diff --git a/packages/mock-providers/.eslintrc.json b/packages/mock-providers/.eslintrc.json
new file mode 100644
index 0000000000000..a83aeda48e66d
--- /dev/null
+++ b/packages/mock-providers/.eslintrc.json
@@ -0,0 +1,4 @@
+{
+ "extends": ["@rocket.chat/eslint-config"],
+ "ignorePatterns": ["**/dist"]
+}
diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json
new file mode 100644
index 0000000000000..9cbe0db459627
--- /dev/null
+++ b/packages/mock-providers/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "@rocket.chat/mock-providers",
+ "version": "0.0.1",
+ "private": true,
+ "devDependencies": {
+ "@rocket.chat/ui-contexts": "workspace:*",
+ "@tanstack/react-query": "^4.16.1",
+ "@types/jest": "^27.4.1",
+ "eslint": "^8.12.0",
+ "jest": "~29.5.0",
+ "react": "~17.0.2",
+ "ts-jest": "~29.0.5",
+ "typescript": "~5.0.2"
+ },
+ "peerDependencies": {
+ "@tanstack/react-query": "*",
+ "react": "*"
+ },
+ "scripts": {
+ "lint": "eslint --ext .js,.jsx,.ts,.tsx .",
+ "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
+ "test": "jest",
+ "build": "rm -rf dist && tsc -p tsconfig.json",
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
+ },
+ "main": "./dist/index.js",
+ "typings": "./dist/index.d.ts",
+ "files": [
+ "/dist"
+ ]
+}
diff --git a/packages/mock-providers/src/MockedAuthorizationContext.tsx b/packages/mock-providers/src/MockedAuthorizationContext.tsx
new file mode 100644
index 0000000000000..18f791f1dd984
--- /dev/null
+++ b/packages/mock-providers/src/MockedAuthorizationContext.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import { AuthorizationContext } from '@rocket.chat/ui-contexts';
+
+export const MockedAuthorizationContext = ({ permissions = [], children }: { permissions: string[]; children: React.ReactNode }) => {
+ return (
+ [() => (): void => undefined, (): boolean => permissions.includes(id)],
+ queryAtLeastOnePermission: () => [() => (): void => undefined, (): boolean => false],
+ queryAllPermissions: () => [() => (): void => undefined, (): boolean => false],
+ queryRole: () => [() => (): void => undefined, (): boolean => false],
+ roleStore: {
+ roles: {},
+ emit: (): void => undefined,
+ on: () => (): void => undefined,
+ off: (): void => undefined,
+ events: (): 'change'[] => ['change'],
+ has: (): boolean => false,
+ once: () => (): void => undefined,
+ },
+ }}
+ >
+ {children}
+
+ );
+};
diff --git a/packages/mock-providers/src/MockedServerContext.tsx b/packages/mock-providers/src/MockedServerContext.tsx
new file mode 100644
index 0000000000000..f3c13004ed775
--- /dev/null
+++ b/packages/mock-providers/src/MockedServerContext.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import type { Serialized } from '@rocket.chat/core-typings';
+import type { Method, OperationParams, OperationResult, PathPattern, UrlParams } from '@rocket.chat/rest-typings';
+import type { ServerMethodName, ServerMethodParameters } from '@rocket.chat/ui-contexts';
+import { ServerContext } from '@rocket.chat/ui-contexts';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+
+export const MockedServerContext = ({
+ handleRequest,
+ children,
+}: {
+ handleRequest: (args: {
+ method: TMethod;
+ pathPattern: TPathPattern;
+ keys: UrlParams;
+ params: OperationParams;
+ }) => Promise>>;
+ children: React.ReactNode;
+}): any => {
+ const [queryClient] = React.useState(() => new QueryClient());
+ return (
+ `http://localhost:3000/${path}`,
+ callMethod: (_methodName: MethodName, ..._args: ServerMethodParameters) =>
+ Promise.reject('mock not implemented'),
+ callEndpoint: async (args: {
+ method: TMethod;
+ pathPattern: TPathPattern;
+ keys: UrlParams;
+ params: OperationParams;
+ }) => {
+ return handleRequest(args);
+ },
+ } as any
+ }
+ >
+ {children}
+
+ );
+};
diff --git a/packages/mock-providers/src/MockedSettingsContext.tsx b/packages/mock-providers/src/MockedSettingsContext.tsx
new file mode 100644
index 0000000000000..f916f4a6fb475
--- /dev/null
+++ b/packages/mock-providers/src/MockedSettingsContext.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import type { ISetting } from '@rocket.chat/core-typings';
+import { SettingsContext } from '@rocket.chat/ui-contexts';
+import type { ContextType } from 'react';
+
+const settingContextValue: ContextType = {
+ hasPrivateAccess: true,
+ isLoading: false,
+ querySetting: (_id: string) => [() => () => undefined, () => undefined],
+ querySettings: () => [() => () => undefined, () => []],
+ dispatch: async () => undefined,
+};
+
+const createSettingContextValue = ({ settings }: { settings?: Record }): ContextType => {
+ const cache = new Map();
+
+ return {
+ ...settingContextValue,
+ ...(settings && {
+ querySetting: (_id: string) => [
+ () => () => undefined,
+ () => {
+ if (cache.has(_id)) {
+ return cache.get(_id) as any;
+ }
+ cache.set(_id, { value: settings[_id] } as any);
+ return cache.get(_id) as any;
+ },
+ ],
+ }),
+ };
+};
+
+export const MockedSettingsContext = ({
+ settings,
+ children,
+}: {
+ children: React.ReactNode;
+ settings?: Record;
+}) => {
+ return {children};
+};
diff --git a/packages/mock-providers/src/MockedUiKitActionManager.tsx b/packages/mock-providers/src/MockedUiKitActionManager.tsx
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/packages/mock-providers/src/MockedUserContext.tsx b/packages/mock-providers/src/MockedUserContext.tsx
new file mode 100644
index 0000000000000..8dd9ae53cf3f4
--- /dev/null
+++ b/packages/mock-providers/src/MockedUserContext.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import type { LoginService } from '@rocket.chat/ui-contexts';
+import { UserContext } from '@rocket.chat/ui-contexts';
+import type { ContextType } from 'react';
+
+const userContextValue: ContextType = {
+ userId: 'john.doe',
+ user: {
+ _id: 'john.doe',
+ username: 'john.doe',
+ name: 'John Doe',
+ createdAt: new Date(),
+ active: true,
+ _updatedAt: new Date(),
+ roles: ['admin'],
+ type: 'user',
+ },
+ queryPreference: ((pref: string, defaultValue: T) => [
+ () => () => undefined,
+ () => (typeof pref === 'string' ? undefined : defaultValue),
+ ]) as any,
+ querySubscriptions: () => [() => () => undefined, () => []],
+ querySubscription: () => [() => () => undefined, () => undefined],
+ queryRoom: () => [() => () => undefined, () => undefined],
+
+ queryAllServices: () => [() => (): void => undefined, (): LoginService[] => []],
+ loginWithService: () => () => Promise.reject('loginWithService not implemented'),
+ loginWithPassword: async () => Promise.reject('loginWithPassword not implemented'),
+ loginWithToken: async () => Promise.reject('loginWithToken not implemented'),
+ logout: () => Promise.resolve(),
+};
+
+const createUserContextValue = ({ userPreferences }: { userPreferences?: Record }): ContextType => {
+ return {
+ ...userContextValue,
+ ...(userPreferences && { queryPreference: (id) => [() => () => undefined, () => userPreferences[id as unknown as string] as any] }),
+ };
+};
+
+export const MockedUserContext = ({
+ userPreferences,
+ children,
+}: {
+ children: React.ReactNode;
+ userPreferences?: Record;
+}) => {
+ return {children};
+};
diff --git a/packages/mock-providers/tsconfig.json b/packages/mock-providers/tsconfig.json
new file mode 100644
index 0000000000000..58749dfbb7e45
--- /dev/null
+++ b/packages/mock-providers/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.base.client.json",
+ "compilerOptions": {
+ "jsx": "react",
+ "rootDir": "./src",
+ "outDir": "./dist"
+ },
+ "include": ["./src/**/*"]
+}
diff --git a/yarn.lock b/yarn.lock
index df384064d532f..e35cc8a86c4ef 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5,6 +5,13 @@ __metadata:
version: 6
cacheKey: 8
+"@aashutoshrathi/word-wrap@npm:^1.2.3":
+ version: 1.2.6
+ resolution: "@aashutoshrathi/word-wrap@npm:1.2.6"
+ checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd
+ languageName: node
+ linkType: hard
+
"@actions/core@npm:^1.10.0":
version: 1.10.0
resolution: "@actions/core@npm:1.10.0"
@@ -5002,6 +5009,23 @@ __metadata:
languageName: node
linkType: hard
+"@eslint/eslintrc@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "@eslint/eslintrc@npm:2.1.0"
+ dependencies:
+ ajv: ^6.12.4
+ debug: ^4.3.2
+ espree: ^9.6.0
+ globals: ^13.19.0
+ ignore: ^5.2.0
+ import-fresh: ^3.2.1
+ js-yaml: ^4.1.0
+ minimatch: ^3.1.2
+ strip-json-comments: ^3.1.1
+ checksum: d5ed0adbe23f6571d8c9bb0ca6edf7618dc6aed4046aa56df7139f65ae7b578874e0d9c796df784c25bda648ceb754b6320277d828c8b004876d7443b8dc018c
+ languageName: node
+ linkType: hard
+
"@eslint/js@npm:8.43.0":
version: 8.43.0
resolution: "@eslint/js@npm:8.43.0"
@@ -5009,6 +5033,13 @@ __metadata:
languageName: node
linkType: hard
+"@eslint/js@npm:8.44.0":
+ version: 8.44.0
+ resolution: "@eslint/js@npm:8.44.0"
+ checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf
+ languageName: node
+ linkType: hard
+
"@faker-js/faker@npm:~8.0.2":
version: 8.0.2
resolution: "@faker-js/faker@npm:8.0.2"
@@ -10326,6 +10357,24 @@ __metadata:
languageName: unknown
linkType: soft
+"@rocket.chat/mock-providers@workspace:packages/mock-providers":
+ version: 0.0.0-use.local
+ resolution: "@rocket.chat/mock-providers@workspace:packages/mock-providers"
+ dependencies:
+ "@rocket.chat/ui-contexts": "workspace:*"
+ "@tanstack/react-query": ^4.16.1
+ "@types/jest": ^27.4.1
+ eslint: ^8.12.0
+ jest: ~29.5.0
+ react: ~17.0.2
+ ts-jest: ~29.0.5
+ typescript: ~5.0.2
+ peerDependencies:
+ "@tanstack/react-query": "*"
+ react: "*"
+ languageName: unknown
+ linkType: soft
+
"@rocket.chat/model-typings@workspace:^, @rocket.chat/model-typings@workspace:packages/model-typings":
version: 0.0.0-use.local
resolution: "@rocket.chat/model-typings@workspace:packages/model-typings"
@@ -10851,7 +10900,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@rocket.chat/ui-contexts@workspace:^, @rocket.chat/ui-contexts@workspace:packages/ui-contexts, @rocket.chat/ui-contexts@workspace:~":
+"@rocket.chat/ui-contexts@workspace:*, @rocket.chat/ui-contexts@workspace:^, @rocket.chat/ui-contexts@workspace:packages/ui-contexts, @rocket.chat/ui-contexts@workspace:~":
version: 0.0.0-use.local
resolution: "@rocket.chat/ui-contexts@workspace:packages/ui-contexts"
dependencies:
@@ -15463,6 +15512,15 @@ __metadata:
languageName: node
linkType: hard
+"acorn@npm:^8.9.0":
+ version: 8.10.0
+ resolution: "acorn@npm:8.10.0"
+ bin:
+ acorn: bin/acorn
+ checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d
+ languageName: node
+ linkType: hard
+
"add-px-to-style@npm:1.0.0":
version: 1.0.0
resolution: "add-px-to-style@npm:1.0.0"
@@ -22159,6 +22217,55 @@ __metadata:
languageName: node
linkType: hard
+"eslint@npm:^8.12.0":
+ version: 8.44.0
+ resolution: "eslint@npm:8.44.0"
+ dependencies:
+ "@eslint-community/eslint-utils": ^4.2.0
+ "@eslint-community/regexpp": ^4.4.0
+ "@eslint/eslintrc": ^2.1.0
+ "@eslint/js": 8.44.0
+ "@humanwhocodes/config-array": ^0.11.10
+ "@humanwhocodes/module-importer": ^1.0.1
+ "@nodelib/fs.walk": ^1.2.8
+ ajv: ^6.10.0
+ chalk: ^4.0.0
+ cross-spawn: ^7.0.2
+ debug: ^4.3.2
+ doctrine: ^3.0.0
+ escape-string-regexp: ^4.0.0
+ eslint-scope: ^7.2.0
+ eslint-visitor-keys: ^3.4.1
+ espree: ^9.6.0
+ esquery: ^1.4.2
+ esutils: ^2.0.2
+ fast-deep-equal: ^3.1.3
+ file-entry-cache: ^6.0.1
+ find-up: ^5.0.0
+ glob-parent: ^6.0.2
+ globals: ^13.19.0
+ graphemer: ^1.4.0
+ ignore: ^5.2.0
+ import-fresh: ^3.0.0
+ imurmurhash: ^0.1.4
+ is-glob: ^4.0.0
+ is-path-inside: ^3.0.3
+ js-yaml: ^4.1.0
+ json-stable-stringify-without-jsonify: ^1.0.1
+ levn: ^0.4.1
+ lodash.merge: ^4.6.2
+ minimatch: ^3.1.2
+ natural-compare: ^1.4.0
+ optionator: ^0.9.3
+ strip-ansi: ^6.0.1
+ strip-json-comments: ^3.1.0
+ text-table: ^0.2.0
+ bin:
+ eslint: bin/eslint.js
+ checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501
+ languageName: node
+ linkType: hard
+
"eslint@npm:^8.43.0, eslint@npm:~8.43.0":
version: 8.43.0
resolution: "eslint@npm:8.43.0"
@@ -22230,6 +22337,17 @@ __metadata:
languageName: node
linkType: hard
+"espree@npm:^9.6.0":
+ version: 9.6.0
+ resolution: "espree@npm:9.6.0"
+ dependencies:
+ acorn: ^8.9.0
+ acorn-jsx: ^5.3.2
+ eslint-visitor-keys: ^3.4.1
+ checksum: 1287979510efb052a6a97c73067ea5d0a40701b29adde87bbe2d3eb1667e39ca55e8129e20e2517fed3da570150e7ef470585228459a8f3e3755f45007a1c662
+ languageName: node
+ linkType: hard
+
"esprima@npm:^4.0.0, esprima@npm:^4.0.1":
version: 4.0.1
resolution: "esprima@npm:4.0.1"
@@ -31625,6 +31743,20 @@ __metadata:
languageName: node
linkType: hard
+"optionator@npm:^0.9.3":
+ version: 0.9.3
+ resolution: "optionator@npm:0.9.3"
+ dependencies:
+ "@aashutoshrathi/word-wrap": ^1.2.3
+ deep-is: ^0.1.3
+ fast-levenshtein: ^2.0.6
+ levn: ^0.4.1
+ prelude-ls: ^1.2.1
+ type-check: ^0.4.0
+ checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a
+ languageName: node
+ linkType: hard
+
"optipng-bin@npm:^7.0.0":
version: 7.0.1
resolution: "optipng-bin@npm:7.0.1"
@@ -39582,6 +39714,16 @@ __metadata:
languageName: node
linkType: hard
+"typescript@npm:~5.0.2":
+ version: 5.0.4
+ resolution: "typescript@npm:5.0.4"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172
+ languageName: node
+ linkType: hard
+
"typescript@patch:typescript@^5.1.3#~builtin, typescript@patch:typescript@~5.1.3#~builtin":
version: 5.1.3
resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin::version=5.1.3&hash=f456af"
@@ -39592,6 +39734,16 @@ __metadata:
languageName: node
linkType: hard
+"typescript@patch:typescript@~5.0.2#~builtin":
+ version: 5.0.4
+ resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=f456af"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 6a1fe9a77bb9c5176ead919cc4a1499ee63e46b4e05bf667079f11bf3a8f7887f135aa72460a4c3b016e6e6bb65a822cb8689a6d86cbfe92d22cc9f501f09213
+ languageName: node
+ linkType: hard
+
"ua-parser-js@npm:^1.0.35":
version: 1.0.35
resolution: "ua-parser-js@npm:1.0.35"