diff --git a/.changeset/brown-singers-appear.md b/.changeset/brown-singers-appear.md
new file mode 100644
index 000000000000..8a9a69f225ac
--- /dev/null
+++ b/.changeset/brown-singers-appear.md
@@ -0,0 +1,7 @@
+---
+'@rocket.chat/ui-client': minor
+'@rocket.chat/i18n': minor
+'@rocket.chat/meteor': minor
+---
+
+added `sidepanelNavigation` to feature preview list
diff --git a/.changeset/bump-patch-1724712948901.md b/.changeset/bump-patch-1724712948901.md
new file mode 100644
index 000000000000..e1eaa7980afb
--- /dev/null
+++ b/.changeset/bump-patch-1724712948901.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Bump @rocket.chat/meteor version.
diff --git a/.changeset/bump-patch-1724977971712.md b/.changeset/bump-patch-1724977971712.md
new file mode 100644
index 000000000000..e1eaa7980afb
--- /dev/null
+++ b/.changeset/bump-patch-1724977971712.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Bump @rocket.chat/meteor version.
diff --git a/.changeset/bump-patch-1725326060827.md b/.changeset/bump-patch-1725326060827.md
new file mode 100644
index 000000000000..e1eaa7980afb
--- /dev/null
+++ b/.changeset/bump-patch-1725326060827.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Bump @rocket.chat/meteor version.
diff --git a/.changeset/bump-patch-1725387211812.md b/.changeset/bump-patch-1725387211812.md
new file mode 100644
index 000000000000..e1eaa7980afb
--- /dev/null
+++ b/.changeset/bump-patch-1725387211812.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Bump @rocket.chat/meteor version.
diff --git a/.changeset/cool-actors-sin.md b/.changeset/cool-actors-sin.md
new file mode 100644
index 000000000000..e53b8f136ebb
--- /dev/null
+++ b/.changeset/cool-actors-sin.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Improves Omnichannel queue page performance
diff --git a/.changeset/heavy-snails-help.md b/.changeset/heavy-snails-help.md
new file mode 100644
index 000000000000..fb10bac9ea8f
--- /dev/null
+++ b/.changeset/heavy-snails-help.md
@@ -0,0 +1,6 @@
+---
+"@rocket.chat/meteor": minor
+"@rocket.chat/rest-typings": minor
+---
+
+Implemented "omnichannel/contacts.update" endpoint to update contacts
diff --git a/.changeset/orange-clocks-wait.md b/.changeset/orange-clocks-wait.md
new file mode 100644
index 000000000000..eacb88108a0f
--- /dev/null
+++ b/.changeset/orange-clocks-wait.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates)
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 000000000000..6aa4b3dd5bf9
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,110 @@
+{
+ "mode": "pre",
+ "tag": "rc",
+ "initialVersions": {
+ "@rocket.chat/meteor": "6.12.0-develop",
+ "rocketchat-services": "1.3.0",
+ "@rocket.chat/account-service": "0.4.3",
+ "@rocket.chat/authorization-service": "0.4.3",
+ "@rocket.chat/ddp-streamer": "0.3.3",
+ "@rocket.chat/omnichannel-transcript": "0.4.3",
+ "@rocket.chat/presence-service": "0.4.3",
+ "@rocket.chat/queue-worker": "0.4.3",
+ "@rocket.chat/stream-hub-service": "0.4.3",
+ "@rocket.chat/license": "0.2.3",
+ "@rocket.chat/omnichannel-services": "0.3.0",
+ "@rocket.chat/pdf-worker": "0.2.0",
+ "@rocket.chat/presence": "0.2.3",
+ "@rocket.chat/ui-theming": "0.2.0",
+ "@rocket.chat/account-utils": "0.0.2",
+ "@rocket.chat/agenda": "0.1.0",
+ "@rocket.chat/api-client": "0.2.3",
+ "@rocket.chat/apps": "0.1.3",
+ "@rocket.chat/base64": "1.0.13",
+ "@rocket.chat/cas-validate": "0.0.2",
+ "@rocket.chat/core-services": "0.5.0",
+ "@rocket.chat/core-typings": "6.12.0-develop",
+ "@rocket.chat/cron": "0.1.3",
+ "@rocket.chat/ddp-client": "0.3.3",
+ "@rocket.chat/eslint-config": "0.7.0",
+ "@rocket.chat/favicon": "0.0.2",
+ "@rocket.chat/fuselage-ui-kit": "9.0.0",
+ "@rocket.chat/gazzodown": "9.0.0",
+ "@rocket.chat/i18n": "0.6.0",
+ "@rocket.chat/instance-status": "0.1.3",
+ "@rocket.chat/jest-presets": "0.0.1",
+ "@rocket.chat/jwt": "0.1.1",
+ "@rocket.chat/livechat": "1.19.0",
+ "@rocket.chat/log-format": "0.0.2",
+ "@rocket.chat/logger": "0.0.2",
+ "@rocket.chat/message-parser": "0.31.29",
+ "@rocket.chat/mock-providers": "0.1.1",
+ "@rocket.chat/model-typings": "0.6.0",
+ "@rocket.chat/models": "0.2.0",
+ "@rocket.chat/poplib": "0.0.2",
+ "@rocket.chat/password-policies": "0.0.2",
+ "@rocket.chat/patch-injection": "0.0.1",
+ "@rocket.chat/peggy-loader": "0.31.25",
+ "@rocket.chat/random": "1.2.2",
+ "@rocket.chat/release-action": "2.2.3",
+ "@rocket.chat/release-changelog": "0.1.0",
+ "@rocket.chat/rest-typings": "6.12.0-develop",
+ "@rocket.chat/server-cloud-communication": "0.0.2",
+ "@rocket.chat/server-fetch": "0.0.3",
+ "@rocket.chat/sha256": "1.0.10",
+ "@rocket.chat/tools": "0.2.2",
+ "@rocket.chat/ui-avatar": "5.0.0",
+ "@rocket.chat/ui-client": "9.0.0",
+ "@rocket.chat/ui-composer": "0.2.0",
+ "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-kit": "0.36.0",
+ "@rocket.chat/ui-video-conf": "9.0.0",
+ "@rocket.chat/uikit-playground": "0.3.3",
+ "@rocket.chat/web-ui-registration": "9.0.0"
+ },
+ "changesets": [
+ "bright-humans-cross",
+ "brown-crabs-chew",
+ "bump-patch-1724712948901",
+ "bump-patch-1724977971712",
+ "bump-patch-1725326060827",
+ "bump-patch-1725387211812",
+ "calm-tigers-peel",
+ "cool-actors-sin",
+ "cool-rocks-remember",
+ "empty-toys-smell",
+ "fast-lobsters-turn",
+ "funny-boats-guess",
+ "gentle-bugs-think",
+ "gentle-news-wonder",
+ "giant-spiders-pay",
+ "gorgeous-hotels-attend",
+ "large-geese-ring",
+ "lemon-steaks-provide",
+ "nasty-windows-smile",
+ "new-mayflies-wait",
+ "ninety-hounds-exist",
+ "orange-clocks-wait",
+ "popular-bottles-visit",
+ "proud-years-buy",
+ "purple-dolls-serve",
+ "rich-pillows-hang",
+ "rooms-table-ts",
+ "rotten-camels-pretend",
+ "rude-dogs-burn",
+ "six-beers-fry",
+ "smart-baboons-allow",
+ "smart-mice-attack",
+ "spicy-kings-think",
+ "strong-rings-rush",
+ "strong-swans-double",
+ "strong-terms-love",
+ "stupid-fishes-relate",
+ "swift-maps-tickle",
+ "ten-bulldogs-clap",
+ "thirty-dryers-help",
+ "twelve-windows-train",
+ "two-bikes-crash",
+ "violet-radios-begin"
+ ]
+}
diff --git a/.changeset/smart-baboons-allow.md b/.changeset/smart-baboons-allow.md
new file mode 100644
index 000000000000..0c593e4ed2c5
--- /dev/null
+++ b/.changeset/smart-baboons-allow.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": patch
+---
+
+Fixed issue that prevented sending encrypted filed from the mobile app
diff --git a/.changeset/strong-rings-rush.md b/.changeset/strong-rings-rush.md
new file mode 100644
index 000000000000..5125f47dcb3b
--- /dev/null
+++ b/.changeset/strong-rings-rush.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": patch
+---
+
+Restored tooltips to the unit edit department field selected options
diff --git a/.changeset/tame-mayflies-press.md b/.changeset/tame-mayflies-press.md
new file mode 100644
index 000000000000..e470306cbc25
--- /dev/null
+++ b/.changeset/tame-mayflies-press.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": minor
+---
+
+Implemented sending email via apps
diff --git a/.changeset/wise-avocados-taste.md b/.changeset/wise-avocados-taste.md
new file mode 100644
index 000000000000..c4c9bce010b8
--- /dev/null
+++ b/.changeset/wise-avocados-taste.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Fixes an issue where multi-step modals were closing unexpectedly
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 514dd6d1c518..40260f71d21f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -824,7 +824,7 @@ jobs:
with:
token: ${{ secrets.DISTRIBUTION_TOKEN }}
event-type: new_release
- repository: RocketChat/Release.Distributions
+ repository: RocketChat/public-releases
client-payload: '{"tag": "${{ github.ref_name }}"}'
docs-update:
diff --git a/.yarn/patches/typia-npm-5.3.3-21d3e18463.patch b/.yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch
similarity index 64%
rename from .yarn/patches/typia-npm-5.3.3-21d3e18463.patch
rename to .yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch
index 1487a9f4712d..22a02fa15957 100644
--- a/.yarn/patches/typia-npm-5.3.3-21d3e18463.patch
+++ b/.yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch
@@ -1,22 +1,22 @@
diff --git a/lib/factories/internal/metadata/iterate_metadata_intersection.js b/lib/factories/internal/metadata/iterate_metadata_intersection.js
-index 260670b8ea37b63dcacadeffa26450f81087c90e..f07b44b16099d896ab40c46f03df86ee2f2c1a90 100644
+index da05ef3ac6f397d68b8fa10285f62d1794c57579..0f2b9b26e01cebd0b9c04a2db8857f911cfbaf57 100644
--- a/lib/factories/internal/metadata/iterate_metadata_intersection.js
+++ b/lib/factories/internal/metadata/iterate_metadata_intersection.js
-@@ -247,7 +247,7 @@ var iterate_metadata_intersection = function (checker) {
+@@ -181,7 +181,7 @@ var iterate_metadata_intersection = function (checker) {
var tags = MetadataTypeTagFactory_1.MetadataTypeTagFactory.analyze(errors)(target)(objects.map(function (om) { return om.objects; }).flat(), explore);
if (tags.length)
if (target === "array")
- meta.arrays.at(-1).tags.push(tags);
+ meta.arrays.slice(-1)[0].tags.push(tags);
- else if (booleanLiteral === null)
+ else if (atomics.size)
meta.atomics.find(function (a) { return a.type === target; }).tags.push(tags);
- else {
+ else if (constants.length) {
diff --git a/lib/programmers/CheckerProgrammer.js b/lib/programmers/CheckerProgrammer.js
-index bbec09f22798d144b96f59bb946e7e32e3438c05..dc13cb47b72358b8e6165b768cff2360db2bd617 100644
+index 662e6ff51c91598229c88f691b7ce07200957167..4028a50cc92ee293e98b13822293d0fb35c64c1f 100644
--- a/lib/programmers/CheckerProgrammer.js
+++ b/lib/programmers/CheckerProgrammer.js
-@@ -458,8 +458,8 @@ var CheckerProgrammer;
- ? "".concat(explore.postfix.slice(0, -1), "[").concat(index, "]\"")
+@@ -529,8 +529,8 @@ var CheckerProgrammer;
+ ? "".concat((0, postfix_of_tuple_1.postfix_of_tuple)(explore.postfix), "[").concat(index, "]\"")
: "\"[".concat(index, "]\"") }));
});
- var rest = tuple.elements.length && tuple.elements.at(-1).rest !== null
@@ -27,7 +27,7 @@ index bbec09f22798d144b96f59bb946e7e32e3438c05..dc13cb47b72358b8e6165b768cff2360
var arrayLength = typescript_1.default.factory.createPropertyAccessExpression(input, "length");
return config.combiner(explore)("and")(input, __spreadArray(__spreadArray(__spreadArray([], __read((rest === null
diff --git a/lib/programmers/TypiaProgrammer.js b/lib/programmers/TypiaProgrammer.js
-index c75ab1bc077b788e36c32834ea4916c22df34500..99452220e2dd090d4d562296e26fb266faa617f9 100644
+index db244cb5e40fd68e15b7a06936b0f92802e5e4c9..c2f64885f67cc543c62b0b09e141c88684f99253 100644
--- a/lib/programmers/TypiaProgrammer.js
+++ b/lib/programmers/TypiaProgrammer.js
@@ -165,7 +165,7 @@ var TypiaProgrammer;
@@ -39,34 +39,53 @@ index c75ab1bc077b788e36c32834ea4916c22df34500..99452220e2dd090d4d562296e26fb266
})()
: [0, 0], 2), line = _k[0], pos = _k[1];
console.error("".concat(file, ":").concat(line, ":").concat(pos, " - ").concat(category, " TS").concat(diag.code, ": ").concat(diag.messageText));
-diff --git a/lib/programmers/internal/application_tuple.js b/lib/programmers/internal/application_tuple.js
-index 5c1853a3a1692f95fe702bdae9813e958f54ac4c..04ca996c2ffe72d1cd5969e45a38e91937b975b1 100644
---- a/lib/programmers/internal/application_tuple.js
-+++ b/lib/programmers/internal/application_tuple.js
-@@ -22,15 +22,15 @@ var application_tuple = function (options) {
- var schema = __assign(__assign({ type: "array", items: tuple.type.elements.map(function (meta, i) {
- var _a;
- return (0, application_schema_1.application_schema)(options)(false)(components)((_a = meta.rest) !== null && _a !== void 0 ? _a : meta)(__assign(__assign({}, attribute), { "x-typia-rest": i === tuple.type.elements.length - 1 && meta.rest !== null, "x-typia-required": meta.required, "x-typia-optional": meta.optional }));
-- }) }, attribute), { minItems: !!((_a = tuple.type.elements.at(-1)) === null || _a === void 0 ? void 0 : _a.rest)
-+ }) }, attribute), { minItems: !!((_a = tuple.type.elements.slice(-1)[0]) === null || _a === void 0 ? void 0 : _a.rest)
- ? tuple.type.elements.length - 1
-- : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.at(-1)) === null || _b === void 0 ? void 0 : _b.rest)
-+ : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.slice(-1)[0]) === null || _b === void 0 ? void 0 : _b.rest)
- ? undefined
- : tuple.type.elements.length });
- if (options.purpose === "ajv")
- if (tuple.type.elements.length === 0)
- return schema;
-- else if (!((_c = tuple.type.elements.at(-1)) === null || _c === void 0 ? void 0 : _c.rest))
-+ else if (!((_c = tuple.type.elements.slice(-1)[0]) === null || _c === void 0 ? void 0 : _c.rest))
- return schema;
- var wrapper = __assign(__assign({}, schema), { items: (0, application_schema_1.application_schema)(options)(false)(components)(tuple.type.elements.reduce(function (x, y) { var _a, _b; return Metadata_1.Metadata.merge((_a = x.rest) !== null && _a !== void 0 ? _a : x, (_b = y.rest) !== null && _b !== void 0 ? _b : y); }, Metadata_1.Metadata.initialize()))(tuple.type.recursive ? {} : attribute), "x-typia-tuple": schema, minItems: schema.minItems, maxItems: schema.maxItems });
- return wrapper;
+diff --git a/lib/programmers/internal/application_v30_tuple.js b/lib/programmers/internal/application_v30_tuple.js
+index 94e8827fd94df3792c1d7b2cdacac604175ba8ca..c9a3a1bcdd978b97a080ed2c467188d808d10c8f 100644
+--- a/lib/programmers/internal/application_v30_tuple.js
++++ b/lib/programmers/internal/application_v30_tuple.js
+@@ -21,9 +21,9 @@ var application_v30_tuple = function (components) {
+ return function (tuple) {
+ return function (attribute) {
+ var _a, _b;
+- return (__assign(__assign({}, attribute), { type: "array", items: (0, application_v30_schema_1.application_v30_schema)(false)(components)(tuple.type.recursive ? {} : attribute)(tuple.type.elements.reduce(function (x, y) { var _a, _b; return Metadata_1.Metadata.merge((_a = x.rest) !== null && _a !== void 0 ? _a : x, (_b = y.rest) !== null && _b !== void 0 ? _b : y); }, Metadata_1.Metadata.initialize())), minItems: !!((_a = tuple.type.elements.at(-1)) === null || _a === void 0 ? void 0 : _a.rest)
++ return (__assign(__assign({}, attribute), { type: "array", items: (0, application_v30_schema_1.application_v30_schema)(false)(components)(tuple.type.recursive ? {} : attribute)(tuple.type.elements.reduce(function (x, y) { var _a, _b; return Metadata_1.Metadata.merge((_a = x.rest) !== null && _a !== void 0 ? _a : x, (_b = y.rest) !== null && _b !== void 0 ? _b : y); }, Metadata_1.Metadata.initialize())), minItems: !!((_a = tuple.type.elements.slice(-1)[0]) === null || _a === void 0 ? void 0 : _a.rest)
+ ? tuple.type.elements.length - 1
+- : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.at(-1)) === null || _b === void 0 ? void 0 : _b.rest)
++ : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.slice(-1)[0]) === null || _b === void 0 ? void 0 : _b.rest)
+ ? undefined
+ : tuple.type.elements.length }));
+ };
+diff --git a/lib/programmers/internal/application_v31_tuple.js b/lib/programmers/internal/application_v31_tuple.js
+index af7bbbe1536244eec93d7311e289fc8b34245c0f..e7f126b72a3480f761f57e4d43826a26b8b06e3f 100644
+--- a/lib/programmers/internal/application_v31_tuple.js
++++ b/lib/programmers/internal/application_v31_tuple.js
+@@ -7,7 +7,7 @@ exports.application_v31_tuple = void 0;
+ var application_v31_tuple = function (generator) {
+ return function (tuple) {
+ var _a, _b;
+- var tail = (_b = (_a = tuple.type.elements.at(-1)) === null || _a === void 0 ? void 0 : _a.rest) !== null && _b !== void 0 ? _b : null;
++ var tail = (_b = (_a = tuple.type.elements.slice(-1)[0]) === null || _a === void 0 ? void 0 : _a.rest) !== null && _b !== void 0 ? _b : null;
+ var prefixItems = tuple.type.isRest()
+ ? tuple.type.elements.slice(0, -1)
+ : tuple.type.elements;
+diff --git a/lib/programmers/internal/decode_union_object.js b/lib/programmers/internal/decode_union_object.js
+index c283bdfdcfb99f26954e6d76d35ccef4f78ddcee..7cdef1aeec80238014cf9457ca4351f02e99b638 100644
+--- a/lib/programmers/internal/decode_union_object.js
++++ b/lib/programmers/internal/decode_union_object.js
+@@ -72,7 +72,7 @@ var iterate = function (escaper) {
+ ? typescript_1.default.factory.createIfStatement(b.condition, typescript_1.default.factory.createReturnStatement(b.value), undefined)
+ : typescript_1.default.factory.createReturnStatement(b.value);
+ });
+- if (branches.at(-1).condition !== null)
++ if (branches.slice(-1)[0].condition !== null)
+ statements.push(escaper(input, expected));
+ return typescript_1.default.factory.createBlock(statements, true);
+ };
diff --git a/lib/programmers/json/JsonStringifyProgrammer.js b/lib/programmers/json/JsonStringifyProgrammer.js
-index ce0ae787164f7eba68ef35b05232b4b94ad8e7d7..8f70cfc8c8e9d82cd1ec5004ca5637487f57b3bc 100644
+index 77f2812cb509f5b9093dc311f8ae8558e4469a74..54a6c4e22f9cfa87cd30f8ade50e6cb8ccda9957 100644
--- a/lib/programmers/json/JsonStringifyProgrammer.js
+++ b/lib/programmers/json/JsonStringifyProgrammer.js
-@@ -424,10 +424,10 @@ var JsonStringifyProgrammer;
+@@ -469,10 +469,10 @@ var JsonStringifyProgrammer;
var rest = (function () {
if (tuple.elements.length === 0)
return null;
@@ -80,10 +99,10 @@ index ce0ae787164f7eba68ef35b05232b4b94ad8e7d7..8f70cfc8c8e9d82cd1ec5004ca563748
})();
return StringifyJoinder_1.StringifyJoiner.tuple(children, rest);
diff --git a/lib/programmers/misc/MiscCloneProgrammer.js b/lib/programmers/misc/MiscCloneProgrammer.js
-index 3db6bc92637284468c5fe47ef59f51a9b41d06eb..0b3fa9deaaadf28d4f348225c0d44f49700c1bca 100644
+index 38bec89fba26db7a9c3ee71abd49086692c7e78b..9b9d7a9b0606da78224ce083bcbd7e07cd6ce82e 100644
--- a/lib/programmers/misc/MiscCloneProgrammer.js
+++ b/lib/programmers/misc/MiscCloneProgrammer.js
-@@ -291,11 +291,11 @@ var MiscCloneProgrammer;
+@@ -318,11 +318,11 @@ var MiscCloneProgrammer;
var rest = (function () {
if (tuple.elements.length === 0)
return null;
@@ -98,10 +117,10 @@ index 3db6bc92637284468c5fe47ef59f51a9b41d06eb..0b3fa9deaaadf28d4f348225c0d44f49
return CloneJoiner_1.CloneJoiner.tuple(children, rest);
};
diff --git a/lib/programmers/misc/MiscPruneProgrammer.js b/lib/programmers/misc/MiscPruneProgrammer.js
-index 8440aaba9e449dae2468e96dfd7035ac7e170cfc..e97ceec78427b7eed08db23cc4775fdb10c6b2ff 100644
+index d4a9c66c0b5508b4ffdc4b7684364a9d748f6508..33f9356bab69faffadb8c2b49997d2c3ca429810 100644
--- a/lib/programmers/misc/MiscPruneProgrammer.js
+++ b/lib/programmers/misc/MiscPruneProgrammer.js
-@@ -272,11 +272,11 @@ var MiscPruneProgrammer;
+@@ -305,11 +305,11 @@ var MiscPruneProgrammer;
var rest = (function () {
if (tuple.elements.length === 0)
return null;
@@ -116,10 +135,10 @@ index 8440aaba9e449dae2468e96dfd7035ac7e170cfc..e97ceec78427b7eed08db23cc4775fdb
return PruneJoiner_1.PruneJoiner.tuple(children, rest);
};
diff --git a/lib/programmers/notations/NotationGeneralProgrammer.js b/lib/programmers/notations/NotationGeneralProgrammer.js
-index 6e0b582a802180d7671c00b999469e7e59193b30..f11cc1d523875a040d3e27ce9a850b083c5d0275 100644
+index dfe64a21a5a81a7e887ab5ae02d73e6d3bdddb03..aa4b6070ed6a83c49018384e3a0c1dbd4a7c540b 100644
--- a/lib/programmers/notations/NotationGeneralProgrammer.js
+++ b/lib/programmers/notations/NotationGeneralProgrammer.js
-@@ -301,11 +301,11 @@ var NotationGeneralProgrammer;
+@@ -328,11 +328,11 @@ var NotationGeneralProgrammer;
var rest = (function () {
if (tuple.elements.length === 0)
return null;
@@ -134,36 +153,36 @@ index 6e0b582a802180d7671c00b999469e7e59193b30..f11cc1d523875a040d3e27ce9a850b08
return NotationJoiner_1.NotationJoiner.tuple(children, rest);
};
diff --git a/lib/transformers/CallExpressionTransformer.js b/lib/transformers/CallExpressionTransformer.js
-index 2c5a23879d171ee271ebf6857dc9c65ec29c0ea7..96a40845614f6c54fe8e4ebc48a7d8efeba52a41 100644
+index f7be23d98552526d8c2348ba0f3d32b8d31e522b..133af0caa37ffcf7330811ef7bda79e75b9ecd89 100644
--- a/lib/transformers/CallExpressionTransformer.js
+++ b/lib/transformers/CallExpressionTransformer.js
-@@ -101,7 +101,7 @@ var CallExpressionTransformer;
- var location = path_1.default.resolve(declaration.getSourceFile().fileName);
- if (isTarget(location) === false)
- return expression;
+@@ -129,7 +129,7 @@ var CallExpressionTransformer;
+ // TRANSFORMATION
+ //----
+ // FUNCTION NAME
- var module = location.split(path_1.default.sep).at(-1).split(".")[0];
+ var module = location.split(path_1.default.sep).slice(-1)[0].split(".")[0];
var name = project.checker.getTypeAtLocation(declaration).symbol.name;
+ // FIND TRANSFORMER
var functor = (_b = FUNCTORS[module]) === null || _b === void 0 ? void 0 : _b[name];
- if (functor === undefined)
diff --git a/src/factories/internal/metadata/iterate_metadata_intersection.ts b/src/factories/internal/metadata/iterate_metadata_intersection.ts
-index f46caa25c987092597073e046ae3b9e8130bd994..1eedd727c74f173a5b98a9572b865e058885811d 100644
+index c4d93a961385c09abb6f448896ad4636b648703b..99b1547e6a501caf28a452390fe721cd47dc2ca1 100644
--- a/src/factories/internal/metadata/iterate_metadata_intersection.ts
+++ b/src/factories/internal/metadata/iterate_metadata_intersection.ts
-@@ -214,7 +214,7 @@ export const iterate_metadata_intersection =
+@@ -188,7 +188,7 @@ export const iterate_metadata_intersection =
target,
)(objects.map((om) => om.objects).flat(), explore);
if (tags.length)
- if (target === "array") meta.arrays.at(-1)!.tags.push(tags);
+ if (target === "array") meta.arrays.slice(-1)[0]!.tags.push(tags);
- else if (booleanLiteral === null)
+ else if (atomics.size)
meta.atomics.find((a) => a.type === target)!.tags.push(tags);
- else {
+ else if (constants.length) {
diff --git a/src/programmers/CheckerProgrammer.ts b/src/programmers/CheckerProgrammer.ts
-index 892748b80755b89d1449f4d515aa3166534c6b19..8cb5ce35fe6f918545c82066f0583dead2661c89 100644
+index 40f46e8212a5173e19e0214422086655de908933..18a1a2371cac697e1b621a8fbc6b090b691e3072 100644
--- a/src/programmers/CheckerProgrammer.ts
+++ b/src/programmers/CheckerProgrammer.ts
-@@ -702,14 +702,14 @@ export namespace CheckerProgrammer {
+@@ -785,14 +785,14 @@ export namespace CheckerProgrammer {
),
);
const rest: ts.Expression | null =
@@ -181,47 +200,66 @@ index 892748b80755b89d1449f4d515aa3166534c6b19..8cb5ce35fe6f918545c82066f0583dea
...explore,
start: tuple.elements.length - 1,
diff --git a/src/programmers/TypiaProgrammer.ts b/src/programmers/TypiaProgrammer.ts
-index e01eccf62eccd73e1f0720db897f539256a6bbc1..cae5eb6fc702d359d4886acefdb68d42691edf97 100644
+index 67d9fc138483832aae43574fd2753bbe40a27d14..4397517aa620a8733c51917eebfa467f2922bf6d 100644
--- a/src/programmers/TypiaProgrammer.ts
+++ b/src/programmers/TypiaProgrammer.ts
@@ -101,7 +101,7 @@ export namespace TypiaProgrammer {
- .file!.text.substring(0, diag.start)
- .split("\n");
- if (lines.length === 0) return [0, 0];
-- return [lines.length, lines.at(-1)!.length + 1];
-+ return [lines.length, lines.slice(-1)[0]!.length + 1];
- })()
- : [0, 0];
- console.error(
-diff --git a/src/programmers/internal/application_tuple.ts b/src/programmers/internal/application_tuple.ts
-index 5e10b9051e4a846f298aa8f086109e8d6bb38bf9..a8e24d5c2a2a4a4d5d1dc49eb45b4784654a4b66 100644
---- a/src/programmers/internal/application_tuple.ts
-+++ b/src/programmers/internal/application_tuple.ts
-@@ -28,16 +28,16 @@ export const application_tuple =
- }),
+ .file!.text.substring(0, diag.start)
+ .split("\n");
+ if (lines.length === 0) return [0, 0];
+- return [lines.length, lines.at(-1)!.length + 1];
++ return [lines.length, lines.slice(-1)[0]!.length + 1];
+ })()
+ : [0, 0];
+ console.error(
+diff --git a/src/programmers/internal/application_v30_tuple.ts b/src/programmers/internal/application_v30_tuple.ts
+index 0431273d439c6069a1bb5fbfd7808c5e8d0ea255..4b27cfc3ebde7ce9dcdb5161d34e70004a327b1e 100644
+--- a/src/programmers/internal/application_v30_tuple.ts
++++ b/src/programmers/internal/application_v30_tuple.ts
+@@ -24,10 +24,10 @@ export const application_v30_tuple =
+ Metadata.initialize(),
),
- ...attribute,
-- minItems: !!tuple.type.elements.at(-1)?.rest
-+ minItems: !!tuple.type.elements.slice(-1)[0]?.rest
- ? tuple.type.elements.length - 1
- : tuple.type.elements.filter((x) => !x.optional).length,
-- maxItems: !!tuple.type.elements.at(-1)?.rest
-+ maxItems: !!tuple.type.elements.slice(-1)[0]?.rest
- ? undefined
- : tuple.type.elements.length,
- };
- if (options.purpose === "ajv")
- if (tuple.type.elements.length === 0) return schema;
-- else if (!tuple.type.elements.at(-1)?.rest) return schema;
-+ else if (!tuple.type.elements.slice(-1)[0]?.rest) return schema;
-
- const wrapper: IJsonSchema.IArray = {
- ...schema,
+ ),
+- minItems: !!tuple.type.elements.at(-1)?.rest
++ minItems: !!tuple.type.elements.slice(-1)[0]?.rest
+ ? tuple.type.elements.length - 1
+ : tuple.type.elements.filter((x) => !x.optional).length,
+- maxItems: !!tuple.type.elements.at(-1)?.rest
++ maxItems: !!tuple.type.elements.slice(-1)[0]?.rest
+ ? undefined!
+ : tuple.type.elements.length,
+ });
+diff --git a/src/programmers/internal/application_v31_tuple.ts b/src/programmers/internal/application_v31_tuple.ts
+index 426abad3423de706c368b35b2cf6b4845f6f3d91..be15ec0fda1725bf1ea882c9901e0f837c052fde 100644
+--- a/src/programmers/internal/application_v31_tuple.ts
++++ b/src/programmers/internal/application_v31_tuple.ts
+@@ -9,7 +9,7 @@ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
+ export const application_v31_tuple =
+ (generator: (meta: Metadata) => OpenApi.IJsonSchema) =>
+ (tuple: MetadataTuple): OpenApi.IJsonSchema.ITuple => {
+- const tail: Metadata | null = tuple.type.elements.at(-1)?.rest ?? null;
++ const tail: Metadata | null = tuple.type.elements.slice(-1)[0]?.rest ?? null;
+ const prefixItems: Metadata[] = tuple.type.isRest()
+ ? tuple.type.elements.slice(0, -1)
+ : tuple.type.elements;
+diff --git a/src/programmers/internal/decode_union_object.ts b/src/programmers/internal/decode_union_object.ts
+index f60bf69f91f35dee2efc807475fd6eca71aab052..ef8d51160f7eb9853ec0c827827aaa6c65db1587 100644
+--- a/src/programmers/internal/decode_union_object.ts
++++ b/src/programmers/internal/decode_union_object.ts
+@@ -87,7 +87,7 @@ const iterate =
+ )
+ : ts.factory.createReturnStatement(b.value),
+ );
+- if (branches.at(-1)!.condition !== null)
++ if (branches.slice(-1)[0]!.condition !== null)
+ statements.push(escaper(input, expected));
+ return ts.factory.createBlock(statements, true);
+ };
diff --git a/src/programmers/json/JsonStringifyProgrammer.ts b/src/programmers/json/JsonStringifyProgrammer.ts
-index c317cec2c78e984a6e64c7bf287d0c67e530e309..5974830c62dbd2b865aa2e64e2e757283258d872 100644
+index 558e5bf4b79f5cc28791ba0f5e40ebe6599361ce..c43d77b5d15343af90f7362d1757fc758659d5c9 100644
--- a/src/programmers/json/JsonStringifyProgrammer.ts
+++ b/src/programmers/json/JsonStringifyProgrammer.ts
-@@ -543,7 +543,7 @@ export namespace JsonStringifyProgrammer {
+@@ -560,7 +560,7 @@ export namespace JsonStringifyProgrammer {
);
const rest = (() => {
if (tuple.elements.length === 0) return null;
@@ -230,7 +268,7 @@ index c317cec2c78e984a6e64c7bf287d0c67e530e309..5974830c62dbd2b865aa2e64e2e75728
if (last.rest === null) return null;
const code = decode(project)(config)(importer)(
-@@ -552,7 +552,7 @@ export namespace JsonStringifyProgrammer {
+@@ -569,7 +569,7 @@ export namespace JsonStringifyProgrammer {
undefined,
[ExpressionFactory.number(tuple.elements.length - 1)],
),
@@ -240,10 +278,10 @@ index c317cec2c78e984a6e64c7bf287d0c67e530e309..5974830c62dbd2b865aa2e64e2e75728
...explore,
start: tuple.elements.length - 1,
diff --git a/src/programmers/misc/MiscCloneProgrammer.ts b/src/programmers/misc/MiscCloneProgrammer.ts
-index 94d768b0a0738c0caccd711671351d1f22fa3848..739fd5f2baf4d2eb8e9dd65d73179242a0244707 100644
+index c8c9cb90085eff7dd68ac332a362674ca33d93d8..76a810816bc4ad57ff5e1787a33cd7f01471ffbe 100644
--- a/src/programmers/misc/MiscCloneProgrammer.ts
+++ b/src/programmers/misc/MiscCloneProgrammer.ts
-@@ -343,7 +343,7 @@ export namespace MiscCloneProgrammer {
+@@ -395,7 +395,7 @@ export namespace MiscCloneProgrammer {
const rest = (() => {
if (tuple.elements.length === 0) return null;
@@ -252,7 +290,7 @@ index 94d768b0a0738c0caccd711671351d1f22fa3848..739fd5f2baf4d2eb8e9dd65d73179242
const rest: Metadata | null = last.rest;
if (rest === null) return null;
-@@ -353,7 +353,7 @@ export namespace MiscCloneProgrammer {
+@@ -405,7 +405,7 @@ export namespace MiscCloneProgrammer {
undefined,
[ExpressionFactory.number(tuple.elements.length - 1)],
),
@@ -262,10 +300,10 @@ index 94d768b0a0738c0caccd711671351d1f22fa3848..739fd5f2baf4d2eb8e9dd65d73179242
...explore,
start: tuple.elements.length - 1,
diff --git a/src/programmers/misc/MiscPruneProgrammer.ts b/src/programmers/misc/MiscPruneProgrammer.ts
-index ed1465267066e382ae6696a25a806c2489597593..661f3cd93ae66070c978bd3e8d2b8db07189fe47 100644
+index 1051204a00041ddfb39da9de77b35ab8b44b75ee..73db30fdc06955f43dc2f563cbfc174e50a1bc6f 100644
--- a/src/programmers/misc/MiscPruneProgrammer.ts
+++ b/src/programmers/misc/MiscPruneProgrammer.ts
-@@ -310,7 +310,7 @@ export namespace MiscPruneProgrammer {
+@@ -347,7 +347,7 @@ export namespace MiscPruneProgrammer {
const rest = (() => {
if (tuple.elements.length === 0) return null;
@@ -274,7 +312,7 @@ index ed1465267066e382ae6696a25a806c2489597593..661f3cd93ae66070c978bd3e8d2b8db0
const rest: Metadata | null = last.rest;
if (rest === null || filter(rest) === false) return null;
-@@ -320,7 +320,7 @@ export namespace MiscPruneProgrammer {
+@@ -357,7 +357,7 @@ export namespace MiscPruneProgrammer {
undefined,
[ExpressionFactory.number(tuple.elements.length - 1)],
),
@@ -284,10 +322,10 @@ index ed1465267066e382ae6696a25a806c2489597593..661f3cd93ae66070c978bd3e8d2b8db0
...explore,
start: tuple.elements.length - 1,
diff --git a/src/programmers/notations/NotationGeneralProgrammer.ts b/src/programmers/notations/NotationGeneralProgrammer.ts
-index bd49b1e34002b1a1ec4f5444a8f91fa0ab794360..71d676de290986045910602ab10c6ef09a19c07d 100644
+index d8b2e22a8f9f3bfcb8f3e7987edaa7bf19a48720..96632214cb02b1534dc1987a0f892a3bf41e892f 100644
--- a/src/programmers/notations/NotationGeneralProgrammer.ts
+++ b/src/programmers/notations/NotationGeneralProgrammer.ts
-@@ -353,7 +353,7 @@ export namespace NotationGeneralProgrammer {
+@@ -411,7 +411,7 @@ export namespace NotationGeneralProgrammer {
const rest = (() => {
if (tuple.elements.length === 0) return null;
@@ -296,7 +334,7 @@ index bd49b1e34002b1a1ec4f5444a8f91fa0ab794360..71d676de290986045910602ab10c6ef0
const rest: Metadata | null = last.rest;
if (rest === null) return null;
-@@ -363,7 +363,7 @@ export namespace NotationGeneralProgrammer {
+@@ -421,7 +421,7 @@ export namespace NotationGeneralProgrammer {
undefined,
[ExpressionFactory.number(tuple.elements.length - 1)],
),
@@ -306,15 +344,15 @@ index bd49b1e34002b1a1ec4f5444a8f91fa0ab794360..71d676de290986045910602ab10c6ef0
...explore,
start: tuple.elements.length - 1,
diff --git a/src/transformers/CallExpressionTransformer.ts b/src/transformers/CallExpressionTransformer.ts
-index c58a1b143ce4f204bb249a4858c9d16a26f97408..9e9ffcf73e4c01aa6ac8c213669fdcd50e0181b9 100644
+index 99a4604f1a1944336b4d93dc61390269c346c243..c31ba72f1d206c441d6c237314a1c4d5c808dd09 100644
--- a/src/transformers/CallExpressionTransformer.ts
+++ b/src/transformers/CallExpressionTransformer.ts
-@@ -111,7 +111,7 @@ export namespace CallExpressionTransformer {
- // TRANSFORMATION
- //----
- // FUNCTION NAME
-- const module: string = location.split(path.sep).at(-1)!.split(".")[0]!;
-+ const module: string = location.split(path.sep).slice(-1)[0]!.split(".")[0]!;
- const { name } = project.checker.getTypeAtLocation(declaration).symbol;
-
- // FIND TRANSFORMER
+@@ -131,7 +131,7 @@ export namespace CallExpressionTransformer {
+ // TRANSFORMATION
+ //----
+ // FUNCTION NAME
+- const module: string = location.split(path.sep).at(-1)!.split(".")[0]!;
++ const module: string = location.split(path.sep).slice(-1)[0]!.split(".")[0]!;
+ const { name } = project.checker.getTypeAtLocation(declaration).symbol;
+
+ // FIND TRANSFORMER
diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md
index f466c34da838..a3c6f38176ac 100644
--- a/apps/meteor/CHANGELOG.md
+++ b/apps/meteor/CHANGELOG.md
@@ -1,5 +1,334 @@
# @rocket.chat/meteor
+## 6.12.0-rc.4
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/license@0.2.6-rc.4
+ - @rocket.chat/omnichannel-services@0.3.3-rc.4
+ - @rocket.chat/pdf-worker@0.2.3-rc.4
+ - @rocket.chat/presence@0.2.6-rc.4
+ - @rocket.chat/api-client@0.2.6-rc.4
+ - @rocket.chat/apps@0.1.6-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/cron@0.1.6-rc.4
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.4
+ - @rocket.chat/gazzodown@10.0.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.3-rc.4
+ - @rocket.chat/ui-theming@0.2.1-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.4
+ - @rocket.chat/ui-client@10.0.0-rc.4
+ - @rocket.chat/ui-video-conf@10.0.0-rc.4
+ - @rocket.chat/web-ui-registration@10.0.0-rc.4
+ - @rocket.chat/instance-status@0.1.6-rc.4
+
+
+## 6.11.2
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+## 6.12.0-rc.3
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+- ([#33159](https://github.com/RocketChat/Rocket.Chat/pull/33159)) Improves Omnichannel queue page performance
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/license@0.2.5-rc.3
+ - @rocket.chat/omnichannel-services@0.3.2-rc.3
+ - @rocket.chat/pdf-worker@0.2.2-rc.3
+ - @rocket.chat/presence@0.2.5-rc.3
+ - @rocket.chat/api-client@0.2.5-rc.3
+ - @rocket.chat/apps@0.1.5-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/cron@0.1.5-rc.3
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.3
+ - @rocket.chat/gazzodown@10.0.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.2-rc.3
+ - @rocket.chat/ui-theming@0.2.1-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.3
+ - @rocket.chat/ui-client@10.0.0-rc.3
+ - @rocket.chat/ui-video-conf@10.0.0-rc.3
+ - @rocket.chat/web-ui-registration@10.0.0-rc.3
+ - @rocket.chat/instance-status@0.1.5-rc.3
+
+
+## 6.12.0-rc.2
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+- ([#33169](https://github.com/RocketChat/Rocket.Chat/pull/33169)) Fixed issue that prevented sending encrypted filed from the mobile app
+
+- ([#33174](https://github.com/RocketChat/Rocket.Chat/pull/33174)) Restored tooltips to the unit edit department field selected options
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/license@0.2.5-rc.2
+ - @rocket.chat/omnichannel-services@0.3.2-rc.2
+ - @rocket.chat/pdf-worker@0.2.2-rc.2
+ - @rocket.chat/presence@0.2.5-rc.2
+ - @rocket.chat/api-client@0.2.5-rc.2
+ - @rocket.chat/apps@0.1.5-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/cron@0.1.5-rc.2
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.2
+ - @rocket.chat/gazzodown@10.0.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.2-rc.2
+ - @rocket.chat/ui-theming@0.2.1-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.2
+ - @rocket.chat/ui-client@10.0.0-rc.2
+ - @rocket.chat/ui-video-conf@10.0.0-rc.2
+ - @rocket.chat/web-ui-registration@10.0.0-rc.2
+ - @rocket.chat/instance-status@0.1.5-rc.2
+
+
+## 6.12.0-rc.1
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+- ([#33136](https://github.com/RocketChat/Rocket.Chat/pull/33136)) Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates)
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/license@0.2.5-rc.1
+ - @rocket.chat/omnichannel-services@0.3.2-rc.1
+ - @rocket.chat/pdf-worker@0.2.2-rc.1
+ - @rocket.chat/presence@0.2.5-rc.1
+ - @rocket.chat/api-client@0.2.5-rc.1
+ - @rocket.chat/apps@0.1.5-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/cron@0.1.5-rc.1
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.1
+ - @rocket.chat/gazzodown@10.0.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.2-rc.1
+ - @rocket.chat/ui-theming@0.2.1-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.1
+ - @rocket.chat/ui-client@10.0.0-rc.1
+ - @rocket.chat/ui-video-conf@10.0.0-rc.1
+ - @rocket.chat/web-ui-registration@10.0.0-rc.1
+ - @rocket.chat/instance-status@0.1.5-rc.1
+
+
+## 6.12.0-rc.0
+
+### Minor Changes
+
+- ([#32535](https://github.com/RocketChat/Rocket.Chat/pull/32535)) Federation actions like sending message in a federated DM, reacting in a federated chat, etc, will no longer work if the configuration is invalid.
+
+- ([#32916](https://github.com/RocketChat/Rocket.Chat/pull/32916)) Added a new Audit endpoint `audit/rooms.members` that allows users with `view-members-list-all-rooms` to fetch a list of the members of any room even if the user is not part of it.
+
+- ([#32032](https://github.com/RocketChat/Rocket.Chat/pull/32032)) Added a new 'Deactivated' tab to the users page, this tab lists users who have logged in for the first time but have been deactivated for any reason. Also added the UI code for the Active tab;
+
+- ([#33044](https://github.com/RocketChat/Rocket.Chat/pull/33044)) Replaces an outdated banner with the Bubble component in order to display retention policy warning
+
+- ([#32867](https://github.com/RocketChat/Rocket.Chat/pull/32867)) Added an accordion for advanced settings on Create teams and channels
+
+- ([#32709](https://github.com/RocketChat/Rocket.Chat/pull/32709) by [@heet434](https://github.com/heet434)) Add "Created at" column to admin rooms table
+
+- ([#32535](https://github.com/RocketChat/Rocket.Chat/pull/32535)) New button added to validate Matrix Federation configuration. A new field inside admin settings will reflect the configuration status being either 'Valid' or 'Invalid'.
+
+- ([#32969](https://github.com/RocketChat/Rocket.Chat/pull/32969)) Upgrades fuselage-toastbar version in order to add pause on hover functionality
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Added a new setting to enable/disable file encryption in an end to end encrypted room.
+
+- ([#32868](https://github.com/RocketChat/Rocket.Chat/pull/32868)) Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Fixed a bug related to uploading end to end encrypted file.
+
+ E2EE files and uploads are uploaded as files of mime type `application/octet-stream` as we can't reveal the mime type of actual content since it is encrypted and has to be kept confidential.
+
+ The server resolves the mime type of encrypted file as `application/octet-stream` but it wasn't playing nicely with existing settings related to whitelisted and blacklisted media types.
+
+ E2EE files upload was getting blocked if `application/octet-stream` is not a whitelisted media type.
+
+ Now this PR solves this issue by always accepting E2EE uploads even if `application/octet-stream` is not whitelisted but it will block the upload if `application/octet-stream` is black listed.
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- ([#32986](https://github.com/RocketChat/Rocket.Chat/pull/32986)) Fixed login with third-party apps not working without the "Manage OAuth Apps" permission
+
+- ([#32852](https://github.com/RocketChat/Rocket.Chat/pull/32852)) Federated users can no longer be deleted.
+
+- ([#33033](https://github.com/RocketChat/Rocket.Chat/pull/33033)) Fixed an issue due to an endpoint pagination that was causing that when an agent have assigned more than 50 departments, the departments have a blank space instead of the name.
+
+- ([#33058](https://github.com/RocketChat/Rocket.Chat/pull/33058)) Prevent `processRoomAbandonment` callback from erroring out when a room was inactive during a day Business Hours was not configured for.
+
+- ([#24889](https://github.com/RocketChat/Rocket.Chat/pull/24889) by [@Shivansh2287](https://github.com/Shivansh2287)) Fixes an issue where the Announcement modal with long words was adding a horizontal scrollbar
+
+- ([#32940](https://github.com/RocketChat/Rocket.Chat/pull/32940)) Stopped non channel members from dragging and dropping files in a channel they do not belong
+
+- ([#33001](https://github.com/RocketChat/Rocket.Chat/pull/33001)) Allow apps to react/unreact to messages via bridge
+
+- ([#32809](https://github.com/RocketChat/Rocket.Chat/pull/32809)) Deactivating users who federated will now be permanent.
+
+- ([#31525](https://github.com/RocketChat/Rocket.Chat/pull/31525)) Fix: Show correct user info actions for non-members in channels.
+
+- ([#32931](https://github.com/RocketChat/Rocket.Chat/pull/32931)) Fixed an issue that caused UI to show an error when the call to get the Business Hour type from settings returned `undefined`.
+
+- ([#32743](https://github.com/RocketChat/Rocket.Chat/pull/32743)) Fixes an issue where creating a new user with an invalid username (containing special characters) resulted in an error message, but the user was still created. The user creation process now properly aborts when an invalid username is provided.
+
+- ([#33109](https://github.com/RocketChat/Rocket.Chat/pull/33109)) Fixes the `expanded` prop being accidentally forwarded to `ContextualbarHeader`
+
+- ([#32846](https://github.com/RocketChat/Rocket.Chat/pull/32846)) Fixed issue with system messages being counted as agents' first responses in livechat rooms (which caused the "best first response time" and "average first response time" metrics to be unreliable for all agents)
+
+- ([#32791](https://github.com/RocketChat/Rocket.Chat/pull/32791)) Fixed a behavior when updating messages that prevented the `customFields` prop from being updated if there were no changes to the `msg` property. Now, `customFields` will be always updated on message update even if `msg` doesn't change
+
+- ([#33101](https://github.com/RocketChat/Rocket.Chat/pull/33101)) Fixed an issue where teams were being created with no room associated with it.
+
+- ([#33036](https://github.com/RocketChat/Rocket.Chat/pull/33036)) Fixes multiple problems with the `processRoomAbandonment` hook. This hook is in charge of calculating the time a room has been abandoned (this means, the time that elapsed since a room was last answered by an agent until it was closed). However, when business hours were enabled and the user didn't open on one day, if an abandoned room happened to be abandoned _over_ the day there was no business hour configuration, then the process will error out.
+ Additionally, the values the code was calculating were not right. When business hours are enabled, this code should only count the abandonment time _while a business hour was open_. When rooms were left abandoned for days or weeks, this will also throw an error or output an invalid count.
+- ([#33054](https://github.com/RocketChat/Rocket.Chat/pull/33054)) Fixed issue with livechat analytics in a given date range considering conversation data from the following day
+
+- ([#32981](https://github.com/RocketChat/Rocket.Chat/pull/32981)) fixed an issue with the "follow message" button not changing state after click
+
+- ([#32928](https://github.com/RocketChat/Rocket.Chat/pull/32928)) Fixed issue where `after-registration-triggers` would show up in a page when the user was not yet registered
+
+- ([#33047](https://github.com/RocketChat/Rocket.Chat/pull/33047)) Fixed: Custom fields in extraData now correctly added to extraRoomInfo by livechat.beforeRoom callback during livechat room creation.
+
+- ([#33040](https://github.com/RocketChat/Rocket.Chat/pull/33040)) Fixed an issue related to setting Accounts_ForgetUserSessionOnWindowClose, this setting was not working as expected.
+
+ The new meteor 2.16 release introduced a new option to configure the Accounts package and choose between the local storage or session storage. They also changed how Meteor.\_localstorage works internally. Due to these changes in Meteor, our setting to use session storage wasn't working as expected. This PR fixes this issue and configures the Accounts package according to the workspace settings.
+
+- Updated dependencies [8ea6517c4e, c11f3722df, 7f88158036, 127866ce97, 0c919db7b4, b764c415dc, 1f061a1aa5, dd37ea1b35, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.0
+ - @rocket.chat/ui-theming@0.2.1-rc.0
+ - @rocket.chat/ui-video-conf@10.0.0-rc.0
+ - @rocket.chat/ui-composer@0.2.1-rc.0
+ - @rocket.chat/gazzodown@10.0.0-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.0
+ - @rocket.chat/ui-client@10.0.0-rc.0
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/i18n@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/web-ui-registration@10.0.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/omnichannel-services@0.3.1-rc.0
+ - @rocket.chat/apps@0.1.4-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+ - @rocket.chat/presence@0.2.4-rc.0
+ - @rocket.chat/api-client@0.2.4-rc.0
+ - @rocket.chat/license@0.2.4-rc.0
+ - @rocket.chat/pdf-worker@0.2.1-rc.0
+ - @rocket.chat/cron@0.1.4-rc.0
+ - @rocket.chat/instance-status@0.1.4-rc.0
+ - @rocket.chat/server-cloud-communication@0.0.2
+
+
+- Bump @rocket.chat/meteor version.
+
+- ([#33084](https://github.com/RocketChat/Rocket.Chat/pull/33084) by [@dionisio-bot](https://github.com/dionisio-bot)) Prevent `processRoomAbandonment` callback from erroring out when a room was inactive during a day Business Hours was not configured for.
+
+- ([#33153](https://github.com/RocketChat/Rocket.Chat/pull/33153) by [@dionisio-bot](https://github.com/dionisio-bot)) Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates)
+
+- ([#33185](https://github.com/RocketChat/Rocket.Chat/pull/33185) by [@dionisio-bot](https://github.com/dionisio-bot)) Restored tooltips to the unit edit department field selected options
+
+- ([#33129](https://github.com/RocketChat/Rocket.Chat/pull/33129) by [@dionisio-bot](https://github.com/dionisio-bot)) Fixed an issue related to setting Accounts_ForgetUserSessionOnWindowClose, this setting was not working as expected.
+
+ The new meteor 2.16 release introduced a new option to configure the Accounts package and choose between the local storage or session storage. They also changed how Meteor.\_localstorage works internally. Due to these changes in Meteor, our setting to use session storage wasn't working as expected. This PR fixes this issue and configures the Accounts package according to the workspace settings.
+
+- ([#33178](https://github.com/RocketChat/Rocket.Chat/pull/33178) by [@dionisio-bot](https://github.com/dionisio-bot)) Fixes an issue where multi-step modals were closing unexpectedly
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/api-client@0.2.5
+ - @rocket.chat/license@0.2.5
+ - @rocket.chat/omnichannel-services@0.3.2
+ - @rocket.chat/pdf-worker@0.2.2
+ - @rocket.chat/presence@0.2.5
+ - @rocket.chat/apps@0.1.5
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/cron@0.1.5
+ - @rocket.chat/fuselage-ui-kit@9.0.2
+ - @rocket.chat/gazzodown@9.0.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.2
+ - @rocket.chat/ui-theming@0.2.0
+ - @rocket.chat/ui-avatar@5.0.2
+ - @rocket.chat/ui-client@9.0.2
+ - @rocket.chat/ui-video-conf@9.0.2
+ - @rocket.chat/web-ui-registration@9.0.2
+ - @rocket.chat/instance-status@0.1.5
+
+
+## 6.11.1
+
+### Patch Changes
+
+- Bump @rocket.chat/meteor version.
+
+- Bump @rocket.chat/meteor version.
+
+- ([#33062](https://github.com/RocketChat/Rocket.Chat/pull/33062)) Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates)
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/api-client@0.2.4
+ - @rocket.chat/license@0.2.4
+ - @rocket.chat/omnichannel-services@0.3.1
+ - @rocket.chat/pdf-worker@0.2.1
+ - @rocket.chat/presence@0.2.4
+ - @rocket.chat/apps@0.1.4
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/cron@0.1.4
+ - @rocket.chat/fuselage-ui-kit@9.0.1
+ - @rocket.chat/gazzodown@9.0.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/server-cloud-communication@0.0.2
+ - @rocket.chat/models@0.2.1
+ - @rocket.chat/ui-theming@0.2.0
+ - @rocket.chat/ui-avatar@5.0.1
+ - @rocket.chat/ui-client@9.0.1
+ - @rocket.chat/ui-video-conf@9.0.1
+ - @rocket.chat/web-ui-registration@9.0.1
+ - @rocket.chat/instance-status@0.1.4
+
+
## 6.11.0
### Minor Changes
diff --git a/apps/meteor/app/api/server/v1/rooms.ts b/apps/meteor/app/api/server/v1/rooms.ts
index ad297a38656b..2b573160ebdb 100644
--- a/apps/meteor/app/api/server/v1/rooms.ts
+++ b/apps/meteor/app/api/server/v1/rooms.ts
@@ -8,6 +8,7 @@ import {
isRoomsMuteUnmuteUserProps,
isRoomsExportProps,
isRoomsIsMemberProps,
+ isRoomsCleanHistoryProps,
} from '@rocket.chat/rest-typings';
import { Meteor } from 'meteor/meteor';
@@ -361,7 +362,7 @@ API.v1.addRoute(
API.v1.addRoute(
'rooms.cleanHistory',
- { authRequired: true },
+ { authRequired: true, validateParams: isRoomsCleanHistoryProps },
{
async post() {
const { _id } = await findRoomByIdOrName({ params: this.bodyParams });
diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts
index 9c56ecac01cb..530e3dc0770c 100644
--- a/apps/meteor/app/api/server/v1/users.ts
+++ b/apps/meteor/app/api/server/v1/users.ts
@@ -755,6 +755,12 @@ API.v1.addRoute(
{ authRequired: false },
{
async post() {
+ const isPasswordResetEnabled = settings.get('Accounts_PasswordReset');
+
+ if (!isPasswordResetEnabled) {
+ return API.v1.failure('Password reset is not enabled');
+ }
+
const { email } = this.bodyParams;
if (!email) {
return API.v1.failure("The 'email' param is required");
diff --git a/apps/meteor/app/apps/server/bridges/bridges.js b/apps/meteor/app/apps/server/bridges/bridges.js
index 6d52a1d8e56d..aeab9f191039 100644
--- a/apps/meteor/app/apps/server/bridges/bridges.js
+++ b/apps/meteor/app/apps/server/bridges/bridges.js
@@ -5,6 +5,7 @@ import { AppApisBridge } from './api';
import { AppCloudBridge } from './cloud';
import { AppCommandsBridge } from './commands';
import { AppDetailChangesBridge } from './details';
+import { AppEmailBridge } from './email';
import { AppEnvironmentalVariableBridge } from './environmental';
import { AppHttpBridge } from './http';
import { AppInternalBridge } from './internal';
@@ -53,6 +54,7 @@ export class RealAppBridges extends AppBridges {
this._moderationBridge = new AppModerationBridge(orch);
this._threadBridge = new AppThreadBridge(orch);
this._roleBridge = new AppRoleBridge(orch);
+ this._emailBridge = new AppEmailBridge(orch);
}
getCommandBridge() {
@@ -150,4 +152,8 @@ export class RealAppBridges extends AppBridges {
getRoleBridge() {
return this._roleBridge;
}
+
+ getEmailBridge() {
+ return this._emailBridge;
+ }
}
diff --git a/apps/meteor/app/apps/server/bridges/email.ts b/apps/meteor/app/apps/server/bridges/email.ts
new file mode 100644
index 000000000000..4c9cb9a93ed6
--- /dev/null
+++ b/apps/meteor/app/apps/server/bridges/email.ts
@@ -0,0 +1,16 @@
+import type { IAppServerOrchestrator } from '@rocket.chat/apps';
+import type { IEmail } from '@rocket.chat/apps-engine/definition/email';
+import { EmailBridge } from '@rocket.chat/apps-engine/server/bridges';
+
+import * as Mailer from '../../../mailer/server/api';
+
+export class AppEmailBridge extends EmailBridge {
+ constructor(private readonly orch: IAppServerOrchestrator) {
+ super();
+ }
+
+ protected async sendEmail(email: IEmail, appId: string): Promise {
+ this.orch.debugLog(`The app ${appId} is sending an email.`);
+ await Mailer.send(email);
+ }
+}
diff --git a/apps/meteor/app/authorization/server/constant/permissions.ts b/apps/meteor/app/authorization/server/constant/permissions.ts
index d9ae4133e49e..e5e8f7fb05dd 100644
--- a/apps/meteor/app/authorization/server/constant/permissions.ts
+++ b/apps/meteor/app/authorization/server/constant/permissions.ts
@@ -97,6 +97,10 @@ export const permissions = [
_id: 'create-livechat-contact',
roles: ['livechat-manager', 'livechat-monitor', 'livechat-agent', 'admin'],
},
+ {
+ _id: 'update-livechat-contact',
+ roles: ['livechat-manager', 'livechat-monitor', 'livechat-agent', 'admin'],
+ },
{ _id: 'view-livechat-manager', roles: ['livechat-manager', 'livechat-monitor', 'admin'] },
{
_id: 'view-omnichannel-contact-center',
diff --git a/apps/meteor/app/file-upload/server/lib/FileUpload.ts b/apps/meteor/app/file-upload/server/lib/FileUpload.ts
index 8714c71f20d6..ac97923be41e 100644
--- a/apps/meteor/app/file-upload/server/lib/FileUpload.ts
+++ b/apps/meteor/app/file-upload/server/lib/FileUpload.ts
@@ -175,7 +175,12 @@ export const FileUpload = {
throw new Meteor.Error('error-invalid-file-type', reason);
}
- // E2EE files are of type - application/octet-stream, application/octet-stream is whitelisted for E2EE files.
+ // E2EE files should be of type application/octet-stream. no information about them should be disclosed on upload if they are encrypted
+ if (isE2EEUpload(file)) {
+ file.type = 'application/octet-stream';
+ }
+
+ // E2EE files are of type application/octet-stream, which is whitelisted for E2EE files
if (!fileUploadIsValidContentType(file?.type, isE2EEUpload(file) ? 'application/octet-stream' : undefined)) {
const reason = i18n.t('File_type_is_not_accepted', { lng: language });
throw new Meteor.Error('error-invalid-file-type', reason);
diff --git a/apps/meteor/app/lib/server/functions/getModifiedHttpHeaders.ts b/apps/meteor/app/lib/server/functions/getModifiedHttpHeaders.ts
new file mode 100644
index 000000000000..e62727814de3
--- /dev/null
+++ b/apps/meteor/app/lib/server/functions/getModifiedHttpHeaders.ts
@@ -0,0 +1,20 @@
+export const getModifiedHttpHeaders = (httpHeaders: Record) => {
+ const modifiedHttpHeaders = { ...httpHeaders };
+
+ if ('x-auth-token' in modifiedHttpHeaders) {
+ modifiedHttpHeaders['x-auth-token'] = '[redacted]';
+ }
+
+ if (modifiedHttpHeaders.cookie) {
+ const cookies = modifiedHttpHeaders.cookie.split('; ');
+ const modifiedCookies = cookies.map((cookie: string) => {
+ if (cookie.startsWith('rc_token=')) {
+ return 'rc_token=[redacted]';
+ }
+ return cookie;
+ });
+ modifiedHttpHeaders.cookie = modifiedCookies.join('; ');
+ }
+
+ return modifiedHttpHeaders;
+};
diff --git a/apps/meteor/app/lib/server/lib/debug.js b/apps/meteor/app/lib/server/lib/debug.js
index aaa492e80337..cbf38528579f 100644
--- a/apps/meteor/app/lib/server/lib/debug.js
+++ b/apps/meteor/app/lib/server/lib/debug.js
@@ -7,6 +7,7 @@ import _ from 'underscore';
import { getMethodArgs } from '../../../../server/lib/logger/logPayloads';
import { metrics } from '../../../metrics/server';
import { settings } from '../../../settings/server';
+import { getModifiedHttpHeaders } from '../functions/getModifiedHttpHeaders';
const logger = new Logger('Meteor');
@@ -41,7 +42,7 @@ const traceConnection = (enable, filter, prefix, name, connection, userId) => {
console.log(name, {
id: connection.id,
clientAddress: connection.clientAddress,
- httpHeaders: connection.httpHeaders,
+ httpHeaders: getModifiedHttpHeaders(connection.httpHeaders),
userId,
});
} else {
diff --git a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts
index 7551cabb6e63..fdb99c83207c 100644
--- a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts
+++ b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts
@@ -111,7 +111,7 @@ async function updateUsersSubscriptions(message: IMessage, room: IRoom): Promise
roomId: room._id,
uidsExclude: [message.u._id],
uidsInclude: userIds,
- onlyRead: !toAll && !toHere,
+ onlyRead: !toAll && !toHere && unreadCount !== 'all_messages',
}).forEach((sub) => {
const hasUserMention = userIds.includes(sub.u._id);
const shouldIncUnread = hasUserMention || toAll || toHere || unreadCount === 'all_messages';
@@ -168,8 +168,6 @@ export async function updateThreadUsersSubscriptions(message: IMessage, replies:
}
export async function notifyUsersOnMessage(message: IMessage, room: IRoom, roomUpdater: Updater): Promise {
- console.log('notifyUsersOnMessage function');
-
// Skips this callback if the message was edited and increments it if the edit was way in the past (aka imported)
if (isEditedMessage(message)) {
if (Math.abs(moment(message.editedAt).diff(Date.now())) > 60000) {
diff --git a/apps/meteor/app/livechat/imports/server/rest/sms.ts b/apps/meteor/app/livechat/imports/server/rest/sms.ts
index 6f8ce64bc635..6b2411cf8e3d 100644
--- a/apps/meteor/app/livechat/imports/server/rest/sms.ts
+++ b/apps/meteor/app/livechat/imports/server/rest/sms.ts
@@ -97,12 +97,18 @@ const normalizeLocationSharing = (payload: ServiceData) => {
// @ts-expect-error - this is an special endpoint that requires the return to not be wrapped as regular returns
API.v1.addRoute('livechat/sms-incoming/:service', {
async post() {
- if (!(await OmnichannelIntegration.isConfiguredSmsService(this.urlParams.service))) {
+ const { service } = this.urlParams;
+ if (!(await OmnichannelIntegration.isConfiguredSmsService(service))) {
return API.v1.failure('Invalid service');
}
const smsDepartment = settings.get('SMS_Default_Omnichannel_Department');
- const SMSService = await OmnichannelIntegration.getSmsService(this.urlParams.service);
+ const SMSService = await OmnichannelIntegration.getSmsService(service);
+
+ if (!SMSService.validateRequest(this.request)) {
+ return API.v1.failure('Invalid request');
+ }
+
const sms = SMSService.parse(this.bodyParams);
const { department } = this.queryParams;
let targetDepartment = await defineDepartment(department || smsDepartment);
@@ -121,7 +127,7 @@ API.v1.addRoute('livechat/sms-incoming/:service', {
},
source: {
type: OmnichannelSourceType.SMS,
- alias: this.urlParams.service,
+ alias: service,
},
};
diff --git a/apps/meteor/app/livechat/server/api/v1/contact.ts b/apps/meteor/app/livechat/server/api/v1/contact.ts
index 91b18a6b21af..94bd5ed3e11c 100644
--- a/apps/meteor/app/livechat/server/api/v1/contact.ts
+++ b/apps/meteor/app/livechat/server/api/v1/contact.ts
@@ -1,11 +1,11 @@
import { LivechatCustomField, LivechatVisitors } from '@rocket.chat/models';
-import { isPOSTOmnichannelContactsProps } from '@rocket.chat/rest-typings';
+import { isPOSTOmnichannelContactsProps, isPOSTUpdateOmnichannelContactsProps } from '@rocket.chat/rest-typings';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import { Match, check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
import { API } from '../../../../api/server';
-import { Contacts, createContact } from '../../lib/Contacts';
+import { Contacts, createContact, updateContact } from '../../lib/Contacts';
API.v1.addRoute(
'omnichannel/contact',
@@ -101,3 +101,18 @@ API.v1.addRoute(
},
},
);
+API.v1.addRoute(
+ 'omnichannel/contacts.update',
+ { authRequired: true, permissionsRequired: ['update-livechat-contact'], validateParams: isPOSTUpdateOmnichannelContactsProps },
+ {
+ async post() {
+ if (!process.env.TEST_MODE) {
+ throw new Meteor.Error('error-not-allowed', 'This endpoint is only allowed in test mode');
+ }
+
+ const contact = await updateContact({ ...this.bodyParams });
+
+ return API.v1.success({ contact });
+ },
+ },
+);
diff --git a/apps/meteor/app/livechat/server/api/v1/room.ts b/apps/meteor/app/livechat/server/api/v1/room.ts
index b0f45a63ff87..565f8e0bb3f4 100644
--- a/apps/meteor/app/livechat/server/api/v1/room.ts
+++ b/apps/meteor/app/livechat/server/api/v1/room.ts
@@ -31,63 +31,72 @@ import { findVisitorInfo } from '../lib/visitors';
const isAgentWithInfo = (agentObj: ILivechatAgent | { hiddenInfo: boolean }): agentObj is ILivechatAgent => !('hiddenInfo' in agentObj);
-API.v1.addRoute('livechat/room', {
- async get() {
- // I'll temporary use check for validation, as validateParams doesnt support what's being done here
- const extraCheckParams = await onCheckRoomParams({
- token: String,
- rid: Match.Maybe(String),
- agentId: Match.Maybe(String),
- });
-
- check(this.queryParams, extraCheckParams as any);
-
- const { token, rid, agentId, ...extraParams } = this.queryParams;
-
- const guest = token && (await findGuest(token));
- if (!guest) {
- throw new Error('invalid-token');
- }
-
- if (!rid) {
- const room = await LivechatRooms.findOneOpenByVisitorToken(token, {});
- if (room) {
- return API.v1.success({ room, newRoom: false });
- }
-
- let agent: SelectedAgent | undefined;
- const agentObj = agentId && (await findAgent(agentId));
- if (agentObj) {
- if (isAgentWithInfo(agentObj)) {
- const { username = undefined } = agentObj;
- agent = { agentId, username };
- } else {
- agent = { agentId };
- }
+API.v1.addRoute(
+ 'livechat/room',
+ {
+ rateLimiterOptions: {
+ numRequestsAllowed: 5,
+ intervalTimeInMS: 60000,
+ },
+ },
+ {
+ async get() {
+ // I'll temporary use check for validation, as validateParams doesnt support what's being done here
+ const extraCheckParams = await onCheckRoomParams({
+ token: String,
+ rid: Match.Maybe(String),
+ agentId: Match.Maybe(String),
+ });
+
+ check(this.queryParams, extraCheckParams as any);
+
+ const { token, rid, agentId, ...extraParams } = this.queryParams;
+
+ const guest = token && (await findGuest(token));
+ if (!guest) {
+ throw new Error('invalid-token');
}
- const roomInfo = {
- source: {
- type: isWidget(this.request.headers) ? OmnichannelSourceType.WIDGET : OmnichannelSourceType.API,
- },
- };
+ if (!rid) {
+ const room = await LivechatRooms.findOneOpenByVisitorToken(token, {});
+ if (room) {
+ return API.v1.success({ room, newRoom: false });
+ }
- const newRoom = await LivechatTyped.createRoom({ visitor: guest, roomInfo, agent, extraData: extraParams });
+ let agent: SelectedAgent | undefined;
+ const agentObj = agentId && (await findAgent(agentId));
+ if (agentObj) {
+ if (isAgentWithInfo(agentObj)) {
+ const { username = undefined } = agentObj;
+ agent = { agentId, username };
+ } else {
+ agent = { agentId };
+ }
+ }
- return API.v1.success({
- room: newRoom,
- newRoom: true,
- });
- }
+ const roomInfo = {
+ source: {
+ type: isWidget(this.request.headers) ? OmnichannelSourceType.WIDGET : OmnichannelSourceType.API,
+ },
+ };
+
+ const newRoom = await LivechatTyped.createRoom({ visitor: guest, roomInfo, agent, extraData: extraParams });
- const froom = await LivechatRooms.findOneOpenByRoomIdAndVisitorToken(rid, token, {});
- if (!froom) {
- throw new Error('invalid-room');
- }
+ return API.v1.success({
+ room: newRoom,
+ newRoom: true,
+ });
+ }
+
+ const froom = await LivechatRooms.findOneOpenByRoomIdAndVisitorToken(rid, token, {});
+ if (!froom) {
+ throw new Error('invalid-room');
+ }
- return API.v1.success({ room: froom, newRoom: false });
+ return API.v1.success({ room: froom, newRoom: false });
+ },
},
-});
+);
// Note: use this route if a visitor is closing a room
// If a RC user(like eg agent) is closing a room, use the `livechat/room.closeByUser` route
diff --git a/apps/meteor/app/livechat/server/api/v1/visitor.ts b/apps/meteor/app/livechat/server/api/v1/visitor.ts
index a5b3f2de35b1..ed32f0e2d279 100644
--- a/apps/meteor/app/livechat/server/api/v1/visitor.ts
+++ b/apps/meteor/app/livechat/server/api/v1/visitor.ts
@@ -9,119 +9,128 @@ import { settings } from '../../../../settings/server';
import { Livechat as LivechatTyped } from '../../lib/LivechatTyped';
import { findGuest, normalizeHttpHeaderData } from '../lib/livechat';
-API.v1.addRoute('livechat/visitor', {
- async post() {
- check(this.bodyParams, {
- visitor: Match.ObjectIncluding({
- token: String,
- name: Match.Maybe(String),
- email: Match.Maybe(String),
- department: Match.Maybe(String),
- phone: Match.Maybe(String),
- username: Match.Maybe(String),
- customFields: Match.Maybe([
- Match.ObjectIncluding({
- key: String,
- value: String,
- overwrite: Boolean,
- }),
- ]),
- }),
- });
-
- const { customFields, id, token, name, email, department, phone, username, connectionData } = this.bodyParams.visitor;
-
- if (!token?.trim()) {
- throw new Meteor.Error('error-invalid-token', 'Token cannot be empty', { method: 'livechat/visitor' });
- }
-
- const guest = {
- token,
- ...(id && { id }),
- ...(name && { name }),
- ...(email && { email }),
- ...(department && { department }),
- ...(username && { username }),
- ...(connectionData && { connectionData }),
- ...(phone && typeof phone === 'string' && { phone: { number: phone as string } }),
- connectionData: normalizeHttpHeaderData(this.request.headers),
- };
-
- const visitor = await LivechatTyped.registerGuest(guest);
- if (!visitor) {
- throw new Meteor.Error('error-livechat-visitor-registration', 'Error registering visitor', {
- method: 'livechat/visitor',
+API.v1.addRoute(
+ 'livechat/visitor',
+ {
+ rateLimiterOptions: {
+ numRequestsAllowed: 5,
+ intervalTimeInMS: 60000,
+ },
+ },
+ {
+ async post() {
+ check(this.bodyParams, {
+ visitor: Match.ObjectIncluding({
+ token: String,
+ name: Match.Maybe(String),
+ email: Match.Maybe(String),
+ department: Match.Maybe(String),
+ phone: Match.Maybe(String),
+ username: Match.Maybe(String),
+ customFields: Match.Maybe([
+ Match.ObjectIncluding({
+ key: String,
+ value: String,
+ overwrite: Boolean,
+ }),
+ ]),
+ }),
});
- }
- const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {});
- // If it's updating an existing visitor, it must also update the roomInfo
- const rooms = await LivechatRooms.findOpenByVisitorToken(visitor?.token, {}, extraQuery).toArray();
- await Promise.all(
- rooms.map(
- (room: IRoom) =>
- visitor &&
- LivechatTyped.saveRoomInfo(room, {
- _id: visitor._id,
- name: visitor.name,
- phone: visitor.phone?.[0]?.phoneNumber,
- livechatData: visitor.livechatData as { [k: string]: string },
- }),
- ),
- );
-
- if (customFields && Array.isArray(customFields) && customFields.length > 0) {
- const keys = customFields.map((field) => field.key);
- const errors: string[] = [];
-
- const processedKeys = await Promise.all(
- await LivechatCustomField.findByIdsAndScope>(keys, 'visitor', {
- projection: { _id: 1 },
- })
- .map(async (field) => {
- const customField = customFields.find((f) => f.key === field._id);
- if (!customField) {
- return;
- }
-
- const { key, value, overwrite } = customField;
- // TODO: Change this to Bulk update
- if (!(await VisitorsRaw.updateLivechatDataByToken(token, key, value, overwrite))) {
- errors.push(key);
- }
-
- return key;
- })
- .toArray(),
- );
+ const { customFields, id, token, name, email, department, phone, username, connectionData } = this.bodyParams.visitor;
- if (processedKeys.length !== keys.length) {
- LivechatTyped.logger.warn({
- msg: 'Some custom fields were not processed',
- visitorId: visitor._id,
- missingKeys: keys.filter((key) => !processedKeys.includes(key)),
- });
+ if (!token?.trim()) {
+ throw new Meteor.Error('error-invalid-token', 'Token cannot be empty', { method: 'livechat/visitor' });
}
- if (errors.length > 0) {
- LivechatTyped.logger.error({
- msg: 'Error updating custom fields',
- visitorId: visitor._id,
- errors,
+ const guest = {
+ token,
+ ...(id && { id }),
+ ...(name && { name }),
+ ...(email && { email }),
+ ...(department && { department }),
+ ...(username && { username }),
+ ...(connectionData && { connectionData }),
+ ...(phone && typeof phone === 'string' && { phone: { number: phone as string } }),
+ connectionData: normalizeHttpHeaderData(this.request.headers),
+ };
+
+ const visitor = await LivechatTyped.registerGuest(guest);
+ if (!visitor) {
+ throw new Meteor.Error('error-livechat-visitor-registration', 'Error registering visitor', {
+ method: 'livechat/visitor',
});
- throw new Error('error-updating-custom-fields');
}
- return API.v1.success({ visitor: await VisitorsRaw.findOneEnabledById(visitor._id) });
- }
+ const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {});
+ // If it's updating an existing visitor, it must also update the roomInfo
+ const rooms = await LivechatRooms.findOpenByVisitorToken(visitor?.token, {}, extraQuery).toArray();
+ await Promise.all(
+ rooms.map(
+ (room: IRoom) =>
+ visitor &&
+ LivechatTyped.saveRoomInfo(room, {
+ _id: visitor._id,
+ name: visitor.name,
+ phone: visitor.phone?.[0]?.phoneNumber,
+ livechatData: visitor.livechatData as { [k: string]: string },
+ }),
+ ),
+ );
- if (!visitor) {
- throw new Meteor.Error('error-saving-visitor', 'An error ocurred while saving visitor');
- }
+ if (customFields && Array.isArray(customFields) && customFields.length > 0) {
+ const keys = customFields.map((field) => field.key);
+ const errors: string[] = [];
- return API.v1.success({ visitor });
+ const processedKeys = await Promise.all(
+ await LivechatCustomField.findByIdsAndScope>(keys, 'visitor', {
+ projection: { _id: 1 },
+ })
+ .map(async (field) => {
+ const customField = customFields.find((f) => f.key === field._id);
+ if (!customField) {
+ return;
+ }
+
+ const { key, value, overwrite } = customField;
+ // TODO: Change this to Bulk update
+ if (!(await VisitorsRaw.updateLivechatDataByToken(token, key, value, overwrite))) {
+ errors.push(key);
+ }
+
+ return key;
+ })
+ .toArray(),
+ );
+
+ if (processedKeys.length !== keys.length) {
+ LivechatTyped.logger.warn({
+ msg: 'Some custom fields were not processed',
+ visitorId: visitor._id,
+ missingKeys: keys.filter((key) => !processedKeys.includes(key)),
+ });
+ }
+
+ if (errors.length > 0) {
+ LivechatTyped.logger.error({
+ msg: 'Error updating custom fields',
+ visitorId: visitor._id,
+ errors,
+ });
+ throw new Error('error-updating-custom-fields');
+ }
+
+ return API.v1.success({ visitor: await VisitorsRaw.findOneEnabledById(visitor._id) });
+ }
+
+ if (!visitor) {
+ throw new Meteor.Error('error-saving-visitor', 'An error ocurred while saving visitor');
+ }
+
+ return API.v1.success({ visitor });
+ },
},
-});
+);
API.v1.addRoute('livechat/visitor/:token', {
async get() {
diff --git a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts
index a6031bd42efa..2c718c058b00 100644
--- a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts
+++ b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts
@@ -58,14 +58,17 @@ export const getSecondsSinceLastAgentResponse = async (room: IOmnichannelRoom, a
for (let index = 0; index <= daysOfInactivity; index++) {
const today = inactivityDay.clone().format('dddd');
const officeDay = officeDays[today];
+
if (!officeDay) {
inactivityDay.add(1, 'days');
continue;
}
+
if (!officeDay.open) {
inactivityDay.add(1, 'days');
continue;
}
+
if (!officeDay?.start?.time || !officeDay?.finish?.time) {
inactivityDay.add(1, 'days');
continue;
diff --git a/apps/meteor/app/livechat/server/lib/Contacts.ts b/apps/meteor/app/livechat/server/lib/Contacts.ts
index 4f4a33ee61b2..58404ce27584 100644
--- a/apps/meteor/app/livechat/server/lib/Contacts.ts
+++ b/apps/meteor/app/livechat/server/lib/Contacts.ts
@@ -1,4 +1,11 @@
-import type { ILivechatContactChannel, ILivechatCustomField, ILivechatVisitor, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings';
+import type {
+ ILivechatContact,
+ ILivechatContactChannel,
+ ILivechatCustomField,
+ ILivechatVisitor,
+ IOmnichannelRoom,
+ IUser,
+} from '@rocket.chat/core-typings';
import {
LivechatVisitors,
Users,
@@ -45,6 +52,16 @@ type CreateContactParams = {
channels?: ILivechatContactChannel[];
};
+type UpdateContactParams = {
+ contactId: string;
+ name?: string;
+ emails?: string[];
+ phones?: string[];
+ customFields?: Record;
+ contactManager?: string;
+ channels?: ILivechatContactChannel[];
+};
+
export const Contacts = {
async registerContact({
token,
@@ -189,10 +206,7 @@ export async function createContact(params: CreateContactParams): Promise>(contactManager, { projection: { roles: 1 } });
- if (!contactManagerUser) {
- throw new Error('error-contact-manager-not-found');
- }
+ await validateContactManager(contactManager);
}
const allowedCustomFields = await getAllowedCustomFields();
@@ -211,6 +225,29 @@ export async function createContact(params: CreateContactParams): Promise {
+ const { contactId, name, emails, phones, customFields, contactManager, channels } = params;
+
+ const contact = await LivechatContacts.findOneById>(contactId, { projection: { _id: 1 } });
+
+ if (!contact) {
+ throw new Error('error-contact-not-found');
+ }
+
+ if (contactManager) {
+ await validateContactManager(contactManager);
+ }
+
+ if (customFields) {
+ const allowedCustomFields = await getAllowedCustomFields();
+ validateCustomFields(allowedCustomFields, customFields);
+ }
+
+ const updatedContact = await LivechatContacts.updateContact(contactId, { name, emails, phones, contactManager, channels, customFields });
+
+ return updatedContact;
+}
+
async function getAllowedCustomFields(): Promise {
return LivechatCustomField.findByScope(
'visitor',
@@ -245,4 +282,18 @@ export function validateCustomFields(allowedCustomFields: ILivechatCustomField[]
}
}
}
+
+ const allowedCustomFieldIds = new Set(allowedCustomFields.map((cf) => cf._id));
+ for (const key in customFields) {
+ if (!allowedCustomFieldIds.has(key)) {
+ throw new Error(i18n.t('error-custom-field-not-allowed', { key }));
+ }
+ }
+}
+
+export async function validateContactManager(contactManagerUserId: string) {
+ const contactManagerUser = await Users.findOneAgentById>(contactManagerUserId, { projection: { _id: 1 } });
+ if (!contactManagerUser) {
+ throw new Error('error-contact-manager-not-found');
+ }
}
diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info
index faf0e8f47de6..77fdbe3d6942 100644
--- a/apps/meteor/app/utils/rocketchat.info
+++ b/apps/meteor/app/utils/rocketchat.info
@@ -1,3 +1,3 @@
{
- "version": "6.12.0-develop"
+ "version": "6.12.0-rc.4"
}
diff --git a/apps/meteor/client/components/GenericModal/GenericModal.tsx b/apps/meteor/client/components/GenericModal/GenericModal.tsx
index d371e1ff4ef2..5d025e05827d 100644
--- a/apps/meteor/client/components/GenericModal/GenericModal.tsx
+++ b/apps/meteor/client/components/GenericModal/GenericModal.tsx
@@ -111,7 +111,7 @@ const GenericModal = ({
{tagline && {tagline}}
{title ?? t('Are_you_sure')}
-
+ {onClose && }
{children}
diff --git a/apps/meteor/client/components/GenericModal/GenericModalSkeleton.tsx b/apps/meteor/client/components/GenericModal/GenericModalSkeleton.tsx
index d56cbdd26a67..2dcdf3b3578c 100644
--- a/apps/meteor/client/components/GenericModal/GenericModalSkeleton.tsx
+++ b/apps/meteor/client/components/GenericModal/GenericModalSkeleton.tsx
@@ -1,25 +1,13 @@
import { Skeleton } from '@rocket.chat/fuselage';
-import { useTranslation } from '@rocket.chat/ui-contexts';
import type { ComponentProps } from 'react';
import React from 'react';
import GenericModal from './GenericModal';
-const GenericModalSkeleton = ({ onClose, ...props }: ComponentProps) => {
- const t = useTranslation();
-
- return (
- }
- confirmText={t('Cancel')}
- onConfirm={onClose}
- >
-
-
- );
-};
+const GenericModalSkeleton = (props: ComponentProps) => (
+ }>
+
+
+);
export default GenericModalSkeleton;
diff --git a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelAppSourceRoomIcon.tsx b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelAppSourceRoomIcon.tsx
index 60f3af65eb9d..6a841c30491b 100644
--- a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelAppSourceRoomIcon.tsx
+++ b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelAppSourceRoomIcon.tsx
@@ -1,53 +1,29 @@
-import { UserStatus, type IOmnichannelRoomFromAppSource } from '@rocket.chat/core-typings';
+import { type IOmnichannelSourceFromApp } from '@rocket.chat/core-typings';
import { Icon, Box } from '@rocket.chat/fuselage';
-import type { ComponentProps, ReactElement } from 'react';
+import type { ComponentProps } from 'react';
import React from 'react';
import { AsyncStatePhase } from '../../../lib/asyncState/AsyncStatePhase';
import { useOmnichannelRoomIcon } from './context/OmnichannelRoomIconContext';
-const colors = {
- busy: 'status-font-on-danger',
- away: 'status-font-on-warning',
- online: 'status-font-on-success',
- offline: 'annotation',
- disabled: 'annotation',
+type OmnichannelAppSourceRoomIconProps = {
+ source: IOmnichannelSourceFromApp;
+ color: ComponentProps['color'];
+ size: ComponentProps['size'];
+ placement: 'sidebar' | 'default';
};
-const convertBoxSizeToNumber = (boxSize: ComponentProps['size']): number => {
- switch (boxSize) {
- case 'x20': {
- return 20;
- }
- case 'x24': {
- return 24;
- }
- case 'x16':
- default: {
- return 16;
- }
- }
-};
+export const OmnichannelAppSourceRoomIcon = ({ source, color, size, placement }: OmnichannelAppSourceRoomIconProps) => {
+ const icon = (placement === 'sidebar' && source.sidebarIcon) || source.defaultIcon;
+ const { phase, value } = useOmnichannelRoomIcon(source.id, icon || '');
-export const OmnichannelAppSourceRoomIcon = ({
- room,
- size = 16,
- placement = 'default',
-}: {
- room: IOmnichannelRoomFromAppSource;
- size: ComponentProps['size'];
- placement: 'sidebar' | 'default';
-}): ReactElement => {
- const color = colors[room.v.status || UserStatus.OFFLINE];
- const icon = (placement === 'sidebar' && room.source.sidebarIcon) || room.source.defaultIcon;
- const { phase, value } = useOmnichannelRoomIcon(room.source.id, icon || '');
- const fontSize = convertBoxSizeToNumber(size);
if ([AsyncStatePhase.REJECTED, AsyncStatePhase.LOADING].includes(phase)) {
return ;
}
+
return (
-
-
+
+
diff --git a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelCoreSourceRoomIcon.tsx b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelCoreSourceRoomIcon.tsx
index 03a49e26cf9d..dd93771a55ca 100644
--- a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelCoreSourceRoomIcon.tsx
+++ b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelCoreSourceRoomIcon.tsx
@@ -1,16 +1,8 @@
-import type { IOmnichannelRoom } from '@rocket.chat/core-typings';
+import type { IOmnichannelSource } from '@rocket.chat/core-typings';
import { Icon } from '@rocket.chat/fuselage';
-import type { ComponentProps, ReactElement } from 'react';
+import type { ComponentProps } from 'react';
import React from 'react';
-const colors = {
- busy: 'status-font-on-danger',
- away: 'status-font-on-warning',
- online: 'status-font-on-success',
- offline: 'annotation',
- disabled: 'annotation',
-};
-
const iconMap = {
widget: 'livechat',
email: 'mail',
@@ -20,13 +12,13 @@ const iconMap = {
other: 'headset',
} as const;
-export const OmnichannelCoreSourceRoomIcon = ({
- room,
- size = 'x16',
-}: {
- room: IOmnichannelRoom;
+type OmnichannelCoreSourceRoomIconProps = {
+ source: IOmnichannelSource;
+ color: ComponentProps['color'];
size: ComponentProps['size'];
-}): ReactElement => {
- const icon = iconMap[room.source?.type || 'other'] || 'headset';
- return ;
+};
+
+export const OmnichannelCoreSourceRoomIcon = ({ source, color, size }: OmnichannelCoreSourceRoomIconProps) => {
+ const icon = iconMap[source?.type || 'other'] || 'headset';
+ return ;
};
diff --git a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelRoomIcon.tsx b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelRoomIcon.tsx
index 5542d7bf2333..51f466c7f477 100644
--- a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelRoomIcon.tsx
+++ b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/OmnichannelRoomIcon.tsx
@@ -1,23 +1,34 @@
-import type { IOmnichannelRoom } from '@rocket.chat/core-typings';
-import { isOmnichannelRoomFromAppSource } from '@rocket.chat/core-typings';
+import type { IOmnichannelSource } from '@rocket.chat/core-typings';
+import { UserStatus, isOmnichannelSourceFromApp } from '@rocket.chat/core-typings';
import type { Icon } from '@rocket.chat/fuselage';
-import type { ComponentProps, ReactElement } from 'react';
+import type { ComponentProps } from 'react';
import React from 'react';
import { OmnichannelAppSourceRoomIcon } from './OmnichannelAppSourceRoomIcon';
import { OmnichannelCoreSourceRoomIcon } from './OmnichannelCoreSourceRoomIcon';
-export const OmnichannelRoomIcon = ({
- room,
- size,
- placement = 'default',
-}: {
- room: IOmnichannelRoom;
+const colors = {
+ busy: 'status-font-on-danger',
+ away: 'status-font-on-warning',
+ online: 'status-font-on-success',
+ offline: 'annotation',
+ disabled: 'annotation',
+} as const;
+
+type OmnichannelRoomIconProps = {
+ source: IOmnichannelSource;
+ color?: ComponentProps['color'];
+ status?: UserStatus;
size: ComponentProps['size'];
- placement: 'sidebar' | 'default';
-}): ReactElement => {
- if (isOmnichannelRoomFromAppSource(room)) {
- return ;
+ placement?: 'sidebar' | 'default';
+};
+
+export const OmnichannelRoomIcon = ({ source, color, status, size = 'x16', placement = 'default' }: OmnichannelRoomIconProps) => {
+ const iconColor = color ?? colors[status || UserStatus.OFFLINE];
+
+ if (isOmnichannelSourceFromApp(source)) {
+ return ;
}
- return ;
+
+ return ;
};
diff --git a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIcon.ts b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIconManager.ts
similarity index 88%
rename from apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIcon.ts
rename to apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIconManager.ts
index b0263ed9ff06..dbcdfccf933f 100644
--- a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIcon.ts
+++ b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/lib/OmnichannelRoomIconManager.ts
@@ -3,7 +3,7 @@ import DOMPurify from 'dompurify';
import { sdk } from '../../../../../app/utils/client/lib/SDKClient';
-const OmnichannelRoomIcon = new (class extends Emitter {
+const OmnichannelRoomIconManager = new (class extends Emitter {
icons = new Map();
constructor() {
@@ -23,7 +23,7 @@ const OmnichannelRoomIcon = new (class extends Emitter {
sdk.rest
.send(`/apps/public/${appId}/get-sidebar-icon?icon=${icon}`, 'GET')
.then((response: any) => {
- response.text().then((text: any) => {
+ response.text().then((text: string) => {
this.icons.set(
`${appId}-${icon}`,
DOMPurify.sanitize(text, {
@@ -44,4 +44,4 @@ const OmnichannelRoomIcon = new (class extends Emitter {
}
})();
-export default OmnichannelRoomIcon;
+export default OmnichannelRoomIconManager;
diff --git a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/provider/OmnichannelRoomIconProvider.tsx b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/provider/OmnichannelRoomIconProvider.tsx
index 7ee5be7ee0e6..06d16af25794 100644
--- a/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/provider/OmnichannelRoomIconProvider.tsx
+++ b/apps/meteor/client/components/RoomIcon/OmnichannelRoomIcon/provider/OmnichannelRoomIconProvider.tsx
@@ -6,9 +6,9 @@ import { useSyncExternalStore } from 'use-sync-external-store/shim';
import type { AsyncState } from '../../../../lib/asyncState/AsyncState';
import { AsyncStatePhase } from '../../../../lib/asyncState/AsyncStatePhase';
import { OmnichannelRoomIconContext } from '../context/OmnichannelRoomIconContext';
-import OmnichannelRoomIcon from '../lib/OmnichannelRoomIcon';
+import OmnichannelRoomIconManager from '../lib/OmnichannelRoomIconManager';
-let icons = Array.from(OmnichannelRoomIcon.icons.values());
+let icons = Array.from(OmnichannelRoomIconManager.icons.values());
type OmnichannelRoomIconProviderProps = {
children?: ReactNode;
@@ -18,8 +18,8 @@ export const OmnichannelRoomIconProvider = ({ children }: OmnichannelRoomIconPro
const svgIcons = useSyncExternalStore(
useCallback(
(callback): (() => void) =>
- OmnichannelRoomIcon.on('change', () => {
- icons = Array.from(OmnichannelRoomIcon.icons.values());
+ OmnichannelRoomIconManager.on('change', () => {
+ icons = Array.from(OmnichannelRoomIconManager.icons.values());
callback();
}),
[],
@@ -31,7 +31,7 @@ export const OmnichannelRoomIconProvider = ({ children }: OmnichannelRoomIconPro
{
const extractSnapshot = (app: string, iconName: string): AsyncState => {
- const icon = OmnichannelRoomIcon.get(app, iconName);
+ const icon = OmnichannelRoomIconManager.get(app, iconName);
if (icon) {
return {
@@ -57,7 +57,7 @@ export const OmnichannelRoomIconProvider = ({ children }: OmnichannelRoomIconPro
iconName: string,
): [subscribe: (onStoreChange: () => void) => () => void, getSnapshot: () => AsyncState] => [
(callback): (() => void) =>
- OmnichannelRoomIcon.on(`${app}-${iconName}`, () => {
+ OmnichannelRoomIconManager.on(`${app}-${iconName}`, () => {
snapshots.set(`${app}-${iconName}`, extractSnapshot(app, iconName));
// Then we call the callback (onStoreChange), signaling React to re-render
diff --git a/apps/meteor/client/components/RoomIcon/RoomIcon.tsx b/apps/meteor/client/components/RoomIcon/RoomIcon.tsx
index e71ed259ae69..d757071fedf5 100644
--- a/apps/meteor/client/components/RoomIcon/RoomIcon.tsx
+++ b/apps/meteor/client/components/RoomIcon/RoomIcon.tsx
@@ -1,4 +1,4 @@
-import type { IOmnichannelRoom, IRoom } from '@rocket.chat/core-typings';
+import type { IRoom } from '@rocket.chat/core-typings';
import { isOmnichannelRoom } from '@rocket.chat/core-typings';
import { Icon } from '@rocket.chat/fuselage';
import type { ComponentProps, ReactElement } from 'react';
@@ -24,8 +24,8 @@ export const RoomIcon = ({
return ;
}
- if (isOmnichannelRoom(room as IRoom)) {
- return ;
+ if (isOmnichannelRoom(room)) {
+ return ;
}
if (isValidElement(iconPropsOrReactNode)) {
diff --git a/apps/meteor/client/hooks/useEndpointAction.ts b/apps/meteor/client/hooks/useEndpointAction.ts
index c7c371a04e1f..2cfb22b18548 100644
--- a/apps/meteor/client/hooks/useEndpointAction.ts
+++ b/apps/meteor/client/hooks/useEndpointAction.ts
@@ -15,7 +15,7 @@ type UseEndpointActionOptions = (undefined ext
export function useEndpointAction(
method: TMethod,
pathPattern: TPathPattern,
- options: UseEndpointActionOptions = { keys: {} as UrlParams },
+ options: NoInfer> = { keys: {} as UrlParams },
) {
const sendData = useEndpoint(method, pathPattern, options.keys as UrlParams);
diff --git a/apps/meteor/client/hooks/useEndpointData.ts b/apps/meteor/client/hooks/useEndpointData.ts
index 6e759ad587e5..93942946ede0 100644
--- a/apps/meteor/client/hooks/useEndpointData.ts
+++ b/apps/meteor/client/hooks/useEndpointData.ts
@@ -20,11 +20,11 @@ const deprecationWarning = log('useEndpointData is deprecated, use @tanstack/rea
*/
export const useEndpointData = (
endpoint: TPathPattern,
- options: {
+ options: NoInfer<{
keys?: UrlParams;
params?: OperationParams<'GET', TPathPattern>;
initialValue?: Serialized> | (() => Serialized>);
- } = {},
+ }> = {},
): AsyncState>> & {
reload: () => void;
} => {
diff --git a/apps/meteor/client/lib/createRouteGroup.tsx b/apps/meteor/client/lib/createRouteGroup.tsx
index e418ecc56e99..70eab4782dd1 100644
--- a/apps/meteor/client/lib/createRouteGroup.tsx
+++ b/apps/meteor/client/lib/createRouteGroup.tsx
@@ -1,4 +1,4 @@
-import { type IRouterPaths, type RouteName, type RouterPathPattern } from '@rocket.chat/ui-contexts';
+import type { IRouterPaths, RouteName, RouterPathPattern } from '@rocket.chat/ui-contexts';
import React, { type ElementType, type ReactNode } from 'react';
import { router } from '../providers/RouterProvider';
@@ -9,21 +9,21 @@ type GroupName = 'omnichannel' | 'marketplace' | 'account' | 'admin';
type GroupPrefix = IRouterPaths[`${TGroupName}-index`]['pattern'];
-type RouteNamesOf = Extract<
+type RouteNamesOf = (
| keyof {
[TRouteName in RouteName as IRouterPaths[TRouteName]['pattern'] extends `${GroupPrefix}/${string}`
? TRouteName
: never]: never;
}
- | `${GroupName}-index`,
- RouteName
->;
+ | `${GroupName}-index`
+) &
+ RouteName;
-type TrimPrefix = T extends `${P}${infer U}` ? U : T;
+type TrimPrefix = T extends `${P}${infer U}` ? U : T;
export const createRouteGroup = (
name: TGroupName,
- prefix: GroupPrefix,
+ prefix: NoInfer>,
RouterComponent: ElementType<{
children?: ReactNode;
}>,
diff --git a/apps/meteor/client/lib/getLocalePercentage.ts b/apps/meteor/client/lib/getLocalePercentage.ts
index e6f2fa3bbff1..3aa84b59f03f 100644
--- a/apps/meteor/client/lib/getLocalePercentage.ts
+++ b/apps/meteor/client/lib/getLocalePercentage.ts
@@ -1,9 +1,6 @@
-export const getLocalePercentage = (locale: string, total: number, fraction: number, decimalCount = 2): string => {
- const option = {
+export const getLocalePercentage = (locale: string, total: number, fraction: number, decimalCount = 2) =>
+ new Intl.NumberFormat(locale, {
style: 'percent',
minimumFractionDigits: decimalCount,
maximumFractionDigits: decimalCount,
- };
-
- return new Intl.NumberFormat(locale, option).format(fraction / total);
-};
+ }).format(fraction / total);
diff --git a/apps/meteor/client/omnichannel/units/UnitEdit.tsx b/apps/meteor/client/omnichannel/units/UnitEdit.tsx
index e4bc1c0efb50..e71e8e2a94d0 100644
--- a/apps/meteor/client/omnichannel/units/UnitEdit.tsx
+++ b/apps/meteor/client/omnichannel/units/UnitEdit.tsx
@@ -228,7 +228,7 @@ const UnitEdit = ({ unitData, unitMonitors, unitDepartments }: UnitEditProps) =>
value={value}
onChange={onChange}
onBlur={onBlur}
- withTitle={false}
+ withTitle
filter={departmentsFilter}
setFilter={setDepartmentsFilter}
options={departmentsOptions}
diff --git a/apps/meteor/client/providers/CallProvider/CallProvider.tsx b/apps/meteor/client/providers/CallProvider/CallProvider.tsx
index f2c884aeb05f..6e728dc35eb6 100644
--- a/apps/meteor/client/providers/CallProvider/CallProvider.tsx
+++ b/apps/meteor/client/providers/CallProvider/CallProvider.tsx
@@ -11,7 +11,7 @@ import {
} from '@rocket.chat/core-typings';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { Random } from '@rocket.chat/random';
-import type { Device, IExperimentalHTMLAudioElement } from '@rocket.chat/ui-contexts';
+import type { Device } from '@rocket.chat/ui-contexts';
import {
useRouter,
useUser,
@@ -65,7 +65,7 @@ export const CallProvider = ({ children }: CallProviderProps) => {
const hasVoIPEnterpriseLicense = useIsVoipEnterprise();
- const remoteAudioMediaRef = useRef(null); // TODO: Create a dedicated file for the AUDIO and make the controls accessible
+ const remoteAudioMediaRef = useRef(null); // TODO: Create a dedicated file for the AUDIO and make the controls accessible
const [queueCounter, setQueueCounter] = useState(0);
const [queueName, setQueueName] = useState('');
diff --git a/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx b/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
index 90ced3b0459a..c8fd77fa257b 100644
--- a/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
+++ b/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
@@ -1,5 +1,5 @@
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
-import type { Device, IExperimentalHTMLAudioElement, DeviceContextValue } from '@rocket.chat/ui-contexts';
+import type { Device, DeviceContextValue } from '@rocket.chat/ui-contexts';
import { DeviceContext } from '@rocket.chat/ui-contexts';
import type { ReactElement, ReactNode } from 'react';
import React, { useEffect, useState, useMemo } from 'react';
@@ -33,7 +33,7 @@ export const DeviceProvider = ({ children }: DeviceProviderProps): ReactElement
};
const setAudioOutputDevice = useMutableCallback(
- ({ outputDevice, HTMLAudioElement }: { outputDevice: Device; HTMLAudioElement: IExperimentalHTMLAudioElement }): void => {
+ ({ outputDevice, HTMLAudioElement }: { outputDevice: Device; HTMLAudioElement: HTMLAudioElement }): void => {
if (!isSetSinkIdAvailable()) {
throw new Error('setSinkId is not available in this browser');
}
diff --git a/apps/meteor/client/providers/DeviceProvider/lib/isSetSinkIdAvailable.tsx b/apps/meteor/client/providers/DeviceProvider/lib/isSetSinkIdAvailable.tsx
index 65bf99ed116f..2f835819afe6 100644
--- a/apps/meteor/client/providers/DeviceProvider/lib/isSetSinkIdAvailable.tsx
+++ b/apps/meteor/client/providers/DeviceProvider/lib/isSetSinkIdAvailable.tsx
@@ -1,6 +1,4 @@
-import type { IExperimentalHTMLAudioElement } from '@rocket.chat/ui-contexts';
-
export const isSetSinkIdAvailable = (): boolean => {
- const audio = new Audio() as IExperimentalHTMLAudioElement;
+ const audio = new Audio();
return !!audio.setSinkId;
};
diff --git a/apps/meteor/client/providers/TranslationProvider.tsx b/apps/meteor/client/providers/TranslationProvider.tsx
index 0c0ef00b5ac0..eb546c91c6bd 100644
--- a/apps/meteor/client/providers/TranslationProvider.tsx
+++ b/apps/meteor/client/providers/TranslationProvider.tsx
@@ -84,7 +84,7 @@ const useI18next = (lng: string): typeof i18next => {
loadPath: 'i18n/{{lng}}.json',
parse: (data: string, _lngs?: string | string[], namespaces: string | string[] = []) =>
extractTranslationKeys(JSON.parse(data), namespaces),
- request: (_options, url, _payload, callback) => {
+ request: (_options: unknown, url: string, _payload: unknown, callback: (error: unknown, data: unknown) => void) => {
const params = url.split('/');
const lng = params[params.length - 1];
diff --git a/apps/meteor/client/sidebar/RoomMenu.spec.tsx b/apps/meteor/client/sidebar/RoomMenu.spec.tsx
new file mode 100644
index 000000000000..e12063c9cdb0
--- /dev/null
+++ b/apps/meteor/client/sidebar/RoomMenu.spec.tsx
@@ -0,0 +1,67 @@
+import type { RoomType } from '@rocket.chat/core-typings';
+import { mockAppRoot } from '@rocket.chat/mock-providers';
+import { render, screen } from '@testing-library/react';
+import '@testing-library/jest-dom';
+import userEvent from '@testing-library/user-event';
+import React from 'react';
+
+import RoomMenu from './RoomMenu';
+
+jest.mock('../../client/lib/rooms/roomCoordinator', () => ({
+ roomCoordinator: {
+ getRoomDirectives: () => ({
+ getUiText: () => 'leaveWarning',
+ }),
+ },
+}));
+
+jest.mock('../../app/ui-utils/client', () => ({
+ LegacyRoomManager: {
+ close: jest.fn(),
+ },
+}));
+
+const defaultProps = {
+ rid: 'roomId',
+ type: 'c' as RoomType,
+ hideDefaultOptions: false,
+ placement: 'right-start',
+};
+
+const renderOptions = {
+ wrapper: mockAppRoot()
+ .withTranslations('en', 'core', {
+ Hide: 'Hide',
+ Mark_unread: 'Mark Unread',
+ Favorite: 'Favorite',
+ Leave_room: 'Leave',
+ })
+ .withSetting('Favorite_Rooms', true)
+ .withPermission('leave-c')
+ .withPermission('leave-p')
+ .build(),
+ legacyRoot: true,
+};
+
+it('should display all the menu options for regular rooms', async () => {
+ render(, renderOptions);
+
+ const menu = screen.queryByRole('button');
+ await userEvent.click(menu as HTMLElement);
+
+ expect(await screen.findByRole('option', { name: 'Hide' })).toBeInTheDocument();
+ expect(await screen.findByRole('option', { name: 'Favorite' })).toBeInTheDocument();
+ expect(await screen.findByRole('option', { name: 'Mark Unread' })).toBeInTheDocument();
+ expect(await screen.findByRole('option', { name: 'Leave' })).toBeInTheDocument();
+});
+
+it('should display only mark unread and favorite for omnichannel rooms', async () => {
+ render(, renderOptions);
+
+ const menu = screen.queryByRole('button');
+ await userEvent.click(menu as HTMLElement);
+
+ expect(await screen.findAllByRole('option')).toHaveLength(2);
+ expect(screen.queryByRole('option', { name: 'Hide' })).not.toBeInTheDocument();
+ expect(screen.queryByRole('option', { name: 'Leave' })).not.toBeInTheDocument();
+});
diff --git a/apps/meteor/client/startup/accounts.ts b/apps/meteor/client/startup/accounts.ts
index 60f2de02bde0..88008a606656 100644
--- a/apps/meteor/client/startup/accounts.ts
+++ b/apps/meteor/client/startup/accounts.ts
@@ -27,13 +27,15 @@ Accounts.onEmailVerificationLink((token: string) => {
});
Meteor.startup(() => {
- Tracker.autorun(() => {
+ Tracker.autorun((computation) => {
const forgetUserSessionOnWindowClose = settings.get('Accounts_ForgetUserSessionOnWindowClose');
if (forgetUserSessionOnWindowClose === undefined) {
return;
}
+ computation.stop();
+
Accounts.config({ clientStorage: forgetUserSessionOnWindowClose ? 'session' : 'local' });
});
});
diff --git a/apps/meteor/client/views/admin/oauthApps/EditOauthApp.tsx b/apps/meteor/client/views/admin/oauthApps/EditOauthApp.tsx
index 19bef201492f..79d2fbe11140 100644
--- a/apps/meteor/client/views/admin/oauthApps/EditOauthApp.tsx
+++ b/apps/meteor/client/views/admin/oauthApps/EditOauthApp.tsx
@@ -8,6 +8,7 @@ import {
FieldRow,
FieldError,
FieldHint,
+ PasswordInput,
TextAreaInput,
ToggleSwitch,
FieldGroup,
@@ -136,7 +137,7 @@ const EditOauthApp = ({ onChange, data, ...props }: EditOauthAppProps): ReactEle
{t('Client_Secret')}
-
+
diff --git a/apps/meteor/client/views/admin/viewLogs/ansispan.ts b/apps/meteor/client/views/admin/viewLogs/ansispan.ts
index 7f1709e48ef2..8aa5bccb1195 100644
--- a/apps/meteor/client/views/admin/viewLogs/ansispan.ts
+++ b/apps/meteor/client/views/admin/viewLogs/ansispan.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-control-regex */
const foregroundColors = {
30: 'var(--rcx-color-font-secondary-info, #6C727A)',
31: 'var(--rcx-color-font-danger, #D40C26)',
@@ -16,13 +17,13 @@ export const ansispan = (str: string): string => {
.replace(/>/g, '>')
.replace(/$1')
- .replace(/\033\[1m/g, '')
- .replace(/\033\[22m/g, '')
- .replace(/\033\[3m/g, '')
- .replace(/\033\[23m/g, '')
- .replace(/\033\[m/g, '')
- .replace(/\033\[0m/g, '')
- .replace(/\033\[39m/g, '');
+ .replace(/\x1b\[1m/g, '')
+ .replace(/\x1b\[22m/g, '')
+ .replace(/\x1b\[3m/g, '')
+ .replace(/\x1b\[23m/g, '')
+ .replace(/\x1b\[m/g, '')
+ .replace(/\x1b\[0m/g, '')
+ .replace(/\x1b\[39m/g, '');
return Object.entries(foregroundColors).reduce((str, [ansiCode, color]) => {
const span = ``;
return str.replace(new RegExp(`\\033\\[${ansiCode}m`, 'g'), span).replace(new RegExp(`\\033\\[0;${ansiCode}m`, 'g'), span);
diff --git a/apps/meteor/client/views/omnichannel/directory/components/SourceField.tsx b/apps/meteor/client/views/omnichannel/directory/components/SourceField.tsx
index 074bb0fe531a..235f4f95d1fa 100644
--- a/apps/meteor/client/views/omnichannel/directory/components/SourceField.tsx
+++ b/apps/meteor/client/views/omnichannel/directory/components/SourceField.tsx
@@ -56,7 +56,7 @@ const SourceField = ({ room }: SourceFieldProps) => {
-
+
diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterContainer.stories.tsx b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterContainer.stories.tsx
index d3a43adf701d..c3e4d0aeb535 100644
--- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterContainer.stories.tsx
+++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterContainer.stories.tsx
@@ -12,10 +12,10 @@ export const Default: ComponentStory = (args) => {
+export type DataType = {
+ title: string;
+ value: number | string;
+}[];
+
+type Totalizers = {
+ totalizers: DataType;
+};
+
+type CounterContainerProps = {
+ data?: Totalizers;
+ state: AsyncStatePhase;
+ initialData: DataType;
+};
+
+const CounterContainer = ({ data, state, initialData, ...props }: CounterContainerProps) => {
const t = useTranslation();
- const [displayData, setDisplayData] = useState(initialData);
+ const [displayData, setDisplayData] = useState(initialData);
const { totalizers } = data || { totalizers: initialData };
@@ -22,7 +38,7 @@ const CounterContainer = ({ data, state, initialData, ...props }) => {
return (
{displayData.map(({ title, value }, i) => (
- } count={value} />
+ } count={value} />
))}
);
diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.tsx
similarity index 61%
rename from apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.js
rename to apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.tsx
index 08eafa0aebab..3ad469fe5840 100644
--- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.js
+++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/AgentsOverview.tsx
@@ -1,3 +1,5 @@
+import type { OperationParams } from '@rocket.chat/rest-typings';
+import type { MutableRefObject } from 'react';
import React from 'react';
import { useEndpointData } from '../../../../hooks/useEndpointData';
@@ -8,9 +10,14 @@ const overviewInitalValue = {
value: '-',
};
+type AgentsOverviewChartsProps = {
+ params: OperationParams<'GET', '/v1/livechat/analytics/dashboards/agents-productivity-totalizers'>;
+ reloadRef: MutableRefObject<{ [x: string]: () => void }>;
+};
+
const initialData = [overviewInitalValue, overviewInitalValue, overviewInitalValue];
-const AgentsOverview = ({ params, reloadRef, ...props }) => {
+const AgentsOverview = ({ params, reloadRef, ...props }: AgentsOverviewChartsProps) => {
const {
value: data,
phase: state,
diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.tsx
similarity index 60%
rename from apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.js
rename to apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.tsx
index c351d297c5c3..626f350cadeb 100644
--- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.js
+++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ChatsOverview.tsx
@@ -1,3 +1,5 @@
+import type { OperationParams } from '@rocket.chat/rest-typings';
+import type { MutableRefObject } from 'react';
import React from 'react';
import { useEndpointData } from '../../../../hooks/useEndpointData';
@@ -9,7 +11,12 @@ const initialData = [
{ title: '', value: '00:00:00' },
];
-const ChatsOverview = ({ params, reloadRef, ...props }) => {
+type ChatsOverviewProps = {
+ params: OperationParams<'GET', '/v1/livechat/analytics/dashboards/chats-totalizers'>;
+ reloadRef: MutableRefObject<{ [x: string]: () => void }>;
+};
+
+const ChatsOverview = ({ params, reloadRef, ...props }: ChatsOverviewProps) => {
const { value: data, phase: state, reload } = useEndpointData('/v1/livechat/analytics/dashboards/chats-totalizers', { params });
reloadRef.current.chatsOverview = reload;
diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.tsx
similarity index 61%
rename from apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.js
rename to apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.tsx
index 08d7a9d101e2..52cc76bfc1aa 100644
--- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.js
+++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ConversationOverview.tsx
@@ -1,3 +1,5 @@
+import type { OperationParams } from '@rocket.chat/rest-typings';
+import type { MutableRefObject } from 'react';
import React from 'react';
import { useEndpointData } from '../../../../hooks/useEndpointData';
@@ -10,7 +12,12 @@ const overviewInitalValue = {
const initialData = [overviewInitalValue, overviewInitalValue, overviewInitalValue, overviewInitalValue];
-const ConversationOverview = ({ params, reloadRef, ...props }) => {
+type ConversationOverviewProps = {
+ params: OperationParams<'GET', '/v1/livechat/analytics/dashboards/conversation-totalizers'>;
+ reloadRef: MutableRefObject<{ [x: string]: () => void }>;
+};
+
+const ConversationOverview = ({ params, reloadRef, ...props }: ConversationOverviewProps) => {
const { value: data, phase: state, reload } = useEndpointData('/v1/livechat/analytics/dashboards/conversation-totalizers', { params });
reloadRef.current.conversationOverview = reload;
diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.tsx
similarity index 60%
rename from apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.js
rename to apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.tsx
index 691a2e1b8840..8f3667077c3e 100644
--- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.js
+++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/overviews/ProductivityOverview.tsx
@@ -1,3 +1,5 @@
+import type { OperationParams } from '@rocket.chat/rest-typings';
+import type { MutableRefObject } from 'react';
import React from 'react';
import { useEndpointData } from '../../../../hooks/useEndpointData';
@@ -7,7 +9,12 @@ const defaultValue = { title: '', value: '00:00:00' };
const initialData = [defaultValue, defaultValue, defaultValue, defaultValue];
-const ProductivityOverview = ({ params, reloadRef, ...props }) => {
+type ProductivityOverviewProps = {
+ params: OperationParams<'GET', '/v1/livechat/analytics/dashboards/productivity-totalizers'>;
+ reloadRef: MutableRefObject<{ [x: string]: () => void }>;
+};
+
+const ProductivityOverview = ({ params, reloadRef, ...props }: ProductivityOverviewProps) => {
const { value: data, phase: state, reload } = useEndpointData('/v1/livechat/analytics/dashboards/productivity-totalizers', { params });
reloadRef.current.productivityOverview = reload;
diff --git a/apps/meteor/client/views/room/Header/HeaderIconWithRoom.tsx b/apps/meteor/client/views/room/Header/HeaderIconWithRoom.tsx
index 10de9166d964..98eb417cd611 100644
--- a/apps/meteor/client/views/room/Header/HeaderIconWithRoom.tsx
+++ b/apps/meteor/client/views/room/Header/HeaderIconWithRoom.tsx
@@ -14,7 +14,7 @@ type HeaderIconWithRoomProps = {
const HeaderIconWithRoom = ({ room }: HeaderIconWithRoomProps): ReactElement => {
const icon = useRoomIcon(room);
if (isOmnichannelRoom(room)) {
- return ;
+ return ;
}
return ;
diff --git a/apps/meteor/client/views/room/HeaderV2/HeaderIconWithRoom.tsx b/apps/meteor/client/views/room/HeaderV2/HeaderIconWithRoom.tsx
index 91cb397f30cc..33f34ec7a86a 100644
--- a/apps/meteor/client/views/room/HeaderV2/HeaderIconWithRoom.tsx
+++ b/apps/meteor/client/views/room/HeaderV2/HeaderIconWithRoom.tsx
@@ -14,7 +14,7 @@ type HeaderIconWithRoomProps = {
const HeaderIconWithRoom = ({ room }: HeaderIconWithRoomProps): ReactElement => {
const icon = useRoomIcon(room);
if (isOmnichannelRoom(room)) {
- return ;
+ return ;
}
return ;
diff --git a/apps/meteor/client/views/room/body/RetentionPolicyWarning.tsx b/apps/meteor/client/views/room/body/RetentionPolicyWarning.tsx
index f4939a261145..4629b812bbff 100644
--- a/apps/meteor/client/views/room/body/RetentionPolicyWarning.tsx
+++ b/apps/meteor/client/views/room/body/RetentionPolicyWarning.tsx
@@ -1,5 +1,5 @@
import type { IRoom } from '@rocket.chat/core-typings';
-import { Bubble, MessageDivider } from '@rocket.chat/fuselage';
+import { Box, Bubble } from '@rocket.chat/fuselage';
import { useTranslation } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import React from 'react';
@@ -13,11 +13,11 @@ const RetentionPolicyWarning = ({ room }: { room: IRoom }): ReactElement => {
const message = usePruneWarningMessage(room);
return (
-
+
{message}
-
+
);
};
diff --git a/apps/meteor/client/views/room/hooks/useRetentionPolicy.spec.ts b/apps/meteor/client/views/room/hooks/useRetentionPolicy.spec.ts
new file mode 100644
index 000000000000..9b99d6e4d781
--- /dev/null
+++ b/apps/meteor/client/views/room/hooks/useRetentionPolicy.spec.ts
@@ -0,0 +1,87 @@
+import { mockAppRoot } from '@rocket.chat/mock-providers';
+import { renderHook } from '@testing-library/react';
+
+import { createFakeRoom } from '../../../../tests/mocks/data';
+import { useRetentionPolicy } from './useRetentionPolicy';
+
+const getGlobalSettings = ({
+ enabled = false,
+ filesOnly = false,
+ doNotPrunePinned = false,
+ ignoreThreads = false,
+ appliesToChannels = false,
+ appliesToGroups = false,
+ appliesToDMs = false,
+}) => {
+ return mockAppRoot()
+ .withSetting('RetentionPolicy_Enabled', enabled)
+ .withSetting('RetentionPolicy_FilesOnly', filesOnly)
+ .withSetting('RetentionPolicy_DoNotPrunePinned', doNotPrunePinned)
+ .withSetting('RetentionPolicy_DoNotPruneThreads', ignoreThreads)
+ .withSetting('RetentionPolicy_AppliesToChannels', appliesToChannels)
+ .withSetting('RetentionPolicy_AppliesToGroups', appliesToGroups)
+ .withSetting('RetentionPolicy_AppliesToDMs', appliesToDMs);
+};
+
+const defaultValue = {
+ enabled: false,
+ isActive: false,
+ filesOnly: false,
+ excludePinned: false,
+ ignoreThreads: false,
+};
+
+const roomTypeConfig = {
+ c: { appliesToChannels: true },
+ p: { appliesToGroups: true },
+ d: { appliesToDMs: true },
+};
+
+const CHANNELS_TYPE = 'c';
+
+it('should return the default value if global retention is not enabled', async () => {
+ const fakeRoom = createFakeRoom({ t: CHANNELS_TYPE });
+
+ const { result } = renderHook(() => useRetentionPolicy(fakeRoom), {
+ legacyRoot: true,
+ wrapper: getGlobalSettings({}).build(),
+ });
+
+ expect(result.current).toEqual(expect.objectContaining(defaultValue));
+});
+
+it('should return enabled true if global retention is enabled', async () => {
+ const fakeRoom = createFakeRoom({ t: CHANNELS_TYPE });
+
+ const { result } = renderHook(() => useRetentionPolicy(fakeRoom), {
+ legacyRoot: true,
+ wrapper: getGlobalSettings({ enabled: true }).build(),
+ });
+
+ expect(result.current).toEqual(expect.objectContaining({ ...defaultValue, enabled: true }));
+});
+
+it('should return enabled and active true global retention is active for rooms of the type', async () => {
+ const fakeRoom = createFakeRoom({ t: CHANNELS_TYPE });
+
+ const { result } = renderHook(() => useRetentionPolicy(fakeRoom), {
+ legacyRoot: true,
+ wrapper: getGlobalSettings({ enabled: true, ...roomTypeConfig[CHANNELS_TYPE] }).build(),
+ });
+
+ expect(result.current).toEqual(expect.objectContaining({ ...defaultValue, enabled: true, isActive: true }));
+});
+
+it.failing(
+ 'should isActive be false if global retention is active for rooms of the type and room has retention.enabled false',
+ async () => {
+ const fakeRoom = createFakeRoom({ t: CHANNELS_TYPE, retention: { enabled: false } });
+
+ const { result } = renderHook(() => useRetentionPolicy(fakeRoom), {
+ legacyRoot: true,
+ wrapper: getGlobalSettings({ enabled: true, ...roomTypeConfig[CHANNELS_TYPE] }).build(),
+ });
+
+ expect(result.current?.isActive).toBe(false);
+ },
+);
diff --git a/apps/meteor/client/views/room/modals/ReadReceiptsModal/ReadReceiptsModal.tsx b/apps/meteor/client/views/room/modals/ReadReceiptsModal/ReadReceiptsModal.tsx
index c4da16264646..ca033c2dcb0d 100644
--- a/apps/meteor/client/views/room/modals/ReadReceiptsModal/ReadReceiptsModal.tsx
+++ b/apps/meteor/client/views/room/modals/ReadReceiptsModal/ReadReceiptsModal.tsx
@@ -1,11 +1,11 @@
import type { IMessage, ReadReceipt } from '@rocket.chat/core-typings';
-import { Skeleton } from '@rocket.chat/fuselage';
import { useMethod, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
import type { ReactElement } from 'react';
import React, { useEffect } from 'react';
import GenericModal from '../../../../components/GenericModal';
+import GenericModalSkeleton from '../../../../components/GenericModal/GenericModalSkeleton';
import ReadReceiptRow from './ReadReceiptRow';
type ReadReceiptsModalProps = {
@@ -29,11 +29,7 @@ const ReadReceiptsModal = ({ messageId, onClose }: ReadReceiptsModalProps): Reac
}, [dispatchToastMessage, t, onClose, readReceiptsResult.isError, readReceiptsResult.error]);
if (readReceiptsResult.isLoading || readReceiptsResult.isError) {
- return (
-
-
-
- );
+ return ;
}
const readReceipts = readReceiptsResult.data;
diff --git a/apps/meteor/client/views/teams/ConvertToChannelModal/ConvertToChannelModal.tsx b/apps/meteor/client/views/teams/ConvertToChannelModal/ConvertToChannelModal.tsx
index c29f6c0ec586..3efcdb89690f 100644
--- a/apps/meteor/client/views/teams/ConvertToChannelModal/ConvertToChannelModal.tsx
+++ b/apps/meteor/client/views/teams/ConvertToChannelModal/ConvertToChannelModal.tsx
@@ -20,7 +20,7 @@ const ConvertToChannelModal = ({ onClose, onCancel, onConfirm, teamId, userId }:
});
if (phase === AsyncStatePhase.LOADING) {
- return ;
+ return ;
}
return ;
diff --git a/apps/meteor/client/views/teams/contextualBar/channels/TeamsChannels.tsx b/apps/meteor/client/views/teams/contextualBar/channels/TeamsChannels.tsx
index 8bad02c135c8..b1847825ffab 100644
--- a/apps/meteor/client/views/teams/contextualBar/channels/TeamsChannels.tsx
+++ b/apps/meteor/client/views/teams/contextualBar/channels/TeamsChannels.tsx
@@ -110,7 +110,7 @@ const TeamsChannels = ({
{t('Total')}: {total}
-
+
{
- const t = useTranslation();
const query = useMemo(() => ({ teamId }), [teamId]);
const getTeamsListRooms = useEndpoint('GET', '/v1/teams.listRooms');
const { data, isLoading } = useQuery(['getTeamsListRooms', query], async () => getTeamsListRooms(query));
if (isLoading) {
- return (
- } confirmText={t('Cancel')}>
-
-
- );
+ return ;
}
return ;
};
diff --git a/apps/meteor/client/views/teams/contextualBar/info/LeaveTeam/LeaveTeamWithData.tsx b/apps/meteor/client/views/teams/contextualBar/info/LeaveTeam/LeaveTeamWithData.tsx
index 9bab0acc3d86..58f98705d2bb 100644
--- a/apps/meteor/client/views/teams/contextualBar/info/LeaveTeam/LeaveTeamWithData.tsx
+++ b/apps/meteor/client/views/teams/contextualBar/info/LeaveTeam/LeaveTeamWithData.tsx
@@ -1,11 +1,10 @@
import type { ITeam } from '@rocket.chat/core-typings';
-import { Skeleton } from '@rocket.chat/fuselage';
-import { useUserId, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts';
+import { useUserId, useEndpoint } from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
import type { ReactElement } from 'react';
import React from 'react';
-import GenericModal from '../../../../../components/GenericModal';
+import GenericModalSkeleton from '../../../../../components/GenericModal/GenericModalSkeleton';
import LeaveTeamModal from './LeaveTeamModal/LeaveTeamModal';
type LeaveTeamWithDataProps = {
@@ -15,7 +14,6 @@ type LeaveTeamWithDataProps = {
};
const LeaveTeamWithData = ({ teamId, onCancel, onConfirm }: LeaveTeamWithDataProps): ReactElement => {
- const t = useTranslation();
const userId = useUserId();
if (!userId) {
@@ -26,11 +24,7 @@ const LeaveTeamWithData = ({ teamId, onCancel, onConfirm }: LeaveTeamWithDataPro
const { data, isLoading } = useQuery(['teams.listRoomsOfUser'], () => getRoomsOfUser({ teamId, userId }));
if (isLoading) {
- return (
- } confirmText={t('Cancel')}>
-
-
- );
+ return ;
}
return ;
diff --git a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx
index fc1b2905478e..f28f4c8b5742 100644
--- a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx
+++ b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx
@@ -109,12 +109,13 @@ const TeamsInfo = ({
flexGrow={0}
key='menu'
maxHeight='initial'
+ title={t('More')}
secondary
renderItem={({ label: { label, icon }, ...props }): ReactElement => }
options={menuOptions}
/>
);
- }, [menuOptions]);
+ }, [t, menuOptions]);
const actions = useMemo(() => {
const mapAction = ([key, { label, icon, action }]: [string, Action]): ReactElement => (
diff --git a/apps/meteor/client/views/teams/contextualBar/members/RemoveUsersModal/RemoveUsersModal.js b/apps/meteor/client/views/teams/contextualBar/members/RemoveUsersModal/RemoveUsersModal.js
index 76a38b680692..f85d5434c1d1 100644
--- a/apps/meteor/client/views/teams/contextualBar/members/RemoveUsersModal/RemoveUsersModal.js
+++ b/apps/meteor/client/views/teams/contextualBar/members/RemoveUsersModal/RemoveUsersModal.js
@@ -1,8 +1,6 @@
-import { Skeleton } from '@rocket.chat/fuselage';
-import { useTranslation } from '@rocket.chat/ui-contexts';
import React, { useMemo } from 'react';
-import GenericModal from '../../../../../components/GenericModal';
+import GenericModalSkeleton from '../../../../../components/GenericModal/GenericModalSkeleton';
import { useEndpointData } from '../../../../../hooks/useEndpointData';
import { AsyncStatePhase } from '../../../../../lib/asyncState';
import BaseRemoveUsersModal from './BaseRemoveUsersModal';
@@ -10,7 +8,6 @@ import BaseRemoveUsersModal from './BaseRemoveUsersModal';
const initialData = { user: { username: '' } };
const RemoveUsersModal = ({ teamId, userId, onClose, onCancel, onConfirm }) => {
- const t = useTranslation();
const { value, phase } = useEndpointData('/v1/teams.listRoomsOfUser', { params: useMemo(() => ({ teamId, userId }), [teamId, userId]) });
const userDataFetch = useEndpointData('/v1/users.info', { params: useMemo(() => ({ userId }), [userId]), initialValue: initialData });
const {
@@ -18,11 +15,7 @@ const RemoveUsersModal = ({ teamId, userId, onClose, onCancel, onConfirm }) => {
} = userDataFetch?.value;
if (phase === AsyncStatePhase.LOADING) {
- return (
- } confirmText={t('Cancel')} onConfirm={onClose}>
-
-
- );
+ return ;
}
return ;
diff --git a/apps/meteor/ee/server/lib/audit/methods.ts b/apps/meteor/ee/server/lib/audit/methods.ts
index a3d32f0635d8..b8434a6ebbdd 100644
--- a/apps/meteor/ee/server/lib/audit/methods.ts
+++ b/apps/meteor/ee/server/lib/audit/methods.ts
@@ -88,11 +88,18 @@ Meteor.methods({
check(startDate, Date);
check(endDate, Date);
- const user = await Meteor.userAsync();
+ const user = (await Meteor.userAsync()) as IUser;
if (!user || !(await hasPermissionAsync(user._id, 'can-audit'))) {
throw new Meteor.Error('Not allowed');
}
+ const userFields = {
+ _id: user._id,
+ username: user.username,
+ ...(user.name && { name: user.name }),
+ ...(user.avatarETag && { avatarETag: user.avatarETag }),
+ };
+
const rooms: IRoom[] = await LivechatRooms.findByVisitorIdAndAgentId(visitor, agent, {
projection: { _id: 1 },
}).toArray();
@@ -118,7 +125,7 @@ Meteor.methods({
await AuditLog.insertOne({
ts: new Date(),
results: messages.length,
- u: user,
+ u: userFields,
fields: { msg, users: usernames, rids, room: name, startDate, endDate, type, visitor, agent },
});
@@ -128,11 +135,18 @@ Meteor.methods({
check(startDate, Date);
check(endDate, Date);
- const user = await Meteor.userAsync();
+ const user = (await Meteor.userAsync()) as IUser;
if (!user || !(await hasPermissionAsync(user._id, 'can-audit'))) {
throw new Meteor.Error('Not allowed');
}
+ const userFields = {
+ _id: user._id,
+ username: user.username,
+ ...(user.name && { name: user.name }),
+ ...(user.avatarETag && { avatarETag: user.avatarETag }),
+ };
+
let rids;
let name;
@@ -169,9 +183,10 @@ Meteor.methods({
await AuditLog.insertOne({
ts: new Date(),
results: messages.length,
- u: user,
+ u: userFields,
fields: { msg, users: usernames, rids, room: name, startDate, endDate, type, visitor, agent },
});
+
updateCounter({ settingsId: 'Message_Auditing_Panel_Load_Count' });
return messages;
@@ -183,13 +198,24 @@ Meteor.methods({
if (!uid || !(await hasPermissionAsync(uid, 'can-audit-log'))) {
throw new Meteor.Error('Not allowed');
}
- return AuditLog.find({
- // 'u._id': userId,
- ts: {
- $gt: startDate,
- $lt: endDate,
+ return AuditLog.find(
+ {
+ // 'u._id': userId,
+ ts: {
+ $gt: startDate,
+ $lt: endDate,
+ },
},
- }).toArray();
+ {
+ projection: {
+ 'u.services': 0,
+ 'u.roles': 0,
+ 'u.lastLogin': 0,
+ 'u.statusConnection': 0,
+ 'u.emails': 0,
+ },
+ },
+ ).toArray();
},
});
diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md
index 230250c5ca64..8ff59eaabd3e 100644
--- a/apps/meteor/ee/server/services/CHANGELOG.md
+++ b/apps/meteor/ee/server/services/CHANGELOG.md
@@ -1,5 +1,96 @@
# rocketchat-services
+## 1.3.3-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 1.3.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+## 1.3.3-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 1.3.3-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 1.3.3-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 1.3.3-rc.0
+
+### Patch Changes
+
+- Updated dependencies [c11f3722df, 7f88158036, b764c415dc, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 1.3.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 1.3.0
### Minor Changes
diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json
index 58b73351c4e0..25c198eebe45 100644
--- a/apps/meteor/ee/server/services/package.json
+++ b/apps/meteor/ee/server/services/package.json
@@ -1,7 +1,7 @@
{
"name": "rocketchat-services",
"private": true,
- "version": "1.3.0",
+ "version": "1.3.3-rc.4",
"description": "Rocket.Chat Authorization service",
"main": "index.js",
"scripts": {
@@ -18,7 +18,7 @@
"author": "Rocket.Chat",
"license": "MIT",
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-services": "workspace:^",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/emitter": "~0.31.25",
@@ -62,7 +62,7 @@
"pino-pretty": "^7.6.1",
"pm2": "^5.2.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../../package.json"
diff --git a/apps/meteor/package.json b/apps/meteor/package.json
index 9c49c2cb33f8..7323df058498 100644
--- a/apps/meteor/package.json
+++ b/apps/meteor/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/meteor",
"description": "The Ultimate Open Source WebChat Platform",
- "version": "6.12.0-develop",
+ "version": "6.12.0-rc.4",
"private": true,
"author": {
"name": "Rocket.Chat",
@@ -210,7 +210,7 @@
"supports-color": "~7.2.0",
"template-file": "^6.0.1",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"@babel/runtime": "~7.22.15",
@@ -230,7 +230,7 @@
"@rocket.chat/agenda": "workspace:^",
"@rocket.chat/api-client": "workspace:^",
"@rocket.chat/apps": "workspace:^",
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/base64": "workspace:^",
"@rocket.chat/cas-validate": "workspace:^",
"@rocket.chat/core-services": "workspace:^",
@@ -241,7 +241,7 @@
"@rocket.chat/favicon": "workspace:^",
"@rocket.chat/forked-matrix-appservice-bridge": "^4.0.2",
"@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.3",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/fuselage-polyfills": "~0.31.25",
"@rocket.chat/fuselage-toastbar": "^0.33.0",
@@ -430,7 +430,7 @@
"turndown": "^7.1.2",
"twilio": "^3.76.1",
"twit": "^2.2.11",
- "typia": "^5.3.3",
+ "typia": "~6.9.0",
"ua-parser-js": "^1.0.37",
"underscore": "^1.13.6",
"universal-perf-hooks": "^1.0.1",
diff --git a/apps/meteor/server/lib/ldap/Manager.ts b/apps/meteor/server/lib/ldap/Manager.ts
index ab000b142225..f0efcc04539d 100644
--- a/apps/meteor/server/lib/ldap/Manager.ts
+++ b/apps/meteor/server/lib/ldap/Manager.ts
@@ -165,7 +165,7 @@ export class LDAPManager {
const { attribute: idAttribute, value: id } = uniqueId;
const username = this.slugifyUsername(ldapUser, usedUsername || id || '') || undefined;
- const emails = this.getLdapEmails(ldapUser, username);
+ const emails = this.getLdapEmails(ldapUser, username).map((email) => email.trim());
const name = this.getLdapName(ldapUser) || undefined;
const userData: IImportUser = {
diff --git a/apps/meteor/server/methods/reportMessage.ts b/apps/meteor/server/methods/reportMessage.ts
index cc240a2fb291..a2a1deca45fa 100644
--- a/apps/meteor/server/methods/reportMessage.ts
+++ b/apps/meteor/server/methods/reportMessage.ts
@@ -3,6 +3,7 @@ import type { IMessage } from '@rocket.chat/core-typings';
import type { ServerMethods } from '@rocket.chat/ddp-client';
import { ModerationReports, Rooms, Users, Messages } from '@rocket.chat/models';
import { check } from 'meteor/check';
+import { DDPRateLimiter } from 'meteor/ddp-rate-limiter';
import { Meteor } from 'meteor/meteor';
import { canAccessRoomAsync } from '../../app/authorization/server/functions/canAccessRoom';
@@ -82,3 +83,15 @@ Meteor.methods({
return true;
},
});
+
+DDPRateLimiter.addRule(
+ {
+ type: 'method',
+ name: 'reportMessage',
+ userId() {
+ return true;
+ },
+ },
+ 5,
+ 60000,
+);
diff --git a/apps/meteor/server/methods/sendConfirmationEmail.ts b/apps/meteor/server/methods/sendConfirmationEmail.ts
index b79d037c252f..c7b3098b1698 100644
--- a/apps/meteor/server/methods/sendConfirmationEmail.ts
+++ b/apps/meteor/server/methods/sendConfirmationEmail.ts
@@ -2,6 +2,7 @@ import type { ServerMethods } from '@rocket.chat/ddp-client';
import { Users } from '@rocket.chat/models';
import { Accounts } from 'meteor/accounts-base';
import { check } from 'meteor/check';
+import { DDPRateLimiter } from 'meteor/ddp-rate-limiter';
import { Meteor } from 'meteor/meteor';
import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger';
@@ -31,3 +32,15 @@ Meteor.methods({
}
},
});
+
+DDPRateLimiter.addRule(
+ {
+ type: 'method',
+ name: 'sendConfirmationEmail',
+ userId() {
+ return true;
+ },
+ },
+ 5,
+ 60000,
+);
diff --git a/apps/meteor/server/models/raw/LivechatContacts.ts b/apps/meteor/server/models/raw/LivechatContacts.ts
index 1f5f29a3cc78..88dac1b9f5c1 100644
--- a/apps/meteor/server/models/raw/LivechatContacts.ts
+++ b/apps/meteor/server/models/raw/LivechatContacts.ts
@@ -8,4 +8,13 @@ export class LivechatContactsRaw extends BaseRaw implements IL
constructor(db: Db, trash?: Collection>) {
super(db, 'livechat_contact', trash);
}
+
+ async updateContact(contactId: string, data: Partial): Promise {
+ const updatedValue = await this.findOneAndUpdate(
+ { _id: contactId },
+ { $set: { ...data, unknown: false } },
+ { returnDocument: 'after' },
+ );
+ return updatedValue.value as ILivechatContact;
+ }
}
diff --git a/apps/meteor/server/models/raw/LivechatRooms.ts b/apps/meteor/server/models/raw/LivechatRooms.ts
index b01d7e62c5ff..ae03d67251ec 100644
--- a/apps/meteor/server/models/raw/LivechatRooms.ts
+++ b/apps/meteor/server/models/raw/LivechatRooms.ts
@@ -91,22 +91,31 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
options?: { offset?: number; count?: number; sort?: { [k: string]: number } };
}) {
const match: Document = { $match: { t: 'l', open: true, servedBy: { $exists: true } } };
- const matchUsers: Document = { $match: {} };
+
if (departmentId && departmentId !== 'undefined') {
match.$match.departmentId = departmentId;
}
- if (agentId) {
- matchUsers.$match['user._id'] = agentId;
- }
- if (!includeOfflineAgents) {
- matchUsers.$match['user.status'] = { $ne: 'offline' };
- matchUsers.$match['user.statusLivechat'] = { $eq: 'available' };
- }
+
const departmentsLookup = {
$lookup: {
from: 'rocketchat_livechat_department',
- localField: 'departmentId',
- foreignField: '_id',
+ let: {
+ deptId: '$departmentId',
+ },
+ pipeline: [
+ {
+ $match: {
+ $expr: {
+ $eq: ['$_id', '$$deptId'],
+ },
+ },
+ },
+ {
+ $project: {
+ name: 1,
+ },
+ },
+ ],
as: 'departments',
},
};
@@ -116,27 +125,40 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
preserveNullAndEmptyArrays: true,
},
};
- const departmentsGroup = {
- $group: {
- _id: {
- departmentId: '$departmentId',
- name: '$departments.name',
- room: '$$ROOT',
- },
- },
- };
+
const usersLookup = {
$lookup: {
from: 'users',
- localField: '_id.room.servedBy._id',
- foreignField: '_id',
+ let: {
+ servedById: '$servedBy._id',
+ },
+ pipeline: [
+ {
+ $match: {
+ $expr: {
+ $eq: ['$_id', '$$servedById'],
+ },
+ ...(!includeOfflineAgents && {
+ status: { $ne: 'offline' },
+ statusLivechat: 'available',
+ }),
+ ...(agentId && { _id: agentId }),
+ },
+ },
+ {
+ $project: {
+ _id: 1,
+ username: 1,
+ status: 1,
+ },
+ },
+ ],
as: 'user',
},
};
const usersUnwind = {
$unwind: {
path: '$user',
- preserveNullAndEmptyArrays: true,
},
};
const usersGroup = {
@@ -145,8 +167,8 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
userId: '$user._id',
username: '$user.username',
status: '$user.status',
- departmentId: '$_id.departmentId',
- departmentName: '$_id.name',
+ departmentId: '$departmentId',
+ departmentName: '$departments.name',
},
chats: { $sum: 1 },
},
@@ -160,16 +182,13 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
status: '$_id.status',
},
department: {
- _id: { $ifNull: ['$_id.departmentId', null] },
- name: { $ifNull: ['$_id.departmentName', null] },
+ _id: '$_id.departmentId',
+ name: '$_id.departmentName',
},
chats: 1,
},
};
- const firstParams = [match, departmentsLookup, departmentsUnwind, departmentsGroup, usersLookup, usersUnwind];
- if (Object.keys(matchUsers.$match)) {
- firstParams.push(matchUsers);
- }
+ const firstParams = [match, departmentsLookup, departmentsUnwind, usersLookup, usersUnwind];
const sort: Document = { $sort: options.sort || { chats: -1 } };
const pagination = [sort];
@@ -188,6 +207,7 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
};
const params = [...firstParams, usersGroup, project, facet];
+
return this.col.aggregate(params, { readPreference: readSecondaryPreferred(), allowDiskUse: true }).toArray();
}
diff --git a/apps/meteor/server/services/federation/Federation.ts b/apps/meteor/server/services/federation/Federation.ts
index c8e2a9b1bc57..34331dc00971 100644
--- a/apps/meteor/server/services/federation/Federation.ts
+++ b/apps/meteor/server/services/federation/Federation.ts
@@ -17,7 +17,9 @@ const allowedActionsInFederatedRooms: ValueOf[] = [
RoomMemberActions.LEAVE,
];
-const allowedActionsForModerators = allowedActionsInFederatedRooms.filter((action) => action !== RoomMemberActions.SET_AS_OWNER);
+const allowedActionsForModerators: ValueOf[] = allowedActionsInFederatedRooms.filter(
+ (action) => action !== RoomMemberActions.SET_AS_OWNER,
+);
const allowedRoomSettingsChangesInFederatedRooms: ValueOf[] = [RoomSettingsEnum.NAME, RoomSettingsEnum.TOPIC];
diff --git a/apps/meteor/server/services/omnichannel-integrations/providers/mobex.ts b/apps/meteor/server/services/omnichannel-integrations/providers/mobex.ts
index 19284b8e1e6b..d036345663cd 100644
--- a/apps/meteor/server/services/omnichannel-integrations/providers/mobex.ts
+++ b/apps/meteor/server/services/omnichannel-integrations/providers/mobex.ts
@@ -1,6 +1,7 @@
import { Base64 } from '@rocket.chat/base64';
import type { ISMSProvider, ServiceData, SMSProviderResult, SMSProviderResponse } from '@rocket.chat/core-typings';
import { serverFetch as fetch } from '@rocket.chat/server-fetch';
+import type { Request } from 'express';
import { settings } from '../../../../app/settings/server';
import { SystemLogger } from '../../../lib/logger/system';
@@ -196,6 +197,10 @@ export class Mobex implements ISMSProvider {
};
}
+ validateRequest(_request: Request): boolean {
+ return true;
+ }
+
error(error: Error & { reason?: string }): SMSProviderResponse {
let message = '';
if (error.reason) {
diff --git a/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts b/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts
index 3aff869a95a0..4a1c8d9d0ebf 100644
--- a/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts
+++ b/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts
@@ -1,6 +1,7 @@
import { api } from '@rocket.chat/core-services';
import type { ISMSProvider, ServiceData, SMSProviderResponse, SMSProviderResult } from '@rocket.chat/core-typings';
import { Users } from '@rocket.chat/models';
+import type { Request } from 'express';
import filesize from 'filesize';
import twilio from 'twilio';
@@ -244,6 +245,31 @@ export class Twilio implements ISMSProvider {
};
}
+ isRequestFromTwilio(signature: string, requestBody: object): boolean {
+ const authToken = settings.get('SMS_Twilio_authToken');
+ const siteUrl = settings.get('Site_Url');
+
+ if (!authToken || !siteUrl) {
+ SystemLogger.error(`(Twilio) -> URL or Twilio token not configured.`);
+ return false;
+ }
+
+ const twilioUrl = siteUrl.endsWith('/')
+ ? `${siteUrl}api/v1/livechat/sms-incoming/twilio`
+ : `${siteUrl}/api/v1/livechat/sms-incoming/twilio`;
+ return twilio.validateRequest(authToken, signature, twilioUrl, requestBody);
+ }
+
+ validateRequest(request: Request): boolean {
+ // We're not getting original twilio requests on CI :p
+ if (process.env.TEST_MODE === 'true') {
+ return true;
+ }
+ const twilioHeader = request.headers['x-twilio-signature'] || '';
+ const twilioSignature = Array.isArray(twilioHeader) ? twilioHeader[0] : twilioHeader;
+ return this.isRequestFromTwilio(twilioSignature, request.body);
+ }
+
error(error: Error & { reason?: string }): SMSProviderResponse {
let message = '';
if (error.reason) {
diff --git a/apps/meteor/server/services/omnichannel-integrations/providers/voxtelesys.ts b/apps/meteor/server/services/omnichannel-integrations/providers/voxtelesys.ts
index 3e78907bbf75..aa42bacad624 100644
--- a/apps/meteor/server/services/omnichannel-integrations/providers/voxtelesys.ts
+++ b/apps/meteor/server/services/omnichannel-integrations/providers/voxtelesys.ts
@@ -2,6 +2,7 @@ import { api } from '@rocket.chat/core-services';
import type { ISMSProvider, ServiceData, SMSProviderResponse } from '@rocket.chat/core-typings';
import { Users } from '@rocket.chat/models';
import { serverFetch as fetch } from '@rocket.chat/server-fetch';
+import type { Request } from 'express';
import filesize from 'filesize';
import { settings } from '../../../../app/settings/server';
@@ -162,6 +163,10 @@ export class Voxtelesys implements ISMSProvider {
};
}
+ validateRequest(_request: Request): boolean {
+ return true;
+ }
+
error(error: Error & { reason?: string }): SMSProviderResponse {
let message = '';
if (error.reason) {
diff --git a/apps/meteor/server/settings/message.ts b/apps/meteor/server/settings/message.ts
index 6ec6e3355655..520af87d2333 100644
--- a/apps/meteor/server/settings/message.ts
+++ b/apps/meteor/server/settings/message.ts
@@ -32,7 +32,7 @@ export const createMessageSettings = () =>
],
});
- await this.add('Message_Attachments_Strip_Exif', false, {
+ await this.add('Message_Attachments_Strip_Exif', true, {
type: 'boolean',
public: true,
i18nDescription: 'Message_Attachments_Strip_ExifDescription',
diff --git a/apps/meteor/server/startup/cloudRegistration.ts b/apps/meteor/server/startup/cloudRegistration.ts
index 65d870de4d89..e69d4446d6ec 100644
--- a/apps/meteor/server/startup/cloudRegistration.ts
+++ b/apps/meteor/server/startup/cloudRegistration.ts
@@ -1,7 +1,5 @@
import { Settings } from '@rocket.chat/models';
-import { notifyOnSettingChangedById } from '../../app/lib/server/lib/notifyListener';
-
export async function ensureCloudWorkspaceRegistered(): Promise {
const cloudWorkspaceClientId = await Settings.getValueById('Cloud_Workspace_Client_Id');
const cloudWorkspaceClientSecret = await Settings.getValueById('Cloud_Workspace_Client_Secret');
@@ -18,6 +16,5 @@ export async function ensureCloudWorkspaceRegistered(): Promise {
}
// otherwise, set the setup wizard to in_progress forcing admins to complete the registration
- (await Settings.updateValueById('Show_Setup_Wizard', 'in_progress')).modifiedCount &&
- void notifyOnSettingChangedById('Show_Setup_Wizard');
+ await Settings.updateValueById('Show_Setup_Wizard', 'in_progress');
}
diff --git a/apps/meteor/tests/e2e/channel-management.spec.ts b/apps/meteor/tests/e2e/channel-management.spec.ts
index dc0ec9b1ebaa..cd3ab365240f 100644
--- a/apps/meteor/tests/e2e/channel-management.spec.ts
+++ b/apps/meteor/tests/e2e/channel-management.spec.ts
@@ -64,7 +64,7 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.members.addUser('user1');
await expect(poHomeChannel.tabs.members.memberOption('user1')).toBeVisible();
- await expect(poHomeChannel.getSystemMessageByText('added user1')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('added user1')).toBeVisible();
});
test('should edit topic of targetChannel', async ({ page }) => {
@@ -78,7 +78,7 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.btnRoomInfo.click();
await expect(page.getByRole('heading', { name: 'hello-topic-edited' })).toBeVisible();
await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-topic-edited');
- await expect(poHomeChannel.getSystemMessageByText('changed room topic to hello-topic-edited')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('changed room topic to hello-topic-edited')).toBeVisible();
});
test('should edit announcement of targetChannel', async ({ page }) => {
@@ -91,7 +91,7 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.dismissToast();
await poHomeChannel.tabs.btnRoomInfo.click();
await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-announcement-edited');
- await expect(poHomeChannel.getSystemMessageByText('changed room announcement to: hello-announcement-edited')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('changed room announcement to: hello-announcement-edited')).toBeVisible();
});
test('should edit description of targetChannel', async ({ page }) => {
@@ -104,7 +104,7 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.dismissToast();
await poHomeChannel.tabs.btnRoomInfo.click();
await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-description-edited');
- await expect(poHomeChannel.getSystemMessageByText('changed room description to: hello-description-edited')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('changed room description to: hello-description-edited')).toBeVisible();
});
test('should edit name of targetChannel', async ({ page }) => {
@@ -202,11 +202,11 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.members.showAllUsers();
await poHomeChannel.tabs.members.muteUser('user1');
- await expect(poHomeChannel.getSystemMessageByText('muted user1')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('muted user1')).toBeVisible();
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await expect(user1Channel.readOnlyFooter).toBeVisible();
});
@@ -216,11 +216,11 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.members.showAllUsers();
await poHomeChannel.tabs.members.unmuteUser('user1');
- await expect(poHomeChannel.getSystemMessageByText('unmuted user1')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('unmuted user1')).toBeVisible();
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await expect(user1Channel.composer).toBeVisible();
});
@@ -230,11 +230,11 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.members.showAllUsers();
await poHomeChannel.tabs.members.setUserAsModerator('user1');
- await expect(poHomeChannel.getSystemMessageByText('set user1 as moderator')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('set user1 as moderator')).toBeVisible();
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await user1Channel.tabs.btnRoomInfo.click();
await expect(user1Channel.tabs.room.btnEdit).toBeVisible();
});
@@ -245,12 +245,12 @@ test.describe.serial('channel-management', () => {
await poHomeChannel.tabs.members.showAllUsers();
await poHomeChannel.tabs.members.setUserAsOwner('user1');
- await expect(poHomeChannel.getSystemMessageByText('set user1 as owner')).toBeVisible();
+ await expect(poHomeChannel.content.getSystemMessageByText('set user1 as owner')).toBeVisible();
const user1Page = await browser.newPage({ storageState: Users.user1.state });
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await user1Channel.tabs.btnRoomInfo.click();
await user1Channel.tabs.room.btnMore.click();
@@ -271,7 +271,7 @@ test.describe.serial('channel-management', () => {
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await user1Channel.content.sendMessage('message to check ignore');
await expect(poHomeChannel.content.lastUserMessageBody).toContainText('This message was ignored');
@@ -282,7 +282,7 @@ test.describe.serial('channel-management', () => {
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await user1Channel.content.sendMessage('only message to be unignored');
await poHomeChannel.sidenav.openChat(targetChannel);
@@ -295,7 +295,7 @@ test.describe.serial('channel-management', () => {
test('should unignore user1 messages', async () => {
const user1Channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${targetChannel}`);
- await user1Channel.waitForChannel();
+ await user1Channel.content.waitForChannel();
await user1Channel.content.sendMessage('message before being unignored');
await poHomeChannel.sidenav.openChat(targetChannel);
@@ -327,7 +327,7 @@ test.describe.serial('channel-management', () => {
const channel = new HomeChannel(user1Page);
await user1Page.goto(`/channel/${channelName}`);
- await channel.waitForChannel();
+ await channel.content.waitForChannel();
await expect(user1Page.locator('button >> text="Join"')).toBeVisible();
});
});
diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-queue-management.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-queue-management.spec.ts
new file mode 100644
index 000000000000..ee91c49bfb16
--- /dev/null
+++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-queue-management.spec.ts
@@ -0,0 +1,120 @@
+import { createFakeVisitor } from '../../mocks/data';
+import { IS_EE } from '../config/constants';
+import { createAuxContext } from '../fixtures/createAuxContext';
+import { Users } from '../fixtures/userStates';
+import { HomeOmnichannel, OmnichannelLiveChat } from '../page-objects';
+import { test, expect } from '../utils/test';
+
+const firstVisitor = createFakeVisitor();
+
+const secondVisitor = createFakeVisitor();
+
+test.use({ storageState: Users.user1.state });
+
+test.describe('OC - Livechat - Queue Management', () => {
+ test.skip(!IS_EE, 'Enterprise Only');
+
+ let poHomeOmnichannel: HomeOmnichannel;
+ let poLiveChat: OmnichannelLiveChat;
+
+ const waitingQueueMessage = 'This is a message from Waiting Queue';
+ const queuePosition1 = 'Your spot is #1';
+ const queuePosition2 = 'Your spot is #2';
+
+ test.beforeAll(async ({ api, browser }) => {
+ await Promise.all([
+ api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }),
+ api.post('/settings/Livechat_waiting_queue', { value: true }),
+ api.post('/settings/Livechat_waiting_queue_message', { value: waitingQueueMessage }),
+ api.post('/livechat/users/agent', { username: 'user1' }),
+ ]);
+
+ const { page: omniPage } = await createAuxContext(browser, Users.user1, '/', true);
+ poHomeOmnichannel = new HomeOmnichannel(omniPage);
+ });
+
+ test.beforeEach(async ({ browser, api }) => {
+ const context = await browser.newContext();
+ const page2 = await context.newPage();
+
+ poLiveChat = new OmnichannelLiveChat(page2, api);
+ await poLiveChat.page.goto('/livechat');
+ });
+
+ test.afterAll(async ({ api }) => {
+ await Promise.all([
+ api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }),
+ api.post('/settings/Livechat_waiting_queue', { value: false }),
+ api.post('/settings/Livechat_waiting_queue_message', { value: '' }),
+ api.delete('/livechat/users/agent/user1'),
+ ]);
+ await poHomeOmnichannel.page.close();
+ });
+
+ test.afterEach(async () => {
+ await poLiveChat.closeChat();
+ await poLiveChat.page.close();
+ });
+
+ test('OC - Queue Management - Waiting Queue Message enabled', async () => {
+ await test.step('should start livechat session', async () => {
+ await poLiveChat.openAnyLiveChatAndSendMessage({
+ liveChatUser: firstVisitor,
+ message: 'Test message',
+ isOffline: false,
+ });
+ });
+ await test.step('expect to receive Waiting Queue message on chat', async () => {
+ await expect(poLiveChat.page.locator(`div >> text=${waitingQueueMessage}`)).toBeVisible();
+ });
+ });
+
+ test.describe('OC - Queue Management - Update Queue Position', () => {
+ let poLiveChat2: OmnichannelLiveChat;
+
+ test.beforeEach(async ({ browser, api }) => {
+ const context = await browser.newContext();
+ const page = await context.newPage();
+ poLiveChat2 = new OmnichannelLiveChat(page, api);
+ await poLiveChat2.page.goto('/livechat');
+ });
+
+ test.afterEach(async () => {
+ await poLiveChat2.closeChat();
+ await poLiveChat2.page.close();
+ });
+
+ test('Update user position on Queue', async () => {
+ await test.step('should start secondary livechat session', async () => {
+ await poLiveChat2.openAnyLiveChatAndSendMessage({
+ liveChatUser: secondVisitor,
+ message: 'Test message',
+ isOffline: false,
+ });
+ });
+
+ await test.step('should start primary livechat session', async () => {
+ await poLiveChat.openAnyLiveChatAndSendMessage({
+ liveChatUser: firstVisitor,
+ message: 'Test message',
+ isOffline: false,
+ });
+ });
+
+ await test.step('should verify the queue position of the primary user', async () => {
+ await expect(poLiveChat.page.locator(`div[role='alert'] >> text=${queuePosition2}`)).toBeVisible();
+ });
+
+ await test.step('should allow the agent to take the secondary user chat', async () => {
+ await poHomeOmnichannel.sidenav.getQueuedChat(secondVisitor.name).click();
+ await expect(poHomeOmnichannel.content.btnTakeChat).toBeVisible();
+ await poHomeOmnichannel.content.btnTakeChat.click();
+ await expect(poHomeOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel');
+ });
+
+ await test.step('expect the queue position of the primary user to update after the secondary users chat is taken', async () => {
+ await expect(poLiveChat.page.locator(`div[role='alert'] >> text=${queuePosition1}`)).toBeVisible();
+ });
+ });
+ });
+});
diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts
index 9c1b5fdd5948..cd33a56caa04 100644
--- a/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts
+++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts
@@ -185,11 +185,14 @@ test.describe('OC - Manage Units', () => {
await poOmnichannelUnits.btnSave.click();
});
- await test.step('expect department to be in the chosen departments list', async () => {
+ await test.step('expect department to be in the chosen departments list and have title', async () => {
await poOmnichannelUnits.search(unit.name);
await poOmnichannelUnits.findRowByName(unit.name).click();
await expect(poOmnichannelUnits.contextualBar).toBeVisible();
- await expect(page.getByRole('option', { name: department2.data.name })).toBeVisible();
+ await expect(poOmnichannelUnits.selectOptionChip(department2.data.name)).toBeVisible();
+ await poOmnichannelUnits.selectOptionChip(department2.data.name).hover();
+
+ await expect(page.getByRole('tooltip', { name: department2.data.name })).toBeVisible();
await poOmnichannelUnits.btnContextualbarClose.click();
});
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
index ec761ddbfa73..9d5e2081ca93 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
@@ -2,6 +2,8 @@ import fs from 'fs/promises';
import type { Locator, Page } from '@playwright/test';
+import { expect } from '../../utils/test';
+
export class HomeContent {
protected readonly page: Page;
@@ -376,7 +378,19 @@ export class HomeContent {
return this.page.locator('div[class="swiper-slide swiper-slide-active"] img');
}
+ // TODO: use getSystemMessageByText instead
findSystemMessage(text: string): Locator {
return this.page.locator(`[data-qa-type="system-message-body"] >> text="${text}"`);
}
+
+ getSystemMessageByText(text: string): Locator {
+ return this.page.locator('[aria-roledescription="system message"]', { hasText: text });
+ }
+
+ async waitForChannel(): Promise {
+ await this.page.locator('role=main').waitFor();
+ await this.page.locator('role=main >> role=heading[level=1]').waitFor();
+
+ await expect(this.page.locator('role=main >> role=list')).not.toHaveAttribute('aria-busy', 'true');
+ }
}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-channels.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-channels.ts
index b09e90d0cd61..98d864598834 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-channels.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-channels.ts
@@ -7,6 +7,10 @@ export class HomeFlextabChannels {
this.page = page;
}
+ get channelsTab(): Locator {
+ return this.page.getByRole('dialog', { exact: true });
+ }
+
get btnAddExisting(): Locator {
return this.page.locator('button >> text="Add Existing"');
}
@@ -18,4 +22,24 @@ export class HomeFlextabChannels {
get btnAdd(): Locator {
return this.page.locator('role=dialog >> role=group >> role=button[name=Add]');
}
+
+ get channelsList(): Locator {
+ return this.channelsTab.getByRole('list');
+ }
+
+ channelOption(name: string) {
+ return this.channelsTab.locator('li', { hasText: name });
+ }
+
+ async openChannelOptionMoreActions(name: string) {
+ await this.channelOption(name).hover();
+ await this.channelOption(name).locator('role=button[name="More"]').click();
+ }
+
+ async confirmRemoveChannel() {
+ return this.page
+ .getByRole('dialog', { name: 'Are you sure?', exact: true })
+ .getByRole('button', { name: 'Remove', exact: true })
+ .click();
+ }
}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts
index d4a9638691be..6a2740831e2c 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts
@@ -79,4 +79,12 @@ export class HomeFlextabMembers {
async unignoreUser(username: string) {
await this.ignoreUserAction('Unignore', username);
}
+
+ get confirmRemoveUserModal() {
+ return this.page.getByRole('dialog', { name: 'Confirmation', exact: true });
+ }
+
+ async confirmRemoveUser() {
+ return this.confirmRemoveUserModal.getByRole('button', { name: 'Remove', exact: true }).click();
+ }
}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts
index 78d536448a75..f0eb7b726d45 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts
@@ -7,6 +7,10 @@ export class HomeFlextabRoom {
this.page = page;
}
+ get roomInfoTab(): Locator {
+ return this.page.getByRole('dialog', { exact: true });
+ }
+
get btnEdit(): Locator {
return this.page.locator('role=button[name="Edit"]');
}
@@ -15,6 +19,42 @@ export class HomeFlextabRoom {
return this.page.locator('role=button[name="More"]');
}
+ get btnLeave(): Locator {
+ return this.roomInfoTab.locator('role=button[name="Leave"]');
+ }
+
+ get btnDelete(): Locator {
+ return this.roomInfoTab.locator('role=button[name="Delete"]');
+ }
+
+ getMoreOption(option: string) {
+ return this.roomInfoTab.locator(`role=menuitem[name="${option}"]`);
+ }
+
+ get confirmLeaveModal(): Locator {
+ return this.page.getByRole('dialog', { name: 'Confirmation', exact: true });
+ }
+
+ async confirmLeave() {
+ return this.confirmLeaveModal.getByRole('button', { name: 'Leave', exact: true }).click();
+ }
+
+ get confirmDeleteTeamModal(): Locator {
+ return this.page.getByRole('dialog', { name: 'Delete team', exact: true });
+ }
+
+ async confirmDeleteTeam() {
+ return this.confirmDeleteTeamModal.getByRole('button', { name: 'Yes, delete', exact: true }).click();
+ }
+
+ get confirmConvertModal(): Locator {
+ return this.page.getByRole('dialog', { name: 'Confirmation', exact: true });
+ }
+
+ async confirmConvert() {
+ return this.confirmConvertModal.getByRole('button', { name: 'Convert', exact: true }).click();
+ }
+
get optionDelete(): Locator {
return this.page.locator('label[data-key="delete"]');
}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts
index 2ae5acf5fb9d..6e22bea99faf 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts
@@ -36,6 +36,10 @@ export class HomeFlextab {
return this.page.locator('[data-qa-id="ToolBoxAction-hash"]');
}
+ get btnTeamMembers(): Locator {
+ return this.page.locator('role=menuitem[name="Teams Members"]');
+ }
+
get kebab(): Locator {
return this.page.locator('role=button[name="Options"]');
}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts
index 0f17b7ccb5d4..d0bdd5028010 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts
@@ -95,7 +95,16 @@ export class HomeSidenav {
}
async openSearch(): Promise {
- await this.page.locator('role=button[name="Search"]').click();
+ await this.page.locator('role=navigation >> role=button[name=Search]').click();
+ }
+
+ getSearchRoomByName(name: string): Locator {
+ return this.page.locator(`role=search >> role=listbox >> role=link >> text="${name}"`);
+ }
+
+ async searchRoom(name: string): Promise {
+ await this.openSearch();
+ await this.page.locator('role=search >> role=searchbox').fill(name);
}
async logout(): Promise {
@@ -109,9 +118,8 @@ export class HomeSidenav {
}
async openChat(name: string): Promise {
- await this.page.locator('role=navigation >> role=button[name=Search]').click();
- await this.page.locator('role=search >> role=searchbox').fill(name);
- await this.page.locator(`role=search >> role=listbox >> role=link >> text="${name}"`).click();
+ await this.searchRoom(name);
+ await this.getSearchRoomByName(name).click();
await this.waitForChannel();
}
diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts
index 7b3c0d093ddc..a2784ea4c67b 100644
--- a/apps/meteor/tests/e2e/page-objects/home-channel.ts
+++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts
@@ -1,6 +1,5 @@
import type { Locator, Page } from '@playwright/test';
-import { expect } from '../utils/test';
import { HomeContent, HomeSidenav, HomeFlextab } from './fragments';
export class HomeChannel {
@@ -27,14 +26,6 @@ export class HomeChannel {
return this.page.locator('[data-qa="ContextualbarActionClose"]');
}
- async waitForChannel(): Promise {
- await this.page.locator('role=main').waitFor();
- await this.page.locator('role=main >> role=heading[level=1]').waitFor();
-
- await expect(this.page.locator('role=main >> .rcx-skeleton')).toHaveCount(0);
- await expect(this.page.locator('role=main >> role=list')).not.toHaveAttribute('aria-busy', 'true');
- }
-
async dismissToast() {
// this is a workaround for when the toast is blocking the click of the button
await this.toastSuccess.locator('button >> i.rcx-icon--name-cross.rcx-icon').click();
@@ -68,8 +59,4 @@ export class HomeChannel {
get roomHeaderToolbar(): Locator {
return this.page.locator('[role=toolbar][aria-label="Primary Room actions"]');
}
-
- getSystemMessageByText(text: string): Locator {
- return this.page.locator('[aria-roledescription="system message"]', { hasText: text });
- }
}
diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
index 330fc981237f..e52ae45782c8 100644
--- a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
+++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts
@@ -88,6 +88,19 @@ export class OmnichannelLiveChat {
await this.btnNewChat.click();
}
+ async openAnyLiveChatAndSendMessage(params: {
+ liveChatUser: { name: string; email: string };
+ message: string;
+ isOffline?: boolean;
+ department?: string;
+ }): Promise {
+ const { liveChatUser, message, isOffline, department } = params;
+ await this.openAnyLiveChat();
+ await this.sendMessage(liveChatUser, isOffline, department);
+ await this.onlineAgentMessage.fill(message);
+ await this.btnSendMessageToOnlineAgent.click();
+ }
+
unreadMessagesBadge(count: number): Locator {
const name = count === 1 ? `${count} unread message` : `${count} unread messages`;
diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts
index abcd794f8efa..2d0e24073a45 100644
--- a/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts
+++ b/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts
@@ -43,6 +43,10 @@ export class OmnichannelUnits extends OmnichannelAdministration {
return this.page.locator(`[role=option][value="${name}"]`);
}
+ public selectOptionChip(name: string) {
+ return this.page.getByRole('option', { name });
+ }
+
async selectDepartment({ name, _id }: { name: string; _id: string }) {
await this.inputDepartments.click();
await this.inputDepartments.fill(name);
diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts
index 4f6b9ce3ff23..9d6dab66448d 100644
--- a/apps/meteor/tests/e2e/retention-policy.spec.ts
+++ b/apps/meteor/tests/e2e/retention-policy.spec.ts
@@ -119,7 +119,7 @@ test.describe.serial('retention-policy', () => {
await auxContext.poHomeChannel.tabs.room.checkboxReadOnly.check();
await auxContext.poHomeChannel.tabs.room.btnSave.click();
- await expect(auxContext.poHomeChannel.getSystemMessageByText('set room to read only')).toBeVisible();
+ await expect(auxContext.poHomeChannel.content.getSystemMessageByText('set room to read only')).toBeVisible();
});
});
diff --git a/apps/meteor/tests/e2e/team-management.spec.ts b/apps/meteor/tests/e2e/team-management.spec.ts
index 350d55dfaab6..690fa2b5b5dd 100644
--- a/apps/meteor/tests/e2e/team-management.spec.ts
+++ b/apps/meteor/tests/e2e/team-management.spec.ts
@@ -24,18 +24,18 @@ test.describe.serial('teams-management', () => {
await page.goto('/home');
});
- test('expect create "targetTeam" private', async ({ page }) => {
+ test('should create targetTeam private', async ({ page }) => {
await poHomeTeam.sidenav.openNewByLabel('Team');
- await poHomeTeam.inputTeamName.type(targetTeam);
+ await poHomeTeam.inputTeamName.fill(targetTeam);
await poHomeTeam.addMember('user1');
await poHomeTeam.btnTeamCreate.click();
await expect(page).toHaveURL(`/group/${targetTeam}`);
});
- test('expect create "targetTeamNonPrivate" non private', async ({ page }) => {
+ test('should create targetTeamNonPrivate non private', async ({ page }) => {
await poHomeTeam.sidenav.openNewByLabel('Team');
- await poHomeTeam.inputTeamName.type(targetTeamNonPrivate);
+ await poHomeTeam.inputTeamName.fill(targetTeamNonPrivate);
await poHomeTeam.textPrivate.click();
await poHomeTeam.addMember('user1');
await poHomeTeam.btnTeamCreate.click();
@@ -43,9 +43,9 @@ test.describe.serial('teams-management', () => {
await expect(page).toHaveURL(`/channel/${targetTeamNonPrivate}`);
});
- test('expect create "targetTeamReadOnly" readonly', async ({ page }) => {
+ test('should create targetTeamReadOnly readonly', async ({ page }) => {
await poHomeTeam.sidenav.openNewByLabel('Team');
- await poHomeTeam.inputTeamName.type(targetTeamReadOnly);
+ await poHomeTeam.inputTeamName.fill(targetTeamReadOnly);
await poHomeTeam.sidenav.advancedSettingsAccordion.click();
await poHomeTeam.textReadOnly.click();
await poHomeTeam.addMember('user1');
@@ -54,15 +54,15 @@ test.describe.serial('teams-management', () => {
await expect(page).toHaveURL(`/group/${targetTeamReadOnly}`);
});
- test('expect throw validation error if team name already exists', async () => {
+ test('should throw validation error if team name already exists', async () => {
await poHomeTeam.sidenav.openNewByLabel('Team');
- await poHomeTeam.inputTeamName.type(targetTeam);
+ await poHomeTeam.inputTeamName.fill(targetTeam);
await poHomeTeam.btnTeamCreate.click();
await expect(poHomeTeam.inputTeamName).toHaveAttribute('aria-invalid', 'true');
});
- test('expect send hello in the "targetTeam" and reply in a thread', async ({ page }) => {
+ test('should send hello in the targetTeam and reply in a thread', async ({ page }) => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.content.sendMessage('hello');
await page.locator('[data-qa-type="message"]').last().hover();
@@ -73,26 +73,29 @@ test.describe.serial('teams-management', () => {
await expect(poHomeTeam.tabs.flexTabViewThreadMessage).toHaveText('any-reply-message');
});
- test('expect set "targetTeam" as readonly', async () => {
+ test('should set targetTeam as readonly', async () => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.tabs.btnRoomInfo.click();
await poHomeTeam.tabs.room.btnEdit.click();
await poHomeTeam.tabs.room.advancedSettingsAccordion.click();
await poHomeTeam.tabs.room.checkboxReadOnly.click();
await poHomeTeam.tabs.room.btnSave.click();
+
+ await expect(poHomeTeam.content.getSystemMessageByText('set room to read only')).toBeVisible();
});
- test('expect insert a channel inside "targetTeam"', async ({ page }) => {
+ test('should insert targetChannel inside targetTeam', async ({ page }) => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.tabs.btnChannels.click();
await poHomeTeam.tabs.channels.btnAddExisting.click();
- await poHomeTeam.tabs.channels.inputChannels.type(targetChannel, { delay: 100 });
+ await poHomeTeam.tabs.channels.inputChannels.fill(targetChannel);
await page.locator(`.rcx-option__content:has-text("${targetChannel}")`).click();
await poHomeTeam.tabs.channels.btnAdd.click();
- await expect(page.getByRole('dialog').getByRole('listitem')).toContainText(targetChannel);
+
+ await expect(poHomeTeam.tabs.channels.channelsList).toContainText(targetChannel);
});
- test('should access team channel through "targetTeam" header', async ({ page }) => {
+ test('should access team channel through targetTeam header', async ({ page }) => {
await poHomeTeam.sidenav.openChat(targetChannel);
await page.getByRole('button', { name: targetChannel }).first().focus();
await page.keyboard.press('Tab');
@@ -101,4 +104,71 @@ test.describe.serial('teams-management', () => {
await expect(page).toHaveURL(`/group/${targetTeam}`);
});
+
+ test('should remove targetChannel from targetTeam', async ({ page }) => {
+ await poHomeTeam.sidenav.openChat(targetTeam);
+ await poHomeTeam.tabs.btnChannels.click();
+ await poHomeTeam.tabs.channels.openChannelOptionMoreActions(targetChannel);
+ await page.getByRole('menu', { exact: true }).getByRole('menuitem', { name: 'Remove from team' }).click();
+ await poHomeTeam.tabs.channels.confirmRemoveChannel();
+
+ await expect(poHomeTeam.tabs.channels.channelsList).not.toBeVisible();
+ });
+
+ test('should remove user1 from targetTeamNonPrivate', async () => {
+ await poHomeTeam.sidenav.openChat(targetTeamNonPrivate);
+ await poHomeTeam.tabs.kebab.click({ force: true });
+ await poHomeTeam.tabs.btnTeamMembers.click();
+ await poHomeTeam.tabs.members.showAllUsers();
+ await poHomeTeam.tabs.members.openMemberOptionMoreActions('user1');
+ await poHomeTeam.tabs.members.getMenuItemAction('Remove from team').click();
+ await expect(poHomeTeam.tabs.members.confirmRemoveUserModal).toBeVisible();
+
+ await poHomeTeam.tabs.members.confirmRemoveUser();
+ await expect(poHomeTeam.tabs.members.memberOption('user1')).not.toBeVisible();
+ });
+
+ test('should delete targetTeamNonPrivate', async () => {
+ await poHomeTeam.sidenav.openChat(targetTeamNonPrivate);
+ await poHomeTeam.tabs.btnRoomInfo.click();
+ await poHomeTeam.tabs.room.btnDelete.click();
+ await expect(poHomeTeam.tabs.room.confirmDeleteTeamModal).toBeVisible();
+
+ await poHomeTeam.tabs.room.confirmDeleteTeam();
+ await poHomeTeam.sidenav.searchRoom(targetTeamNonPrivate);
+ await expect(poHomeTeam.sidenav.getSearchRoomByName(targetTeamNonPrivate)).not.toBeVisible();
+ });
+
+ test('should user1 leave from targetTeam', async ({ browser }) => {
+ const user1Page = await browser.newPage({ storageState: Users.user1.state });
+ const user1Channel = new HomeTeam(user1Page);
+ await user1Page.goto(`/group/${targetTeam}`);
+ await user1Channel.content.waitForChannel();
+
+ await user1Channel.tabs.btnRoomInfo.click();
+ await user1Channel.tabs.room.btnLeave.click();
+ await expect(user1Channel.tabs.room.confirmLeaveModal).toBeVisible();
+
+ await user1Channel.tabs.room.confirmLeave();
+ await user1Page.close();
+
+ await poHomeTeam.sidenav.openChat(targetTeam);
+ await poHomeTeam.tabs.kebab.click({ force: true });
+ await poHomeTeam.tabs.btnTeamMembers.click();
+ await poHomeTeam.tabs.members.showAllUsers();
+ await expect(poHomeTeam.tabs.members.memberOption('user1')).not.toBeVisible();
+ });
+
+ test('should convert team into a channel', async ({ page }) => {
+ await poHomeTeam.sidenav.openChat(targetTeam);
+ await poHomeTeam.tabs.btnRoomInfo.click();
+ await poHomeTeam.tabs.room.btnMore.click();
+ await page.getByRole('listbox', { exact: true }).getByRole('option', { name: 'Convert to Channel' }).click();
+ await expect(poHomeTeam.tabs.room.confirmConvertModal).toBeVisible();
+
+ await poHomeTeam.tabs.room.confirmConvert();
+
+ // TODO: improve this locator and check the action reactivity
+ await expect(poHomeTeam.content.getSystemMessageByText(`converted #${targetTeam} to channel`)).toBeVisible();
+ });
});
diff --git a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts
index f3ae205c7090..7142725a1d99 100644
--- a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts
+++ b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts
@@ -2468,6 +2468,10 @@ describe('LIVECHAT - rooms', () => {
await updateSetting('Unread_Count_Omni', 'all_messages');
});
+ after(async () => {
+ await deleteDepartment(departmentWithAgent.department._id);
+ });
+
it('it should prepare the required data for further tests', async () => {
departmentWithAgent = await createDepartmentWithAnOnlineAgent();
visitor = await createVisitor(departmentWithAgent.department._id);
diff --git a/apps/meteor/tests/end-to-end/api/livechat/07-queue.ts b/apps/meteor/tests/end-to-end/api/livechat/07-queue.ts
index 1d5ef110d308..4e2128b682a6 100644
--- a/apps/meteor/tests/end-to-end/api/livechat/07-queue.ts
+++ b/apps/meteor/tests/end-to-end/api/livechat/07-queue.ts
@@ -1,27 +1,58 @@
/* eslint-env mocha */
+import { faker } from '@faker-js/faker';
+import type { ILivechatDepartment, ILivechatVisitor, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings';
import { expect } from 'chai';
-import { before, describe, it } from 'mocha';
+import { after, before, describe, it } from 'mocha';
import type { Response } from 'supertest';
import { getCredentials, api, request, credentials } from '../../../data/api-data';
+import { createDepartmentWithAnOnlineAgent, deleteDepartment, addOrRemoveAgentFromDepartment } from '../../../data/livechat/department';
+import { createVisitor, createLivechatRoom, closeOmnichannelRoom, deleteVisitor } from '../../../data/livechat/rooms';
+import { createAnOnlineAgent } from '../../../data/livechat/users';
import { updatePermission, updateSetting } from '../../../data/permissions.helper';
+import { deleteUser } from '../../../data/users.helper';
+import { IS_EE } from '../../../e2e/config/constants';
+
+const cleanupRooms = async () => {
+ const response = await request.get(api('livechat/queue')).set(credentials).expect('Content-Type', 'application/json').expect(200);
+
+ const { queue } = response.body;
+
+ for await (const item of queue) {
+ const {
+ body: { rooms },
+ } = await request.get(api('livechat/rooms')).query({ 'agents[]': item.user._id }).set(credentials);
+
+ await Promise.all(
+ rooms.map((room: IOmnichannelRoom) =>
+ request.post(api('livechat/room.closeByUser')).set(credentials).send({ rid: room._id, comment: faker.lorem.sentence() }),
+ ),
+ );
+ }
+};
describe('LIVECHAT - Queue', () => {
before((done) => getCredentials(done));
- before(async () => {
- await updateSetting('Livechat_enabled', true);
- });
+ before(async () =>
+ Promise.all([
+ updateSetting('Livechat_enabled', true),
+ updateSetting('Livechat_Routing_Method', 'Auto_Selection'),
+
+ // this cleanup is required since previous tests left the DB dirty
+ cleanupRooms(),
+ ]),
+ );
describe('livechat/queue', () => {
it('should return an "unauthorized error" when the user does not have the necessary permission', async () => {
await updatePermission('view-l-room', []);
await request.get(api('livechat/queue')).set(credentials).expect('Content-Type', 'application/json').expect(403);
+ await updatePermission('view-l-room', ['admin']);
});
it('should return an array of queued metrics', async () => {
- await updatePermission('view-l-room', ['admin']);
await request
.get(api('livechat/queue'))
.set(credentials)
@@ -36,7 +67,6 @@ describe('LIVECHAT - Queue', () => {
});
});
it('should return an array of queued metrics even requested with count and offset params', async () => {
- await updatePermission('view-l-room', ['admin']);
await request
.get(api('livechat/queue'))
.set(credentials)
@@ -55,4 +85,284 @@ describe('LIVECHAT - Queue', () => {
});
});
});
+
+ describe('queue position', () => {
+ let agent1: { user: IUser };
+ let agent2: { user: IUser };
+ let agent3: { user: IUser };
+ let deptd1: ILivechatDepartment;
+ let deptd2: ILivechatDepartment;
+
+ const roomsToClose: IOmnichannelRoom[] = [];
+ const visitors: ILivechatVisitor[] = [];
+ const usersToDelete: IUser[] = [];
+
+ before(async () => {
+ const { department, agent } = await createDepartmentWithAnOnlineAgent();
+
+ deptd1 = department;
+ agent1 = agent;
+
+ usersToDelete.push(agent.user);
+
+ const newVisitor = await createVisitor(deptd1._id);
+ const newRoom = await createLivechatRoom(newVisitor.token);
+
+ roomsToClose.push(newRoom);
+ visitors.push(newVisitor);
+ });
+
+ after(async () => {
+ await deleteDepartment(deptd1._id);
+
+ if (deptd2) {
+ await deleteDepartment(deptd2._id);
+ }
+
+ await Promise.all(roomsToClose.map((room) => closeOmnichannelRoom(room._id)));
+ await Promise.all(visitors.map((visitor) => deleteVisitor(visitor.token)));
+ await Promise.all(usersToDelete.map((user) => deleteUser(user)));
+ });
+
+ it('should have one item in the queue', async () => {
+ await request
+ .get(api('livechat/queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(1);
+
+ const [queue] = res.body.queue;
+
+ expect(queue).to.have.property('chats', 1);
+ expect(queue).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+
+ it('should return empty results when filtering by another agent', async () => {
+ await request
+ .get(api('livechat/queue'))
+ .query({ agentId: 'another-agent' })
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total', 0);
+ expect(res.body).to.have.property('count', 0);
+ expect(res.body.queue).to.be.an('array').of.length(0);
+ });
+ });
+
+ it('should increase chats when a new room for same department is created', async () => {
+ const newVisitor = await createVisitor();
+ const newRoom = await createLivechatRoom(newVisitor.token);
+
+ roomsToClose.push(newRoom);
+ visitors.push(newVisitor);
+
+ await request
+ .get(api('livechat/queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(1);
+
+ const [queue] = res.body.queue;
+
+ expect(queue).to.have.property('chats', 2);
+ expect(queue).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+
+ it('should have two items when create room for another agent', async () => {
+ const { user } = await createAnOnlineAgent();
+ await addOrRemoveAgentFromDepartment(deptd1._id, { agentId: user._id, username: user.username }, true);
+
+ agent2 = { user };
+
+ usersToDelete.push(user);
+
+ const newVisitor = await createVisitor(deptd1._id);
+ const newRoom = await createLivechatRoom(newVisitor.token);
+
+ roomsToClose.push(newRoom);
+ visitors.push(newVisitor);
+
+ await request
+ .get(api('livechat/queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(2);
+
+ const [queue1, queue2] = res.body.queue;
+
+ expect(queue1).to.have.property('chats', 2);
+ expect(queue1).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue1).to.have.nested.property('department._id', deptd1._id);
+
+ expect(queue2).to.have.property('chats', 1);
+ expect(queue2).to.have.nested.property('user._id', agent2.user._id);
+ expect(queue2).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+
+ it('should be able to filter for second agent only', async () => {
+ await request
+ .get(api('livechat/queue'))
+ .query({ agentId: agent2.user._id })
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(1);
+
+ const [queue1] = res.body.queue;
+
+ expect(queue1).to.have.property('chats', 1);
+ expect(queue1).to.have.nested.property('user._id', agent2.user._id);
+ expect(queue1).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+
+ it('should return empty if filter for a department without chats', async () => {
+ await request
+ .get(api('livechat/queue'))
+ .query({ departmentId: 'no-chats' })
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total', 0);
+ expect(res.body).to.have.property('count', 0);
+ expect(res.body.queue).to.be.an('array').of.length(0);
+ });
+ });
+
+ it('should be able to filter for first department only', async () => {
+ await request
+ .get(api('livechat/queue'))
+ .query({ departmentId: deptd1._id })
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(2);
+
+ const [queue1] = res.body.queue;
+
+ expect(queue1).to.have.property('chats', 2);
+ expect(queue1).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue1).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+
+ (IS_EE ? it : it.skip)('should have three items when create room for another department', async () => {
+ const { department: dep2, agent: ag3 } = await createDepartmentWithAnOnlineAgent();
+
+ agent3 = ag3;
+
+ usersToDelete.push(ag3.user);
+
+ deptd2 = dep2;
+
+ const newVisitor = await createVisitor(deptd2._id);
+ const newRoom = await createLivechatRoom(newVisitor.token);
+
+ roomsToClose.push(newRoom);
+ visitors.push(newVisitor);
+
+ await request
+ .get(api('livechat/queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(3);
+
+ const [queue1, queue2, queue3] = res.body.queue;
+
+ expect(queue1).to.have.property('chats', 2);
+ expect(queue1).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue1).to.have.nested.property('department._id', deptd1._id);
+
+ expect(queue2).to.have.property('chats', 1);
+ expect(queue3).to.have.property('chats', 1);
+ });
+ });
+
+ (IS_EE ? it : it.skip)('should change the order when second department gets more rooms', async () => {
+ const newVisitor1 = await createVisitor(deptd2._id);
+ const newRoom1 = await createLivechatRoom(newVisitor1.token);
+
+ roomsToClose.push(newRoom1);
+ visitors.push(newVisitor1);
+
+ const newVisitor2 = await createVisitor(deptd2._id);
+ const newRoom2 = await createLivechatRoom(newVisitor2.token);
+
+ roomsToClose.push(newRoom2);
+ visitors.push(newVisitor2);
+
+ await request
+ .get(api('livechat/queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res: Response) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('count');
+ expect(res.body.queue).to.be.an('array').of.length(3);
+
+ const [queue1, queue2, queue3] = res.body.queue;
+
+ expect(queue1).to.have.property('chats', 3);
+ expect(queue1).to.have.nested.property('user._id', agent3.user._id);
+ expect(queue1).to.have.nested.property('department._id', deptd2._id);
+
+ expect(queue2).to.have.property('chats', 2);
+ expect(queue2).to.have.nested.property('user._id', agent1.user._id);
+ expect(queue2).to.have.nested.property('department._id', deptd1._id);
+
+ expect(queue3).to.have.property('chats', 1);
+ expect(queue3).to.have.nested.property('user._id', agent2.user._id);
+ expect(queue3).to.have.nested.property('department._id', deptd1._id);
+ });
+ });
+ });
});
diff --git a/apps/meteor/tests/end-to-end/api/livechat/contacts.ts b/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
index 21eced5ee7e9..957d22ba92ae 100644
--- a/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
+++ b/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
@@ -1,27 +1,42 @@
import { faker } from '@faker-js/faker';
+import type { ILivechatAgent, IUser } from '@rocket.chat/core-typings';
import { expect } from 'chai';
import { before, after, describe, it } from 'mocha';
import { getCredentials, api, request, credentials } from '../../../data/api-data';
import { createCustomField, deleteCustomField } from '../../../data/livechat/custom-fields';
import { createAgent } from '../../../data/livechat/rooms';
+import { removeAgent } from '../../../data/livechat/users';
import { removePermissionFromAllRoles, restorePermissionToRoles, updatePermission, updateSetting } from '../../../data/permissions.helper';
import { createUser, deleteUser } from '../../../data/users.helper';
describe('LIVECHAT - contacts', () => {
+ let agentUser: IUser;
+ let livechatAgent: ILivechatAgent;
before((done) => getCredentials(done));
before(async () => {
await updateSetting('Livechat_enabled', true);
- await updatePermission('create-livechat-contact', ['admin']);
+ agentUser = await createUser();
+ livechatAgent = await createAgent(agentUser.username);
});
after(async () => {
+ await removeAgent(livechatAgent._id);
+ await deleteUser(agentUser);
await restorePermissionToRoles('create-livechat-contact');
await updateSetting('Livechat_enabled', true);
});
describe('[POST] omnichannel/contacts', () => {
+ before(async () => {
+ await updatePermission('create-livechat-contact', ['admin']);
+ });
+
+ after(async () => {
+ await restorePermissionToRoles('create-livechat-contact');
+ });
+
it('should be able to create a new contact', async () => {
const res = await request
.post(api('omnichannel/contacts'))
@@ -92,9 +107,6 @@ describe('LIVECHAT - contacts', () => {
});
it('should be able to create a new contact with a contact manager', async () => {
- const user = await createUser();
- const livechatAgent = await createAgent(user.username);
-
const res = await request
.post(api('omnichannel/contacts'))
.set(credentials)
@@ -108,8 +120,6 @@ describe('LIVECHAT - contacts', () => {
expect(res.body).to.have.property('success', true);
expect(res.body).to.have.property('contactId');
expect(res.body.contactId).to.be.an('string');
-
- await deleteUser(user);
});
describe('Custom Fields', () => {
@@ -296,4 +306,267 @@ describe('LIVECHAT - contacts', () => {
});
});
});
+
+ describe('[POST] omnichannel/contacts.update', () => {
+ let contactId: string;
+
+ before(async () => {
+ const { body } = await request
+ .post(api('omnichannel/contacts'))
+ .set(credentials)
+ .send({
+ name: faker.person.fullName(),
+ emails: [faker.internet.email().toLowerCase()],
+ phones: [faker.phone.number()],
+ });
+ contactId = body.contactId;
+ });
+
+ after(async () => {
+ await restorePermissionToRoles('update-livechat-contact');
+ });
+
+ it('should be able to update a contact', async () => {
+ const name = faker.person.fullName();
+ const emails = [faker.internet.email().toLowerCase()];
+ const phones = [faker.phone.number()];
+
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ name,
+ emails,
+ phones,
+ });
+
+ expect(res.status).to.be.equal(200);
+ expect(res.body).to.have.property('success', true);
+ expect(res.body.contact._id).to.be.equal(contactId);
+ expect(res.body.contact.name).to.be.equal(name);
+ expect(res.body.contact.emails).to.be.deep.equal(emails);
+ expect(res.body.contact.phones).to.be.deep.equal(phones);
+ });
+
+ it('should set the unknown field to false when updating a contact', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ name: faker.person.fullName(),
+ });
+
+ expect(res.status).to.be.equal(200);
+ expect(res.body).to.have.property('success', true);
+ expect(res.body.contact._id).to.be.equal(contactId);
+ expect(res.body.contact.unknown).to.be.equal(false);
+ });
+
+ it('should be able to update the contact manager', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ contactManager: livechatAgent._id,
+ });
+
+ expect(res.status).to.be.equal(200);
+ expect(res.body).to.have.property('success', true);
+ expect(res.body.contact._id).to.be.equal(contactId);
+ expect(res.body.contact.contactManager).to.be.equal(livechatAgent._id);
+ });
+
+ it('should return an error if contact does not exist', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId: 'invalid',
+ name: faker.person.fullName(),
+ emails: [faker.internet.email().toLowerCase()],
+ phones: [faker.phone.number()],
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('error-contact-not-found');
+ });
+
+ it('should return an error if contact manager not exists', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ contactManager: 'invalid',
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('error-contact-manager-not-found');
+ });
+
+ describe('Permissions', () => {
+ before(async () => {
+ await removePermissionFromAllRoles('update-livechat-contact');
+ });
+
+ after(async () => {
+ await restorePermissionToRoles('update-livechat-contact');
+ });
+
+ it("should return an error if user doesn't have 'update-livechat-contact' permission", async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('User does not have the permissions required for this action [error-unauthorized]');
+ });
+ });
+
+ describe('Custom Fields', () => {
+ before(async () => {
+ await createCustomField({
+ field: 'cf1',
+ label: 'Custom Field 1',
+ scope: 'visitor',
+ visibility: 'public',
+ type: 'input',
+ required: true,
+ regexp: '^[0-9]+$',
+ searchable: true,
+ public: true,
+ });
+ });
+
+ after(async () => {
+ await deleteCustomField('cf1');
+ });
+
+ it('should validate custom fields correctly', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId,
+ customFields: {
+ cf1: '123',
+ },
+ });
+
+ expect(res.status).to.be.equal(200);
+ expect(res.body).to.have.property('success', true);
+ expect(res.body.contact._id).to.be.equal(contactId);
+ });
+
+ it('should return an error for invalid custom field value', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId,
+ customFields: {
+ cf1: 'invalid',
+ },
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('Invalid value for Custom Field 1 field');
+ });
+
+ it('should return an error if additional custom fields are provided', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId,
+ customFields: {
+ cf1: '123',
+ cf2: 'invalid',
+ },
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('Custom field cf2 is not allowed');
+ });
+ });
+
+ describe('Fields Validation', () => {
+ it('should return an error if contactId is missing', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ emails: [faker.internet.email().toLowerCase()],
+ phones: [faker.phone.number()],
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal("must have required property 'contactId' [invalid-params]");
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+
+ it('should return an error if emails is not an array', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ emails: 'invalid',
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('must be array [invalid-params]');
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+
+ it('should return an error if emails is not an array of strings', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId,
+ emails: [{ invalid: true }],
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('must be string [invalid-params]');
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+
+ it('should return an error if phones is not an array', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ phones: 'invalid',
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('must be array [invalid-params]');
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+
+ it('should return an error if phones is not an array of strings', async () => {
+ const res = await request
+ .post(api('omnichannel/contacts.update'))
+ .set(credentials)
+ .send({
+ contactId,
+ phones: [{ invalid: true }],
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('must be string [invalid-params]');
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+
+ it('should return an error if additional fields are provided', async () => {
+ const res = await request.post(api('omnichannel/contacts.update')).set(credentials).send({
+ contactId,
+ unknown: true,
+ });
+
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error');
+ expect(res.body.error).to.be.equal('must NOT have additional properties [invalid-params]');
+ expect(res.body.errorType).to.be.equal('invalid-params');
+ });
+ });
+ });
});
diff --git a/apps/meteor/tests/end-to-end/api/methods.ts b/apps/meteor/tests/end-to-end/api/methods.ts
index e1ca05d1fbf2..197a71f8e8f2 100644
--- a/apps/meteor/tests/end-to-end/api/methods.ts
+++ b/apps/meteor/tests/end-to-end/api/methods.ts
@@ -2030,6 +2030,13 @@ describe('Meteor.methods', () => {
let messageWithMarkdownId: IMessage['_id'];
let channelName: string;
const siteUrl = process.env.SITE_URL || process.env.TEST_API_URL || 'http://localhost:3000';
+ let testUser: TestUser;
+ let testUserCredentials: Credentials;
+
+ before(async () => {
+ testUser = await createUser();
+ testUserCredentials = await login(testUser.username, password);
+ });
before('create room', (done) => {
channelName = `methods-test-channel-${Date.now()}`;
@@ -2125,13 +2132,14 @@ describe('Meteor.methods', () => {
after(() =>
Promise.all([
deleteRoom({ type: 'p', roomId: rid }),
+ deleteUser(testUser),
updatePermission('bypass-time-limit-edit-and-delete', ['bot', 'app']),
updateSetting('Message_AllowEditing_BlockEditInMinutes', 0),
]),
);
- it('should update a message with a URL', (done) => {
- void request
+ it('should update a message with a URL', async () => {
+ await request
.post(methodCall('updateMessage'))
.set(credentials)
.send({
@@ -2149,8 +2157,53 @@ describe('Meteor.methods', () => {
expect(res.body).to.have.a.property('message').that.is.a('string');
const data = JSON.parse(res.body.message);
expect(data).to.have.a.property('msg').that.is.an('string');
+ });
+ });
+
+ it('should fail if user does not have permissions to update a message with the same content', async () => {
+ await request
+ .post(methodCall('updateMessage'))
+ .set(testUserCredentials)
+ .send({
+ message: JSON.stringify({
+ method: 'updateMessage',
+ params: [{ _id: messageId, rid, msg: 'test message with https://github.com' }],
+ id: 'id',
+ msg: 'method',
+ }),
})
- .end(done);
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.a.property('success', true);
+ expect(res.body).to.have.a.property('message').that.is.a('string');
+ const data = JSON.parse(res.body.message);
+ expect(data).to.have.a.property('msg').that.is.an('string');
+ expect(data.error).to.have.a.property('error', 'error-action-not-allowed');
+ });
+ });
+
+ it('should fail if user does not have permissions to update a message with different content', async () => {
+ await request
+ .post(methodCall('updateMessage'))
+ .set(testUserCredentials)
+ .send({
+ message: JSON.stringify({
+ method: 'updateMessage',
+ params: [{ _id: messageId, rid, msg: 'updating test message with https://github.com' }],
+ id: 'id',
+ msg: 'method',
+ }),
+ })
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.a.property('success', true);
+ expect(res.body).to.have.a.property('message').that.is.a('string');
+ const data = JSON.parse(res.body.message);
+ expect(data).to.have.a.property('msg').that.is.an('string');
+ expect(data.error).to.have.a.property('error', 'error-action-not-allowed');
+ });
});
it('should add a quote attachment to a message', async () => {
@@ -3295,4 +3348,107 @@ describe('Meteor.methods', () => {
.end(done);
});
});
+ (IS_EE ? describe : describe.skip)('[@auditGetAuditions] EE', () => {
+ let testUser: TestUser;
+ let testUserCredentials: Credentials;
+
+ const now = new Date();
+ const startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0).getTime();
+ const endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999).getTime();
+
+ before('create test user', async () => {
+ testUser = await createUser();
+ testUserCredentials = await login(testUser.username, password);
+ });
+
+ before('generate audits data', async () => {
+ await request
+ .post(methodCall('auditGetMessages'))
+ .set(credentials)
+ .send({
+ message: JSON.stringify({
+ method: 'auditGetMessages',
+ params: [
+ {
+ type: '',
+ msg: 'test1234',
+ startDate: { $date: startDate },
+ endDate: { $date: endDate },
+ rid: 'GENERAL',
+ users: [],
+ },
+ ],
+ id: '14',
+ msg: 'method',
+ }),
+ });
+ });
+
+ after(() => Promise.all([deleteUser(testUser)]));
+
+ it('should fail if the user does not have permissions to get auditions', async () => {
+ await request
+ .post(methodCall('auditGetAuditions'))
+ .set(testUserCredentials)
+ .send({
+ message: JSON.stringify({
+ method: 'auditGetAuditions',
+ params: [
+ {
+ startDate: { $date: startDate },
+ endDate: { $date: endDate },
+ },
+ ],
+ id: '18',
+ msg: 'method',
+ }),
+ })
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.a.property('message');
+ const data = JSON.parse(res.body.message);
+ expect(data).to.have.a.property('error');
+ expect(data.error).to.have.a.property('error', 'Not allowed');
+ });
+ });
+
+ it('should not return more user data than necessary - e.g. passwords, hashes, tokens', async () => {
+ await request
+ .post(methodCall('auditGetAuditions'))
+ .set(credentials)
+ .send({
+ message: JSON.stringify({
+ method: 'auditGetAuditions',
+ params: [
+ {
+ startDate: { $date: startDate },
+ endDate: { $date: endDate },
+ },
+ ],
+ id: '18',
+ msg: 'method',
+ }),
+ })
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.a.property('success', true);
+ expect(res.body).to.have.a.property('message').that.is.a('string');
+ const data = JSON.parse(res.body.message);
+ expect(data).to.have.a.property('result').that.is.an('array');
+ expect(data.result.length).to.be.greaterThan(0);
+ expect(data).to.have.a.property('msg', 'result');
+ expect(data).to.have.a.property('id', '18');
+ data.result.forEach((item: any) => {
+ expect(item).to.have.all.keys('_id', 'ts', 'results', 'u', 'fields', '_updatedAt');
+ expect(item.u).to.not.have.property('services');
+ expect(item.u).to.not.have.property('roles');
+ expect(item.u).to.not.have.property('lastLogin');
+ expect(item.u).to.not.have.property('statusConnection');
+ expect(item.u).to.not.have.property('emails');
+ });
+ });
+ });
+ });
});
diff --git a/apps/meteor/tests/end-to-end/api/miscellaneous.ts b/apps/meteor/tests/end-to-end/api/miscellaneous.ts
index 613a874ecd8c..b8341f7c0994 100644
--- a/apps/meteor/tests/end-to-end/api/miscellaneous.ts
+++ b/apps/meteor/tests/end-to-end/api/miscellaneous.ts
@@ -5,7 +5,7 @@ import type { IInstance } from '@rocket.chat/rest-typings';
import { AssertionError, expect } from 'chai';
import { after, before, describe, it } from 'mocha';
-import { getCredentials, api, request, credentials } from '../../data/api-data';
+import { getCredentials, api, request, credentials, methodCall } from '../../data/api-data';
import { updatePermission, updateSetting } from '../../data/permissions.helper';
import { createRoom, deleteRoom } from '../../data/rooms.helper';
import { createTeam, deleteTeam } from '../../data/teams.helper';
@@ -703,4 +703,139 @@ describe('miscellaneous', () => {
.end(done);
});
});
+
+ describe('[/stdout.queue]', () => {
+ let testUser: TestUser;
+ let testUsername: string;
+ let testUserPassword: string;
+ before(async () => {
+ testUser = await createUser();
+ testUsername = testUser.username;
+ testUserPassword = password;
+ await updateSetting('Log_Trace_Methods', true);
+ await updateSetting('Log_Level', '2');
+
+ // populate the logs by sending method calls
+ const populateLogsPromises = [];
+ populateLogsPromises.push(
+ request
+ .post(methodCall('getRoomRoles'))
+ .set(credentials)
+ .set('Cookie', `rc_token=${credentials['X-Auth-Token']}`)
+ .send({
+ message: JSON.stringify({
+ method: 'getRoomRoles',
+ params: ['GENERAL'],
+ id: 'id',
+ msg: 'method',
+ }),
+ }),
+ );
+
+ populateLogsPromises.push(
+ request
+ .post(methodCall('private-settings:get'))
+ .set(credentials)
+ .send({
+ message: JSON.stringify({
+ method: 'private-settings/get',
+ params: [
+ {
+ $date: new Date().getTime(),
+ },
+ ],
+ id: 'id',
+ msg: 'method',
+ }),
+ }),
+ );
+
+ populateLogsPromises.push(
+ request.post(api('login')).send({
+ user: {
+ username: testUsername,
+ },
+ password: testUserPassword,
+ }),
+ );
+
+ await Promise.all(populateLogsPromises);
+ });
+
+ after(async () => {
+ await Promise.all([updateSetting('Log_Trace_Methods', false), updateSetting('Log_Level', '0'), deleteUser(testUser)]);
+ });
+
+ it('if log trace enabled, x-auth-token should be redacted', async () => {
+ await request
+ .get(api('stdout.queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('queue').that.is.an('array');
+
+ const { queue } = res.body;
+ let foundRedactedToken = false;
+
+ for (const log of queue) {
+ if (log.string.includes("'x-auth-token': '[redacted]'")) {
+ foundRedactedToken = true;
+ break;
+ }
+ }
+
+ expect(foundRedactedToken).to.be.true;
+ });
+ });
+
+ it('if log trace enabled, rc_token should be redacted', async () => {
+ await request
+ .get(api('stdout.queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('queue').that.is.an('array');
+
+ const { queue } = res.body;
+ let foundRedactedCookie = false;
+
+ for (const log of queue) {
+ if (log.string.includes('rc_token=[redacted]')) {
+ foundRedactedCookie = true;
+ break;
+ }
+ }
+
+ expect(foundRedactedCookie).to.be.true;
+ });
+ });
+
+ it('should not return user token anywhere in the log stream', async () => {
+ await request
+ .get(api('stdout.queue'))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('queue').that.is.an('array');
+
+ const { queue } = res.body;
+ let foundTokenValue = false;
+
+ for (const log of queue) {
+ if (log.string.includes(credentials['X-Auth-Token'])) {
+ foundTokenValue = true;
+ break;
+ }
+ }
+
+ expect(foundTokenValue).to.be.false;
+ });
+ });
+ });
});
diff --git a/apps/meteor/tests/end-to-end/api/rooms.ts b/apps/meteor/tests/end-to-end/api/rooms.ts
index 981388c416a9..bb4cbb8fb196 100644
--- a/apps/meteor/tests/end-to-end/api/rooms.ts
+++ b/apps/meteor/tests/end-to-end/api/rooms.ts
@@ -747,6 +747,42 @@ describe('[Rooms]', () => {
});
});
+ it('should correctly save encrypted file with the default media type even if another type is provided', async () => {
+ let fileId;
+
+ await request
+ .post(api(`rooms.media/${testChannel._id}`))
+ .set(credentials)
+ .attach('file', fs.createReadStream(path.join(__dirname, '../../mocks/files/sample-jpeg.jpg')), {
+ contentType: 'image/jpeg',
+ })
+ .field({ content: JSON.stringify({ algorithm: 'rc.v1.aes-sha2', ciphertext: 'something' }) })
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('file');
+ expect(res.body.file).to.have.property('_id');
+ expect(res.body.file).to.have.property('url');
+
+ fileId = res.body.file._id;
+ });
+
+ await request
+ .post(api(`rooms.mediaConfirm/${testChannel._id}/${fileId}`))
+ .set(credentials)
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ expect(res.body).to.have.property('message');
+ expect(res.body.message).to.have.property('files');
+ expect(res.body.message.files).to.be.an('array').of.length(1);
+ expect(res.body.message.files[0]).to.have.property('type', 'application/octet-stream');
+ expect(res.body.message.files[0]).to.have.property('name', 'sample-jpeg.jpg');
+ });
+ });
+
it('should fail encrypted file upload when files encryption is disabled', async () => {
await updateSetting('E2E_Enable_Encrypt_Files', false);
@@ -1098,7 +1134,6 @@ describe('[Rooms]', () => {
.end(done);
});
});
-
describe('[/rooms.info]', () => {
let testChannel: IRoom;
let testGroup: IRoom;
diff --git a/apps/meteor/tests/end-to-end/api/users.ts b/apps/meteor/tests/end-to-end/api/users.ts
index e908baebd974..77e2b330cc0a 100644
--- a/apps/meteor/tests/end-to-end/api/users.ts
+++ b/apps/meteor/tests/end-to-end/api/users.ts
@@ -2643,18 +2643,37 @@ describe('[Users]', () => {
});
describe('[/users.forgotPassword]', () => {
+ it('should return an error when "Accounts_PasswordReset" is disabled', (done) => {
+ void updateSetting('Accounts_PasswordReset', false).then(() => {
+ void request
+ .post(api('users.forgotPassword'))
+ .send({
+ email: adminEmail,
+ })
+ .expect('Content-Type', 'application/json')
+ .expect(400)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', false);
+ expect(res.body).to.have.property('error', 'Password reset is not enabled');
+ })
+ .end(done);
+ });
+ });
+
it('should send email to user (return success), when is a valid email', (done) => {
- void request
- .post(api('users.forgotPassword'))
- .send({
- email: adminEmail,
- })
- .expect('Content-Type', 'application/json')
- .expect(200)
- .expect((res) => {
- expect(res.body).to.have.property('success', true);
- })
- .end(done);
+ void updateSetting('Accounts_PasswordReset', true).then(() => {
+ void request
+ .post(api('users.forgotPassword'))
+ .send({
+ email: adminEmail,
+ })
+ .expect('Content-Type', 'application/json')
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('success', true);
+ })
+ .end(done);
+ });
});
it('should not send email to user(return error), when is a invalid email', (done) => {
diff --git a/apps/meteor/tests/mocks/data.ts b/apps/meteor/tests/mocks/data.ts
index 14f03a6bd9ab..fd6a0ce91123 100644
--- a/apps/meteor/tests/mocks/data.ts
+++ b/apps/meteor/tests/mocks/data.ts
@@ -21,7 +21,7 @@ export function createFakeUser(overrides?: Partial): IUser {
};
}
-export const createFakeRoom = (overrides?: Partial): IRoom => ({
+export const createFakeRoom = (overrides?: Partial): IRoom => ({
_id: faker.database.mongodbObjectId(),
_updatedAt: faker.date.recent(),
t: faker.helpers.arrayElement(['c', 'p', 'd']),
diff --git a/apps/meteor/tests/unit/app/lib/server/functions/getModifiedHttpHeaders.tests.ts b/apps/meteor/tests/unit/app/lib/server/functions/getModifiedHttpHeaders.tests.ts
new file mode 100644
index 000000000000..5130bbe59a99
--- /dev/null
+++ b/apps/meteor/tests/unit/app/lib/server/functions/getModifiedHttpHeaders.tests.ts
@@ -0,0 +1,59 @@
+import { expect } from 'chai';
+
+import { getModifiedHttpHeaders } from '../../../../../../app/lib/server/functions/getModifiedHttpHeaders';
+
+describe('getModifiedHttpHeaders', () => {
+ it('should redact x-auth-token if present', () => {
+ const inputHeaders = {
+ 'x-auth-token': '12345',
+ 'some-other-header': 'value',
+ };
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result['x-auth-token']).to.equal('[redacted]');
+ expect(result['some-other-header']).to.equal('value');
+ });
+
+ it('should not modify headers if x-auth-token is not present', () => {
+ const inputHeaders = {
+ 'some-other-header': 'value',
+ };
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result).to.deep.equal(inputHeaders);
+ });
+
+ it('should redact rc_token in cookies if present', () => {
+ const inputHeaders = {
+ cookie: 'session_id=abc123; rc_token=98765; other_cookie=value',
+ };
+ const expectedCookies = 'session_id=abc123; rc_token=[redacted]; other_cookie=value';
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result.cookie).to.equal(expectedCookies);
+ });
+
+ it('should not modify cookies if rc_token is not present', () => {
+ const inputHeaders = {
+ cookie: 'session_id=abc123; other_cookie=value',
+ };
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result.cookie).to.equal(inputHeaders.cookie);
+ });
+
+ it('should return headers unchanged if neither x-auth-token nor cookie are present', () => {
+ const inputHeaders = {
+ 'some-other-header': 'value',
+ };
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result).to.deep.equal(inputHeaders);
+ });
+
+ it('should handle cases with both x-auth-token and rc_token in cookie', () => {
+ const inputHeaders = {
+ 'x-auth-token': '12345',
+ 'cookie': 'session_id=abc123; rc_token=98765; other_cookie=value',
+ };
+ const expectedCookies = 'session_id=abc123; rc_token=[redacted]; other_cookie=value';
+ const result = getModifiedHttpHeaders(inputHeaders);
+ expect(result['x-auth-token']).to.equal('[redacted]');
+ expect(result.cookie).to.equal(expectedCookies);
+ });
+});
diff --git a/apps/meteor/tests/unit/app/livechat/server/lib/Contacts.spec.ts b/apps/meteor/tests/unit/app/livechat/server/lib/Contacts.spec.ts
index 9ff2019ffca5..fef3c59469f8 100644
--- a/apps/meteor/tests/unit/app/livechat/server/lib/Contacts.spec.ts
+++ b/apps/meteor/tests/unit/app/livechat/server/lib/Contacts.spec.ts
@@ -2,10 +2,22 @@ import { expect } from 'chai';
import proxyquire from 'proxyquire';
import sinon from 'sinon';
-const { validateCustomFields } = proxyquire.noCallThru().load('../../../../../../app/livechat/server/lib/Contacts', {
- 'meteor/check': sinon.stub(),
- 'meteor/meteor': sinon.stub(),
-});
+const modelsMock = {
+ Users: {
+ findOneAgentById: sinon.stub(),
+ },
+ LivechatContacts: {
+ findOneById: sinon.stub(),
+ updateContact: sinon.stub(),
+ },
+};
+const { validateCustomFields, validateContactManager, updateContact } = proxyquire
+ .noCallThru()
+ .load('../../../../../../app/livechat/server/lib/Contacts', {
+ 'meteor/check': sinon.stub(),
+ 'meteor/meteor': sinon.stub(),
+ '@rocket.chat/models': modelsMock,
+ });
describe('[OC] Contacts', () => {
describe('validateCustomFields', () => {
@@ -36,5 +48,55 @@ describe('[OC] Contacts', () => {
expect(() => validateCustomFields(allowedCustomFields, customFields)).not.to.throw();
});
+
+ it('should throw an error if a extra custom field is passed', () => {
+ const allowedCustomFields = [{ _id: 'field1', label: 'Field 1', required: false }];
+ const customFields = { field2: 'value' };
+
+ expect(() => validateCustomFields(allowedCustomFields, customFields)).to.throw();
+ });
+ });
+
+ describe('validateContactManager', () => {
+ beforeEach(() => {
+ modelsMock.Users.findOneAgentById.reset();
+ });
+
+ it('should throw an error if the user does not exist', async () => {
+ modelsMock.Users.findOneAgentById.resolves(undefined);
+ await expect(validateContactManager('any_id')).to.be.rejectedWith('error-contact-manager-not-found');
+ });
+
+ it('should not throw an error if the user has the "livechat-agent" role', async () => {
+ const user = { _id: 'userId' };
+ modelsMock.Users.findOneAgentById.resolves(user);
+
+ await expect(validateContactManager('userId')).to.not.be.rejected;
+ expect(modelsMock.Users.findOneAgentById.getCall(0).firstArg).to.be.equal('userId');
+ });
+ });
+
+ describe('updateContact', () => {
+ beforeEach(() => {
+ modelsMock.LivechatContacts.findOneById.reset();
+ modelsMock.LivechatContacts.updateContact.reset();
+ });
+
+ it('should throw an error if the contact does not exist', async () => {
+ modelsMock.LivechatContacts.findOneById.resolves(undefined);
+ await expect(updateContact('any_id')).to.be.rejectedWith('error-contact-not-found');
+ expect(modelsMock.LivechatContacts.updateContact.getCall(0)).to.be.null;
+ });
+
+ it('should update the contact with correct params', async () => {
+ modelsMock.LivechatContacts.findOneById.resolves({ _id: 'contactId' });
+ modelsMock.LivechatContacts.updateContact.resolves({ _id: 'contactId', name: 'John Doe' } as any);
+
+ const updatedContact = await updateContact({ contactId: 'contactId', name: 'John Doe' });
+
+ expect(modelsMock.LivechatContacts.updateContact.getCall(0).args[0]).to.be.equal('contactId');
+ expect(modelsMock.LivechatContacts.updateContact.getCall(0).args[1]).to.be.deep.contain({ name: 'John Doe' });
+ expect(updatedContact).to.be.deep.equal({ _id: 'contactId', name: 'John Doe' });
+ });
});
});
diff --git a/apps/meteor/tests/unit/server/services/omnichannel-integrations/providers/twilio.spec.ts b/apps/meteor/tests/unit/server/services/omnichannel-integrations/providers/twilio.spec.ts
new file mode 100644
index 000000000000..f3c5d281aefb
--- /dev/null
+++ b/apps/meteor/tests/unit/server/services/omnichannel-integrations/providers/twilio.spec.ts
@@ -0,0 +1,211 @@
+import crypto from 'crypto';
+
+import { expect } from 'chai';
+import proxyquire from 'proxyquire';
+import sinon from 'sinon';
+
+const settingsStub = {
+ get: sinon.stub(),
+};
+
+const twilioStub = {
+ validateRequest: sinon.stub(),
+ isRequestFromTwilio: sinon.stub(),
+};
+
+const { Twilio } = proxyquire.noCallThru().load('../../../../../../server/services/omnichannel-integrations/providers/twilio.ts', {
+ '../../../../app/settings/server': { settings: settingsStub },
+ '../../../../app/utils/server/restrictions': { fileUploadIsValidContentType: sinon.stub() },
+ '../../../lib/i18n': { i18n: sinon.stub() },
+ '../../../lib/logger/system': { SystemLogger: { error: sinon.stub() } },
+});
+
+/**
+ * Get a valid Twilio signature for a request
+ *
+ * @param {String} authToken your Twilio AuthToken
+ * @param {String} url your webhook URL
+ * @param {Object} params the included request parameters
+ */
+function getSignature(authToken: string, url: string, params: Record): string {
+ // get all request parameters
+ const data = Object.keys(params)
+ // sort them
+ .sort()
+ // concatenate them to a string
+
+ .reduce((acc, key) => acc + key + params[key], url);
+
+ return (
+ crypto
+ // sign the string with sha1 using your AuthToken
+ .createHmac('sha1', authToken)
+ .update(Buffer.from(data, 'utf-8'))
+ // base64 encode it
+ .digest('base64')
+ );
+}
+
+describe('Twilio Request Validation', () => {
+ beforeEach(() => {
+ settingsStub.get.reset();
+ twilioStub.validateRequest.reset();
+ twilioStub.isRequestFromTwilio.reset();
+ });
+
+ it('should not validate a request when process.env.TEST_MODE is true', () => {
+ process.env.TEST_MODE = 'true';
+
+ const twilio = new Twilio();
+ const request = {
+ headers: {
+ 'x-twilio-signature': 'test',
+ },
+ };
+
+ expect(twilio.validateRequest(request)).to.be.true;
+ });
+
+ it('should not validate a request when process.env.TEST_MODE is true', () => {
+ process.env.TEST_MODE = 'true';
+
+ const twilio = new Twilio();
+ const request = {
+ headers: {
+ 'x-twilio-signature': 'test',
+ },
+ };
+
+ expect(twilio.validateRequest(request)).to.be.true;
+ });
+
+ it('should validate a request when process.env.TEST_MODE is false', () => {
+ process.env.TEST_MODE = 'false';
+
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('test');
+ settingsStub.get.withArgs('Site_Url').returns('https://example.com');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {
+ 'x-twilio-signature': getSignature('test', 'https://example.com/api/v1/livechat/sms-incoming/twilio', requestBody),
+ },
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.true;
+ });
+
+ it('should reject a request where signature doesnt match', () => {
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('test');
+ settingsStub.get.withArgs('Site_Url').returns('https://example.com');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {
+ 'x-twilio-signature': getSignature('anotherAuthToken', 'https://example.com/api/v1/livechat/sms-incoming/twilio', requestBody),
+ },
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.false;
+ });
+
+ it('should reject a request where signature is missing', () => {
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('test');
+ settingsStub.get.withArgs('Site_Url').returns('https://example.com');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {},
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.false;
+ });
+
+ it('should reject a request where the signature doesnt correspond body', () => {
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('test');
+ settingsStub.get.withArgs('Site_Url').returns('https://example.com');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {
+ 'x-twilio-signature': getSignature('test', 'https://example.com/api/v1/livechat/sms-incoming/twilio', {}),
+ },
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.false;
+ });
+
+ it('should return false if URL is not provided', () => {
+ process.env.TEST_MODE = 'false';
+
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('test');
+ settingsStub.get.withArgs('Site_Url').returns('');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {
+ 'x-twilio-signature': getSignature('test', 'https://example.com/api/v1/livechat/sms-incoming/twilio', requestBody),
+ },
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.false;
+ });
+
+ it('should return false if authToken is not provided', () => {
+ process.env.TEST_MODE = 'false';
+
+ settingsStub.get.withArgs('SMS_Twilio_authToken').returns('');
+ settingsStub.get.withArgs('Site_Url').returns('https://example.com');
+
+ const twilio = new Twilio();
+ const requestBody = {
+ To: 'test',
+ From: 'test',
+ Body: 'test',
+ };
+
+ const request = {
+ headers: {
+ 'x-twilio-signature': getSignature('test', 'https://example.com/api/v1/livechat/sms-incoming/twilio', requestBody),
+ },
+ body: requestBody,
+ };
+
+ expect(twilio.validateRequest(request)).to.be.false;
+ });
+});
diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md
index fd5eb3925946..ab5fcbb3f11d 100644
--- a/ee/apps/account-service/CHANGELOG.md
+++ b/ee/apps/account-service/CHANGELOG.md
@@ -1,5 +1,95 @@
# @rocket.chat/account-service
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, b764c415dc, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json
index ac28eb76e76d..e44579ff9317 100644
--- a/ee/apps/account-service/package.json
+++ b/ee/apps/account-service/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/account-service",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat Account service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -45,7 +45,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/account-service/src/service.js",
"files": [
diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md
index df7be3c9b1eb..6d82edcf5808 100644
--- a/ee/apps/authorization-service/CHANGELOG.md
+++ b/ee/apps/authorization-service/CHANGELOG.md
@@ -1,5 +1,95 @@
# @rocket.chat/authorization-service
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+- @rocket.chat/core-typings@6.11.2
+- @rocket.chat/rest-typings@6.11.2
+- @rocket.chat/core-services@0.5.2
+- @rocket.chat/model-typings@0.6.2
+- @rocket.chat/models@0.2.2
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, b764c415dc, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json
index bff15e7f7d91..d30a0150b3fc 100644
--- a/ee/apps/authorization-service/package.json
+++ b/ee/apps/authorization-service/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/authorization-service",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat Authorization service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -41,7 +41,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/authorization-service/src/service.js",
"files": [
diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md
index 1162e17c05d7..1c9c37bf3400 100644
--- a/ee/apps/ddp-streamer/CHANGELOG.md
+++ b/ee/apps/ddp-streamer/CHANGELOG.md
@@ -1,5 +1,105 @@
# @rocket.chat/ddp-streamer
+## 0.3.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+ - @rocket.chat/instance-status@0.1.6-rc.4
+
+
+## 0.3.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+ - @rocket.chat/instance-status@0.1.5-rc.3
+
+
+## 0.3.5-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+ - @rocket.chat/instance-status@0.1.5-rc.2
+
+
+## 0.3.5-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+ - @rocket.chat/instance-status@0.1.5-rc.1
+
+
+## 0.3.5-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, b764c415dc, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/instance-status@0.1.4-rc.0
+
+
+## 0.3.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/models@0.2.2
+ - @rocket.chat/instance-status@0.1.5
+
+
+## 0.3.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/models@0.2.1
+ - @rocket.chat/instance-status@0.1.4
+
+
## 0.3.3
### Patch Changes
diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json
index 1687042e0d31..b744c93d182d 100644
--- a/ee/apps/ddp-streamer/package.json
+++ b/ee/apps/ddp-streamer/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/ddp-streamer",
"private": true,
- "version": "0.3.3",
+ "version": "0.3.6-rc.4",
"description": "Rocket.Chat DDP-Streamer service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -15,7 +15,7 @@
],
"author": "Rocket.Chat",
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-services": "workspace:^",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/emitter": "~0.31.25",
@@ -57,7 +57,7 @@
"eslint": "~8.45.0",
"pino-pretty": "^7.6.1",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/service.js",
"files": [
diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md
index aac67c02dd3d..bfb8ca03b676 100644
--- a/ee/apps/omnichannel-transcript/CHANGELOG.md
+++ b/ee/apps/omnichannel-transcript/CHANGELOG.md
@@ -1,5 +1,103 @@
# @rocket.chat/omnichannel-transcript
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/omnichannel-services@0.3.3-rc.4
+ - @rocket.chat/pdf-worker@0.2.3-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/omnichannel-services@0.3.2-rc.3
+ - @rocket.chat/pdf-worker@0.2.2-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/omnichannel-services@0.3.2-rc.2
+ - @rocket.chat/pdf-worker@0.2.2-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/omnichannel-services@0.3.2-rc.1
+ - @rocket.chat/pdf-worker@0.2.2-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/omnichannel-services@0.3.1-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/pdf-worker@0.2.1-rc.0
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/omnichannel-services@0.3.2
+ - @rocket.chat/pdf-worker@0.2.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/omnichannel-services@0.3.1
+ - @rocket.chat/pdf-worker@0.2.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json
index c60542c180ec..8b091830ce96 100644
--- a/ee/apps/omnichannel-transcript/package.json
+++ b/ee/apps/omnichannel-transcript/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/omnichannel-transcript",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -47,7 +47,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/omnichannel-transcript/src/service.js",
"files": [
diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md
index b9544b0cdde9..238f5b922e4d 100644
--- a/ee/apps/presence-service/CHANGELOG.md
+++ b/ee/apps/presence-service/CHANGELOG.md
@@ -1,5 +1,95 @@
# @rocket.chat/presence-service
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/presence@0.2.6-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/presence@0.2.5-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.5-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/presence@0.2.5-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.5-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/presence@0.2.5-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.5-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/presence@0.2.4-rc.0
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/presence@0.2.5
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/presence@0.2.4
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json
index c800dd4d6c80..82c889b1b59c 100644
--- a/ee/apps/presence-service/package.json
+++ b/ee/apps/presence-service/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/presence-service",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat Presence service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -41,7 +41,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/presence-service/src/service.js",
"files": [
diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md
index 12271005af74..9fd9667e3115 100644
--- a/ee/apps/queue-worker/CHANGELOG.md
+++ b/ee/apps/queue-worker/CHANGELOG.md
@@ -1,5 +1,96 @@
# @rocket.chat/queue-worker
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/omnichannel-services@0.3.3-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/omnichannel-services@0.3.2-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/omnichannel-services@0.3.2-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/omnichannel-services@0.3.2-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/omnichannel-services@0.3.1-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/omnichannel-services@0.3.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/omnichannel-services@0.3.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json
index 0a227cb271c0..30157195b812 100644
--- a/ee/apps/queue-worker/package.json
+++ b/ee/apps/queue-worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/queue-worker",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -45,7 +45,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/queue-worker/src/service.js",
"files": [
diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md
index 3fbf664a0b30..fe29a82ffbba 100644
--- a/ee/apps/stream-hub-service/CHANGELOG.md
+++ b/ee/apps/stream-hub-service/CHANGELOG.md
@@ -1,5 +1,89 @@
# @rocket.chat/stream-hub-service
+## 0.4.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.4.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.4.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.4.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.4.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.4.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.4.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.4.3
### Patch Changes
diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json
index 812522a5f1d8..a33d3e6dcea9 100644
--- a/ee/apps/stream-hub-service/package.json
+++ b/ee/apps/stream-hub-service/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/stream-hub-service",
"private": true,
- "version": "0.4.3",
+ "version": "0.4.6-rc.4",
"description": "Rocket.Chat Stream Hub service",
"scripts": {
"build": "tsc -p tsconfig.json",
@@ -43,7 +43,7 @@
"@types/polka": "^0.5.6",
"eslint": "~8.45.0",
"ts-node": "^10.9.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./dist/ee/apps/stream-hub-service/src/service.js",
"files": [
diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md
index 8cc9df0dd502..0c857093c129 100644
--- a/ee/packages/license/CHANGELOG.md
+++ b/ee/packages/license/CHANGELOG.md
@@ -1,5 +1,68 @@
# @rocket.chat/license
+## 0.2.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+
+
+## 0.2.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+
+
+## 0.2.5-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+
+
+## 0.2.5-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+
+
+## 0.2.5-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+## 0.2.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+
+
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+
+
## 0.2.3
### Patch Changes
diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json
index 1c746514d443..58de941b5a3e 100644
--- a/ee/packages/license/package.json
+++ b/ee/packages/license/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/license",
- "version": "0.2.3",
+ "version": "0.2.6-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
@@ -10,7 +10,7 @@
"eslint": "~8.45.0",
"jest": "~29.7.0",
"jest-websocket-mock": "~2.5.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "tsc",
diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md
index a4a49de7aa30..752cb9a7d8c2 100644
--- a/ee/packages/omnichannel-services/CHANGELOG.md
+++ b/ee/packages/omnichannel-services/CHANGELOG.md
@@ -1,5 +1,103 @@
# @rocket.chat/omnichannel-services
+## 0.3.3-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/pdf-worker@0.2.3-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.3.3-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/pdf-worker@0.2.2-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.3.3-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/pdf-worker@0.2.2-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.3.3-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/pdf-worker@0.2.2-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.3.3-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, b764c415dc, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/pdf-worker@0.2.1-rc.0
+
+
+## 0.3.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/pdf-worker@0.2.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/model-typings@0.6.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.3.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/pdf-worker@0.2.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/model-typings@0.6.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.3.0
### Minor Changes
diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json
index f520d82bd7d3..e8774da0cdbc 100644
--- a/ee/packages/omnichannel-services/package.json
+++ b/ee/packages/omnichannel-services/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/omnichannel-services",
- "version": "0.3.0",
+ "version": "0.3.3-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:^",
@@ -8,7 +8,7 @@
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"@rocket.chat/core-services": "workspace:^",
diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md
index 5ebe251216a7..c2fbbdf3c0cf 100644
--- a/ee/packages/pdf-worker/CHANGELOG.md
+++ b/ee/packages/pdf-worker/CHANGELOG.md
@@ -1,5 +1,73 @@
# @rocket.chat/pdf-worker
+## 0.2.3-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+
+
+## 0.2.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+## 0.2.3-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+
+
+## 0.2.2-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+
+
+## 0.2.3-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+
+
+## 0.2.3-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+## 0.2.2
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.11.2
+
+
+## 0.2.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+
+
## 0.2.0
### Minor Changes
diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json
index 749d48ccc9c2..5e351a9dca4e 100644
--- a/ee/packages/pdf-worker/package.json
+++ b/ee/packages/pdf-worker/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/pdf-worker",
- "version": "0.2.0",
+ "version": "0.2.3-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
@@ -14,7 +14,7 @@
"eslint": "~8.45.0",
"jest": "~29.7.0",
"react-dom": "~18.3.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "tsc -p tsconfig.build.json && cp -r src/public dist/public",
diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md
index 3d1a7e35b705..41d732348c84 100644
--- a/ee/packages/presence/CHANGELOG.md
+++ b/ee/packages/presence/CHANGELOG.md
@@ -1,5 +1,82 @@
# @rocket.chat/presence
+## 0.2.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/core-services@0.6.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.2.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/core-services@0.6.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.2.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/core-services@0.6.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.2.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/core-services@0.6.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.2.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/core-services@0.6.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.2.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/core-services@0.5.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/core-services@0.5.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.2.3
### Patch Changes
diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json
index 787eb2053007..d1c24c7e5134 100644
--- a/ee/packages/presence/package.json
+++ b/ee/packages/presence/package.json
@@ -1,19 +1,19 @@
{
"name": "@rocket.chat/presence",
- "version": "0.2.3",
+ "version": "0.2.6-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
"@babel/preset-env": "~7.22.20",
"@babel/preset-typescript": "~7.22.15",
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/eslint-config": "workspace:^",
"@rocket.chat/rest-typings": "workspace:^",
"@types/node": "^14.18.63",
"babel-jest": "^29.0.3",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint src",
diff --git a/ee/packages/ui-theming/CHANGELOG.md b/ee/packages/ui-theming/CHANGELOG.md
index 2d01b23733b1..7b9d7c385f6c 100644
--- a/ee/packages/ui-theming/CHANGELOG.md
+++ b/ee/packages/ui-theming/CHANGELOG.md
@@ -1,5 +1,11 @@
# @rocket.chat/ui-theming
+## 0.2.1-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
## 0.2.0
### Minor Changes
diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json
index 713265b36bfa..52af8ad57dc2 100644
--- a/ee/packages/ui-theming/package.json
+++ b/ee/packages/ui-theming/package.json
@@ -1,10 +1,10 @@
{
"name": "@rocket.chat/ui-theming",
- "version": "0.2.0",
+ "version": "0.2.1-rc.0",
"private": true,
"devDependencies": {
"@rocket.chat/css-in-js": "~0.31.25",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/icons": "~0.38.0",
"@rocket.chat/ui-contexts": "workspace:~",
@@ -16,7 +16,7 @@
"eslint-plugin-testing-library": "^5.11.1",
"react": "~17.0.2",
"react-docgen-typescript-plugin": "~1.0.5",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/package.json b/package.json
index 29de436373e2..8153bb915a62 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "rocket.chat",
- "version": "6.12.0-develop",
+ "version": "6.12.0-rc.4",
"description": "Rocket.Chat Monorepo",
"main": "index.js",
"private": true,
@@ -64,8 +64,7 @@
"@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0": "patch:@storybook/react-docgen-typescript-plugin@npm%3A1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0#./.yarn/patches/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40.patch",
"mongodb@^4.17.1": "patch:mongodb@npm:4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch",
"@rocket.chat/forked-matrix-sdk-crypto-nodejs": "0.1.0-beta.13",
- "typia@5.3.3": "patch:typia@npm:5.3.3#.yarn/patches/typia-npm-5.3.3-21d3e18463.patch",
- "typia@~5.3.3": "patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch"
+ "typia@~6.9.0": "patch:typia@npm%3A6.9.0#./.yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch"
},
"dependencies": {
"node-gyp": "^9.4.1"
diff --git a/packages/account-utils/package.json b/packages/account-utils/package.json
index e33876a02d28..4ec6cd3bcab5 100644
--- a/packages/account-utils/package.json
+++ b/packages/account-utils/package.json
@@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/agenda/package.json b/packages/agenda/package.json
index 71b8b01bd6b0..f09921de6c31 100644
--- a/packages/agenda/package.json
+++ b/packages/agenda/package.json
@@ -14,7 +14,7 @@
"devDependencies": {
"@types/debug": "^4.1.10",
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/api-client/CHANGELOG.md b/packages/api-client/CHANGELOG.md
index 8fe130aeaf28..f572a907479f 100644
--- a/packages/api-client/CHANGELOG.md
+++ b/packages/api-client/CHANGELOG.md
@@ -1,5 +1,74 @@
# @rocket.chat/api-client
+## 0.2.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+
+
+## 0.2.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+
+
+## 0.2.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+
+
+## 0.2.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+
+
+## 0.2.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [b764c415dc, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+## 0.2.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+
+
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+
+
## 0.2.3
### Patch Changes
diff --git a/packages/api-client/package.json b/packages/api-client/package.json
index 43de20583d47..4bfe95e386fb 100644
--- a/packages/api-client/package.json
+++ b/packages/api-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/api-client",
- "version": "0.2.3",
+ "version": "0.2.6-rc.4",
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
"@types/jest": "~29.5.12",
@@ -8,7 +8,7 @@
"eslint": "~8.45.0",
"jest": "~29.7.0",
"jest-fetch-mock": "^3.0.3",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "tsc",
diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md
index 07f4af49f31e..37eff88a3664 100644
--- a/packages/apps/CHANGELOG.md
+++ b/packages/apps/CHANGELOG.md
@@ -1,5 +1,75 @@
# @rocket.chat/apps
+## 0.1.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/model-typings@0.7.0-rc.4
+
+
+## 0.1.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/model-typings@0.7.0-rc.3
+
+
+## 0.1.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/model-typings@0.7.0-rc.2
+
+
+## 0.1.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/model-typings@0.7.0-rc.1
+
+
+## 0.1.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, 7937ff741a, a14c0678bb, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/model-typings@0.6.2
+
+
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/model-typings@0.6.1
+
+
## 0.1.3
### Patch Changes
diff --git a/packages/apps/package.json b/packages/apps/package.json
index 816e271535df..f1330372ee3e 100644
--- a/packages/apps/package.json
+++ b/packages/apps/package.json
@@ -1,10 +1,10 @@
{
"name": "@rocket.chat/apps",
- "version": "0.1.3",
+ "version": "0.1.6-rc.4",
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
@@ -18,7 +18,7 @@
"/dist"
],
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/model-typings": "workspace:^"
}
diff --git a/packages/base64/package.json b/packages/base64/package.json
index c58a652877a3..441fed0e06c1 100644
--- a/packages/base64/package.json
+++ b/packages/base64/package.json
@@ -21,7 +21,7 @@
"@typescript-eslint/parser": "~5.60.1",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/cas-validate/package.json b/packages/cas-validate/package.json
index 769b74d38e56..a7cccb911781 100644
--- a/packages/cas-validate/package.json
+++ b/packages/cas-validate/package.json
@@ -5,7 +5,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md
index 0c10b78c3bf4..d1bb14df9ada 100644
--- a/packages/core-services/CHANGELOG.md
+++ b/packages/core-services/CHANGELOG.md
@@ -1,5 +1,86 @@
# @rocket.chat/core-services
+## 0.6.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.6.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.6.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.6.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.6.0-rc.0
+
+### Minor Changes
+
+- ([#32868](https://github.com/RocketChat/Rocket.Chat/pull/32868)) Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints
+
+### Patch Changes
+
+- Updated dependencies [c11f3722df, b764c415dc, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.5.2
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.5.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.5.0
### Minor Changes
diff --git a/packages/core-services/package.json b/packages/core-services/package.json
index fe1d4ef0dcea..d451acbedc2d 100644
--- a/packages/core-services/package.json
+++ b/packages/core-services/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/core-services",
- "version": "0.5.0",
+ "version": "0.6.0-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
@@ -16,7 +16,7 @@
"jest": "~29.7.0",
"mongodb": "^4.17.2",
"prettier": "~2.8.8",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
@@ -34,7 +34,7 @@
"extends": "../../package.json"
},
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/icons": "~0.38.0",
"@rocket.chat/message-parser": "workspace:^",
diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md
index fb313a4d1320..599b1cc5833e 100644
--- a/packages/core-typings/CHANGELOG.md
+++ b/packages/core-typings/CHANGELOG.md
@@ -1,5 +1,44 @@
# @rocket.chat/core-typings
+## 6.12.0-rc.4
+
+## 6.12.0-rc.3
+
+## 6.12.0-rc.2
+
+## 6.12.0-rc.1
+
+## 6.12.0-rc.0
+
+### Minor Changes
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Added a new setting to enable/disable file encryption in an end to end encrypted room.
+
+- ([#32868](https://github.com/RocketChat/Rocket.Chat/pull/32868)) Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Fixed a bug related to uploading end to end encrypted file.
+
+ E2EE files and uploads are uploaded as files of mime type `application/octet-stream` as we can't reveal the mime type of actual content since it is encrypted and has to be kept confidential.
+
+ The server resolves the mime type of encrypted file as `application/octet-stream` but it wasn't playing nicely with existing settings related to whitelisted and blacklisted media types.
+
+ E2EE files upload was getting blocked if `application/octet-stream` is not a whitelisted media type.
+
+ Now this PR solves this issue by always accepting E2EE uploads even if `application/octet-stream` is not whitelisted but it will block the upload if `application/octet-stream` is black listed.
+
+### Patch Changes
+
+- ([#32846](https://github.com/RocketChat/Rocket.Chat/pull/32846)) Fixed issue with system messages being counted as agents' first responses in livechat rooms (which caused the "best first response time" and "average first response time" metrics to be unreliable for all agents)
+
+- Updated dependencies [c11f3722df]:
+
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+
+
+## 6.11.2
+
+## 6.11.1
+
## 6.11.0
### Minor Changes
diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json
index 34bdc67438ca..07ae6e113f44 100644
--- a/packages/core-typings/package.json
+++ b/packages/core-typings/package.json
@@ -1,13 +1,13 @@
{
"$schema": "https://json.schemastore.org/package",
"name": "@rocket.chat/core-typings",
- "version": "6.12.0-develop",
+ "version": "6.12.0-rc.4",
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:^",
"eslint": "~8.45.0",
"mongodb": "^4.17.2",
"prettier": "~2.8.8",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
@@ -22,10 +22,11 @@
"/dist"
],
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/icons": "~0.38.0",
"@rocket.chat/message-parser": "workspace:^",
- "@rocket.chat/ui-kit": "workspace:~"
+ "@rocket.chat/ui-kit": "workspace:~",
+ "@types/express": "^4.17.21"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/core-typings/src/IRoom.ts b/packages/core-typings/src/IRoom.ts
index b714606b5c8d..95f2836da1e7 100644
--- a/packages/core-typings/src/IRoom.ts
+++ b/packages/core-typings/src/IRoom.ts
@@ -166,6 +166,31 @@ export enum OmnichannelSourceType {
OTHER = 'other', // catch-all source type
}
+export interface IOmnichannelSource {
+ // TODO: looks like this is not so required as the definition suggests
+ // The source, or client, which created the Omnichannel room
+ type: OmnichannelSourceType;
+ // An optional identification of external sources, such as an App
+ id?: string;
+ // A human readable alias that goes with the ID, for post analytical purposes
+ alias?: string;
+ // A label to be shown in the room info
+ label?: string;
+ // The sidebar icon
+ sidebarIcon?: string;
+ // The default sidebar icon
+ defaultIcon?: string;
+}
+
+export interface IOmnichannelSourceFromApp extends IOmnichannelSource {
+ type: OmnichannelSourceType.APP;
+ id: string;
+ label: string;
+ sidebarIcon?: string;
+ defaultIcon?: string;
+ alias?: string;
+}
+
export interface IOmnichannelGenericRoom extends Omit {
t: 'l' | 'v';
v: Pick & {
@@ -179,21 +204,7 @@ export interface IOmnichannelGenericRoom extends Omit &
@@ -350,12 +355,8 @@ export const isOmnichannelRoom = (room: Pick): room is IOmnichannelR
export const isVoipRoom = (room: IRoom): room is IVoipRoom & IRoom => room.t === 'v';
-export const isOmnichannelRoomFromAppSource = (room: IOmnichannelRoom): room is IOmnichannelRoomFromAppSource => {
- if (!isOmnichannelRoom(room)) {
- return false;
- }
-
- return room.source?.type === OmnichannelSourceType.APP;
+export const isOmnichannelSourceFromApp = (source: IOmnichannelSource): source is IOmnichannelSourceFromApp => {
+ return source?.type === OmnichannelSourceType.APP;
};
export type RoomAdminFieldsType =
diff --git a/packages/core-typings/src/omnichannel/sms.ts b/packages/core-typings/src/omnichannel/sms.ts
index 7ff7a4768a13..49364da2b8c3 100644
--- a/packages/core-typings/src/omnichannel/sms.ts
+++ b/packages/core-typings/src/omnichannel/sms.ts
@@ -1,3 +1,5 @@
+import type { Request } from 'express';
+
type ServiceMedia = {
url: string;
contentType: string;
@@ -27,6 +29,7 @@ export interface ISMSProviderConstructor {
export interface ISMSProvider {
parse(data: unknown): ServiceData;
+ validateRequest(request: Request): boolean;
sendBatch?(from: string, to: string[], message: string): Promise;
response(): SMSProviderResponse;
diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md
index 33c0c9872a60..3547dc00b3d5 100644
--- a/packages/cron/CHANGELOG.md
+++ b/packages/cron/CHANGELOG.md
@@ -1,5 +1,75 @@
# @rocket.chat/cron
+## 0.1.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.1.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.1.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.1.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.1.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/models@0.2.2
+
+
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/models@0.2.1
+
+
## 0.1.3
### Patch Changes
diff --git a/packages/cron/package.json b/packages/cron/package.json
index a6484224ded5..3f004bf99cfc 100644
--- a/packages/cron/package.json
+++ b/packages/cron/package.json
@@ -1,10 +1,10 @@
{
"name": "@rocket.chat/cron",
- "version": "0.1.3",
+ "version": "0.1.6-rc.4",
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/ddp-client/CHANGELOG.md b/packages/ddp-client/CHANGELOG.md
index 0f9b5f7f26b3..f95d31c25370 100644
--- a/packages/ddp-client/CHANGELOG.md
+++ b/packages/ddp-client/CHANGELOG.md
@@ -1,5 +1,80 @@
# @rocket.chat/ddp-client
+## 0.3.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/api-client@0.2.6-rc.4
+
+
+## 0.3.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/api-client@0.2.5-rc.3
+
+
+## 0.3.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/api-client@0.2.5-rc.2
+
+
+## 0.3.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/api-client@0.2.5-rc.1
+
+
+## 0.3.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies [b764c415dc, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/api-client@0.2.4-rc.0
+
+
+## 0.3.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/api-client@0.2.5
+
+
+## 0.3.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/api-client@0.2.4
+
+
## 0.3.3
### Patch Changes
diff --git a/packages/ddp-client/package.json b/packages/ddp-client/package.json
index 9e4fdfd85910..dbfe319a21a0 100644
--- a/packages/ddp-client/package.json
+++ b/packages/ddp-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/ddp-client",
- "version": "0.3.3",
+ "version": "0.3.6-rc.4",
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
"@types/jest": "~29.5.12",
@@ -8,7 +8,7 @@
"eslint": "~8.45.0",
"jest": "~29.7.0",
"jest-websocket-mock": "~2.5.0",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"ws": "^8.13.0"
},
"peerDependencies": {
diff --git a/packages/favicon/package.json b/packages/favicon/package.json
index b61eaee02a68..67f5c6dcdfea 100644
--- a/packages/favicon/package.json
+++ b/packages/favicon/package.json
@@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md
index e8fe73f6d549..d44f1c9c56ce 100644
--- a/packages/fuselage-ui-kit/CHANGELOG.md
+++ b/packages/fuselage-ui-kit/CHANGELOG.md
@@ -1,5 +1,98 @@
# Change Log
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/gazzodown@10.0.0-rc.4
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+ - @rocket.chat/ui-avatar@6.0.0-rc.4
+ - @rocket.chat/ui-video-conf@10.0.0-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/gazzodown@10.0.0-rc.3
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+ - @rocket.chat/ui-avatar@6.0.0-rc.3
+ - @rocket.chat/ui-video-conf@10.0.0-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/gazzodown@10.0.0-rc.2
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+ - @rocket.chat/ui-avatar@6.0.0-rc.2
+ - @rocket.chat/ui-video-conf@10.0.0-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/gazzodown@10.0.0-rc.1
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+ - @rocket.chat/ui-avatar@6.0.0-rc.1
+ - @rocket.chat/ui-video-conf@10.0.0-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies [8ea6517c4e, c11f3722df, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/ui-video-conf@10.0.0-rc.0
+ - @rocket.chat/gazzodown@10.0.0-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.0
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/gazzodown@9.0.2
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/ui-avatar@5.0.2
+ - @rocket.chat/ui-video-conf@9.0.2
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/gazzodown@9.0.1
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/ui-avatar@5.0.1
+ - @rocket.chat/ui-video-conf@9.0.1
+
+
## 9.0.0
### Patch Changes
diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json
index 9431a0c19d96..6aaba74098b0 100644
--- a/packages/fuselage-ui-kit/package.json
+++ b/packages/fuselage-ui-kit/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/fuselage-ui-kit",
"private": true,
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system",
"homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/",
"author": {
@@ -50,10 +50,10 @@
"@rocket.chat/icons": "*",
"@rocket.chat/prettier-config": "*",
"@rocket.chat/styled": "*",
- "@rocket.chat/ui-avatar": "5.0.0",
- "@rocket.chat/ui-contexts": "9.0.0",
- "@rocket.chat/ui-kit": "0.36.0",
- "@rocket.chat/ui-video-conf": "9.0.0",
+ "@rocket.chat/ui-avatar": "6.0.0-rc.4",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
+ "@rocket.chat/ui-kit": "0.36.1-rc.0",
+ "@rocket.chat/ui-video-conf": "10.0.0-rc.4",
"@tanstack/react-query": "*",
"react": "*",
"react-dom": "*"
@@ -63,10 +63,10 @@
"@babel/preset-env": "~7.22.20",
"@babel/preset-react": "~7.22.15",
"@babel/preset-typescript": "~7.22.15",
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/eslint-config": "workspace:^",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/fuselage-polyfills": "~0.31.25",
"@rocket.chat/icons": "~0.38.0",
@@ -106,7 +106,7 @@
"rimraf": "^3.0.2",
"storybook-dark-mode": "~3.0.1",
"tslib": "^2.5.3",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"@rocket.chat/core-typings": "workspace:^",
diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md
index 4febdb0f54b2..b29df6d2887b 100644
--- a/packages/gazzodown/CHANGELOG.md
+++ b/packages/gazzodown/CHANGELOG.md
@@ -1,5 +1,83 @@
# @rocket.chat/gazzodown
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+ - @rocket.chat/ui-client@10.0.0-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+ - @rocket.chat/ui-client@10.0.0-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+ - @rocket.chat/ui-client@10.0.0-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+ - @rocket.chat/ui-client@10.0.0-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies [8ea6517c4e, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/ui-client@10.0.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/ui-client@9.0.2
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/ui-client@9.0.1
+
+
## 9.0.0
### Patch Changes
diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json
index 6ecb49fa9544..ef7268835584 100644
--- a/packages/gazzodown/package.json
+++ b/packages/gazzodown/package.json
@@ -1,12 +1,12 @@
{
"name": "@rocket.chat/gazzodown",
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/css-in-js": "~0.31.25",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-tokens": "^0.33.1",
"@rocket.chat/jest-presets": "workspace:~",
"@rocket.chat/message-parser": "workspace:^",
@@ -41,7 +41,7 @@
"outdent": "^0.8.0",
"react-docgen-typescript-plugin": "~1.0.5",
"react-dom": "~17.0.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc -p tsconfig.build.json",
@@ -66,8 +66,8 @@
"@rocket.chat/fuselage-tokens": "*",
"@rocket.chat/message-parser": "0.31.29",
"@rocket.chat/styled": "*",
- "@rocket.chat/ui-client": "9.0.0",
- "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-client": "10.0.0-rc.4",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
"katex": "*",
"react": "*"
},
diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md
index 8c46d5736706..31ca8e91df6d 100644
--- a/packages/i18n/CHANGELOG.md
+++ b/packages/i18n/CHANGELOG.md
@@ -1,5 +1,33 @@
# @rocket.chat/i18n
+## 0.7.0-rc.0
+
+### Minor Changes
+
+- ([#32916](https://github.com/RocketChat/Rocket.Chat/pull/32916)) Added a new Audit endpoint `audit/rooms.members` that allows users with `view-members-list-all-rooms` to fetch a list of the members of any room even if the user is not part of it.
+
+- ([#32867](https://github.com/RocketChat/Rocket.Chat/pull/32867)) Added an accordion for advanced settings on Create teams and channels
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Added a new setting to enable/disable file encryption in an end to end encrypted room.
+
+- ([#33003](https://github.com/RocketChat/Rocket.Chat/pull/33003)) Fixed a bug related to uploading end to end encrypted file.
+
+ E2EE files and uploads are uploaded as files of mime type `application/octet-stream` as we can't reveal the mime type of actual content since it is encrypted and has to be kept confidential.
+
+ The server resolves the mime type of encrypted file as `application/octet-stream` but it wasn't playing nicely with existing settings related to whitelisted and blacklisted media types.
+
+ E2EE files upload was getting blocked if `application/octet-stream` is not a whitelisted media type.
+
+ Now this PR solves this issue by always accepting E2EE uploads even if `application/octet-stream` is not whitelisted but it will block the upload if `application/octet-stream` is black listed.
+
+### Patch Changes
+
+- ([#31525](https://github.com/RocketChat/Rocket.Chat/pull/31525)) Fix: Show correct user info actions for non-members in channels.
+
+- ([#33029](https://github.com/RocketChat/Rocket.Chat/pull/33029)) Fixes a typo in german translation and fixes the broken hyperlink for Resend and Change Email
+
+- ([#32743](https://github.com/RocketChat/Rocket.Chat/pull/32743)) Fixes an issue where creating a new user with an invalid username (containing special characters) resulted in an error message, but the user was still created. The user creation process now properly aborts when an invalid username is provided.
+
## 0.6.0
### Minor Changes
diff --git a/packages/i18n/package.json b/packages/i18n/package.json
index 6927aae08d1c..d7b05c5b18de 100644
--- a/packages/i18n/package.json
+++ b/packages/i18n/package.json
@@ -1,13 +1,13 @@
{
"name": "@rocket.chat/i18n",
- "version": "0.6.0",
+ "version": "0.7.0-rc.0",
"private": true,
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
"eslint": "~8.45.0",
"jest": "~29.7.0",
"tsup": "^6.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "node ./src/index.mjs",
diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json
index b28b1fc2bfde..ea7e31422cb1 100644
--- a/packages/i18n/src/locales/en.i18n.json
+++ b/packages/i18n/src/locales/en.i18n.json
@@ -2082,6 +2082,7 @@
"error-invalid-custom-field": "Invalid custom field",
"error-invalid-custom-field-name": "Invalid custom field name. Use only letters, numbers, hyphens and underscores.",
"error-invalid-custom-field-value": "Invalid value for {{field}} field",
+ "error-custom-field-not-allowed": "Custom field {{key}} is not allowed",
"error-invalid-date": "Invalid date provided.",
"error-invalid-dates": "From date cannot be after To date",
"error-invalid-description": "Invalid description",
@@ -5842,6 +5843,8 @@
"view-joined-room": "View Joined Room",
"view-joined-room_description": "Permission to view the currently joined channels",
"view-l-room": "View Omnichannel Rooms",
+ "create-livechat-contact": "Create Omnichannel contacts",
+ "update-livechat-contact": "Update Omnichannel contacts",
"view-l-room_description": "Permission to view Omnichannel rooms",
"view-livechat-analytics": "View Omnichannel Analytics",
"onboarding.page.awaitingConfirmation.subtitle": "We have sent you an email to {{emailAddress}} with a confirmation link. Please verify that the security code below matches the one in the email.",
diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json
index f072bc626270..dc62318cb230 100644
--- a/packages/i18n/src/locales/pt-BR.i18n.json
+++ b/packages/i18n/src/locales/pt-BR.i18n.json
@@ -1736,6 +1736,7 @@
"error-invalid-custom-field": "Campo personalizado inválido",
"error-invalid-custom-field-name": "Nome inválido para o campo personalizado. Use apenas letras, números, hÃfens e travessão.",
"error-invalid-custom-field-value": "Valor inválido para o campo {{field}}",
+ "error-custom-field-not-allowed": "O campo personalizado {{key}} não é permitido",
"error-invalid-date": "Data fornecida inválida",
"error-invalid-description": "Descrição inválida",
"error-invalid-domain": "DomÃnio inválido",
@@ -4678,6 +4679,8 @@
"view-joined-room": "Ver sala incorporada",
"view-joined-room_description": "Permissão para ver os canais atualmente associados",
"view-l-room": "Ver salas de omnichannel",
+ "create-livechat-contact": "Criar contatos do omnichannel",
+ "update-livechat-contact": "Atualizar contatos do omnichannel",
"view-l-room_description": "Permissão para ver salas de omnichannel",
"view-livechat-analytics": "Ver a análise do omnichannel",
"onboarding.page.awaitingConfirmation.subtitle": "Enviamos um e-mail para {{emailAddress}} com um link de confirmação. Verifique se o código de segurança abaixo coincide com o do e-mail.",
diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md
index 849ccf591d08..bcffe470bc5a 100644
--- a/packages/instance-status/CHANGELOG.md
+++ b/packages/instance-status/CHANGELOG.md
@@ -1,5 +1,68 @@
# @rocket.chat/instance-status
+## 0.1.6-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.3-rc.4
+
+
+## 0.1.6-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.2-rc.3
+
+
+## 0.1.6-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.2-rc.2
+
+
+## 0.1.6-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.2-rc.1
+
+
+## 0.1.6-rc.0
+
+### Patch Changes
+
+- Updated dependencies []:
+- @rocket.chat/models@0.2.1-rc.0
+
+
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.2
+
+
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/models@0.2.1-rc.0
+ - @rocket.chat/models@0.2.1
+
+
## 0.1.3
### Patch Changes
diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json
index 088cba613d8e..03b7aae35db3 100644
--- a/packages/instance-status/package.json
+++ b/packages/instance-status/package.json
@@ -1,13 +1,13 @@
{
"name": "@rocket.chat/instance-status",
- "version": "0.1.3",
+ "version": "0.1.6-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:^",
"eslint": "~8.45.0",
"mongodb": "^4.17.2",
"prettier": "~2.8.8",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/jest-presets/package.json b/packages/jest-presets/package.json
index e6c0c9197bce..5fb2e26389a0 100644
--- a/packages/jest-presets/package.json
+++ b/packages/jest-presets/package.json
@@ -30,7 +30,7 @@
"@types/uuid": "^9",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.4.5"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/jwt/package.json b/packages/jwt/package.json
index a6d989e2c275..d945bd3a6f9c 100644
--- a/packages/jwt/package.json
+++ b/packages/jwt/package.json
@@ -7,7 +7,7 @@
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc",
diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md
index 56265d43563f..08c7ccff3c86 100644
--- a/packages/livechat/CHANGELOG.md
+++ b/packages/livechat/CHANGELOG.md
@@ -1,5 +1,71 @@
# @rocket.chat/livechat Change Log
+## 1.19.3-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@10.0.0-rc.4
+
+
+## 1.19.3-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@10.0.0-rc.3
+
+
+## 1.19.3-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@10.0.0-rc.2
+
+
+## 1.19.3-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@10.0.0-rc.1
+
+
+## 1.19.3-rc.0
+
+### Patch Changes
+
+- ([#32928](https://github.com/RocketChat/Rocket.Chat/pull/32928)) Fixed issue where `after-registration-triggers` would show up in a page when the user was not yet registered
+
+- Updated dependencies [8ea6517c4e, c11f3722df]:
+
+ - @rocket.chat/gazzodown@10.0.0-rc.0
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+
+
+## 1.19.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@9.0.2
+
+
+## 1.19.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/gazzodown@9.0.1
+
+
## 1.19.0
### Minor Changes
diff --git a/packages/livechat/package.json b/packages/livechat/package.json
index 9d40643dd4c5..a04717c3a59d 100644
--- a/packages/livechat/package.json
+++ b/packages/livechat/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/livechat",
- "version": "1.19.0",
+ "version": "1.19.3-rc.4",
"files": [
"/build"
],
@@ -85,7 +85,7 @@
"stylelint-order": "^5.0.0",
"svg-loader": "^0.0.2",
"terser-webpack-plugin": "~4.2.3",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"url-loader": "^4.1.1",
"webpack": "^5.89.0",
"webpack-bundle-analyzer": "^4.9.1",
diff --git a/packages/log-format/package.json b/packages/log-format/package.json
index b43a3954a96f..f6f7c03b6f63 100644
--- a/packages/log-format/package.json
+++ b/packages/log-format/package.json
@@ -6,7 +6,7 @@
"@types/chalk": "^2.2.0",
"@types/ejson": "^2.2.1",
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/logger/package.json b/packages/logger/package.json
index aae996f35139..d073ebddbf49 100644
--- a/packages/logger/package.json
+++ b/packages/logger/package.json
@@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/message-parser/package.json b/packages/message-parser/package.json
index fd7e88dc1d86..78ffd3401ff4 100644
--- a/packages/message-parser/package.json
+++ b/packages/message-parser/package.json
@@ -68,7 +68,7 @@
"rimraf": "^3.0.2",
"ts-loader": "~9.4.2",
"typedoc": "~0.24.1",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"webpack": "~5.78.0",
"webpack-cli": "~5.0.1"
},
diff --git a/packages/mock-providers/CHANGELOG.md b/packages/mock-providers/CHANGELOG.md
index 300b624d5dff..55af119d59fe 100644
--- a/packages/mock-providers/CHANGELOG.md
+++ b/packages/mock-providers/CHANGELOG.md
@@ -1,5 +1,14 @@
# @rocket.chat/mock-providers
+## 0.1.2-rc.0
+
+### Patch Changes
+
+- Updated dependencies [127866ce97, 0c919db7b4, b764c415dc, 1f061a1aa5, dd37ea1b35, 58c0efc732, 58c0efc732]:
+
+ - @rocket.chat/i18n@0.7.0-rc.0
+
+
## 0.1.1
### Patch Changes
diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json
index 64310f0695cc..dddd4396d7c8 100644
--- a/packages/mock-providers/package.json
+++ b/packages/mock-providers/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/mock-providers",
- "version": "0.1.1",
+ "version": "0.1.2-rc.0",
"private": true,
"dependencies": {
"@rocket.chat/emitter": "~0.31.25",
@@ -17,7 +17,7 @@
"@types/use-sync-external-store": "^0.0.5",
"eslint": "~8.45.0",
"react": "~17.0.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"peerDependencies": {
"@tanstack/react-query": "*",
diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md
index 29eaadd0e0fe..e411eea4e61c 100644
--- a/packages/model-typings/CHANGELOG.md
+++ b/packages/model-typings/CHANGELOG.md
@@ -1,5 +1,68 @@
# @rocket.chat/model-typings
+## 0.7.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+
+
+## 0.6.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+
+
+## 0.7.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+
+
+## 0.7.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+
+
+## 0.7.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+
+
+## 0.7.0-rc.0
+
+### Minor Changes
+
+- ([#32868](https://github.com/RocketChat/Rocket.Chat/pull/32868)) Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints
+
+### Patch Changes
+
+- ([#32986](https://github.com/RocketChat/Rocket.Chat/pull/32986)) Fixed login with third-party apps not working without the "Manage OAuth Apps" permission
+
+- ([#33054](https://github.com/RocketChat/Rocket.Chat/pull/33054)) Fixed issue with livechat analytics in a given date range considering conversation data from the following day
+
+- Updated dependencies [7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+
## 0.6.0
### Minor Changes
diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json
index f96764fa49af..47000c59d375 100644
--- a/packages/model-typings/package.json
+++ b/packages/model-typings/package.json
@@ -1,12 +1,12 @@
{
"name": "@rocket.chat/model-typings",
- "version": "0.6.0",
+ "version": "0.7.0-rc.4",
"private": true,
"devDependencies": {
"@types/node-rsa": "^1.1.3",
"eslint": "~8.45.0",
"mongodb": "^4.17.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/model-typings/src/models/ILivechatContactsModel.ts b/packages/model-typings/src/models/ILivechatContactsModel.ts
index bcf48a837400..f94216830884 100644
--- a/packages/model-typings/src/models/ILivechatContactsModel.ts
+++ b/packages/model-typings/src/models/ILivechatContactsModel.ts
@@ -2,4 +2,6 @@ import type { ILivechatContact } from '@rocket.chat/core-typings';
import type { IBaseModel } from './IBaseModel';
-export type ILivechatContactsModel = IBaseModel;
+export interface ILivechatContactsModel extends IBaseModel {
+ updateContact(contactId: string, data: Partial): Promise;
+}
diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md
index e2b984708aaa..b45739ee48e8 100644
--- a/packages/models/CHANGELOG.md
+++ b/packages/models/CHANGELOG.md
@@ -1,5 +1,68 @@
# @rocket.chat/models
+## 0.2.3-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.7.0-rc.4
+
+
+## 0.2.3-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.7.0-rc.3
+
+
+## 0.2.3-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.7.0-rc.2
+
+
+## 0.2.3-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.7.0-rc.1
+
+
+## 0.2.3-rc.0
+
+### Patch Changes
+
+- Updated dependencies [7f88158036, a14c0678bb, e28be46db7]:
+
+ - @rocket.chat/model-typings@0.7.0-rc.0
+
+
+## 0.2.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.6.2
+
+
+## 0.2.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/model-typings@0.6.1
+
+
## 0.2.0
### Minor Changes
diff --git a/packages/models/package.json b/packages/models/package.json
index 19f1f28438f6..d6189ce43a78 100644
--- a/packages/models/package.json
+++ b/packages/models/package.json
@@ -1,13 +1,13 @@
{
"name": "@rocket.chat/models",
- "version": "0.2.0",
+ "version": "0.2.3-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "^29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"@rocket.chat/model-typings": "workspace:~"
diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json
index a232d6b4c476..1d0c4c462e46 100644
--- a/packages/node-poplib/package.json
+++ b/packages/node-poplib/package.json
@@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"main": "./src/index.js",
"typings": "./dist/index.d.ts"
diff --git a/packages/password-policies/package.json b/packages/password-policies/package.json
index d53ffa1f5249..a2fef4ae0543 100644
--- a/packages/password-policies/package.json
+++ b/packages/password-policies/package.json
@@ -7,7 +7,7 @@
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc",
diff --git a/packages/patch-injection/package.json b/packages/patch-injection/package.json
index 99f676bff831..8dabf2fb3f2a 100644
--- a/packages/patch-injection/package.json
+++ b/packages/patch-injection/package.json
@@ -7,7 +7,7 @@
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc",
diff --git a/packages/peggy-loader/package.json b/packages/peggy-loader/package.json
index 5fa014da7f29..f0ac6d915567 100644
--- a/packages/peggy-loader/package.json
+++ b/packages/peggy-loader/package.json
@@ -50,7 +50,7 @@
"peggy": "3.0.2",
"prettier": "~2.8.7",
"rimraf": "^3.0.2",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"webpack": "~5.78.0"
},
"volta": {
diff --git a/packages/random/package.json b/packages/random/package.json
index 72fc8c5c566a..498e218338d9 100644
--- a/packages/random/package.json
+++ b/packages/random/package.json
@@ -23,7 +23,7 @@
"@typescript-eslint/parser": "~5.60.1",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/release-action/package.json b/packages/release-action/package.json
index 0d17e4fb4221..e633ef69d06f 100644
--- a/packages/release-action/package.json
+++ b/packages/release-action/package.json
@@ -11,7 +11,7 @@
"packageManager": "yarn@3.5.1",
"devDependencies": {
"@types/node": "^16.18.60",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"@actions/core": "^1.10.1",
diff --git a/packages/release-changelog/package.json b/packages/release-changelog/package.json
index 9e48d015b321..f183d00b550b 100644
--- a/packages/release-changelog/package.json
+++ b/packages/release-changelog/package.json
@@ -12,7 +12,7 @@
"@rocket.chat/eslint-config": "workspace:^",
"@types/node": "^14.18.63",
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"dependencies": {
"dataloader": "^1.4.0",
diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md
index efcab160b8e6..93c80293523d 100644
--- a/packages/rest-typings/CHANGELOG.md
+++ b/packages/rest-typings/CHANGELOG.md
@@ -1,5 +1,74 @@
# @rocket.chat/rest-typings
+## 6.12.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+
+
+## 6.12.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/core-typings@6.12.0-rc.3
+
+
+## 6.12.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+
+
+## 6.12.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+
+
+## 6.12.0-rc.0
+
+### Minor Changes
+
+- ([#32868](https://github.com/RocketChat/Rocket.Chat/pull/32868)) Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints
+
+### Patch Changes
+
+- ([#31525](https://github.com/RocketChat/Rocket.Chat/pull/31525)) Fix: Show correct user info actions for non-members in channels.
+
+- Updated dependencies [c11f3722df, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/ui-kit@0.36.1-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+
+
+## 6.11.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+
+
+## 6.11.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+
+
## 6.11.0
### Minor Changes
diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json
index 53bd1d2f5cb2..c8da712a4f71 100644
--- a/packages/rest-typings/package.json
+++ b/packages/rest-typings/package.json
@@ -1,13 +1,13 @@
{
"name": "@rocket.chat/rest-typings",
- "version": "6.12.0-develop",
+ "version": "6.12.0-rc.4",
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:~",
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
"mongodb": "^4.17.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc",
@@ -23,7 +23,7 @@
"/dist"
],
"dependencies": {
- "@rocket.chat/apps-engine": "1.45.0-alpha.866",
+ "@rocket.chat/apps-engine": "1.45.0-alpha.868",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/message-parser": "workspace:^",
"@rocket.chat/ui-kit": "workspace:~",
diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts
index c15e94030de3..1ed249f5dd55 100644
--- a/packages/rest-typings/src/v1/omnichannel.ts
+++ b/packages/rest-typings/src/v1/omnichannel.ts
@@ -27,6 +27,7 @@ import type {
ReportWithUnmatchingElements,
SMSProviderResponse,
ILivechatTriggerActionResponse,
+ ILivechatContact,
} from '@rocket.chat/core-typings';
import { ILivechatAgentStatus } from '@rocket.chat/core-typings';
import Ajv from 'ajv';
@@ -1254,6 +1255,55 @@ const POSTOmnichannelContactsSchema = {
export const isPOSTOmnichannelContactsProps = ajv.compile(POSTOmnichannelContactsSchema);
+type POSTUpdateOmnichannelContactsProps = {
+ contactId: string;
+ name?: string;
+ emails?: string[];
+ phones?: string[];
+ customFields?: Record;
+ contactManager?: string;
+};
+
+const POSTUpdateOmnichannelContactsSchema = {
+ type: 'object',
+ properties: {
+ contactId: {
+ type: 'string',
+ },
+ name: {
+ type: 'string',
+ },
+ emails: {
+ type: 'array',
+ items: {
+ type: 'string',
+ },
+ uniqueItems: true,
+ nullable: true,
+ },
+ phones: {
+ type: 'array',
+ items: {
+ type: 'string',
+ },
+ uniqueItems: true,
+ nullable: true,
+ },
+ customFields: {
+ type: 'object',
+ nullable: true,
+ },
+ contactManager: {
+ type: 'string',
+ nullable: true,
+ },
+ },
+ required: ['contactId'],
+ additionalProperties: false,
+};
+
+export const isPOSTUpdateOmnichannelContactsProps = ajv.compile(POSTUpdateOmnichannelContactsSchema);
+
type GETOmnichannelContactProps = { contactId: string };
const GETOmnichannelContactSchema = {
@@ -3695,6 +3745,9 @@ export type OmnichannelEndpoints = {
'/v1/omnichannel/contacts': {
POST: (params: POSTOmnichannelContactsProps) => { contactId: string };
};
+ '/v1/omnichannel/contacts.update': {
+ POST: (params: POSTUpdateOmnichannelContactsProps) => { contact: ILivechatContact };
+ };
'/v1/omnichannel/contact.search': {
GET: (params: GETOmnichannelContactSearchProps) => { contact: ILivechatVisitor | null };
diff --git a/packages/rest-typings/src/v1/rooms.ts b/packages/rest-typings/src/v1/rooms.ts
index 32dd152c44a4..19ecf53757cc 100644
--- a/packages/rest-typings/src/v1/rooms.ts
+++ b/packages/rest-typings/src/v1/rooms.ts
@@ -542,6 +542,62 @@ const roomsImagesPropsSchema = {
export const isRoomsImagesProps = ajv.compile(roomsImagesPropsSchema);
+export type RoomsCleanHistoryProps = {
+ roomId: IRoom['_id'];
+ latest: string;
+ oldest: string;
+ inclusive?: boolean;
+ excludePinned?: boolean;
+ filesOnly?: boolean;
+ users?: IUser['username'][];
+ limit?: number;
+ ignoreDiscussion?: boolean;
+ ignoreThreads?: boolean;
+};
+
+const roomsCleanHistorySchema = {
+ type: 'object',
+ properties: {
+ roomId: {
+ type: 'string',
+ },
+ latest: {
+ type: 'string',
+ },
+ oldest: {
+ type: 'string',
+ },
+ inclusive: {
+ type: 'boolean',
+ },
+ excludePinned: {
+ type: 'boolean',
+ },
+ filesOnly: {
+ type: 'boolean',
+ },
+ users: {
+ type: 'array',
+ items: {
+ type: 'string',
+ },
+ },
+ limit: {
+ type: 'number',
+ },
+ ignoreDiscussion: {
+ type: 'boolean',
+ },
+ ignoreThreads: {
+ type: 'boolean',
+ },
+ },
+ required: ['roomId', 'latest', 'oldest'],
+ additionalProperties: false,
+};
+
+export const isRoomsCleanHistoryProps = ajv.compile(roomsCleanHistorySchema);
+
export type RoomsEndpoints = {
'/v1/rooms.autocomplete.channelAndPrivate': {
GET: (params: RoomsAutoCompleteChannelAndPrivateProps) => {
@@ -576,18 +632,7 @@ export type RoomsEndpoints = {
};
'/v1/rooms.cleanHistory': {
- POST: (params: {
- roomId: IRoom['_id'];
- latest: string;
- oldest: string;
- inclusive?: boolean;
- excludePinned?: boolean;
- filesOnly?: boolean;
- users?: IUser['username'][];
- limit?: number;
- ignoreDiscussion?: boolean;
- ignoreThreads?: boolean;
- }) => { _id: IRoom['_id']; count: number; success: boolean };
+ POST: (params: RoomsCleanHistoryProps) => { _id: IRoom['_id']; count: number; success: boolean };
};
'/v1/rooms.createDiscussion': {
diff --git a/packages/server-cloud-communication/package.json b/packages/server-cloud-communication/package.json
index 8c970687ab8b..35e67a2c0638 100644
--- a/packages/server-cloud-communication/package.json
+++ b/packages/server-cloud-communication/package.json
@@ -5,7 +5,7 @@
"devDependencies": {
"@rocket.chat/license": "workspace:^",
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/server-fetch/package.json b/packages/server-fetch/package.json
index c98b4ba99e54..27f957758520 100644
--- a/packages/server-fetch/package.json
+++ b/packages/server-fetch/package.json
@@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "~8.45.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/sha256/package.json b/packages/sha256/package.json
index 6d10f5b80d65..fb9e0d0d7f26 100644
--- a/packages/sha256/package.json
+++ b/packages/sha256/package.json
@@ -22,7 +22,7 @@
"@typescript-eslint/parser": "~5.60.1",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"volta": {
"extends": "../../package.json"
diff --git a/packages/tools/package.json b/packages/tools/package.json
index d1301efb7055..11dade3ac5c8 100644
--- a/packages/tools/package.json
+++ b/packages/tools/package.json
@@ -7,7 +7,7 @@
"@types/jest": "~29.5.12",
"eslint": "~8.45.0",
"jest": "~29.7.0",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md
index f65d986cfaf5..ebd57cd5bcc9 100644
--- a/packages/ui-avatar/CHANGELOG.md
+++ b/packages/ui-avatar/CHANGELOG.md
@@ -1,5 +1,69 @@
# @rocket.chat/ui-avatar
+## 6.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+
+
+## 6.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+
+
+## 6.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+
+
+## 6.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+
+
+## 6.0.0-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 5.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.2
+
+
+## 5.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.1
+
+
## 5.0.0
### Patch Changes
diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json
index 1c2dc6dabbc4..013bbba63829 100644
--- a/packages/ui-avatar/package.json
+++ b/packages/ui-avatar/package.json
@@ -1,10 +1,10 @@
{
"name": "@rocket.chat/ui-avatar",
- "version": "5.0.0",
+ "version": "6.0.0-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/ui-contexts": "workspace:^",
"@types/babel__core": "~7.20.3",
"@types/react": "~17.0.69",
@@ -15,7 +15,7 @@
"eslint-plugin-storybook": "~0.6.15",
"eslint-plugin-testing-library": "~5.11.1",
"react": "^17.0.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
@@ -31,7 +31,7 @@
],
"peerDependencies": {
"@rocket.chat/fuselage": "*",
- "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
"react": "~17.0.2"
},
"volta": {
diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md
index 5936f8038bc8..037fd7e893b9 100644
--- a/packages/ui-client/CHANGELOG.md
+++ b/packages/ui-client/CHANGELOG.md
@@ -1,5 +1,69 @@
# @rocket.chat/ui-client
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.2
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.1
+
+
## 9.0.0
### Minor Changes
diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json
index f43b2d8622b8..94f6cf8617b8 100644
--- a/packages/ui-client/package.json
+++ b/packages/ui-client/package.json
@@ -1,12 +1,12 @@
{
"name": "@rocket.chat/ui-client",
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
"@react-aria/toolbar": "^3.0.0-beta.1",
"@rocket.chat/css-in-js": "~0.31.25",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/icons": "~0.38.0",
"@rocket.chat/jest-presets": "workspace:~",
@@ -37,7 +37,7 @@
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-hook-form": "~7.45.4",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"scripts": {
"build": "rm -rf dist && tsc -p tsconfig.build.json",
@@ -60,7 +60,7 @@
"@rocket.chat/fuselage": "*",
"@rocket.chat/fuselage-hooks": "*",
"@rocket.chat/icons": "*",
- "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
"react": "~17.0.2"
},
"volta": {
diff --git a/packages/ui-client/src/components/TooltipComponent.tsx b/packages/ui-client/src/components/TooltipComponent.tsx
index 137ec913ec78..4a46e5536a53 100644
--- a/packages/ui-client/src/components/TooltipComponent.tsx
+++ b/packages/ui-client/src/components/TooltipComponent.tsx
@@ -12,7 +12,7 @@ export const TooltipComponent = ({ title, anchor }: TooltipComponentProps): Reac
return (
- {title}
+ {title}
);
};
diff --git a/packages/ui-composer/CHANGELOG.md b/packages/ui-composer/CHANGELOG.md
index d37e917e0375..18571eca048a 100644
--- a/packages/ui-composer/CHANGELOG.md
+++ b/packages/ui-composer/CHANGELOG.md
@@ -1,5 +1,11 @@
# @rocket.chat/ui-composer
+## 0.2.1-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
## 0.2.0
### Minor Changes
diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json
index d854a6ffea86..27a49b541e74 100644
--- a/packages/ui-composer/package.json
+++ b/packages/ui-composer/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/ui-composer",
- "version": "0.2.0",
+ "version": "0.2.1-rc.0",
"private": true,
"main": "./dist/index.js",
"typings": "./dist/index.d.ts",
@@ -19,7 +19,7 @@
"@babel/core": "~7.22.20",
"@react-aria/toolbar": "^3.0.0-beta.1",
"@rocket.chat/eslint-config": "workspace:^",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/icons": "~0.38.0",
"@storybook/addon-actions": "~6.5.16",
"@storybook/addon-docs": "~6.5.16",
@@ -38,7 +38,7 @@
"react": "~17.0.2",
"react-docgen-typescript-plugin": "~1.0.5",
"react-dom": "~17.0.2",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"peerDependencies": {
"@react-aria/toolbar": "*",
diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md
index fb3d074b6fbe..2a846d730bc0 100644
--- a/packages/ui-contexts/CHANGELOG.md
+++ b/packages/ui-contexts/CHANGELOG.md
@@ -1,5 +1,83 @@
# @rocket.chat/ui-contexts
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.4
+ - @rocket.chat/rest-typings@6.12.0-rc.4
+ - @rocket.chat/ddp-client@0.3.6-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.3
+ - @rocket.chat/rest-typings@6.12.0-rc.3
+ - @rocket.chat/ddp-client@0.3.5-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.2
+ - @rocket.chat/rest-typings@6.12.0-rc.2
+ - @rocket.chat/ddp-client@0.3.5-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.12.0-rc.1
+ - @rocket.chat/rest-typings@6.12.0-rc.1
+ - @rocket.chat/ddp-client@0.3.5-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- Updated dependencies [127866ce97, 0c919db7b4, b764c415dc, 1f061a1aa5, dd37ea1b35, 7937ff741a, 58c0efc732, e28be46db7, 58c0efc732]:
+
+ - @rocket.chat/i18n@0.7.0-rc.0
+ - @rocket.chat/rest-typings@6.12.0-rc.0
+ - @rocket.chat/core-typings@6.12.0-rc.0
+ - @rocket.chat/ddp-client@0.3.4-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.2
+ - @rocket.chat/rest-typings@6.11.2
+ - @rocket.chat/ddp-client@0.3.5
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/core-typings@6.11.1
+ - @rocket.chat/rest-typings@6.11.1
+ - @rocket.chat/ddp-client@0.3.4
+
+
## 9.0.0
### Minor Changes
diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json
index 513aebd86a30..847e14dd67bd 100644
--- a/packages/ui-contexts/package.json
+++ b/packages/ui-contexts/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/ui-contexts",
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"private": true,
"devDependencies": {
"@rocket.chat/core-typings": "workspace:^",
@@ -16,7 +16,7 @@
"eslint-plugin-react-hooks": "^4.6.0",
"mongodb": "^4.17.2",
"react": "~17.0.2",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"use-sync-external-store": "^1.2.0"
},
"peerDependencies": {
diff --git a/packages/ui-contexts/src/DeviceContext.ts b/packages/ui-contexts/src/DeviceContext.ts
index 483f03707f95..5bbda60cfcd5 100644
--- a/packages/ui-contexts/src/DeviceContext.ts
+++ b/packages/ui-contexts/src/DeviceContext.ts
@@ -6,10 +6,6 @@ export type Device = {
type: string;
};
-export interface IExperimentalHTMLAudioElement extends HTMLAudioElement {
- setSinkId: (sinkId: string) => void;
-}
-
type EnabledDeviceContextValue = {
enabled: true;
availableAudioOutputDevices: Device[];
@@ -18,7 +14,7 @@ type EnabledDeviceContextValue = {
selectedAudioOutputDevice?: Device;
selectedAudioInputDevice?: Device;
// selectedVideoInputDevice?: Device;
- setAudioOutputDevice: (data: { outputDevice: Device; HTMLAudioElement: IExperimentalHTMLAudioElement }) => void;
+ setAudioOutputDevice: (data: { outputDevice: Device; HTMLAudioElement: HTMLAudioElement }) => void;
setAudioInputDevice: (device: Device) => void;
// setVideoInputDevice: (device: Device) => void;
};
diff --git a/packages/ui-contexts/src/hooks/useEndpoint.ts b/packages/ui-contexts/src/hooks/useEndpoint.ts
index a0b7c977f2c6..3d29917c63e2 100644
--- a/packages/ui-contexts/src/hooks/useEndpoint.ts
+++ b/packages/ui-contexts/src/hooks/useEndpoint.ts
@@ -14,7 +14,7 @@ export type EndpointFunction(
method: TMethod,
pathPattern: TPathPattern,
- ...[keys]: undefined extends UrlParams ? [keys?: UrlParams] : [keys: UrlParams]
+ ...[keys]: NoInfer ? [keys?: UrlParams] : [keys: UrlParams]>
): EndpointFunction {
const { callEndpoint } = useContext(ServerContext);
const keysRef = useRef(keys);
diff --git a/packages/ui-contexts/src/hooks/useSetOutputMediaDevice.ts b/packages/ui-contexts/src/hooks/useSetOutputMediaDevice.ts
index 7a68d7b10e0d..c3d6b9425876 100644
--- a/packages/ui-contexts/src/hooks/useSetOutputMediaDevice.ts
+++ b/packages/ui-contexts/src/hooks/useSetOutputMediaDevice.ts
@@ -1,17 +1,11 @@
import { useContext } from 'react';
-import type { Device, IExperimentalHTMLAudioElement } from '../DeviceContext';
+import type { Device } from '../DeviceContext';
import { DeviceContext, isDeviceContextEnabled } from '../DeviceContext';
// This allows different places to set the output device by providing a HTMLAudioElement
-type setOutputMediaDevice = ({
- outputDevice,
- HTMLAudioElement,
-}: {
- outputDevice: Device;
- HTMLAudioElement: IExperimentalHTMLAudioElement;
-}) => void;
+type setOutputMediaDevice = ({ outputDevice, HTMLAudioElement }: { outputDevice: Device; HTMLAudioElement: HTMLAudioElement }) => void;
export const useSetOutputMediaDevice = (): setOutputMediaDevice => {
const context = useContext(DeviceContext);
diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts
index e021eb840aa0..313710bbfd4e 100644
--- a/packages/ui-contexts/src/index.ts
+++ b/packages/ui-contexts/src/index.ts
@@ -14,7 +14,7 @@ export { ToastMessagesContext, ToastMessagesContextValue } from './ToastMessages
export { TooltipContext, TooltipContextValue } from './TooltipContext';
export { TranslationContext, TranslationContextValue } from './TranslationContext';
export { UserContext, UserContextValue } from './UserContext';
-export { DeviceContext, Device, IExperimentalHTMLAudioElement, DeviceContextValue } from './DeviceContext';
+export { DeviceContext, Device, DeviceContextValue } from './DeviceContext';
export { ActionManagerContext, IActionManager } from './ActionManagerContext';
export { useAbsoluteUrl } from './hooks/useAbsoluteUrl';
diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md
index 9f31c620f4db..7b7a94cfbbe0 100644
--- a/packages/ui-kit/CHANGELOG.md
+++ b/packages/ui-kit/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 0.36.1-rc.0
+
+### Patch Changes
+
+- ([#33000](https://github.com/RocketChat/Rocket.Chat/pull/33000)) fix UiKit error message: Failed to resolve module: @rocket.chat/icons
+
## 0.36.0
### Minor Changes
diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json
index c7e8159d457d..b5c5f4bb2e97 100644
--- a/packages/ui-kit/package.json
+++ b/packages/ui-kit/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/ui-kit",
- "version": "0.36.0",
+ "version": "0.36.1-rc.0",
"description": "Interactive UI elements for Rocket.Chat Apps",
"homepage": "https://rocket.chat",
"author": {
@@ -52,11 +52,11 @@
"ts-jest": "~29.1.1",
"ts-loader": "~9.4.2",
"ts-node": "~10.9.1",
- "ts-patch": "~3.0.2",
- "typescript": "~5.3.3"
+ "ts-patch": "~3.2.1",
+ "typescript": "~5.5.4"
},
"dependencies": {
- "typia": "~5.3.3"
+ "typia": "~6.9.0"
},
"peerDependencies": {
"@rocket.chat/icons": "*"
diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md
index 2a697e293211..85c06375e2a0 100644
--- a/packages/ui-video-conf/CHANGELOG.md
+++ b/packages/ui-video-conf/CHANGELOG.md
@@ -1,5 +1,77 @@
# @rocket.chat/ui-video-conf
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+ - @rocket.chat/ui-avatar@6.0.0-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+ - @rocket.chat/ui-avatar@6.0.0-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+ - @rocket.chat/ui-avatar@6.0.0-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+ - @rocket.chat/ui-avatar@6.0.0-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies [8ea6517c4e]:
+
+ - @rocket.chat/ui-avatar@6.0.0-rc.0
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/ui-avatar@5.0.2
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/ui-avatar@5.0.1
+
+
## 9.0.0
### Minor Changes
diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json
index 5e7d114a3576..4221003e3f58 100644
--- a/packages/ui-video-conf/package.json
+++ b/packages/ui-video-conf/package.json
@@ -1,12 +1,12 @@
{
"name": "@rocket.chat/ui-video-conf",
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
"@rocket.chat/css-in-js": "~0.31.25",
"@rocket.chat/eslint-config": "workspace:^",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/icons": "~0.38.0",
"@rocket.chat/jest-presets": "workspace:~",
@@ -32,7 +32,7 @@
"jest": "~29.7.0",
"jest-axe": "~9.0.0",
"react-docgen-typescript-plugin": "~1.0.5",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"peerDependencies": {
"@rocket.chat/css-in-js": "*",
@@ -40,8 +40,8 @@
"@rocket.chat/fuselage-hooks": "*",
"@rocket.chat/icons": "*",
"@rocket.chat/styled": "*",
- "@rocket.chat/ui-avatar": "5.0.0",
- "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-avatar": "6.0.0-rc.4",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md
index 0107fc049b8f..ad7bfcc86739 100644
--- a/packages/uikit-playground/CHANGELOG.md
+++ b/packages/uikit-playground/CHANGELOG.md
@@ -1,5 +1,87 @@
# @rocket.chat/uikit-playground
+## 0.4.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.4
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+ - @rocket.chat/ui-avatar@6.0.0-rc.4
+
+
+## 0.4.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.3
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+ - @rocket.chat/ui-avatar@6.0.0-rc.3
+
+
+## 0.4.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.2
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+ - @rocket.chat/ui-avatar@6.0.0-rc.2
+
+
+## 0.4.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.1
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+ - @rocket.chat/ui-avatar@6.0.0-rc.1
+
+
+## 0.4.0-rc.0
+
+### Minor Changes
+
+- ([#32969](https://github.com/RocketChat/Rocket.Chat/pull/32969)) Upgrades fuselage-toastbar version in order to add pause on hover functionality
+
+### Patch Changes
+
+- ([#32968](https://github.com/RocketChat/Rocket.Chat/pull/32968)) Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior
+
+- Updated dependencies [8ea6517c4e]:
+
+ - @rocket.chat/fuselage-ui-kit@10.0.0-rc.0
+ - @rocket.chat/ui-avatar@6.0.0-rc.0
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 0.3.5
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/fuselage-ui-kit@9.0.2
+ - @rocket.chat/ui-contexts@9.0.2
+ - @rocket.chat/ui-avatar@5.0.2
+
+
+## 0.3.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/fuselage-ui-kit@9.0.1
+ - @rocket.chat/ui-contexts@9.0.1
+ - @rocket.chat/ui-avatar@5.0.1
+
+
## 0.3.3
### Patch Changes
diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json
index f46f139a66f4..7fb9f16471ca 100644
--- a/packages/uikit-playground/package.json
+++ b/packages/uikit-playground/package.json
@@ -1,7 +1,7 @@
{
"name": "@rocket.chat/uikit-playground",
"private": true,
- "version": "0.3.3",
+ "version": "0.4.0-rc.4",
"type": "module",
"scripts": {
"dev": "vite",
@@ -15,7 +15,7 @@
"@codemirror/tooltip": "^0.19.16",
"@lezer/highlight": "^1.1.6",
"@rocket.chat/css-in-js": "~0.31.25",
- "@rocket.chat/fuselage": "^0.57.0",
+ "@rocket.chat/fuselage": "^0.57.1",
"@rocket.chat/fuselage-hooks": "^0.33.1",
"@rocket.chat/fuselage-polyfills": "~0.31.25",
"@rocket.chat/fuselage-toastbar": "^0.33.0",
@@ -50,7 +50,7 @@
"eslint": "~8.45.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.4",
- "typescript": "~5.3.3",
+ "typescript": "~5.5.4",
"vite": "^4.3.9"
},
"volta": {
diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md
index 871e66b0f29c..c549e60d2d0a 100644
--- a/packages/web-ui-registration/CHANGELOG.md
+++ b/packages/web-ui-registration/CHANGELOG.md
@@ -1,5 +1,70 @@
# @rocket.chat/web-ui-registration
+## 10.0.0-rc.4
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.4
+
+
+## 10.0.0-rc.3
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.3
+
+
+## 10.0.0-rc.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.2
+
+
+## 10.0.0-rc.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.1
+
+
+## 10.0.0-rc.0
+
+### Patch Changes
+
+- ([#32743](https://github.com/RocketChat/Rocket.Chat/pull/32743)) Fixes an issue where creating a new user with an invalid username (containing special characters) resulted in an error message, but the user was still created. The user creation process now properly aborts when an invalid username is provided.
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@10.0.0-rc.0
+
+
+## 9.0.2
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.2
+
+
+## 9.0.1
+
+### Patch Changes
+
+- Updated dependencies []:
+
+ - @rocket.chat/ui-contexts@9.0.1
+
+
## 9.0.0
### Patch Changes
diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json
index ba3dc31423a6..e9d48f871a63 100644
--- a/packages/web-ui-registration/package.json
+++ b/packages/web-ui-registration/package.json
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/web-ui-registration",
- "version": "9.0.0",
+ "version": "10.0.0-rc.4",
"private": true,
"homepage": "https://rocket.chat",
"main": "./dist/index.js",
@@ -42,12 +42,12 @@
"react-hook-form": "~7.45.4",
"react-i18next": "~13.2.2",
"storybook-dark-mode": "~3.0.1",
- "typescript": "~5.3.3"
+ "typescript": "~5.5.4"
},
"peerDependencies": {
"@rocket.chat/layout": "*",
"@rocket.chat/tools": "0.2.2",
- "@rocket.chat/ui-contexts": "9.0.0",
+ "@rocket.chat/ui-contexts": "10.0.0-rc.4",
"@tanstack/react-query": "*",
"react": "*",
"react-hook-form": "*",
diff --git a/yarn.lock b/yarn.lock
index f2e902295848..e6457b71f47f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8433,7 +8433,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
uuid: ^9.0.1
languageName: unknown
linkType: soft
@@ -8443,7 +8443,7 @@ __metadata:
resolution: "@rocket.chat/account-utils@workspace:packages/account-utils"
dependencies:
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8459,7 +8459,7 @@ __metadata:
human-interval: ^2.0.1
moment-timezone: ~0.5.43
mongodb: ^4.17.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8479,13 +8479,13 @@ __metadata:
query-string: ^7.1.3
split-on-first: ^3.0.0
strict-uri-encode: ^2.0.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
-"@rocket.chat/apps-engine@npm:1.45.0-alpha.866":
- version: 1.45.0-alpha.866
- resolution: "@rocket.chat/apps-engine@npm:1.45.0-alpha.866"
+"@rocket.chat/apps-engine@npm:1.45.0-alpha.868":
+ version: 1.45.0-alpha.868
+ resolution: "@rocket.chat/apps-engine@npm:1.45.0-alpha.868"
dependencies:
"@msgpack/msgpack": 3.0.0-beta2
adm-zip: ^0.5.9
@@ -8501,7 +8501,7 @@ __metadata:
uuid: ~8.3.2
peerDependencies:
"@rocket.chat/ui-kit": "*"
- checksum: 04abb4f712fcca206c6791322b52e2a3d97f3db06f606cd1f58fdda4e63d2123d7004bb445ad7582c52808c3ec4433d465d8855e24f3ab2f8457dafa6b017c5b
+ checksum: 3ac41e3de76be67e856e4bca888f113360628e510f9d4c66d70ed71d84f25bda6ca6659ead6c7a87d21c117c47bfa090b4508cce66e8630d2e935d3ed3158835
languageName: node
linkType: hard
@@ -8509,11 +8509,11 @@ __metadata:
version: 0.0.0-use.local
resolution: "@rocket.chat/apps@workspace:packages/apps"
dependencies:
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/model-typings": "workspace:^"
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8545,7 +8545,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8561,7 +8561,7 @@ __metadata:
"@typescript-eslint/parser": ~5.60.1
eslint: ~8.45.0
jest: ~29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8571,7 +8571,7 @@ __metadata:
dependencies:
cheerio: 1.0.0-rc.10
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8582,7 +8582,7 @@ __metadata:
"@babel/core": ~7.22.20
"@babel/preset-env": ~7.22.20
"@babel/preset-typescript": ~7.22.15
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/eslint-config": "workspace:^"
"@rocket.chat/icons": ~0.38.0
@@ -8601,7 +8601,7 @@ __metadata:
jest: ~29.7.0
mongodb: ^4.17.2
prettier: ~2.8.8
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8609,15 +8609,16 @@ __metadata:
version: 0.0.0-use.local
resolution: "@rocket.chat/core-typings@workspace:packages/core-typings"
dependencies:
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/eslint-config": "workspace:^"
"@rocket.chat/icons": ~0.38.0
"@rocket.chat/message-parser": "workspace:^"
"@rocket.chat/ui-kit": "workspace:~"
+ "@types/express": ^4.17.21
eslint: ~8.45.0
mongodb: ^4.17.2
prettier: ~2.8.8
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8631,7 +8632,7 @@ __metadata:
"@rocket.chat/random": "workspace:^"
eslint: ~8.45.0
mongodb: ^4.17.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8670,7 +8671,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
jest-websocket-mock: ~2.5.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
ws: ^8.13.0
peerDependencies:
"@rocket.chat/emitter": "*"
@@ -8681,7 +8682,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer"
dependencies:
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-services": "workspace:^"
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/ddp-client": "workspace:~"
@@ -8718,7 +8719,7 @@ __metadata:
polka: ^0.5.2
sharp: ^0.32.6
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
underscore: ^1.13.6
uuid: ^7.0.3
ws: ^8.8.1
@@ -8758,7 +8759,7 @@ __metadata:
resolution: "@rocket.chat/favicon@workspace:packages/favicon"
dependencies:
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -8879,10 +8880,10 @@ __metadata:
"@babel/preset-env": ~7.22.20
"@babel/preset-react": ~7.22.15
"@babel/preset-typescript": ~7.22.15
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/eslint-config": "workspace:^"
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/fuselage-polyfills": ~0.31.25
"@rocket.chat/gazzodown": "workspace:^"
@@ -8923,7 +8924,7 @@ __metadata:
rimraf: ^3.0.2
storybook-dark-mode: ~3.0.1
tslib: ^2.5.3
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/apps-engine": "*"
"@rocket.chat/eslint-config": 0.7.0
@@ -8933,19 +8934,19 @@ __metadata:
"@rocket.chat/icons": "*"
"@rocket.chat/prettier-config": "*"
"@rocket.chat/styled": "*"
- "@rocket.chat/ui-avatar": 5.0.0
- "@rocket.chat/ui-contexts": 9.0.0
- "@rocket.chat/ui-kit": 0.36.0
- "@rocket.chat/ui-video-conf": 9.0.0
+ "@rocket.chat/ui-avatar": 6.0.0-rc.3
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
+ "@rocket.chat/ui-kit": 0.36.1-rc.0
+ "@rocket.chat/ui-video-conf": 10.0.0-rc.3
"@tanstack/react-query": "*"
react: "*"
react-dom: "*"
languageName: unknown
linkType: soft
-"@rocket.chat/fuselage@npm:^0.57.0":
- version: 0.57.0
- resolution: "@rocket.chat/fuselage@npm:0.57.0"
+"@rocket.chat/fuselage@npm:^0.57.1":
+ version: 0.57.1
+ resolution: "@rocket.chat/fuselage@npm:0.57.1"
dependencies:
"@rocket.chat/css-in-js": ^0.31.25
"@rocket.chat/css-supports": ^0.31.25
@@ -8963,7 +8964,7 @@ __metadata:
react: ^17.0.2
react-dom: ^17.0.2
react-virtuoso: 1.2.4
- checksum: 80f49f79ca6655067f528a9b427a7bfabbcf1583d0c9f3ed40b79217c7a495e93e0335e15e29b23237bf2ccb5ee5fa063051b40bf4d539439f452ffd45fdb537
+ checksum: ed40c4e9ec6f6294e0e7c7a3912ae7c9eca026455506f3f1983483010d3d0c41169f9e38d173e5e63ed0e9824979edd607dda3c881202bf797a97b5b76e83a34
languageName: node
linkType: hard
@@ -8974,7 +8975,7 @@ __metadata:
"@babel/core": ~7.22.20
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/css-in-js": ~0.31.25
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-tokens": ^0.33.1
"@rocket.chat/jest-presets": "workspace:~"
"@rocket.chat/message-parser": "workspace:^"
@@ -9012,7 +9013,7 @@ __metadata:
react-docgen-typescript-plugin: ~1.0.5
react-dom: ~17.0.2
react-error-boundary: ^3.1.4
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/css-in-js": "*"
@@ -9020,8 +9021,8 @@ __metadata:
"@rocket.chat/fuselage-tokens": "*"
"@rocket.chat/message-parser": 0.31.29
"@rocket.chat/styled": "*"
- "@rocket.chat/ui-client": 9.0.0
- "@rocket.chat/ui-contexts": 9.0.0
+ "@rocket.chat/ui-client": 10.0.0-rc.3
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
katex: "*"
react: "*"
languageName: unknown
@@ -9035,7 +9036,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
tsup: ^6.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9055,7 +9056,7 @@ __metadata:
eslint: ~8.45.0
mongodb: ^4.17.2
prettier: ~2.8.8
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9077,7 +9078,7 @@ __metadata:
jest-axe: ~9.0.0
jest-environment-jsdom: ~29.7.0
jest-environment-node: ~29.7.0
- typescript: ~5.4.5
+ typescript: ~5.5.4
uuid: ~9.0.1
languageName: unknown
linkType: soft
@@ -9091,7 +9092,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
jose: ^4.14.4
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9122,7 +9123,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
jest-websocket-mock: ~2.5.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9210,7 +9211,7 @@ __metadata:
stylelint-order: ^5.0.0
svg-loader: ^0.0.2
terser-webpack-plugin: ~4.2.3
- typescript: ~5.3.3
+ typescript: ~5.5.4
url-loader: ^4.1.1
webpack: ^5.89.0
webpack-bundle-analyzer: ^4.9.1
@@ -9232,7 +9233,7 @@ __metadata:
chalk: ^4.0.0
ejson: ^2.2.3
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9243,7 +9244,7 @@ __metadata:
"@rocket.chat/emitter": ~0.31.25
eslint: ~8.45.0
pino: ^8.15.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9292,7 +9293,7 @@ __metadata:
tldts: ~5.7.112
ts-loader: ~9.4.2
typedoc: ~0.24.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
webpack: ~5.78.0
webpack-cli: ~5.0.1
languageName: unknown
@@ -9329,7 +9330,7 @@ __metadata:
"@rocket.chat/agenda": "workspace:^"
"@rocket.chat/api-client": "workspace:^"
"@rocket.chat/apps": "workspace:^"
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/base64": "workspace:^"
"@rocket.chat/cas-validate": "workspace:^"
"@rocket.chat/core-services": "workspace:^"
@@ -9341,7 +9342,7 @@ __metadata:
"@rocket.chat/favicon": "workspace:^"
"@rocket.chat/forked-matrix-appservice-bridge": ^4.0.2
"@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.3
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/fuselage-polyfills": ~0.31.25
"@rocket.chat/fuselage-toastbar": ^0.33.0
@@ -9665,8 +9666,8 @@ __metadata:
turndown: ^7.1.2
twilio: ^3.76.1
twit: ^2.2.11
- typescript: ~5.3.3
- typia: ^5.3.3
+ typescript: ~5.5.4
+ typia: ~6.9.0
ua-parser-js: ^1.0.37
underscore: ^1.13.6
universal-perf-hooks: ^1.0.1
@@ -9698,7 +9699,7 @@ __metadata:
i18next: ~23.4.9
react: ~17.0.2
react-i18next: ~13.2.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
use-sync-external-store: ~1.2.2
peerDependencies:
"@tanstack/react-query": "*"
@@ -9714,7 +9715,7 @@ __metadata:
"@types/node-rsa": ^1.1.3
eslint: ~8.45.0
mongodb: ^4.17.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9727,7 +9728,7 @@ __metadata:
"@types/jest": ~29.5.12
eslint: ~8.45.0
jest: ^29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9770,7 +9771,7 @@ __metadata:
mongo-message-queue: ^1.0.0
mongodb: ^4.17.2
pino: ^8.15.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9808,7 +9809,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9841,7 +9842,7 @@ __metadata:
"@types/jest": ~29.5.12
eslint: ~8.45.0
jest: ~29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9853,7 +9854,7 @@ __metadata:
"@types/jest": ~29.5.12
eslint: ~8.45.0
jest: ~29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9880,7 +9881,7 @@ __metadata:
moment-timezone: ^0.5.43
react: ~18.3.1
react-dom: ~18.3.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9896,7 +9897,7 @@ __metadata:
peggy: 3.0.2
prettier: ~2.8.7
rimraf: ^3.0.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
webpack: ~5.78.0
peerDependencies:
peggy: "*"
@@ -9909,7 +9910,7 @@ __metadata:
resolution: "@rocket.chat/poplib@workspace:packages/node-poplib"
dependencies:
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9941,7 +9942,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -9952,7 +9953,7 @@ __metadata:
"@babel/core": ~7.22.20
"@babel/preset-env": ~7.22.20
"@babel/preset-typescript": ~7.22.15
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-services": "workspace:^"
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/eslint-config": "workspace:^"
@@ -9963,7 +9964,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
mongodb: ^4.17.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10008,7 +10009,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10024,7 +10025,7 @@ __metadata:
"@typescript-eslint/parser": ~5.60.1
eslint: ~8.45.0
jest: ~29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10043,7 +10044,7 @@ __metadata:
remark-parse: 9.0.0
remark-stringify: 9.0.1
semver: ^7.5.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
unified: 9.2.2
languageName: unknown
linkType: soft
@@ -10058,7 +10059,7 @@ __metadata:
dataloader: ^1.4.0
eslint: ~8.45.0
node-fetch: ^2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10066,7 +10067,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@rocket.chat/rest-typings@workspace:packages/rest-typings"
dependencies:
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/eslint-config": "workspace:~"
"@rocket.chat/message-parser": "workspace:^"
@@ -10077,7 +10078,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
mongodb: ^4.17.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10100,7 +10101,7 @@ __metadata:
dependencies:
"@rocket.chat/license": "workspace:^"
eslint: ~8.45.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10114,7 +10115,7 @@ __metadata:
https-proxy-agent: ^5.0.1
node-fetch: 2.3.0
proxy-from-env: ^1.1.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10130,7 +10131,7 @@ __metadata:
"@typescript-eslint/parser": ~5.60.1
eslint: ~8.45.0
jest: ~29.7.0
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10164,7 +10165,7 @@ __metadata:
pino: ^8.15.0
polka: ^0.5.2
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10204,7 +10205,7 @@ __metadata:
eslint: ~8.45.0
jest: ~29.7.0
moment-timezone: ^0.5.43
- typescript: ~5.3.3
+ typescript: ~5.5.4
languageName: unknown
linkType: soft
@@ -10213,7 +10214,7 @@ __metadata:
resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar"
dependencies:
"@babel/core": ~7.22.20
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/ui-contexts": "workspace:^"
"@types/babel__core": ~7.20.3
"@types/react": ~17.0.69
@@ -10224,10 +10225,10 @@ __metadata:
eslint-plugin-storybook: ~0.6.15
eslint-plugin-testing-library: ~5.11.1
react: ^17.0.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/fuselage": "*"
- "@rocket.chat/ui-contexts": 9.0.0
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
react: ~17.0.2
languageName: unknown
linkType: soft
@@ -10239,7 +10240,7 @@ __metadata:
"@babel/core": ~7.22.20
"@react-aria/toolbar": ^3.0.0-beta.1
"@rocket.chat/css-in-js": ~0.31.25
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/icons": ~0.38.0
"@rocket.chat/jest-presets": "workspace:~"
@@ -10270,14 +10271,14 @@ __metadata:
react: ^17.0.2
react-dom: ^17.0.2
react-hook-form: ~7.45.4
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@react-aria/toolbar": "*"
"@rocket.chat/css-in-js": "*"
"@rocket.chat/fuselage": "*"
"@rocket.chat/fuselage-hooks": "*"
"@rocket.chat/icons": "*"
- "@rocket.chat/ui-contexts": 9.0.0
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
react: ~17.0.2
languageName: unknown
linkType: soft
@@ -10289,7 +10290,7 @@ __metadata:
"@babel/core": ~7.22.20
"@react-aria/toolbar": ^3.0.0-beta.1
"@rocket.chat/eslint-config": "workspace:^"
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/icons": ~0.38.0
"@storybook/addon-actions": ~6.5.16
"@storybook/addon-docs": ~6.5.16
@@ -10308,7 +10309,7 @@ __metadata:
react: ~17.0.2
react-docgen-typescript-plugin: ~1.0.5
react-dom: ~17.0.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@react-aria/toolbar": "*"
"@rocket.chat/fuselage": "*"
@@ -10336,7 +10337,7 @@ __metadata:
eslint-plugin-react-hooks: ^4.6.0
mongodb: ^4.17.2
react: ~17.0.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
use-sync-external-store: ^1.2.0
peerDependencies:
"@rocket.chat/core-typings": "workspace:^"
@@ -10371,9 +10372,9 @@ __metadata:
ts-jest: ~29.1.1
ts-loader: ~9.4.2
ts-node: ~10.9.1
- ts-patch: ~3.0.2
- typescript: ~5.3.3
- typia: ~5.3.3
+ ts-patch: ~3.2.1
+ typescript: ~5.5.4
+ typia: ~6.9.0
peerDependencies:
"@rocket.chat/icons": "*"
languageName: unknown
@@ -10384,7 +10385,7 @@ __metadata:
resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming"
dependencies:
"@rocket.chat/css-in-js": ~0.31.25
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/icons": ~0.38.0
"@rocket.chat/ui-contexts": "workspace:~"
@@ -10396,7 +10397,7 @@ __metadata:
eslint-plugin-testing-library: ^5.11.1
react: ~17.0.2
react-docgen-typescript-plugin: ~1.0.5
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/css-in-js": "*"
"@rocket.chat/fuselage": "*"
@@ -10414,7 +10415,7 @@ __metadata:
"@rocket.chat/css-in-js": ~0.31.25
"@rocket.chat/emitter": ~0.31.25
"@rocket.chat/eslint-config": "workspace:^"
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/icons": ~0.38.0
"@rocket.chat/jest-presets": "workspace:~"
@@ -10440,15 +10441,15 @@ __metadata:
jest: ~29.7.0
jest-axe: ~9.0.0
react-docgen-typescript-plugin: ~1.0.5
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/css-in-js": "*"
"@rocket.chat/fuselage": "*"
"@rocket.chat/fuselage-hooks": "*"
"@rocket.chat/icons": "*"
"@rocket.chat/styled": "*"
- "@rocket.chat/ui-avatar": 5.0.0
- "@rocket.chat/ui-contexts": 9.0.0
+ "@rocket.chat/ui-avatar": 6.0.0-rc.3
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
react: ^17.0.2
react-dom: ^17.0.2
languageName: unknown
@@ -10463,7 +10464,7 @@ __metadata:
"@codemirror/tooltip": ^0.19.16
"@lezer/highlight": ^1.1.6
"@rocket.chat/css-in-js": ~0.31.25
- "@rocket.chat/fuselage": ^0.57.0
+ "@rocket.chat/fuselage": ^0.57.1
"@rocket.chat/fuselage-hooks": ^0.33.1
"@rocket.chat/fuselage-polyfills": ~0.31.25
"@rocket.chat/fuselage-toastbar": ^0.33.0
@@ -10495,7 +10496,7 @@ __metadata:
react-split-pane: ^0.1.92
react-virtuoso: ^4.7.1
reactflow: ^11.7.2
- typescript: ~5.3.3
+ typescript: ~5.5.4
use-subscription: ^1.8.0
vite: ^4.3.9
languageName: unknown
@@ -10531,11 +10532,11 @@ __metadata:
react-hook-form: ~7.45.4
react-i18next: ~13.2.2
storybook-dark-mode: ~3.0.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
peerDependencies:
"@rocket.chat/layout": "*"
"@rocket.chat/tools": 0.2.2
- "@rocket.chat/ui-contexts": 9.0.0
+ "@rocket.chat/ui-contexts": 10.0.0-rc.3
"@tanstack/react-query": "*"
react: "*"
react-hook-form: "*"
@@ -10543,6 +10544,13 @@ __metadata:
languageName: unknown
linkType: soft
+"@samchon/openapi@npm:^0.4.6":
+ version: 0.4.9
+ resolution: "@samchon/openapi@npm:0.4.9"
+ checksum: a6fd35db27ebf3223c4793bd9a6669fc0e48ccbe522fa8eb26519073b897fb774cd652777e8d7d414bc19bf47ae03be227dfc2b65e2e1a5869c9723c5adad2e0
+ languageName: node
+ linkType: hard
+
"@selderee/plugin-htmlparser2@npm:^0.6.0":
version: 0.6.0
resolution: "@selderee/plugin-htmlparser2@npm:0.6.0"
@@ -13455,6 +13463,18 @@ __metadata:
languageName: node
linkType: hard
+"@types/express@npm:^4.17.21":
+ version: 4.17.21
+ resolution: "@types/express@npm:4.17.21"
+ dependencies:
+ "@types/body-parser": "*"
+ "@types/express-serve-static-core": ^4.17.33
+ "@types/qs": "*"
+ "@types/serve-static": "*"
+ checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5
+ languageName: node
+ linkType: hard
+
"@types/fibers@npm:^3.1.3":
version: 3.1.3
resolution: "@types/fibers@npm:3.1.3"
@@ -36694,7 +36714,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "rocketchat-services@workspace:apps/meteor/ee/server/services"
dependencies:
- "@rocket.chat/apps-engine": 1.45.0-alpha.866
+ "@rocket.chat/apps-engine": 1.45.0-alpha.868
"@rocket.chat/core-services": "workspace:^"
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/emitter": ~0.31.25
@@ -36734,7 +36754,7 @@ __metadata:
sodium-native: ^3.3.0
sodium-plus: ^0.9.0
ts-node: ^10.9.1
- typescript: ~5.3.3
+ typescript: ~5.5.4
uuid: ^8.3.2
ws: ^8.8.1
languageName: unknown
@@ -37200,7 +37220,7 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4":
+"semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4":
version: 7.5.4
resolution: "semver@npm:7.5.4"
dependencies:
@@ -40047,20 +40067,20 @@ __metadata:
languageName: node
linkType: hard
-"ts-patch@npm:~3.0.2":
- version: 3.0.2
- resolution: "ts-patch@npm:3.0.2"
+"ts-patch@npm:~3.2.1":
+ version: 3.2.1
+ resolution: "ts-patch@npm:3.2.1"
dependencies:
chalk: ^4.1.2
global-prefix: ^3.0.0
minimist: ^1.2.8
resolve: ^1.22.2
- semver: ^7.3.8
+ semver: ^7.5.4
strip-ansi: ^6.0.1
bin:
ts-patch: bin/ts-patch.js
tspc: bin/tspc.js
- checksum: 09cdc54bf517b11d4b0de64515e9a0d7e71e238d6065b3c02a04280dc2683143cd810a9065046228571af0865a7d876a4a852ff9a909cb2cae8fe33b41e4eb81
+ checksum: 8da4472dcd67b561a6299b54e30ab96181598edb90a97bc8dbe0066b28d706ec7402fee73496d25a281e2c4c94cb8e86d3b1592b1ca7591ea0b6cb48617ed19c
languageName: node
linkType: hard
@@ -40544,75 +40564,57 @@ __metadata:
languageName: node
linkType: hard
-"typescript@npm:~5.3.3":
- version: 5.3.3
- resolution: "typescript@npm:5.3.3"
+"typescript@npm:~5.5.4":
+ version: 5.5.4
+ resolution: "typescript@npm:5.5.4"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2
+ checksum: b309040f3a1cd91c68a5a58af6b9fdd4e849b8c42d837b2c2e73f9a4f96a98c4f1ed398a9aab576ee0a4748f5690cf594e6b99dbe61de7839da748c41e6d6ca8
languageName: node
linkType: hard
-"typescript@npm:~5.4.5":
- version: 5.4.5
- resolution: "typescript@npm:5.4.5"
+"typescript@patch:typescript@~5.5.4#~builtin":
+ version: 5.5.4
+ resolution: "typescript@patch:typescript@npm%3A5.5.4#~builtin::version=5.5.4&hash=85af82"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0
+ checksum: fc52962f31a5bcb716d4213bef516885e4f01f30cea797a831205fc9ef12b405a40561c40eae3127ab85ba1548e7df49df2bcdee6b84a94bfbe3a0d7eff16b14
languageName: node
linkType: hard
-"typescript@patch:typescript@~5.3.3#~builtin":
- version: 5.3.3
- resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=85af82"
- bin:
- tsc: bin/tsc
- tsserver: bin/tsserver
- checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610
- languageName: node
- linkType: hard
-
-"typescript@patch:typescript@~5.4.5#~builtin":
- version: 5.4.5
- resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=85af82"
- bin:
- tsc: bin/tsc
- tsserver: bin/tsserver
- checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba
- languageName: node
- linkType: hard
-
-"typia@npm:5.3.3, typia@npm:^5.3.3":
- version: 5.3.3
- resolution: "typia@npm:5.3.3"
+"typia@npm:6.9.0":
+ version: 6.9.0
+ resolution: "typia@npm:6.9.0"
dependencies:
+ "@samchon/openapi": ^0.4.6
commander: ^10.0.0
comment-json: ^4.2.3
inquirer: ^8.2.5
randexp: ^0.5.3
peerDependencies:
- typescript: ">=4.8.0 <5.4.0"
+ typescript: ">=4.8.0 <5.6.0"
bin:
typia: lib/executable/typia.js
- checksum: 6e6c9f4c1382deda6ee91fb42f0adbfa57c5b73541a2e411474108d1deac9dd2f590fbbe48399c0357064a6298b5ab17324aa521195cf8e470057171ce868a64
+ checksum: 1d5ab0d331ff29b84914f5c8c5655fe3b1d17fae45ac3a76d30690de8414e8c45a27c189662896730c3211a436373e8c2eb3fc55d2eeb6ac8d15a1f50218a2e9
languageName: node
linkType: hard
-"typia@patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch::locator=rocket.chat%40workspace%3A.":
- version: 5.3.3
- resolution: "typia@patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch::version=5.3.3&hash=777cd5&locator=rocket.chat%40workspace%3A."
+"typia@patch:typia@npm%3A6.9.0#./.yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch::locator=rocket.chat%40workspace%3A.":
+ version: 6.9.0
+ resolution: "typia@patch:typia@npm%3A6.9.0#./.yarn/patches/typia-npm-6.9.0-2fd4d85f25.patch::version=6.9.0&hash=71fcee&locator=rocket.chat%40workspace%3A."
dependencies:
+ "@samchon/openapi": ^0.4.6
commander: ^10.0.0
comment-json: ^4.2.3
inquirer: ^8.2.5
randexp: ^0.5.3
peerDependencies:
- typescript: ">=4.8.0 <5.4.0"
+ typescript: ">=4.8.0 <5.6.0"
bin:
typia: lib/executable/typia.js
- checksum: 256a670f6d3265135090a493c9519cd97466444188766ce9f4e434d2bfe29ec88c3a4ac3ac39938921e116873694ac526136957cbed5710109525d4d0d2425da
+ checksum: d87f150a526959f92ac9bafe7ad88121e69a2807c7aeb01a625cb845e0614fb09c54bbdbd68d0c90bce37072c2da5e153daa2ccd1f5ff7ca92eca4b5edf9e8a9
languageName: node
linkType: hard