From 5f805f0274338efe2d5cc3b464dfa83f1ea1e133 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Fri, 21 Nov 2025 10:09:32 -0300 Subject: [PATCH 001/302] chore(i18n): Remove resources' single bundle to reduce package size (#37543) --- apps/meteor/package.json | 4 +- apps/meteor/server/lib/i18n.ts | 82 +++++++++++++++++++++- ee/apps/omnichannel-transcript/src/i18n.ts | 10 ++- packages/i18n/package.json | 6 +- packages/i18n/src/scripts/build.mts | 25 ++----- 5 files changed, 95 insertions(+), 32 deletions(-) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 2f82d3fe0525f..3127ea7011c3e 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -37,10 +37,10 @@ "test:e2e:federation": "playwright test --config=playwright-federation.config.ts", "test:e2e:nyc": "nyc report --reporter=lcovonly", "testapi": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.api.js", - "testunit": "yarn .testunit:definition && yarn .testunit:client && yarn .testunit:server:cov", + "testunit": "yarn .testunit:definition && yarn .testunit:jest && yarn .testunit:server:cov", ".testunit:server": "mocha --config ./.mocharc.js", ".testunit:server:cov": "nyc -r text -r lcov mocha --config ./.mocharc.js", - ".testunit:client": "TZ=UTC TS_NODE_COMPILER_OPTIONS='{\"allowJs\": false}' jest", + ".testunit:jest": "TZ=UTC TS_NODE_COMPILER_OPTIONS='{\"allowJs\": false}' jest", ".testunit:definition": "mocha --config ./.mocharc.definition.js", "testunit-watch": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --watch --config ./.mocharc.js", "test": "yarn testunit && yarn testapi", diff --git a/apps/meteor/server/lib/i18n.ts b/apps/meteor/server/lib/i18n.ts index 2a02edbdfc80c..bfa4bff7383fc 100644 --- a/apps/meteor/server/lib/i18n.ts +++ b/apps/meteor/server/lib/i18n.ts @@ -1,8 +1,80 @@ import { availableTranslationNamespaces, defaultTranslationNamespace, extractTranslationNamespaces } from '@rocket.chat/i18n'; -import i18nDict from '@rocket.chat/i18n/dist/resources'; +import languages from '@rocket.chat/i18n/dist/languages'; import { i18n } from '../../app/utils/lib/i18n'; +// Meteor bundler is incredible (derogatory) +// eslint-disable-next-line no-constant-condition +if (false) { + import('@rocket.chat/i18n/dist/resources/af.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ar.i18n.json'); + import('@rocket.chat/i18n/dist/resources/az.i18n.json'); + import('@rocket.chat/i18n/dist/resources/be-BY.i18n.json'); + import('@rocket.chat/i18n/dist/resources/bg.i18n.json'); + import('@rocket.chat/i18n/dist/resources/bn-BD.i18n.json'); + import('@rocket.chat/i18n/dist/resources/bn-IN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/bs.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ca.i18n.json'); + import('@rocket.chat/i18n/dist/resources/cs.i18n.json'); + import('@rocket.chat/i18n/dist/resources/cy.i18n.json'); + import('@rocket.chat/i18n/dist/resources/da.i18n.json'); + import('@rocket.chat/i18n/dist/resources/de-AT.i18n.json'); + import('@rocket.chat/i18n/dist/resources/de-IN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/de.i18n.json'); + import('@rocket.chat/i18n/dist/resources/el.i18n.json'); + import('@rocket.chat/i18n/dist/resources/en.i18n.json'); + import('@rocket.chat/i18n/dist/resources/eo.i18n.json'); + import('@rocket.chat/i18n/dist/resources/es.i18n.json'); + import('@rocket.chat/i18n/dist/resources/et.i18n.json'); + import('@rocket.chat/i18n/dist/resources/eu.i18n.json'); + import('@rocket.chat/i18n/dist/resources/fa.i18n.json'); + import('@rocket.chat/i18n/dist/resources/fi.i18n.json'); + import('@rocket.chat/i18n/dist/resources/fr.i18n.json'); + import('@rocket.chat/i18n/dist/resources/gl.i18n.json'); + import('@rocket.chat/i18n/dist/resources/he.i18n.json'); + import('@rocket.chat/i18n/dist/resources/hi-IN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/hi.i18n.json'); + import('@rocket.chat/i18n/dist/resources/hr.i18n.json'); + import('@rocket.chat/i18n/dist/resources/hu.i18n.json'); + import('@rocket.chat/i18n/dist/resources/id.i18n.json'); + import('@rocket.chat/i18n/dist/resources/it.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ja.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ka-GE.i18n.json'); + import('@rocket.chat/i18n/dist/resources/km.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ko.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ku.i18n.json'); + import('@rocket.chat/i18n/dist/resources/lo.i18n.json'); + import('@rocket.chat/i18n/dist/resources/lt.i18n.json'); + import('@rocket.chat/i18n/dist/resources/lv.i18n.json'); + import('@rocket.chat/i18n/dist/resources/mn.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ms-MY.i18n.json'); + import('@rocket.chat/i18n/dist/resources/nb.i18n.json'); + import('@rocket.chat/i18n/dist/resources/nl.i18n.json'); + import('@rocket.chat/i18n/dist/resources/nn.i18n.json'); + import('@rocket.chat/i18n/dist/resources/pa-IN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/pl.i18n.json'); + import('@rocket.chat/i18n/dist/resources/pt-BR.i18n.json'); + import('@rocket.chat/i18n/dist/resources/pt.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ro.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ru.i18n.json'); + import('@rocket.chat/i18n/dist/resources/se.i18n.json'); + import('@rocket.chat/i18n/dist/resources/si.i18n.json'); + import('@rocket.chat/i18n/dist/resources/sk-SK.i18n.json'); + import('@rocket.chat/i18n/dist/resources/sl-SI.i18n.json'); + import('@rocket.chat/i18n/dist/resources/sq.i18n.json'); + import('@rocket.chat/i18n/dist/resources/sr.i18n.json'); + import('@rocket.chat/i18n/dist/resources/sv.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ta-IN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/th-TH.i18n.json'); + import('@rocket.chat/i18n/dist/resources/tr.i18n.json'); + import('@rocket.chat/i18n/dist/resources/ug.i18n.json'); + import('@rocket.chat/i18n/dist/resources/uk.i18n.json'); + import('@rocket.chat/i18n/dist/resources/vi-VN.i18n.json'); + import('@rocket.chat/i18n/dist/resources/zh-HK.i18n.json'); + import('@rocket.chat/i18n/dist/resources/zh-TW.i18n.json'); + import('@rocket.chat/i18n/dist/resources/zh.i18n.json'); +} + void i18n.init({ lng: 'en', fallbackLng: 'en', @@ -10,9 +82,13 @@ void i18n.init({ ns: availableTranslationNamespaces, nsSeparator: '.', resources: Object.fromEntries( - Object.entries(i18nDict).map(([language, source]) => [ + languages.map((language) => [ language, - extractTranslationNamespaces(source as unknown as Record), + extractTranslationNamespaces( + // TODO: commonjs is terrible but we don't have esm build yet + // eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-dynamic-require + require(`@rocket.chat/i18n/dist/resources/${language}.i18n.json`) as unknown as Record, + ), ]), ), initImmediate: false, diff --git a/ee/apps/omnichannel-transcript/src/i18n.ts b/ee/apps/omnichannel-transcript/src/i18n.ts index fa39b0c8f1ea2..99a0d1580e003 100644 --- a/ee/apps/omnichannel-transcript/src/i18n.ts +++ b/ee/apps/omnichannel-transcript/src/i18n.ts @@ -1,5 +1,5 @@ import { availableTranslationNamespaces, defaultTranslationNamespace, extractTranslationNamespaces } from '@rocket.chat/i18n'; -import i18nDict from '@rocket.chat/i18n/dist/resources'; +import languages from '@rocket.chat/i18n/dist/languages'; import i18next from 'i18next'; import sprintf from 'i18next-sprintf-postprocessor'; @@ -12,9 +12,13 @@ void i18n.init({ ns: availableTranslationNamespaces, nsSeparator: '.', resources: Object.fromEntries( - Object.entries(i18nDict).map(([language, source]) => [ + languages.map((language) => [ language, - extractTranslationNamespaces(source as unknown as Record), + extractTranslationNamespaces( + // TODO: commonjs is terrible but we don't have esm build yet + // eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-dynamic-require + require(`@rocket.chat/i18n/dist/resources/${language}.i18n.json`) as unknown as Record, + ), ]), ), initImmediate: false, diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 4db065b685613..d47f3ef908c21 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -9,10 +9,8 @@ "import": "./dist/index.js", "require": "./dist/index.cjs" }, - "./dist/resources": { - "types": "./dist/resources.d.ts", - "import": "./dist/resources.js", - "require": "./dist/resources.cjs" + "./dist/resources/*": { + "default": "./dist/resources/*" }, "./dist/languages": { "types": "./dist/languages.d.ts", diff --git a/packages/i18n/src/scripts/build.mts b/packages/i18n/src/scripts/build.mts index 4ded10d2116ba..68f1c70b1210b 100644 --- a/packages/i18n/src/scripts/build.mts +++ b/packages/i18n/src/scripts/build.mts @@ -53,30 +53,15 @@ async function build() { } // ./resources - const allResources = resources.reduce( - (acc, resource) => { - return { - ...acc, - [resource.language]: resource.content, - }; - }, - {} as Record>, - ); - const allResourcesSerialized = JSON.stringify(allResources, null, 2); - - await writeFile(join(distDirectory, 'resources.js'), `export default ${allResourcesSerialized};`); - - await writeFile( - join(distDirectory, 'resources.cjs'), - `"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ${allResourcesSerialized};`, - ); + const baseResource = resources.find((r) => r.language === 'en'); + if (!baseResource) { + throw new Error('Base resource "en" not found'); + } await writeFile( join(distDirectory, 'resources.d.ts'), `export interface RocketchatI18n { - ${Object.keys(allResources.en) + ${Object.keys(baseResource.content) .map((key) => `${JSON.stringify(key)}: string;`) .join('\n\t')} } From f36859b437a95e8a24377f54840cf75ed72b0649 Mon Sep 17 00:00:00 2001 From: Ricardo Garim Date: Fri, 21 Nov 2025 12:26:11 -0300 Subject: [PATCH 002/302] chore(federation): update typings to match EventEmitter property pruning (#37570) --- ee/packages/federation-matrix/src/events/room.ts | 8 ++++++-- .../federation-matrix/src/helpers/message.parsers.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ee/packages/federation-matrix/src/events/room.ts b/ee/packages/federation-matrix/src/events/room.ts index 68a12b30192dc..45668831e52f8 100644 --- a/ee/packages/federation-matrix/src/events/room.ts +++ b/ee/packages/federation-matrix/src/events/room.ts @@ -6,8 +6,12 @@ import { Rooms, Users } from '@rocket.chat/models'; import { getUsernameServername } from '../FederationMatrix'; export function room(emitter: Emitter) { - emitter.on('homeserver.matrix.room.name', async (data) => { - const { room_id: roomId, name, user_id: userId } = data; + emitter.on('homeserver.matrix.room.name', async ({ event }) => { + const { + room_id: roomId, + content: { name }, + sender: userId, + } = event; const localRoomId = await Rooms.findOne({ 'federation.mrid': roomId }, { projection: { _id: 1 } }); if (!localRoomId) { diff --git a/ee/packages/federation-matrix/src/helpers/message.parsers.ts b/ee/packages/federation-matrix/src/helpers/message.parsers.ts index 9838e2f91d3c7..af4ff6ed7867d 100644 --- a/ee/packages/federation-matrix/src/helpers/message.parsers.ts +++ b/ee/packages/federation-matrix/src/helpers/message.parsers.ts @@ -2,7 +2,7 @@ import type { EventID, HomeserverEventSignatures } from '@rocket.chat/federation import { marked } from 'marked'; import sanitizeHtml from 'sanitize-html'; -type MatrixMessageContent = HomeserverEventSignatures['homeserver.matrix.message']['content'] & { format?: string }; +type MatrixMessageContent = HomeserverEventSignatures['homeserver.matrix.message']['event']['content'] & { format?: string }; type MatrixEvent = { content?: { body?: string; formatted_body?: string }; From 5ef03e216e7c3a5f08cf67fc46e64fc2ff79dff2 Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Fri, 21 Nov 2025 13:23:48 -0300 Subject: [PATCH 003/302] chore: Upgrade Fuselage focus handling (#37334) Co-authored-by: Tasso --- .../client/components/UserStatusMenu.tsx | 1 - apps/meteor/client/main.ts | 3 +- .../RoomList/useSidebarListNavigation.ts | 4 +- .../RoomList/useSidebarListNavigation.ts | 4 +- .../EmojiPicker/ToneSelector/ToneSelector.tsx | 1 - .../RoomList/useSidebarListNavigation.ts | 4 +- .../room/hooks/useMessageListNavigation.ts | 4 +- apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 11 +- ...tings-persistence-on-ui-navigation.spec.ts | 10 +- apps/uikit-playground/package.json | 9 +- ee/packages/federation-matrix/package.json | 2 +- ee/packages/ui-theming/package.json | 7 +- fuselage.sh | 5 +- packages/core-services/package.json | 2 +- packages/core-typings/package.json | 2 +- packages/gazzodown/package.json | 7 +- packages/livechat/package.json | 2 +- packages/storybook-config/package.json | 7 +- packages/ui-avatar/package.json | 7 +- packages/ui-client/package.json | 7 +- .../components/Header/HeaderTitleButton.tsx | 2 +- .../components/HeaderV2/HeaderTitleButton.tsx | 2 +- packages/ui-composer/package.json | 7 +- packages/ui-contexts/package.json | 2 +- packages/ui-kit/package.json | 2 +- packages/ui-video-conf/package.json | 7 +- packages/ui-voip/package.json | 7 +- packages/web-ui-registration/package.json | 9 +- yarn.lock | 189 +++++------------- 30 files changed, 118 insertions(+), 210 deletions(-) diff --git a/apps/meteor/client/components/UserStatusMenu.tsx b/apps/meteor/client/components/UserStatusMenu.tsx index db91152bc8493..7aa1d8be1fbed 100644 --- a/apps/meteor/client/components/UserStatusMenu.tsx +++ b/apps/meteor/client/components/UserStatusMenu.tsx @@ -63,7 +63,6 @@ const UserStatusMenu = ({ } ref.current.focus(); show(); - ref.current.classList.add('focus-visible'); }, [show]); const handleSelection = useCallback( diff --git a/apps/meteor/client/main.ts b/apps/meteor/client/main.ts index 117f1a312e950..bbc9c124050a6 100644 --- a/apps/meteor/client/main.ts +++ b/apps/meteor/client/main.ts @@ -2,8 +2,7 @@ import './meteor/overrides'; import './meteor/startup'; import './serviceWorker'; -import('@rocket.chat/fuselage-polyfills') - .then(() => import('./meteor/login')) +import('./meteor/login') .then(() => import('./ecdh')) .then(() => import('./importPackages')) .then(() => import('./startup')) diff --git a/apps/meteor/client/sidebar/RoomList/useSidebarListNavigation.ts b/apps/meteor/client/sidebar/RoomList/useSidebarListNavigation.ts index 57cb12fcd4440..baad06280ca9e 100644 --- a/apps/meteor/client/sidebar/RoomList/useSidebarListNavigation.ts +++ b/apps/meteor/client/sidebar/RoomList/useSidebarListNavigation.ts @@ -64,7 +64,7 @@ export const useSidebarListNavigation = () => { 'blur', (e) => { if ( - !(e.relatedTarget as HTMLElement)?.classList.contains('focus-visible') || + !(e.relatedTarget as HTMLElement)?.matches(':focus-visible') || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement) ) { return; @@ -80,7 +80,7 @@ export const useSidebarListNavigation = () => { node.addEventListener( 'focus', (e) => { - const triggeredByKeyboard = (e.target as HTMLElement)?.classList.contains('focus-visible'); + const triggeredByKeyboard = (e.target as HTMLElement)?.matches(':focus-visible'); if (!triggeredByKeyboard || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement)) { return; } diff --git a/apps/meteor/client/sidebarv2/RoomList/useSidebarListNavigation.ts b/apps/meteor/client/sidebarv2/RoomList/useSidebarListNavigation.ts index 6ebce12cac222..3f6ee5062a26d 100644 --- a/apps/meteor/client/sidebarv2/RoomList/useSidebarListNavigation.ts +++ b/apps/meteor/client/sidebarv2/RoomList/useSidebarListNavigation.ts @@ -68,7 +68,7 @@ export const useSidebarListNavigation = () => { 'blur', (e) => { if ( - !(e.relatedTarget as HTMLElement)?.classList.contains('focus-visible') || + !(e.relatedTarget as HTMLElement)?.matches(':focus-visible') || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement) ) { return; @@ -84,7 +84,7 @@ export const useSidebarListNavigation = () => { node.addEventListener( 'focus', (e) => { - const triggeredByKeyboard = (e.target as HTMLElement)?.classList.contains('focus-visible'); + const triggeredByKeyboard = (e.target as HTMLElement)?.matches(':focus-visible'); if (!triggeredByKeyboard || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement)) { return; } diff --git a/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx b/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx index 8429022ccf043..810022e93ccea 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx @@ -34,7 +34,6 @@ const ToneSelector = ({ tone, setTone }: { tone: number; setTone: (tone: number) } ref.current.focus(); show(); - ref.current.classList.add('focus-visible'); }, [show]); const handleSelection = useCallback( diff --git a/apps/meteor/client/views/navigation/sidebar/RoomList/useSidebarListNavigation.ts b/apps/meteor/client/views/navigation/sidebar/RoomList/useSidebarListNavigation.ts index 759c00f565295..ad345bd95a427 100644 --- a/apps/meteor/client/views/navigation/sidebar/RoomList/useSidebarListNavigation.ts +++ b/apps/meteor/client/views/navigation/sidebar/RoomList/useSidebarListNavigation.ts @@ -69,7 +69,7 @@ export const useSidebarListNavigation = () => { 'blur', (e) => { if ( - !(e.relatedTarget as HTMLElement)?.classList.contains('focus-visible') || + !(e.relatedTarget as HTMLElement)?.matches(':focus-visible') || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement) ) { return; @@ -85,7 +85,7 @@ export const useSidebarListNavigation = () => { node.addEventListener( 'focus', (e) => { - const triggeredByKeyboard = (e.target as HTMLElement)?.classList.contains('focus-visible'); + const triggeredByKeyboard = (e.target as HTMLElement)?.matches(':focus-visible'); if (!triggeredByKeyboard || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement)) { return; } diff --git a/apps/meteor/client/views/room/hooks/useMessageListNavigation.ts b/apps/meteor/client/views/room/hooks/useMessageListNavigation.ts index a267097399f18..6dc77e6f94c94 100644 --- a/apps/meteor/client/views/room/hooks/useMessageListNavigation.ts +++ b/apps/meteor/client/views/room/hooks/useMessageListNavigation.ts @@ -73,7 +73,7 @@ export const useMessageListNavigation = (): { messageListRef: RefCallback { if ( - !(e.relatedTarget as HTMLElement)?.classList.contains('focus-visible') || + !(e.relatedTarget as HTMLElement)?.matches(':focus-visible') || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement) ) { return; @@ -89,7 +89,7 @@ export const useMessageListNavigation = (): { messageListRef: RefCallback { - const triggeredByKeyboard = (e.target as HTMLElement)?.classList.contains('focus-visible'); + const triggeredByKeyboard = (e.target as HTMLElement)?.matches(':focus-visible'); if (!triggeredByKeyboard || !(e.currentTarget instanceof HTMLElement && e.relatedTarget instanceof HTMLElement)) { return; } diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 209bf5314c9bd..ab7a0fd449aca 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -48,7 +48,7 @@ "ws": "~8.18.3" }, "devDependencies": { - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@types/cookie": "^0.5.4", "@types/cookie-parser": "^1.4.10", "@types/ejson": "^2.2.2", diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 3127ea7011c3e..a792f9cbeac37 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -254,11 +254,10 @@ "@rocket.chat/federation-matrix": "workspace:^", "@rocket.chat/federation-sdk": "0.3.0", "@rocket.chat/freeswitch": "workspace:^", - "@rocket.chat/fuselage": "^0.68.1", + "@rocket.chat/fuselage": "~0.68.1", "@rocket.chat/fuselage-forms": "~0.1.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", - "@rocket.chat/fuselage-toastbar": "^0.35.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", + "@rocket.chat/fuselage-toastbar": "~0.35.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@rocket.chat/fuselage-ui-kit": "workspace:^", "@rocket.chat/gazzodown": "workspace:^", @@ -267,7 +266,7 @@ "@rocket.chat/icons": "~0.45.0", "@rocket.chat/instance-status": "workspace:^", "@rocket.chat/jwt": "workspace:^", - "@rocket.chat/layout": "^0.33.1", + "@rocket.chat/layout": "~0.34.0", "@rocket.chat/license": "workspace:^", "@rocket.chat/log-format": "workspace:^", "@rocket.chat/logger": "workspace:^", @@ -285,7 +284,7 @@ "@rocket.chat/omni-core": "workspace:^", "@rocket.chat/omni-core-ee": "workspace:^", "@rocket.chat/omnichannel-services": "workspace:^", - "@rocket.chat/onboarding-ui": "^0.35.2", + "@rocket.chat/onboarding-ui": "~0.36.0", "@rocket.chat/password-policies": "workspace:^", "@rocket.chat/patch-injection": "workspace:^", "@rocket.chat/pdf-worker": "workspace:^", diff --git a/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts b/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts index f2610d54cd98d..a3b1daebcd49c 100644 --- a/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts +++ b/apps/meteor/tests/e2e/settings-persistence-on-ui-navigation.spec.ts @@ -25,15 +25,19 @@ test.describe.serial('settings-persistence-on-ui-navigation', () => { test.afterAll(({ api }) => setSettingValueById(api, 'Hide_System_Messages', [])); - test('expect settings to persist in ui when navigating back and forth', async ({ page }) => { - const settingInput = await page.locator('[data-qa-setting-id="Hide_System_Messages"] input'); + test.skip('expect settings to persist in ui when navigating back and forth', async ({ page }) => { + const settingInput = page.locator('[data-qa-setting-id="Hide_System_Messages"] input'); await settingInput.pressSequentially('User joined'); await settingInput.press('Enter'); + const responsePromise = page.waitForResponse( + (response) => response.url().includes('/api/v1/method.call/saveSettings') && response.status() === 200, + ); + await page.locator('button:has-text("Save changes")').click(); await page.locator('button[title="Back"]').click(); - await page.waitForResponse((response) => response.url().includes('/api/v1/method.call/saveSettings') && response.status() === 200); + await responsePromise; await page.locator('a[href="/admin/settings/Message"] >> text=Open').click(); diff --git a/apps/uikit-playground/package.json b/apps/uikit-playground/package.json index d9311f596246e..5cea838d160dc 100644 --- a/apps/uikit-playground/package.json +++ b/apps/uikit-playground/package.json @@ -18,13 +18,12 @@ "@lezer/highlight": "^1.2.3", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", - "@rocket.chat/fuselage-toastbar": "^0.35.1", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", + "@rocket.chat/fuselage-toastbar": "~0.35.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@rocket.chat/fuselage-ui-kit": "workspace:~", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/logo": "~0.32.3", "@rocket.chat/styled": "~0.32.0", "@rocket.chat/ui-avatar": "workspace:^", diff --git a/ee/packages/federation-matrix/package.json b/ee/packages/federation-matrix/package.json index e73e1c3ad0647..7422c31c134a8 100644 --- a/ee/packages/federation-matrix/package.json +++ b/ee/packages/federation-matrix/package.json @@ -41,7 +41,7 @@ "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "^0.31.25", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/federation-sdk": "0.3.0", "@rocket.chat/http-router": "workspace:^", "@rocket.chat/license": "workspace:^", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index a09179f0510be..a69a92cfe90a2 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -5,11 +5,10 @@ "devDependencies": { "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/ui-contexts": "workspace:~", "@types/react": "~18.3.26", "@types/react-dom": "~18.3.7", diff --git a/fuselage.sh b/fuselage.sh index fdcd559a3b5b7..ee607585b0070 100755 --- a/fuselage.sh +++ b/fuselage.sh @@ -81,7 +81,6 @@ if [[ $action == "next-all" || $action == "latest-all" ]]; then fi echo "📦 @rocket.chat/emitter [UPDATING to $targetVersion version...] -📦 @rocket.chat/fuselage-polyfills [UPDATING to $targetVersion version...] 📦 @rocket.chat/fuselage-toastbar [UPDATING to $targetVersion version...] 📦 @rocket.chat/fuselage-tokens [UPDATING to $targetVersion version...] 📦 @rocket.chat/css-in-js [UPDATING to $targetVersion version...] @@ -91,13 +90,11 @@ echo "📦 @rocket.chat/emitter [UPDATING to $targetVersion version...] 📦 @rocket.chat/icons [UPDATING to $targetVersion version...] 📦 @rocket.chat/logo [UPDATING to $targetVersion version...] 📦 @rocket.chat/memo [UPDATING to $targetVersion version...] -📦 @rocket.chat/message-parser [UPDATING to $targetVersion version...] 📦 @rocket.chat/onboarding-ui [UPDATING to $targetVersion version...] 📦 @rocket.chat/string-helpers [UPDATING to $targetVersion version...] 📦 @rocket.chat/layout [UPDATING to $targetVersion version...] -📦 @rocket.chat/message-parser [UPDATING to $targetVersion version...]" - eval "yarn up @rocket.chat/emitter@$targetVersion @rocket.chat/fuselage-polyfills@$targetVersion @rocket.chat/fuselage-toastbar@$targetVersion @rocket.chat/fuselage-tokens@$targetVersion @rocket.chat/css-in-js@$targetVersion @rocket.chat/styled@$targetVersion @rocket.chat/fuselage@$targetVersion @rocket.chat/fuselage-hooks@$targetVersion @rocket.chat/icons@$targetVersion @rocket.chat/logo@$targetVersion @rocket.chat/memo@$targetVersion @rocket.chat/message-parser@$targetVersion @rocket.chat/onboarding-ui@$targetVersion @rocket.chat/string-helpers@$targetVersion @rocket.chat/layout@$targetVersion @rocket.chat/message-parser@$targetVersion" + eval "yarn up @rocket.chat/emitter@$targetVersion @rocket.chat/fuselage-toastbar@$targetVersion @rocket.chat/fuselage-tokens@$targetVersion @rocket.chat/css-in-js@$targetVersion @rocket.chat/styled@$targetVersion @rocket.chat/fuselage@$targetVersion @rocket.chat/fuselage-hooks@$targetVersion @rocket.chat/icons@$targetVersion @rocket.chat/logo@$targetVersion @rocket.chat/memo@$targetVersion @rocket.chat/onboarding-ui@$targetVersion @rocket.chat/string-helpers@$targetVersion @rocket.chat/layout@$targetVersion" exit 1 fi diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 566c62c04b6ef..3202d86825d34 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -37,7 +37,7 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/federation-sdk": "0.3.0", "@rocket.chat/http-router": "workspace:^", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/media-signaling": "workspace:^", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/models": "workspace:^", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index b427e0cff2e86..256996a3c8799 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -31,7 +31,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "typia": "~9.7.2" diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index f5fbd9b0578e7..e14cbde444c44 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -32,11 +32,10 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/styled": "~0.32.0", diff --git a/packages/livechat/package.json b/packages/livechat/package.json index f7f967ad08f0f..c5a3f55e5093a 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -32,7 +32,7 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/ddp-client": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage-hooks": "~0.37.2", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@rocket.chat/logo": "~0.32.3", "@rocket.chat/ui-contexts": "workspace:^", diff --git a/packages/storybook-config/package.json b/packages/storybook-config/package.json index a6452018fa68a..2b877b92e22b1 100644 --- a/packages/storybook-config/package.json +++ b/packages/storybook-config/package.json @@ -4,8 +4,7 @@ "private": true, "dependencies": { "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@storybook/addon-a11y": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", @@ -22,8 +21,8 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:~", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/tsconfig": "workspace:*", "@storybook/react": "^8.6.14", "eslint": "~8.45.0", diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 15e6ec207c766..8faba0286edf8 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -6,11 +6,10 @@ "@babel/core": "~7.28.5", "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/ui-contexts": "workspace:^", "@types/react": "~18.3.26", "@types/react-dom": "~18.3.7", diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 99436af75b90c..1da04ff1f3c77 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -23,11 +23,10 @@ "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/storybook-config": "workspace:~", diff --git a/packages/ui-client/src/components/Header/HeaderTitleButton.tsx b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx index c27f20ac9e095..cdfad6c88f06d 100644 --- a/packages/ui-client/src/components/Header/HeaderTitleButton.tsx +++ b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx @@ -12,7 +12,7 @@ const HeaderTitleButton = ({ className, ...props }: { className?: string } & Com cursor: pointer; background-color: ${Palette.surface['surface-hover']}; } - &:focus.focus-visible { + &:focus-visible { outline: 0; box-shadow: 0 0 0 2px ${Palette.stroke['stroke-extra-light-highlight']}; border-color: ${Palette.stroke['stroke-highlight']}; diff --git a/packages/ui-client/src/components/HeaderV2/HeaderTitleButton.tsx b/packages/ui-client/src/components/HeaderV2/HeaderTitleButton.tsx index 57a43b44b3610..abc0dc447cab8 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderTitleButton.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderTitleButton.tsx @@ -14,7 +14,7 @@ const HeaderTitleButton = ({ className, ...props }: HeaderTitleButtonProps) => { cursor: pointer; background-color: ${Palette.surface['surface-hover']}; } - &:focus.focus-visible { + &:focus-visible { outline: 0; box-shadow: 0 0 0 2px ${Palette.stroke['stroke-extra-light-highlight']}; border-color: ${Palette.stroke['stroke-highlight']}; diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index d2fc950d3abb3..9608675abb952 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -24,11 +24,10 @@ "@react-aria/toolbar": "^3.0.0-nightly.5042", "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/tsconfig": "workspace:*", "@storybook/addon-a11y": "^8.6.14", diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 393d4322ecd2d..a64b4fd682bb5 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -6,7 +6,7 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/ddp-client": "workspace:~", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage-hooks": "~0.37.2", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@rocket.chat/i18n": "workspace:~", "@rocket.chat/jest-presets": "workspace:~", diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 5a0073e333b73..6f37135ff1fc8 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -40,7 +40,7 @@ "@babel/plugin-transform-runtime": "~7.28.5", "@babel/preset-env": "~7.28.5", "@rocket.chat/eslint-config": "workspace:~", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/tsconfig": "workspace:*", "@types/jest": "~30.0.0", diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 56252c20998ab..fdbdf4b172328 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -24,11 +24,10 @@ "@babel/core": "~7.28.5", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/styled": "~0.32.0", "@rocket.chat/tsconfig": "workspace:*", diff --git a/packages/ui-voip/package.json b/packages/ui-voip/package.json index 7fdb5ec514721..95a009f5a2cc7 100644 --- a/packages/ui-voip/package.json +++ b/packages/ui-voip/package.json @@ -33,11 +33,10 @@ "@react-spectrum/test-utils": "~1.0.0-alpha.8", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", - "@rocket.chat/icons": "^0.45.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/mock-providers": "workspace:~", "@rocket.chat/styled": "~0.32.0", diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index f58440419b6d7..bd8310354e06e 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -24,13 +24,12 @@ "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/emitter": "~0.31.25", - "@rocket.chat/fuselage": "^0.68.1", - "@rocket.chat/fuselage-hooks": "~0.37.2", - "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage": "~0.68.1", + "@rocket.chat/fuselage-hooks": "~0.38.1", "@rocket.chat/fuselage-tokens": "~0.33.2", "@rocket.chat/i18n": "workspace:~", - "@rocket.chat/icons": "^0.45.0", - "@rocket.chat/layout": "^0.33.1", + "@rocket.chat/icons": "~0.45.0", + "@rocket.chat/layout": "~0.34.0", "@rocket.chat/mock-providers": "workspace:~", "@rocket.chat/rest-typings": "workspace:~", "@rocket.chat/tools": "workspace:~", diff --git a/yarn.lock b/yarn.lock index ef60b63ad81ee..fcd91d7e52130 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4793,13 +4793,6 @@ __metadata: languageName: node linkType: hard -"@juggle/resize-observer@npm:^3.4.0": - version: 3.4.0 - resolution: "@juggle/resize-observer@npm:3.4.0" - checksum: 10/73d1d00ee9132fb6f0aea0531940a6b93603e935590bd450fc6285a328d906102eeeb95dea77b2edac0e779031a9708aa8c82502bd298ee4dd26e7dff48f397a - languageName: node - linkType: hard - "@kaciras/deasync@npm:^1.1.0": version: 1.1.0 resolution: "@kaciras/deasync@npm:1.1.0" @@ -8327,7 +8320,7 @@ __metadata: "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/federation-sdk": "npm:0.3.0" "@rocket.chat/http-router": "workspace:^" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/media-signaling": "workspace:^" "@rocket.chat/message-parser": "workspace:^" @@ -8352,7 +8345,7 @@ __metadata: dependencies: "@rocket.chat/apps-engine": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/ui-kit": "workspace:~" "@types/express": "npm:^4.17.25" @@ -8535,7 +8528,7 @@ __metadata: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:^" - "@rocket.chat/emitter": "npm:^0.31.25" + "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/federation-sdk": "npm:0.3.0" "@rocket.chat/http-router": "workspace:^" @@ -8625,17 +8618,6 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-hooks@npm:~0.37.2": - version: 0.37.2 - resolution: "@rocket.chat/fuselage-hooks@npm:0.37.2" - peerDependencies: - "@rocket.chat/emitter": "*" - "@rocket.chat/fuselage-tokens": "*" - react: "*" - checksum: 10/8f9ecf349fc667e4f4cd282fd267402bed9d42e77b206c0966fc0a37bb20b387af4052c0ea15c71c4e4cde285443f9922239a981aab4e23924f7946736e49969 - languageName: node - linkType: hard - "@rocket.chat/fuselage-hooks@npm:~0.38.1": version: 0.38.1 resolution: "@rocket.chat/fuselage-hooks@npm:0.38.1" @@ -8647,21 +8629,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-polyfills@npm:~0.31.25": - version: 0.31.25 - resolution: "@rocket.chat/fuselage-polyfills@npm:0.31.25" - dependencies: - "@juggle/resize-observer": "npm:^3.4.0" - clipboard-polyfill: "npm:^3.0.3" - element-closest-polyfill: "npm:^1.0.6" - focus-visible: "npm:^5.2.0" - focus-within-polyfill: "npm:^5.2.1" - new-event-polyfill: "npm:^1.0.1" - checksum: 10/e7d42870155d5fbd09536debbaeaa3f788c97854a018e18523c2bfec71bebdaa9594636afe47b8b2347c2cac74a83fcc1f0815478623ad0afa85fc0015254980 - languageName: node - linkType: hard - -"@rocket.chat/fuselage-toastbar@npm:^0.35.1": +"@rocket.chat/fuselage-toastbar@npm:~0.35.1": version: 0.35.1 resolution: "@rocket.chat/fuselage-toastbar@npm:0.35.1" dependencies: @@ -8755,7 +8723,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.68.1, @rocket.chat/fuselage@npm:~0.68.1": +"@rocket.chat/fuselage@npm:~0.68.1": version: 0.68.1 resolution: "@rocket.chat/fuselage@npm:0.68.1" dependencies: @@ -8786,11 +8754,10 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/styled": "npm:~0.32.0" @@ -8895,7 +8862,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/icons@npm:^0.45.0, @rocket.chat/icons@npm:~0.45.0": +"@rocket.chat/icons@npm:~0.45.0": version: 0.45.0 resolution: "@rocket.chat/icons@npm:0.45.0" checksum: 10/9e0967eba17cbef1c482616bb94cf871dfac20e92ac5fad6164cbe60bab95882d9675bf9de2c611928da6d37806a1279d671b0a3463dda0a3148cdade9291147 @@ -8954,15 +8921,15 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/layout@npm:^0.33.1": - version: 0.33.1 - resolution: "@rocket.chat/layout@npm:0.33.1" +"@rocket.chat/layout@npm:~0.34.0": + version: 0.34.0 + resolution: "@rocket.chat/layout@npm:0.34.0" peerDependencies: "@rocket.chat/fuselage": "*" react: "*" react-dom: "*" react-i18next: "*" - checksum: 10/cc7d9289669bd045f72b11b0217ea938fa4cc7933a1b3969a2fc0fd7ac2eddc6349ac5e14a2934de4cd3819e03a13d2b3016e860b69aa28e038bc6f196383d5b + checksum: 10/a5520a7be879b687f4938d17a2c585f088011292f46cb42ffdf0c2a38ddff0cdd3bf37a9aa7176c99b6e91122511a7b2c8cc522ef02da38db1be07642153f544 languageName: node linkType: hard @@ -8998,7 +8965,7 @@ __metadata: "@rocket.chat/ddp-client": "workspace:^" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/logo": "npm:~0.32.3" @@ -9259,11 +9226,10 @@ __metadata: "@rocket.chat/federation-matrix": "workspace:^" "@rocket.chat/federation-sdk": "npm:0.3.0" "@rocket.chat/freeswitch": "workspace:^" - "@rocket.chat/fuselage": "npm:^0.68.1" + "@rocket.chat/fuselage": "npm:~0.68.1" "@rocket.chat/fuselage-forms": "npm:~0.1.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" - "@rocket.chat/fuselage-toastbar": "npm:^0.35.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" + "@rocket.chat/fuselage-toastbar": "npm:~0.35.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" "@rocket.chat/fuselage-ui-kit": "workspace:^" "@rocket.chat/gazzodown": "workspace:^" @@ -9273,7 +9239,7 @@ __metadata: "@rocket.chat/instance-status": "workspace:^" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/jwt": "workspace:^" - "@rocket.chat/layout": "npm:^0.33.1" + "@rocket.chat/layout": "npm:~0.34.0" "@rocket.chat/license": "workspace:^" "@rocket.chat/livechat": "workspace:^" "@rocket.chat/log-format": "workspace:^" @@ -9293,7 +9259,7 @@ __metadata: "@rocket.chat/omni-core": "workspace:^" "@rocket.chat/omni-core-ee": "workspace:^" "@rocket.chat/omnichannel-services": "workspace:^" - "@rocket.chat/onboarding-ui": "npm:^0.35.2" + "@rocket.chat/onboarding-ui": "npm:~0.36.0" "@rocket.chat/password-policies": "workspace:^" "@rocket.chat/patch-injection": "workspace:^" "@rocket.chat/pdf-worker": "workspace:^" @@ -9847,16 +9813,15 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/onboarding-ui@npm:^0.35.2": - version: 0.35.2 - resolution: "@rocket.chat/onboarding-ui@npm:0.35.2" +"@rocket.chat/onboarding-ui@npm:~0.36.0": + version: 0.36.0 + resolution: "@rocket.chat/onboarding-ui@npm:0.36.0" dependencies: i18next: "npm:~23.4.9" react-hook-form: "npm:~7.54.2" peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" - "@rocket.chat/fuselage-polyfills": "*" "@rocket.chat/icons": "*" "@rocket.chat/layout": "*" "@rocket.chat/logo": "*" @@ -9864,7 +9829,7 @@ __metadata: react: "*" react-dom: "*" react-i18next: "*" - checksum: 10/357146bb9d6d39fbc55279214c9801ad780461d671bea72b98056afb87cd184bc2f609a99d1e2794bb77f4babda33ba1f59af1f3d47a40d0f71f89c5d25e2cc6 + checksum: 10/5915bc45f88869106d556be599431a62a3ad37e956140368a4ff1eef7409659009aeca777a7d8bdb2cc071f27411521c5bfa7dacae6cc68f23e39a2a238f522a languageName: node linkType: hard @@ -10180,11 +10145,10 @@ __metadata: dependencies: "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:~" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/tsconfig": "workspace:*" "@storybook/addon-a11y": "npm:^8.6.14" "@storybook/addon-essentials": "npm:^8.6.14" @@ -10316,11 +10280,10 @@ __metadata: "@babel/core": "npm:~7.28.5" "@rocket.chat/core-typings": "workspace:~" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/ui-contexts": "workspace:^" "@types/react": "npm:~18.3.26" "@types/react-dom": "npm:~18.3.7" @@ -10349,11 +10312,10 @@ __metadata: "@rocket.chat/core-typings": "workspace:~" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/storybook-config": "workspace:~" @@ -10403,11 +10365,10 @@ __metadata: "@react-aria/toolbar": "npm:^3.0.0-nightly.5042" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/tsconfig": "workspace:*" "@storybook/addon-a11y": "npm:^8.6.14" @@ -10448,7 +10409,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:~" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" "@rocket.chat/i18n": "workspace:~" "@rocket.chat/jest-presets": "workspace:~" @@ -10485,7 +10446,7 @@ __metadata: "@babel/plugin-transform-runtime": "npm:~7.28.5" "@babel/preset-env": "npm:~7.28.5" "@rocket.chat/eslint-config": "workspace:~" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/tsconfig": "workspace:*" "@types/jest": "npm:~30.0.0" @@ -10509,11 +10470,10 @@ __metadata: dependencies: "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/ui-contexts": "workspace:~" "@types/react": "npm:~18.3.26" "@types/react-dom": "npm:~18.3.7" @@ -10545,11 +10505,10 @@ __metadata: "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/styled": "npm:~0.32.0" "@rocket.chat/tsconfig": "workspace:*" @@ -10604,11 +10563,10 @@ __metadata: "@rocket.chat/desktop-api": "workspace:^" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/media-signaling": "workspace:~" "@rocket.chat/mock-providers": "workspace:~" @@ -10675,13 +10633,12 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" - "@rocket.chat/fuselage-toastbar": "npm:^0.35.1" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" + "@rocket.chat/fuselage-toastbar": "npm:~0.35.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" "@rocket.chat/fuselage-ui-kit": "workspace:~" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/logo": "npm:~0.32.3" "@rocket.chat/styled": "npm:~0.32.0" "@rocket.chat/tsconfig": "workspace:*" @@ -10725,13 +10682,12 @@ __metadata: "@rocket.chat/core-typings": "workspace:~" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/fuselage": "npm:^0.68.1" - "@rocket.chat/fuselage-hooks": "npm:~0.37.2" - "@rocket.chat/fuselage-polyfills": "npm:~0.31.25" + "@rocket.chat/fuselage": "npm:~0.68.1" + "@rocket.chat/fuselage-hooks": "npm:~0.38.1" "@rocket.chat/fuselage-tokens": "npm:~0.33.2" "@rocket.chat/i18n": "workspace:~" - "@rocket.chat/icons": "npm:^0.45.0" - "@rocket.chat/layout": "npm:^0.33.1" + "@rocket.chat/icons": "npm:~0.45.0" + "@rocket.chat/layout": "npm:~0.34.0" "@rocket.chat/mock-providers": "workspace:~" "@rocket.chat/rest-typings": "workspace:~" "@rocket.chat/tools": "workspace:~" @@ -18086,13 +18042,6 @@ __metadata: languageName: node linkType: hard -"clipboard-polyfill@npm:^3.0.3": - version: 3.0.3 - resolution: "clipboard-polyfill@npm:3.0.3" - checksum: 10/852f136ef4bb2ce31683c5e1f8f08b49fc2e86145ebb0f10e7a45b59750324c4af1fba7c4e9ed0e156130399da84dbdfbdf813d8ef46332334757faca46ee0e9 - languageName: node - linkType: hard - "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -20344,13 +20293,6 @@ __metadata: languageName: node linkType: hard -"element-closest-polyfill@npm:^1.0.6": - version: 1.0.6 - resolution: "element-closest-polyfill@npm:1.0.6" - checksum: 10/f47d6fec1a2962e35b4dd63fa6cc7d3bad7abb270305345ff98ffa0a997f844589ee9e57c268a3277295dce74dcd70775e059dc1475323b4655b7e3d2f9534c3 - languageName: node - linkType: hard - "elliptic@npm:^6.5.3, elliptic@npm:^6.5.5": version: 6.6.0 resolution: "elliptic@npm:6.6.0" @@ -22345,20 +22287,6 @@ __metadata: languageName: node linkType: hard -"focus-visible@npm:^5.2.0": - version: 5.2.0 - resolution: "focus-visible@npm:5.2.0" - checksum: 10/11f686d68dbd4a0efb6714f037a4611411ffb8db4369784fcd6ba7f6cc386a42a5fa08211f6feb14ad3660719b451d0621f95058ea49963a59cf204ced38c4bc - languageName: node - linkType: hard - -"focus-within-polyfill@npm:^5.2.1": - version: 5.2.1 - resolution: "focus-within-polyfill@npm:5.2.1" - checksum: 10/fe7ce8715791b7778134e23a01ece66e52078b0a88285322b97079b345fe5ee30376680e07914721a23d1abcfd03e947931e69c561a27a50c642cbaa403a34fd - languageName: node - linkType: hard - "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.4, follow-redirects@npm:^1.15.6, follow-redirects@npm:^1.15.9": version: 1.15.9 resolution: "follow-redirects@npm:1.15.9" @@ -28588,13 +28516,6 @@ __metadata: languageName: node linkType: hard -"new-event-polyfill@npm:^1.0.1": - version: 1.0.1 - resolution: "new-event-polyfill@npm:1.0.1" - checksum: 10/4c58d2b0505132b2b75d47d82e6ce4f11839f9fa13f89c22bc9cbfe6a60e18df6046b86da5bc8699dae3077beb3a9e503e76bc56a797b76379db07b44bb6952c - languageName: node - linkType: hard - "nise@npm:^6.1.1": version: 6.1.1 resolution: "nise@npm:6.1.1" @@ -32903,7 +32824,7 @@ __metadata: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": "npm:~0.31.25" - "@rocket.chat/icons": "npm:^0.45.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" From 00318e44f9250b3dfc288935003d1530c4c1dc3e Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 10:09:12 -0300 Subject: [PATCH 004/302] chore(ui-voip): Review build configuration (#37585) --- packages/mock-providers/package.json | 1 + packages/ui-voip/.babelrc.json | 9 -- packages/ui-voip/.eslintignore | 1 - packages/ui-voip/.eslintrc.json | 67 +------- packages/ui-voip/.storybook/main.ts | 2 +- packages/ui-voip/package.json | 10 +- .../VoipPopupDraggable/DraggableCore.ts | 47 +++--- .../hooks/useDevicePermissionPrompt.spec.tsx | 2 +- packages/ui-voip/src/v2/MediaCallContext.ts | 2 +- packages/ui-voip/src/v2/MediaCallLogger.ts | 2 +- packages/ui-voip/src/v2/MediaCallProvider.tsx | 8 +- .../src/v2/MockedMediaCallProvider.tsx | 3 +- .../src/v2/components/ActionButton.tsx | 3 +- .../src/v2/components/PeerAutocomplete.tsx | 2 +- .../v2/components/PeerInfo/InternalUser.tsx | 4 +- .../src/v2/components/PeerInfo/PeerInfo.tsx | 2 +- .../src/v2/components/ToggleButton.tsx | 2 +- .../src/v2/components/Widget/Widget.tsx | 3 +- .../Widget/WidgetDraggableContext.ts | 3 +- .../src/v2/components/Widget/WidgetHandle.tsx | 2 +- .../ui-voip/src/v2/useDesktopNotifications.ts | 4 +- packages/ui-voip/src/v2/useInfoSlots.ts | 2 +- packages/ui-voip/src/v2/useKeypad.tsx | 3 +- packages/ui-voip/src/v2/useMediaCallAction.ts | 3 +- packages/ui-voip/src/v2/useMediaSession.ts | 4 +- .../ui-voip/src/v2/useMediaSessionInstance.ts | 8 +- yarn.lock | 143 +++++++++++++++++- 27 files changed, 207 insertions(+), 135 deletions(-) delete mode 100644 packages/ui-voip/.babelrc.json delete mode 100644 packages/ui-voip/.eslintignore diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index c577bce3f90da..0acf19172002c 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -11,6 +11,7 @@ "react-i18next": "~13.2.2" }, "devDependencies": { + "@faker-js/faker": "~8.0.2", "@rocket.chat/ddp-client": "workspace:~", "@rocket.chat/mongo-adapter": "workspace:~", "@rocket.chat/tools": "workspace:~", diff --git a/packages/ui-voip/.babelrc.json b/packages/ui-voip/.babelrc.json deleted file mode 100644 index f474986efbca9..0000000000000 --- a/packages/ui-voip/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - ["@babel/preset-react", { - "runtime": "automatic" - }], - "@babel/preset-typescript" - ] -} diff --git a/packages/ui-voip/.eslintignore b/packages/ui-voip/.eslintignore deleted file mode 100644 index 608841ff3853c..0000000000000 --- a/packages/ui-voip/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -!.storybook diff --git a/packages/ui-voip/.eslintrc.json b/packages/ui-voip/.eslintrc.json index 465fd738d4e4b..341a302833736 100644 --- a/packages/ui-voip/.eslintrc.json +++ b/packages/ui-voip/.eslintrc.json @@ -1,67 +1,4 @@ { - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "@rocket.chat/eslint-config/original", - "@rocket.chat/eslint-config/react", - "prettier", - "plugin:anti-trojan-source/recommended", - "plugin:react/jsx-runtime", - "plugin:storybook/recommended" - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "func-call-spacing": "off", - "import/named": "error", - "import/order": [ - "error", - { - "newlines-between": "always", - "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], - "alphabetize": { - "order": "asc" - } - } - ], - "indent": "off", - "jsx-quotes": ["error", "prefer-single"], - "new-cap": ["error"], - "no-extra-parens": "off", - "no-spaced-func": "off", - "no-undef": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "no-use-before-define": "off", - "prefer-arrow-callback": ["error", { "allowNamedFunctions": true }], - "prettier/prettier": 2 - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts", ".tsx"] - } - } - }, - "ignorePatterns": ["**/dist"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "arrow-body-style": "off", - "@typescript-eslint/ban-ts-ignore": "off", - // "@typescript-eslint/explicit-function-return-type": "warn", - "@typescript-eslint/indent": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/prefer-optional-chain": "warn" - } - } - ] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-voip/.storybook/main.ts b/packages/ui-voip/.storybook/main.ts index 85a01201572cc..293d39612b888 100644 --- a/packages/ui-voip/.storybook/main.ts +++ b/packages/ui-voip/.storybook/main.ts @@ -7,7 +7,7 @@ const config: StorybookConfig = { addons: [ getAbsolutePath('@storybook/addon-essentials'), getAbsolutePath('@storybook/addon-a11y'), - getAbsolutePath('@storybook/addon-webpack5-compiler-babel'), + getAbsolutePath('@storybook/addon-webpack5-compiler-swc'), getAbsolutePath('@storybook/addon-interactions'), ], diff --git a/packages/ui-voip/package.json b/packages/ui-voip/package.json index 95a009f5a2cc7..1eff170a61b7a 100644 --- a/packages/ui-voip/package.json +++ b/packages/ui-voip/package.json @@ -10,11 +10,11 @@ "scripts": { "build": "tsc -p tsconfig.build.json", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", - "eslint": "eslint --ext .js,.jsx,.ts,.tsx .", - "eslint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "storybook": "storybook dev -p 6006", - "test-storybook": "npx concurrently -k -s first -n \"SB,TEST\" \"yarn storybook --ci\" \"npx wait-on tcp:127.0.0.1:6006 && yarn exec test-storybook\"", "test": "jest", + "test-storybook": "npx concurrently -k -s first -n \"SB,TEST\" \"yarn storybook --ci\" \"npx wait-on tcp:127.0.0.1:6006 && yarn exec test-storybook\"", "testunit": "jest", "typecheck": "tsc --noEmit --skipLibCheck -p tsconfig.json" }, @@ -27,8 +27,6 @@ "sip.js": "^0.21.2" }, "devDependencies": { - "@babel/core": "~7.28.5", - "@faker-js/faker": "~8.0.2", "@playwright/test": "^1.52.0", "@react-spectrum/test-utils": "~1.0.0-alpha.8", "@rocket.chat/css-in-js": "~0.31.25", @@ -49,7 +47,7 @@ "@storybook/addon-docs": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-interactions": "^8.6.14", - "@storybook/addon-webpack5-compiler-babel": "^3.0.6", + "@storybook/addon-webpack5-compiler-swc": "~3.0.0", "@storybook/react": "^8.6.14", "@storybook/react-webpack5": "^8.6.14", "@storybook/test": "^8.6.14", diff --git a/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts b/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts index a28377a7ec272..93adfe5b55617 100644 --- a/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts +++ b/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts @@ -1,4 +1,5 @@ -import { Emitter, OffCallbackHandler } from '@rocket.chat/emitter'; +import type { OffCallbackHandler } from '@rocket.chat/emitter'; +import { Emitter } from '@rocket.chat/emitter'; import { useSafeRefCallback } from '@rocket.chat/ui-client'; import { useCallback, useRef, useState } from 'react'; @@ -6,12 +7,12 @@ const GRAB_DOM_EVENTS = ['pointerdown'] as const; const RELEASE_DOM_EVENTS = ['pointerup', 'pointercancel', 'lostpointercapture'] as const; const MOVE_DOM_EVENTS = ['pointermove'] as const; -interface PointCoordinates { +interface IPointCoordinates { x: number; y: number; } -interface IGenericRect extends PointCoordinates { +interface IGenericRect extends IPointCoordinates { width: number; height: number; } @@ -58,7 +59,7 @@ class GenericRect { type DraggableElementEvents = { grab: IGenericRect; - move: PointCoordinates; + move: IPointCoordinates; release: IGenericRect; changeView: IDraggableElement; resize: IGenericRect; @@ -69,9 +70,9 @@ class Draggable extends Emitter { private isDragging = false; - private pointerCoordinates: PointCoordinates = { x: 0, y: 0 }; + private pointerCoordinates: IPointCoordinates = { x: 0, y: 0 }; - private storedPositionOffset: PointCoordinates = { x: 0, y: 0 }; + private storedPositionOffset: IPointCoordinates = { x: 0, y: 0 }; constructor(element: IDraggableElement) { super(); @@ -101,7 +102,7 @@ class Draggable extends Emitter { return this.on('release', cb); } - public onMove(cb: (pointerPosition: PointCoordinates) => void): OffCallbackHandler { + public onMove(cb: (pointerPosition: IPointCoordinates) => void): OffCallbackHandler { return this.on('move', cb); } @@ -113,7 +114,7 @@ class Draggable extends Emitter { return this.on('changeView', cb); } - private setPointerCoordinates(pointerCoordinates: PointCoordinates): void { + private setPointerCoordinates(pointerCoordinates: IPointCoordinates): void { this.pointerCoordinates = pointerCoordinates; } @@ -127,18 +128,18 @@ class Draggable extends Emitter { this.element.setElementPositionOffset(this.storedPositionOffset); } - public moveToCoordinates(targetElementCoordinates: PointCoordinates, initialPosition: IGenericRect): void { + public moveToCoordinates(targetElementCoordinates: IPointCoordinates, initialPosition: IGenericRect): void { this.setStoredPositionOffset(targetElementCoordinates.x - initialPosition.x, targetElementCoordinates.y - initialPosition.y); this.emit('move', this.getStoredOffset()); } - public handleGrab(startingPointerCoordinates: PointCoordinates, elementRect: IGenericRect): void { + public handleGrab(startingPointerCoordinates: IPointCoordinates, elementRect: IGenericRect): void { this.isDragging = true; this.setPointerCoordinates(startingPointerCoordinates); this.emit('grab', elementRect); } - public handleMove(currentPointerCoordinates: PointCoordinates): void { + public handleMove(currentPointerCoordinates: IPointCoordinates): void { if (!this.isDragging) return; const xDelta = currentPointerCoordinates.x - this.pointerCoordinates.x; @@ -162,12 +163,12 @@ class Draggable extends Emitter { this.emit('release', finalElementPosition); } - public moveByOffset(offset: PointCoordinates): void { + public moveByOffset(offset: IPointCoordinates): void { this.addElementPositionOffset(offset.x, offset.y); this.emit('move', this.getStoredOffset()); } - public getStoredOffset(): PointCoordinates { + public getStoredOffset(): IPointCoordinates { return this.storedPositionOffset; } } @@ -243,7 +244,7 @@ class BoundingElement extends Emitter<{ }, this.resizeDebounce); } - private calculateBoundsOffset(_draggableRect: IGenericRect, _boundsRect: IGenericRect): PointCoordinates { + private calculateBoundsOffset(_draggableRect: IGenericRect, _boundsRect: IGenericRect): IPointCoordinates { const draggableRect = new GenericRect(_draggableRect); const boundsRect = new GenericRect(_boundsRect); // If the draggable element's top/left position is less than @@ -287,7 +288,7 @@ class BoundingElement extends Emitter<{ } class HandleElement extends Emitter<{ - grab: PointCoordinates; + grab: IPointCoordinates; }> { private draggableInstance: Draggable; @@ -308,7 +309,7 @@ class HandleElement extends Emitter<{ } } -const getPointerEventCoordinates = (e: PointerEvent): PointCoordinates => ({ +const getPointerEventCoordinates = (e: PointerEvent): IPointCoordinates => ({ x: e.clientX, y: e.clientY, }); @@ -318,10 +319,10 @@ type OnChangeView = (cb: (element: TElement) => void) => OffCallbackHa interface IDraggableElement { setElement(element: unknown): OffCallbackHandler; - setElementPositionOffset(offset: PointCoordinates): void; + setElementPositionOffset(offset: IPointCoordinates): void; getElementRect: GetElementRect; // events - onMove(cb: (pointerPosition: PointCoordinates) => void): OffCallbackHandler; + onMove(cb: (pointerPosition: IPointCoordinates) => void): OffCallbackHandler; onChangeView: OnChangeView; onRelease(cb: (rect: IGenericRect) => void): OffCallbackHandler; onResize(cb: (rect: IGenericRect) => void): OffCallbackHandler; @@ -338,7 +339,7 @@ interface IBoundingElement { interface IHandleElement { setElement(element: unknown): OffCallbackHandler; // events - onGrab(cb: (event: [mousePosition: PointCoordinates, elementRect: IGenericRect]) => void): OffCallbackHandler; + onGrab(cb: (event: [mousePosition: IPointCoordinates, elementRect: IGenericRect]) => void): OffCallbackHandler; } const isLeftClick = (event: PointerEvent) => event.button === 0; @@ -346,7 +347,7 @@ const isMousePointer = (event: PointerEvent) => event.pointerType === 'mouse'; class HandleDomElement extends Emitter<{ - grab: [PointCoordinates, IGenericRect]; + grab: [IPointCoordinates, IGenericRect]; }> implements IHandleElement { @@ -373,7 +374,7 @@ class HandleDomElement return () => unsubArray.forEach((unsub) => unsub()); } - public onGrab = (cb: (event: [mousePosition: PointCoordinates, elementRect: IGenericRect]) => void): OffCallbackHandler => { + public onGrab = (cb: (event: [mousePosition: IPointCoordinates, elementRect: IGenericRect]) => void): OffCallbackHandler => { return this.on('grab', cb); }; } @@ -497,7 +498,7 @@ class DraggableDomElement extends Emitter implements return this.on('changeView', cb); }; - public onMove = (cb: (pointerPosition: PointCoordinates) => void): OffCallbackHandler => { + public onMove = (cb: (pointerPosition: IPointCoordinates) => void): OffCallbackHandler => { return this.on('move', cb); }; @@ -513,7 +514,7 @@ class DraggableDomElement extends Emitter implements return this.element.getBoundingClientRect(); } - public setElementPositionOffset(offset: PointCoordinates): void { + public setElementPositionOffset(offset: IPointCoordinates): void { if (!this.element) { return; } diff --git a/packages/ui-voip/src/hooks/useDevicePermissionPrompt.spec.tsx b/packages/ui-voip/src/hooks/useDevicePermissionPrompt.spec.tsx index 5313f0bf42aae..f934c4a18d364 100644 --- a/packages/ui-voip/src/hooks/useDevicePermissionPrompt.spec.tsx +++ b/packages/ui-voip/src/hooks/useDevicePermissionPrompt.spec.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { ModalProvider, ModalRegion } from '@rocket.chat/ui-client'; import { renderHook, screen, waitFor, act } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ReactNode } from 'react'; +import type { ReactNode } from 'react'; import { useDevicePermissionPrompt } from './useDevicePermissionPrompt'; diff --git a/packages/ui-voip/src/v2/MediaCallContext.ts b/packages/ui-voip/src/v2/MediaCallContext.ts index b2ca6266ef429..1e8b2d216bd8e 100644 --- a/packages/ui-voip/src/v2/MediaCallContext.ts +++ b/packages/ui-voip/src/v2/MediaCallContext.ts @@ -1,4 +1,4 @@ -import { UserStatus } from '@rocket.chat/core-typings'; +import type { UserStatus } from '@rocket.chat/core-typings'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import type { Device } from '@rocket.chat/ui-contexts'; import { keepPreviousData, useQuery } from '@tanstack/react-query'; diff --git a/packages/ui-voip/src/v2/MediaCallLogger.ts b/packages/ui-voip/src/v2/MediaCallLogger.ts index e842355b11440..8f87a1f91a534 100644 --- a/packages/ui-voip/src/v2/MediaCallLogger.ts +++ b/packages/ui-voip/src/v2/MediaCallLogger.ts @@ -1,4 +1,4 @@ -import { IMediaSignalLogger } from '@rocket.chat/media-signaling'; +import type { IMediaSignalLogger } from '@rocket.chat/media-signaling'; export class MediaCallLogger implements IMediaSignalLogger { private isDebug: boolean; diff --git a/packages/ui-voip/src/v2/MediaCallProvider.tsx b/packages/ui-voip/src/v2/MediaCallProvider.tsx index e1a80109e2daa..7a0b834d482a4 100644 --- a/packages/ui-voip/src/v2/MediaCallProvider.tsx +++ b/packages/ui-voip/src/v2/MediaCallProvider.tsx @@ -1,21 +1,23 @@ import { AnchorPortal } from '@rocket.chat/ui-client'; +import type { Device } from '@rocket.chat/ui-contexts'; import { useEndpoint, useUserAvatarPath, useSetOutputMediaDevice, useSetInputMediaDevice, - Device, useUser, useSetModal, useSelectedDevices, useToastMessageDispatch, useSetting, } from '@rocket.chat/ui-contexts'; -import { ReactNode, useCallback, useEffect } from 'react'; +import type { ReactNode } from 'react'; +import { useCallback, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; -import MediaCallContext, { PeerInfo } from './MediaCallContext'; +import type { PeerInfo } from './MediaCallContext'; +import MediaCallContext from './MediaCallContext'; import MediaCallWidget from './MediaCallWidget'; import TransferModal from './TransferModal'; import { useCallSounds } from './useCallSounds'; diff --git a/packages/ui-voip/src/v2/MockedMediaCallProvider.tsx b/packages/ui-voip/src/v2/MockedMediaCallProvider.tsx index b49dc37bf74d1..f361fdb2c5a19 100644 --- a/packages/ui-voip/src/v2/MockedMediaCallProvider.tsx +++ b/packages/ui-voip/src/v2/MockedMediaCallProvider.tsx @@ -1,5 +1,6 @@ import { UserStatus } from '@rocket.chat/core-typings'; -import { ReactNode, useState } from 'react'; +import type { ReactNode } from 'react'; +import { useState } from 'react'; import MediaCallContext from './MediaCallContext'; import type { State, PeerInfo } from './MediaCallContext'; diff --git a/packages/ui-voip/src/v2/components/ActionButton.tsx b/packages/ui-voip/src/v2/components/ActionButton.tsx index b0bf5ff2eae5d..499b34f93d36d 100644 --- a/packages/ui-voip/src/v2/components/ActionButton.tsx +++ b/packages/ui-voip/src/v2/components/ActionButton.tsx @@ -1,6 +1,7 @@ import { Icon, IconButton } from '@rocket.chat/fuselage'; import type { Keys } from '@rocket.chat/icons'; -import { ComponentProps, forwardRef } from 'react'; +import type { ComponentProps } from 'react'; +import { forwardRef } from 'react'; type ActionButtonProps = { label: string; diff --git a/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx b/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx index 2b87e984810c0..b2cd745c645dd 100644 --- a/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx +++ b/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx @@ -1,4 +1,4 @@ -import { UserStatus } from '@rocket.chat/core-typings'; +import type { UserStatus } from '@rocket.chat/core-typings'; import { AutoComplete, Option, Avatar, Field, FieldRow, FieldDescription, FieldError, StatusBullet, Box } from '@rocket.chat/fuselage'; import { useId } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx b/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx index 8b878f2757d4b..049c6f3cbca70 100644 --- a/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx +++ b/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx @@ -1,7 +1,7 @@ -import { UserStatus } from '@rocket.chat/core-typings'; +import type { UserStatus } from '@rocket.chat/core-typings'; import { Avatar, Box, Icon, StatusBullet } from '@rocket.chat/fuselage'; -import { Slot } from '../../useInfoSlots'; +import type { Slot } from '../../useInfoSlots'; type InternalUserProps = { displayName: string; diff --git a/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx b/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx index 2b2195fd0a099..b95ec5ca11f8c 100644 --- a/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx +++ b/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx @@ -1,4 +1,4 @@ -import { ComponentProps } from 'react'; +import type { ComponentProps } from 'react'; import { InternalUser, PhoneNumber } from '.'; diff --git a/packages/ui-voip/src/v2/components/ToggleButton.tsx b/packages/ui-voip/src/v2/components/ToggleButton.tsx index a4cf8baeca187..86f6a72852d4a 100644 --- a/packages/ui-voip/src/v2/components/ToggleButton.tsx +++ b/packages/ui-voip/src/v2/components/ToggleButton.tsx @@ -1,6 +1,6 @@ import { Icon, IconButton } from '@rocket.chat/fuselage'; import type { Keys } from '@rocket.chat/icons'; -import { ComponentProps } from 'react'; +import type { ComponentProps } from 'react'; type ToggleButtonProps = { label: string; // label should not change due to a11y constraints diff --git a/packages/ui-voip/src/v2/components/Widget/Widget.tsx b/packages/ui-voip/src/v2/components/Widget/Widget.tsx index 5ba332a4be626..caf555916e929 100644 --- a/packages/ui-voip/src/v2/components/Widget/Widget.tsx +++ b/packages/ui-voip/src/v2/components/Widget/Widget.tsx @@ -1,6 +1,7 @@ import { Palette } from '@rocket.chat/fuselage'; import styled from '@rocket.chat/styled'; -import { ComponentProps, ReactNode, useLayoutEffect } from 'react'; +import type { ComponentProps, ReactNode } from 'react'; +import { useLayoutEffect } from 'react'; import { FocusScope } from 'react-aria'; import { DragContext } from './WidgetDraggableContext'; diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts b/packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts index 3ee07e68a9450..60b996369ae7e 100644 --- a/packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts +++ b/packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts @@ -1,4 +1,5 @@ -import { createContext, Ref, useContext } from 'react'; +import type { Ref } from 'react'; +import { createContext, useContext } from 'react'; type DragContextValue = { draggableRef: Ref; diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx b/packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx index f127ef2ac3809..059f063423df0 100644 --- a/packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx +++ b/packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx @@ -1,6 +1,6 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, Icon, Palette } from '@rocket.chat/fuselage'; -import { ComponentProps } from 'react'; +import type { ComponentProps } from 'react'; import { useDraggableWidget } from './WidgetDraggableContext'; diff --git a/packages/ui-voip/src/v2/useDesktopNotifications.ts b/packages/ui-voip/src/v2/useDesktopNotifications.ts index e88df35363566..7704312ecad01 100644 --- a/packages/ui-voip/src/v2/useDesktopNotifications.ts +++ b/packages/ui-voip/src/v2/useDesktopNotifications.ts @@ -2,8 +2,8 @@ import { useUserPreference } from '@rocket.chat/ui-contexts'; import { useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { PeerInfo } from './MediaCallContext'; -import { SessionInfo } from './useMediaSessionInstance'; +import type { PeerInfo } from './MediaCallContext'; +import type { SessionInfo } from './useMediaSessionInstance'; import { convertAvatarUrlToPng } from './utils/convertAvatarUrlToPng'; const getDisplayInfo = (peerInfo?: PeerInfo) => { diff --git a/packages/ui-voip/src/v2/useInfoSlots.ts b/packages/ui-voip/src/v2/useInfoSlots.ts index 9b675140d5f54..00ff776eb845b 100644 --- a/packages/ui-voip/src/v2/useInfoSlots.ts +++ b/packages/ui-voip/src/v2/useInfoSlots.ts @@ -2,7 +2,7 @@ import type { Keys as IconNames } from '@rocket.chat/icons'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { ConnectionState } from './MediaCallContext'; +import type { ConnectionState } from './MediaCallContext'; export type Slot = { text: string; diff --git a/packages/ui-voip/src/v2/useKeypad.tsx b/packages/ui-voip/src/v2/useKeypad.tsx index 230776edacaaf..59481e6b9f802 100644 --- a/packages/ui-voip/src/v2/useKeypad.tsx +++ b/packages/ui-voip/src/v2/useKeypad.tsx @@ -1,5 +1,6 @@ import { Divider, Box, TextInput, Field, FieldRow } from '@rocket.chat/fuselage'; -import { ReactNode, useState } from 'react'; +import type { ReactNode } from 'react'; +import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Keypad } from './components'; diff --git a/packages/ui-voip/src/v2/useMediaCallAction.ts b/packages/ui-voip/src/v2/useMediaCallAction.ts index e2782ea53756a..1d6b74cd17212 100644 --- a/packages/ui-voip/src/v2/useMediaCallAction.ts +++ b/packages/ui-voip/src/v2/useMediaCallAction.ts @@ -2,7 +2,8 @@ import type { Keys as IconNames } from '@rocket.chat/icons'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { PeerInfo, useMediaCallExternalContext } from './MediaCallContext'; +import type { PeerInfo } from './MediaCallContext'; +import { useMediaCallExternalContext } from './MediaCallContext'; export const useMediaCallAction = ( callee?: PeerInfo, diff --git a/packages/ui-voip/src/v2/useMediaSession.ts b/packages/ui-voip/src/v2/useMediaSession.ts index ab2bfe206b7ce..15e6bac72c898 100644 --- a/packages/ui-voip/src/v2/useMediaSession.ts +++ b/packages/ui-voip/src/v2/useMediaSession.ts @@ -1,5 +1,5 @@ -import { UserStatus } from '@rocket.chat/core-typings'; -import { MediaSignalingSession, CallState, CallRole } from '@rocket.chat/media-signaling'; +import type { UserStatus } from '@rocket.chat/core-typings'; +import type { MediaSignalingSession, CallState, CallRole } from '@rocket.chat/media-signaling'; import { useUserAvatarPath, useUserPresence } from '@rocket.chat/ui-contexts'; import { useEffect, useReducer, useMemo } from 'react'; diff --git a/packages/ui-voip/src/v2/useMediaSessionInstance.ts b/packages/ui-voip/src/v2/useMediaSessionInstance.ts index c9c0da0db687f..c70d550e8af35 100644 --- a/packages/ui-voip/src/v2/useMediaSessionInstance.ts +++ b/packages/ui-voip/src/v2/useMediaSessionInstance.ts @@ -8,7 +8,7 @@ import type { ConnectionState, PeerInfo, State } from './MediaCallContext'; import { MediaCallLogger } from './MediaCallLogger'; import { useIceServers } from '../hooks/useIceServers'; -interface BaseSession { +interface IBaseSession { state: State; connectionState: ConnectionState; peerInfo: PeerInfo | undefined; @@ -21,18 +21,18 @@ interface BaseSession { hidden: boolean; } -interface EmptySession extends BaseSession { +interface IEmptySession extends IBaseSession { state: Extract; callId: undefined; } -interface CallSession extends BaseSession { +interface ICallSession extends IBaseSession { state: Extract; callId: string; peerInfo: PeerInfo; } -export type SessionInfo = EmptySession | CallSession; +export type SessionInfo = IEmptySession | ICallSession; type SignalTransport = MediaSignalTransport; diff --git a/yarn.lock b/yarn.lock index fcd91d7e52130..48312dd35f1fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9587,6 +9587,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/mock-providers@workspace:packages/mock-providers" dependencies: + "@faker-js/faker": "npm:~8.0.2" "@rocket.chat/ddp-client": "workspace:~" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/i18n": "workspace:~" @@ -10555,8 +10556,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-voip@workspace:packages/ui-voip" dependencies: - "@babel/core": "npm:~7.28.5" - "@faker-js/faker": "npm:~8.0.2" "@playwright/test": "npm:^1.52.0" "@react-spectrum/test-utils": "npm:~1.0.0-alpha.8" "@rocket.chat/css-in-js": "npm:~0.31.25" @@ -10580,7 +10579,7 @@ __metadata: "@storybook/addon-docs": "npm:^8.6.14" "@storybook/addon-essentials": "npm:^8.6.14" "@storybook/addon-interactions": "npm:^8.6.14" - "@storybook/addon-webpack5-compiler-babel": "npm:^3.0.6" + "@storybook/addon-webpack5-compiler-swc": "npm:~3.0.0" "@storybook/react": "npm:^8.6.14" "@storybook/react-webpack5": "npm:^8.6.14" "@storybook/test": "npm:^8.6.14" @@ -11905,6 +11904,16 @@ __metadata: languageName: node linkType: hard +"@storybook/addon-webpack5-compiler-swc@npm:~3.0.0": + version: 3.0.0 + resolution: "@storybook/addon-webpack5-compiler-swc@npm:3.0.0" + dependencies: + "@swc/core": "npm:^1.10.8" + swc-loader: "npm:^0.2.6" + checksum: 10/c2b0c26d8bf54875297c82d2159aeb62846048dc71d8e953a6d6301d8a5aedc4eb979cc75877b24a2f7e1667a5baa7116286c1da29bff4a1510d2b6ec657392c + languageName: node + linkType: hard + "@storybook/blocks@npm:8.6.14, @storybook/blocks@npm:^8.6.14": version: 8.6.14 resolution: "@storybook/blocks@npm:8.6.14" @@ -12303,6 +12312,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-arm64@npm:1.15.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-darwin-x64@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-darwin-x64@npm:1.12.4" @@ -12317,6 +12333,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-x64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-x64@npm:1.15.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@swc/core-linux-arm-gnueabihf@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-linux-arm-gnueabihf@npm:1.12.4" @@ -12331,6 +12354,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm-gnueabihf@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@swc/core-linux-arm64-gnu@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-linux-arm64-gnu@npm:1.12.4" @@ -12345,6 +12375,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.15.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-arm64-musl@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-linux-arm64-musl@npm:1.12.4" @@ -12359,6 +12396,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.15.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@swc/core-linux-x64-gnu@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-linux-x64-gnu@npm:1.12.4" @@ -12373,6 +12417,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.15.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-x64-musl@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-linux-x64-musl@npm:1.12.4" @@ -12387,6 +12438,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-musl@npm:1.15.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@swc/core-win32-arm64-msvc@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-win32-arm64-msvc@npm:1.12.4" @@ -12401,6 +12459,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-arm64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.15.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-win32-ia32-msvc@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-win32-ia32-msvc@npm:1.12.4" @@ -12415,6 +12480,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-ia32-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.15.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@swc/core-win32-x64-msvc@npm:1.12.4": version: 1.12.4 resolution: "@swc/core-win32-x64-msvc@npm:1.12.4" @@ -12429,6 +12501,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-x64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.15.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@swc/core@npm:1.13.19": version: 1.13.19 resolution: "@swc/core@npm:1.13.19" @@ -12475,6 +12554,52 @@ __metadata: languageName: node linkType: hard +"@swc/core@npm:^1.10.8": + version: 1.15.3 + resolution: "@swc/core@npm:1.15.3" + dependencies: + "@swc/core-darwin-arm64": "npm:1.15.3" + "@swc/core-darwin-x64": "npm:1.15.3" + "@swc/core-linux-arm-gnueabihf": "npm:1.15.3" + "@swc/core-linux-arm64-gnu": "npm:1.15.3" + "@swc/core-linux-arm64-musl": "npm:1.15.3" + "@swc/core-linux-x64-gnu": "npm:1.15.3" + "@swc/core-linux-x64-musl": "npm:1.15.3" + "@swc/core-win32-arm64-msvc": "npm:1.15.3" + "@swc/core-win32-ia32-msvc": "npm:1.15.3" + "@swc/core-win32-x64-msvc": "npm:1.15.3" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.25" + peerDependencies: + "@swc/helpers": ">=0.5.17" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/280330d82328818138ed64fdcf9ea9abde6b6f16eca65a9d4db27dde06a8dfffd2649f3447d2243387277513c7430fa4142cafcfd64e943d682ce6a713cb8c2d + languageName: node + linkType: hard + "@swc/core@npm:^1.5.22": version: 1.12.4 resolution: "@swc/core@npm:1.12.4" @@ -34953,6 +35078,18 @@ __metadata: languageName: node linkType: hard +"swc-loader@npm:^0.2.6": + version: 0.2.6 + resolution: "swc-loader@npm:0.2.6" + dependencies: + "@swc/counter": "npm:^0.1.3" + peerDependencies: + "@swc/core": ^1.2.147 + webpack: ">=2" + checksum: 10/fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb + languageName: node + linkType: hard + "swiper@npm:11.1.14": version: 11.1.14 resolution: "swiper@npm:11.1.14" From d56c9a57c486f3ae582cd703aafba6c6f5f7eb90 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 10:09:37 -0300 Subject: [PATCH 005/302] chore(web-ui-registration): Review build configuration (#37584) --- packages/web-ui-registration/.babelrc.json | 9 --------- packages/web-ui-registration/.eslintrc.json | 2 +- packages/web-ui-registration/.storybook/main.ts | 3 ++- packages/web-ui-registration/.storybook/preview.tsx | 3 ++- packages/web-ui-registration/package.json | 12 ++++-------- packages/web-ui-registration/tsconfig.build.json | 3 --- packages/web-ui-registration/tsconfig.json | 3 +-- yarn.lock | 6 +----- 8 files changed, 11 insertions(+), 30 deletions(-) delete mode 100644 packages/web-ui-registration/.babelrc.json diff --git a/packages/web-ui-registration/.babelrc.json b/packages/web-ui-registration/.babelrc.json deleted file mode 100644 index f474986efbca9..0000000000000 --- a/packages/web-ui-registration/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - ["@babel/preset-react", { - "runtime": "automatic" - }], - "@babel/preset-typescript" - ] -} diff --git a/packages/web-ui-registration/.eslintrc.json b/packages/web-ui-registration/.eslintrc.json index 4c413c4080b39..341a302833736 100644 --- a/packages/web-ui-registration/.eslintrc.json +++ b/packages/web-ui-registration/.eslintrc.json @@ -1,4 +1,4 @@ { "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], - "ignorePatterns": ["**/dist"] + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/web-ui-registration/.storybook/main.ts b/packages/web-ui-registration/.storybook/main.ts index 0b3ef2e9ffa02..1eca7fa8f87cc 100644 --- a/packages/web-ui-registration/.storybook/main.ts +++ b/packages/web-ui-registration/.storybook/main.ts @@ -1,4 +1,5 @@ import { dirname, join } from 'path'; + import type { StorybookConfig } from '@storybook/react-webpack5'; export default { @@ -6,7 +7,7 @@ export default { addons: [ getAbsolutePath('@storybook/addon-essentials'), getAbsolutePath('storybook-dark-mode'), - getAbsolutePath('@storybook/addon-webpack5-compiler-babel'), + getAbsolutePath('@storybook/addon-webpack5-compiler-swc'), ], framework: { diff --git a/packages/web-ui-registration/.storybook/preview.tsx b/packages/web-ui-registration/.storybook/preview.tsx index adb8bc2eeb23b..5cd3e45119f71 100644 --- a/packages/web-ui-registration/.storybook/preview.tsx +++ b/packages/web-ui-registration/.storybook/preview.tsx @@ -1,5 +1,6 @@ -import { themes } from '@storybook/theming'; import type { Parameters } from '@storybook/react'; +import { themes } from '@storybook/theming'; + import manifest from '../package.json'; import logo from './logo.svg'; import '@rocket.chat/fuselage/dist/fuselage.css'; diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index bd8310354e06e..d2c7dc09009ad 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -16,11 +16,10 @@ "storybook": "storybook dev -p 6006 --no-version-updates", "typecheck": "tsc --noEmit" }, + "dependencies": { + "dompurify": "~3.2.7" + }, "devDependencies": { - "@babel/core": "~7.28.5", - "@babel/preset-env": "~7.28.5", - "@babel/preset-react": "~7.27.1", - "@babel/preset-typescript": "~7.27.1", "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/emitter": "~0.31.25", @@ -38,7 +37,7 @@ "@storybook/addon-actions": "^8.6.14", "@storybook/addon-docs": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", - "@storybook/addon-webpack5-compiler-babel": "^3.0.6", + "@storybook/addon-webpack5-compiler-swc": "~3.0.0", "@storybook/react": "^8.6.14", "@storybook/react-webpack5": "^8.6.14", "@storybook/theming": "^8.6.14", @@ -70,8 +69,5 @@ }, "volta": { "extends": "../../package.json" - }, - "dependencies": { - "dompurify": "~3.2.7" } } diff --git a/packages/web-ui-registration/tsconfig.build.json b/packages/web-ui-registration/tsconfig.build.json index a175aec991c88..73f50b10a9645 100644 --- a/packages/web-ui-registration/tsconfig.build.json +++ b/packages/web-ui-registration/tsconfig.build.json @@ -1,8 +1,5 @@ { "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ESNext" - }, "include": ["./src/**/*"], "exclude": ["./src/**/*.spec.ts", "./src/**/*.stories.tsx"] } diff --git a/packages/web-ui-registration/tsconfig.json b/packages/web-ui-registration/tsconfig.json index 9099a702aabf0..e1348ec0e2e74 100644 --- a/packages/web-ui-registration/tsconfig.json +++ b/packages/web-ui-registration/tsconfig.json @@ -2,8 +2,7 @@ "extends": "@rocket.chat/tsconfig/client.json", "compilerOptions": { "rootDirs": ["./src","./.storybook"], - "outDir": "./dist", - "module": "CommonJS" + "outDir": "./dist" }, "include": ["./src", "./.storybook"], } diff --git a/yarn.lock b/yarn.lock index 48312dd35f1fc..97b7c37780ac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10674,10 +10674,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/web-ui-registration@workspace:packages/web-ui-registration" dependencies: - "@babel/core": "npm:~7.28.5" - "@babel/preset-env": "npm:~7.28.5" - "@babel/preset-react": "npm:~7.27.1" - "@babel/preset-typescript": "npm:~7.27.1" "@rocket.chat/core-typings": "workspace:~" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" @@ -10695,7 +10691,7 @@ __metadata: "@storybook/addon-actions": "npm:^8.6.14" "@storybook/addon-docs": "npm:^8.6.14" "@storybook/addon-essentials": "npm:^8.6.14" - "@storybook/addon-webpack5-compiler-babel": "npm:^3.0.6" + "@storybook/addon-webpack5-compiler-swc": "npm:~3.0.0" "@storybook/react": "npm:^8.6.14" "@storybook/react-webpack5": "npm:^8.6.14" "@storybook/theming": "npm:^8.6.14" From 4ca66c442b61e9a6c48b11607132a5521941736b Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 10:10:06 -0300 Subject: [PATCH 006/302] chore: `useHasLicenseModule` return as a query result (#37552) --- .../actions/CreateChannelModal.tsx | 4 +- ...uditMenu.spec.tsx => useAuditMenu.spec.ts} | 0 .../{useAuditMenu.tsx => useAuditMenu.ts} | 2 +- apps/meteor/client/contexts/CallContext.ts | 2 +- .../quickActions/useOnHoldChatQuickAction.ts | 2 +- .../hooks/roomActions/useCallsRoomAction.ts | 2 +- .../client/hooks/useDevicesMenuOption.tsx | 2 +- .../client/hooks/useHasLicenseModule.ts | 11 ++--- apps/meteor/client/hooks/useLicense.ts | 4 +- apps/meteor/client/hooks/useVoipClient.ts | 2 +- .../client/hooks/useVoipWarningModal.tsx | 2 +- .../client/providers/MediaCallProvider.tsx | 2 +- .../client/providers/OmnichannelProvider.tsx | 2 +- .../CreateChannel/CreateChannelModal.tsx | 4 +- .../header/actions/hooks/useAuditItems.tsx | 2 +- .../PreferencesConversationTranscript.tsx | 2 +- .../DeviceManagementAdminRoute.tsx | 4 +- .../EngagementDashboardRoute.tsx | 4 +- .../permissions/EditRolePageWithData.tsx | 11 +++-- .../permissions/PermissionsContextBar.tsx | 8 +++- .../UsersUploadsCard/UsersUploadsCard.tsx | 2 +- .../tabs/AppDetails/AppDetails.tsx | 2 +- .../tabs/AppStatus/AppStatus.tsx | 2 +- .../views/marketplace/hooks/useAppMenu.tsx | 4 +- .../omnichannel/tabs/SidepanelOnHold.tsx | 2 +- .../additionalForms/BusinessHoursMultiple.tsx | 2 +- .../additionalForms/ContactManagerInput.tsx | 2 +- .../additionalForms/CurrentChatTags.tsx | 2 +- .../CustomFieldsAdditionalForm.tsx | 2 +- .../DepartmentBusinessHours.tsx | 2 +- .../additionalForms/EeNumberInput.tsx | 2 +- .../additionalForms/EeTextAreaInput.tsx | 2 +- .../additionalForms/EeTextInput.tsx | 2 +- .../additionalForms/MaxChatsPerAgent.tsx | 2 +- .../MaxChatsPerAgentDisplay.tsx | 2 +- .../additionalForms/PrioritiesSelect.tsx | 2 +- .../additionalForms/SlaPoliciesSelect.tsx | 2 +- .../appearance/AppearanceFieldLabel.tsx | 2 +- .../omnichannel/appearance/AppearanceForm.tsx | 2 +- .../components/OmnichannelVerificationTag.tsx | 2 +- .../OutboundMessageWizard.tsx | 8 ++-- .../hooks/useOutboundMessageAccess.spec.ts | 42 ++++++++++++++++--- .../hooks/useOutboundMessageAccess.ts | 4 +- .../hooks/useOutboundProvidersList.ts | 2 +- .../useOutboundMessageUpsellModal.tsx | 2 +- .../contactInfo/AdvancedContactModal.tsx | 2 +- .../ContactInfo/ReviewContactModal.tsx | 2 +- .../contactInfo/EditContactInfo.tsx | 2 +- .../ContactInfoChannels/useBlockChannel.tsx | 2 +- .../ContactInfoHistory/ContactInfoHistory.tsx | 2 +- .../ContactInfoHistoryItem.tsx | 2 +- .../departments/EditDepartment.tsx | 2 +- .../chats/ChatsFiltersContextualBar.tsx | 2 +- .../directory/hooks/useSlaInfo.tsx | 2 +- .../directory/hooks/useSlaPolicies.tsx | 2 +- .../hooks/useCannedResponsesRoomAction.ts | 2 +- .../omnichannel/modals/CloseChatModal.tsx | 2 +- .../monitors/MonitorsPageContainer.tsx | 6 +-- .../views/omnichannel/reports/ReportsPage.tsx | 2 +- .../triggers/actions/ActionForm.tsx | 2 +- .../actions/ExternalServiceActionForm.tsx | 2 +- .../views/omnichannel/units/UnitsRoute.tsx | 2 +- .../QuickActions/hooks/useQuickActions.tsx | 2 +- .../QuickActions/hooks/useQuickActions.tsx | 2 +- .../ComposerFederation/ComposerFederation.tsx | 2 +- .../views/root/hooks/useLivechatEnterprise.ts | 2 +- 66 files changed, 128 insertions(+), 90 deletions(-) rename apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/{useAuditMenu.spec.tsx => useAuditMenu.spec.ts} (100%) rename apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/{useAuditMenu.tsx => useAuditMenu.ts} (94%) diff --git a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateChannelModal.tsx b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateChannelModal.tsx index 2ccdc1321a502..e9fabaea5f6d6 100644 --- a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateChannelModal.tsx +++ b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateChannelModal.tsx @@ -51,7 +51,7 @@ type CreateChannelModalPayload = { }; const getFederationHintKey = (licenseModule: ReturnType, featureToggle: boolean): TranslationKey => { - if (licenseModule === 'loading' || !licenseModule) { + if (licenseModule.isPending || !licenseModule.data) { return 'error-this-is-a-premium-feature'; } if (!featureToggle) { @@ -75,7 +75,7 @@ const CreateChannelModal = ({ teamId = '', onClose, reload }: CreateChannelModal const channelNameRegex = useMemo(() => new RegExp(`^${namesValidation}$`), [namesValidation]); const federatedModule = useHasLicenseModule('federation'); - const canUseFederation = federatedModule !== 'loading' && federatedModule && federationEnabled; + const canUseFederation = !federatedModule.isPending && federatedModule.data && federationEnabled; const channelNameExists = useEndpoint('GET', '/v1/rooms.nameExists'); const createChannel = useEndpoint('POST', '/v1/channels.create'); diff --git a/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.spec.tsx b/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.spec.ts similarity index 100% rename from apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.spec.tsx rename to apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.spec.ts diff --git a/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.tsx b/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.ts similarity index 94% rename from apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.tsx rename to apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.ts index 744513c6316e0..8ec2f98f1edcb 100644 --- a/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.tsx +++ b/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/hooks/useAuditMenu.ts @@ -8,7 +8,7 @@ export const useAuditMenu = () => { const router = useRouter(); const { t } = useTranslation(); - const hasAuditLicense = useHasLicenseModule('auditing') === true; + const { data: hasAuditLicense = false } = useHasLicenseModule('auditing'); const hasAuditPermission = usePermission('can-audit') && hasAuditLicense; const hasAuditLogPermission = usePermission('can-audit-log') && hasAuditLicense; diff --git a/apps/meteor/client/contexts/CallContext.ts b/apps/meteor/client/contexts/CallContext.ts index d420837bbc352..b1724b0d0d7b5 100644 --- a/apps/meteor/client/contexts/CallContext.ts +++ b/apps/meteor/client/contexts/CallContext.ts @@ -78,7 +78,7 @@ const CallContextValueDefault: CallContextValue = { export const CallContext = createContext(CallContextValueDefault); -export const useIsVoipEnterprise = (): boolean => useHasLicenseModule('voip-enterprise') === true; +export const useIsVoipEnterprise = (): boolean => useHasLicenseModule('voip-enterprise').data === true; export const useIsCallEnabled = (): boolean => { const { enabled } = useContext(CallContext); diff --git a/apps/meteor/client/hooks/quickActions/useOnHoldChatQuickAction.ts b/apps/meteor/client/hooks/quickActions/useOnHoldChatQuickAction.ts index 92c7ddf4c1c3d..e8738338f9336 100644 --- a/apps/meteor/client/hooks/quickActions/useOnHoldChatQuickAction.ts +++ b/apps/meteor/client/hooks/quickActions/useOnHoldChatQuickAction.ts @@ -4,7 +4,7 @@ import { QuickActionsEnum, type QuickActionsActionConfig } from '../../views/roo import { useHasLicenseModule } from '../useHasLicenseModule'; export const useOnHoldChatQuickAction = (): QuickActionsActionConfig | undefined => { - const licensed = useHasLicenseModule('livechat-enterprise') === true; + const { data: licensed = false } = useHasLicenseModule('livechat-enterprise'); return useMemo(() => { if (!licensed) { diff --git a/apps/meteor/client/hooks/roomActions/useCallsRoomAction.ts b/apps/meteor/client/hooks/roomActions/useCallsRoomAction.ts index cbc2a594eb6ec..c5d86460b47c6 100644 --- a/apps/meteor/client/hooks/roomActions/useCallsRoomAction.ts +++ b/apps/meteor/client/hooks/roomActions/useCallsRoomAction.ts @@ -9,7 +9,7 @@ import { useHasLicenseModule } from '../useHasLicenseModule'; const VideoConfList = lazy(() => import('../../views/room/contextualBar/VideoConference/VideoConfList')); export const useCallsRoomAction = () => { - const licensed = useHasLicenseModule('videoconference-enterprise') === true; + const { data: licensed = false } = useHasLicenseModule('videoconference-enterprise'); const room = useContext(RoomContext)?.room; const federated = room ? isRoomFederated(room) : false; const { t } = useTranslation(); diff --git a/apps/meteor/client/hooks/useDevicesMenuOption.tsx b/apps/meteor/client/hooks/useDevicesMenuOption.tsx index 5af023da81dd7..ff770484ddb2f 100644 --- a/apps/meteor/client/hooks/useDevicesMenuOption.tsx +++ b/apps/meteor/client/hooks/useDevicesMenuOption.tsx @@ -13,7 +13,7 @@ type DevicesMenuOption = { }; export const useDevicesMenuOption = (): DevicesMenuOption | null => { - const isEnterprise = useHasLicenseModule('voip-enterprise'); + const { data: isEnterprise = false } = useHasLicenseModule('voip-enterprise'); const { t } = useTranslation(); const setModal = useSetModal(); diff --git a/apps/meteor/client/hooks/useHasLicenseModule.ts b/apps/meteor/client/hooks/useHasLicenseModule.ts index c28713019d4d5..4916cb3685198 100644 --- a/apps/meteor/client/hooks/useHasLicenseModule.ts +++ b/apps/meteor/client/hooks/useHasLicenseModule.ts @@ -2,10 +2,7 @@ import type { LicenseModule } from '@rocket.chat/core-typings'; import { useLicenseBase } from './useLicense'; -export const useHasLicenseModule = (licenseName: LicenseModule | undefined): 'loading' | boolean => { - return ( - useLicenseBase({ - select: (data) => !!licenseName && data.license.activeModules.includes(licenseName), - }).data ?? 'loading' - ); -}; +export const useHasLicenseModule = (licenseName: LicenseModule | undefined) => + useLicenseBase({ + select: (data) => !!licenseName && data.license.activeModules.includes(licenseName), + }); diff --git a/apps/meteor/client/hooks/useLicense.ts b/apps/meteor/client/hooks/useLicense.ts index c6f0c96a37dd2..5817eff2e0aa1 100644 --- a/apps/meteor/client/hooks/useLicense.ts +++ b/apps/meteor/client/hooks/useLicense.ts @@ -27,9 +27,11 @@ const invalidateQueryClientLicenses = (() => { export const useLicenseBase = ({ params, + enabled = true, select, }: { params?: LicenseParams; + enabled?: boolean; select: (data: LicenseDataType) => TData; }) => { const uid = useUserId(); @@ -48,7 +50,7 @@ export const useLicenseBase = ({ staleTime: Infinity, placeholderData: keepPreviousData, select, - enabled: !!uid, + enabled: enabled && !!uid, }); }; diff --git a/apps/meteor/client/hooks/useVoipClient.ts b/apps/meteor/client/hooks/useVoipClient.ts index 948fc7ce0183a..4a2eb19de47ee 100644 --- a/apps/meteor/client/hooks/useVoipClient.ts +++ b/apps/meteor/client/hooks/useVoipClient.ts @@ -36,7 +36,7 @@ export const useVoipClient = (): UseVoipClientResult => { const iceServers = useWebRtcServers(); const [result, setResult] = useSafely(useState({})); - const isEE = useHasLicenseModule('voip-enterprise'); + const { data: isEE = false } = useHasLicenseModule('voip-enterprise'); const voipEnabled = settingVoipEnabled && voipConnectorEnabled; useEffect(() => { diff --git a/apps/meteor/client/hooks/useVoipWarningModal.tsx b/apps/meteor/client/hooks/useVoipWarningModal.tsx index 4e6cedbd5977d..568475d3a5efa 100644 --- a/apps/meteor/client/hooks/useVoipWarningModal.tsx +++ b/apps/meteor/client/hooks/useVoipWarningModal.tsx @@ -8,7 +8,7 @@ import TeamsVoipConfigModal from '../views/room/contextualBar/TeamsVoipConfigMod export const useVoipWarningModal = (): (() => void) => { const setModal = useSetModal(); const isAdmin = useRole('admin'); - const hasModule = useHasLicenseModule('teams-voip') === true; + const { data: hasModule = false } = useHasLicenseModule('teams-voip'); const teamsVoipSettingsRoute = useRoute('admin-settings'); const handleClose = useEffectEvent(() => setModal(null)); diff --git a/apps/meteor/client/providers/MediaCallProvider.tsx b/apps/meteor/client/providers/MediaCallProvider.tsx index c1a461f9a0d0f..a1e8f552808a0 100644 --- a/apps/meteor/client/providers/MediaCallProvider.tsx +++ b/apps/meteor/client/providers/MediaCallProvider.tsx @@ -12,7 +12,7 @@ const MediaCallProvider = ({ children }: { children: ReactNode }) => { const canMakeInternalCall = usePermission('allow-internal-voice-calls'); const canMakeExternalCall = usePermission('allow-external-voice-calls'); - const hasModule = useHasLicenseModule('teams-voip'); + const { data: hasModule = false } = useHasLicenseModule('teams-voip'); const unauthorizedContextValue = useMemo( () => ({ diff --git a/apps/meteor/client/providers/OmnichannelProvider.tsx b/apps/meteor/client/providers/OmnichannelProvider.tsx index d96142b1c02ce..986b62d83721a 100644 --- a/apps/meteor/client/providers/OmnichannelProvider.tsx +++ b/apps/meteor/client/providers/OmnichannelProvider.tsx @@ -67,7 +67,7 @@ const OmnichannelProvider = ({ children }: OmnichannelProviderProps) => { const accessible = hasAccess && omniChannelEnabled; const iceServersSetting: any = useSetting('WebRTC_Servers'); - const isEnterprise = useHasLicenseModule('livechat-enterprise') === true; + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); const getPriorities = useEndpoint('GET', '/v1/livechat/priorities'); const subscribe = useStream('notify-logged'); diff --git a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx index f5176767fc817..9671e4e83b527 100644 --- a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx @@ -53,7 +53,7 @@ type CreateChannelModalPayload = { }; const getFederationHintKey = (licenseModule: ReturnType, featureToggle: boolean): TranslationKey => { - if (licenseModule === 'loading' || !licenseModule) { + if (licenseModule.isPending || !licenseModule.data) { return 'error-this-is-a-premium-feature'; } if (!featureToggle) { @@ -79,7 +79,7 @@ const CreateChannelModal = ({ teamId = '', mainRoom, onClose, reload }: CreateCh const channelNameRegex = useMemo(() => new RegExp(`^${namesValidation}$`), [namesValidation]); const federatedModule = useHasLicenseModule('federation'); - const canUseFederation = federatedModule !== 'loading' && federatedModule && federationEnabled; + const canUseFederation = !federatedModule.isPending && federatedModule.data && federationEnabled; const channelNameExists = useEndpoint('GET', '/v1/rooms.nameExists'); const createChannel = useEndpoint('POST', '/v1/channels.create'); diff --git a/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.tsx b/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.tsx index 5734ffc9cac8a..6796784d920c1 100644 --- a/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.tsx +++ b/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.tsx @@ -4,7 +4,7 @@ import { useTranslation, useRoute, usePermission } from '@rocket.chat/ui-context import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule'; export const useAuditItems = (): GenericMenuItemProps[] => { - const hasAuditLicense = useHasLicenseModule('auditing') === true; + const { data: hasAuditLicense = false } = useHasLicenseModule('auditing'); const hasAuditPermission = usePermission('can-audit') && hasAuditLicense; const hasAuditLogPermission = usePermission('can-audit-log') && hasAuditLicense; diff --git a/apps/meteor/client/views/account/omnichannel/PreferencesConversationTranscript.tsx b/apps/meteor/client/views/account/omnichannel/PreferencesConversationTranscript.tsx index 1d0dfceeaa0df..35b7b55cafa16 100644 --- a/apps/meteor/client/views/account/omnichannel/PreferencesConversationTranscript.tsx +++ b/apps/meteor/client/views/account/omnichannel/PreferencesConversationTranscript.tsx @@ -10,7 +10,7 @@ const PreferencesConversationTranscript = () => { const { register } = useFormContext(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const alwaysSendEmailTranscript = useSetting('Livechat_transcript_send_always'); const canSendTranscriptPDF = usePermission('request-pdf-transcript'); const canSendTranscriptEmailPermission = usePermission('send-omnichannel-chat-transcript'); diff --git a/apps/meteor/client/views/admin/deviceManagement/DeviceManagementAdminRoute.tsx b/apps/meteor/client/views/admin/deviceManagement/DeviceManagementAdminRoute.tsx index e8583f1cfab02..fd808444a4485 100644 --- a/apps/meteor/client/views/admin/deviceManagement/DeviceManagementAdminRoute.tsx +++ b/apps/meteor/client/views/admin/deviceManagement/DeviceManagementAdminRoute.tsx @@ -17,7 +17,7 @@ const DeviceManagementAdminRoute = (): ReactElement => { const setModal = useSetModal(); const isModalOpen = !!useCurrentModal(); - const hasDeviceManagement = useHasLicenseModule('device-management') as boolean; + const { data: hasDeviceManagement = false, isPending } = useHasLicenseModule('device-management'); const canViewDeviceManagement = usePermission('view-device-management'); const { shouldShowUpsell, handleManageSubscription } = useUpsellActions(hasDeviceManagement); @@ -39,7 +39,7 @@ const DeviceManagementAdminRoute = (): ReactElement => { } }, [shouldShowUpsell, router, setModal, t, handleManageSubscription]); - if (isModalOpen) { + if (isModalOpen || isPending) { return ; } diff --git a/apps/meteor/client/views/admin/engagementDashboard/EngagementDashboardRoute.tsx b/apps/meteor/client/views/admin/engagementDashboard/EngagementDashboardRoute.tsx index 9da2b9c7b04c8..a1a74535025e6 100644 --- a/apps/meteor/client/views/admin/engagementDashboard/EngagementDashboardRoute.tsx +++ b/apps/meteor/client/views/admin/engagementDashboard/EngagementDashboardRoute.tsx @@ -31,7 +31,7 @@ const EngagementDashboardRoute = (): ReactElement | null => { const tab = useRouteParameter('tab'); const eventStats = useEndpoint('POST', '/v1/statistics.telemetry'); - const hasEngagementDashboard = useHasLicenseModule('engagement-dashboard') as boolean; + const { isPending, data: hasEngagementDashboard = false } = useHasLicenseModule('engagement-dashboard'); const { shouldShowUpsell, handleManageSubscription } = useUpsellActions(hasEngagementDashboard); @@ -64,7 +64,7 @@ const EngagementDashboardRoute = (): ReactElement | null => { }); }, [shouldShowUpsell, router, tab, setModal, t, handleManageSubscription]); - if (isModalOpen) { + if (isModalOpen || isPending) { return ; } diff --git a/apps/meteor/client/views/admin/permissions/EditRolePageWithData.tsx b/apps/meteor/client/views/admin/permissions/EditRolePageWithData.tsx index 48c5282047365..fe647fe476eee 100644 --- a/apps/meteor/client/views/admin/permissions/EditRolePageWithData.tsx +++ b/apps/meteor/client/views/admin/permissions/EditRolePageWithData.tsx @@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next'; import EditRolePage from './EditRolePage'; import { useRole } from './hooks/useRole'; +import GenericError from '../../../components/GenericError'; import PageSkeleton from '../../../components/PageSkeleton'; import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; @@ -13,17 +14,21 @@ const EditRolePageWithData = ({ roleId }: { roleId?: IRole['_id'] }): ReactEleme const { t } = useTranslation(); const role = useRole(roleId); const context = useRouteParameter('context'); - const hasCustomRolesModule = useHasLicenseModule('custom-roles'); + const { isPending, isError, data: hasLicense } = useHasLicenseModule('custom-roles'); if (!role && context === 'edit') { return {t('error-invalid-role')}; } - if (hasCustomRolesModule === 'loading') { + if (isPending) { return ; } - return ; + if (isError) { + return ; + } + + return ; }; export default EditRolePageWithData; diff --git a/apps/meteor/client/views/admin/permissions/PermissionsContextBar.tsx b/apps/meteor/client/views/admin/permissions/PermissionsContextBar.tsx index f2bec4375050a..64b9e7bc92890 100644 --- a/apps/meteor/client/views/admin/permissions/PermissionsContextBar.tsx +++ b/apps/meteor/client/views/admin/permissions/PermissionsContextBar.tsx @@ -14,20 +14,24 @@ const PermissionsContextBar = (): ReactElement | null => { const context = useRouteParameter('context'); const router = useRoute('admin-permissions'); const setModal = useSetModal(); - const hasCustomRolesModule = useHasLicenseModule('custom-roles') === true; + const { isPending, data: hasCustomRolesModule = false } = useHasLicenseModule('custom-roles'); const handleCloseContextualbar = useEffectEvent(() => { router.push({}); }); useEffect(() => { + if (isPending) { + return; + } + if (context !== 'new' || hasCustomRolesModule) { return; } setModal( setModal(null)} />); handleCloseContextualbar(); - }, [context, hasCustomRolesModule, handleCloseContextualbar, setModal]); + }, [isPending, context, hasCustomRolesModule, handleCloseContextualbar, setModal]); return ( (context && ( diff --git a/apps/meteor/client/views/admin/workspace/UsersUploadsCard/UsersUploadsCard.tsx b/apps/meteor/client/views/admin/workspace/UsersUploadsCard/UsersUploadsCard.tsx index 61798ef3405c6..0137f2bd25782 100644 --- a/apps/meteor/client/views/admin/workspace/UsersUploadsCard/UsersUploadsCard.tsx +++ b/apps/meteor/client/views/admin/workspace/UsersUploadsCard/UsersUploadsCard.tsx @@ -26,7 +26,7 @@ const UsersUploadsCard = ({ statistics }: UsersUploadsCardProps): ReactElement = router.navigate('/admin/engagement'); }); - const canViewEngagement = useHasLicenseModule('engagement-dashboard'); + const { data: canViewEngagement = false } = useHasLicenseModule('engagement-dashboard'); return ( diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx index 6053429a21340..8d173ee601d9f 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx @@ -41,7 +41,7 @@ const AppDetails = ({ app }: AppDetailsProps) => { const appAddon = installed ? installedAddon : addon; - const workspaceHasAddon = useHasLicenseModule(appAddon); + const { data: workspaceHasAddon = false } = useHasLicenseModule(appAddon); const openExternalLink = useExternalLink(); diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx index cb7d32c1f919c..998a865457c0c 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx @@ -43,7 +43,7 @@ const AppStatus = ({ app, showStatus = true, isAppDetailsPage, installed, ...pro const isEnterprise = data?.isEnterprise ?? false; const appAddon = app.addon; - const workspaceHasAddon = useHasLicenseModule(appAddon); + const { data: workspaceHasAddon = false } = useHasLicenseModule(appAddon); const statuses = appMultiStatusProps(app, isAppDetailsPage, context || '', isEnterprise); diff --git a/apps/meteor/client/views/marketplace/hooks/useAppMenu.tsx b/apps/meteor/client/views/marketplace/hooks/useAppMenu.tsx index 3ac7d8781e511..ef2e693af381d 100644 --- a/apps/meteor/client/views/marketplace/hooks/useAppMenu.tsx +++ b/apps/meteor/client/views/marketplace/hooks/useAppMenu.tsx @@ -59,8 +59,8 @@ export const useAppMenu = (app: App, isAppDetailsPage: boolean) => { const { data } = useIsEnterprise(); const isEnterpriseLicense = !!data?.isEnterprise; - const workspaceHasMarketplaceAddon = useHasLicenseModule(app.addon); - const workspaceHasInstalledAddon = useHasLicenseModule(app.installedAddon); + const { data: workspaceHasMarketplaceAddon = false } = useHasLicenseModule(app.addon); + const { data: workspaceHasInstalledAddon = false } = useHasLicenseModule(app.installedAddon); const [isLoading, setLoading] = useState(false); const [requestedEndUser, setRequestedEndUser] = useState(app.requestedEndUser); diff --git a/apps/meteor/client/views/navigation/sidepanel/omnichannel/tabs/SidepanelOnHold.tsx b/apps/meteor/client/views/navigation/sidepanel/omnichannel/tabs/SidepanelOnHold.tsx index 8cbcaa450fa13..bf0ccfc56030e 100644 --- a/apps/meteor/client/views/navigation/sidepanel/omnichannel/tabs/SidepanelOnHold.tsx +++ b/apps/meteor/client/views/navigation/sidepanel/omnichannel/tabs/SidepanelOnHold.tsx @@ -14,7 +14,7 @@ const SidePanelOnHold = () => { const rooms = useSidePanelRoomsListTab('onHold'); const [unreadOnly, toggleUnreadOnly] = useUnreadOnlyToggle(); - const hasEEModule = useHasLicenseModule('livechat-enterprise'); + const { data: hasEEModule = false } = useHasLicenseModule('livechat-enterprise'); useRedirectToDefaultTab(!hasEEModule); if (!hasEEModule) { diff --git a/apps/meteor/client/views/omnichannel/additionalForms/BusinessHoursMultiple.tsx b/apps/meteor/client/views/omnichannel/additionalForms/BusinessHoursMultiple.tsx index 876e7623980e2..f378047a30617 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/BusinessHoursMultiple.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/BusinessHoursMultiple.tsx @@ -14,7 +14,7 @@ const BusinessHoursMultiple = ({ className }: { className?: ComponentProps(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const enabledField = useId(); const nameField = useId(); diff --git a/apps/meteor/client/views/omnichannel/additionalForms/ContactManagerInput.tsx b/apps/meteor/client/views/omnichannel/additionalForms/ContactManagerInput.tsx index ab4e90b42aa05..2db2bb68ddc7e 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/ContactManagerInput.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/ContactManagerInput.tsx @@ -7,7 +7,7 @@ type ContactManagerInputProps = { }; const ContactManagerInput = ({ value: userId, onChange }: ContactManagerInputProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/CurrentChatTags.tsx b/apps/meteor/client/views/omnichannel/additionalForms/CurrentChatTags.tsx index 8ae3396002247..e298f3cb3dbc4 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/CurrentChatTags.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/CurrentChatTags.tsx @@ -11,7 +11,7 @@ type CurrentChatTagsProps = Pick }; const CurrentChatTags = ({ value, handler, department, viewAll, ...props }: CurrentChatTagsProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/CustomFieldsAdditionalForm.tsx b/apps/meteor/client/views/omnichannel/additionalForms/CustomFieldsAdditionalForm.tsx index 161f2be252133..47989729e5b7c 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/CustomFieldsAdditionalForm.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/CustomFieldsAdditionalForm.tsx @@ -23,7 +23,7 @@ const CustomFieldsAdditionalForm = ({ className }: { className?: ComponentProps< watch, formState: { errors }, } = useFormContext(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const { visibility, type } = watch(); diff --git a/apps/meteor/client/views/omnichannel/additionalForms/DepartmentBusinessHours.tsx b/apps/meteor/client/views/omnichannel/additionalForms/DepartmentBusinessHours.tsx index a8d541bc1f647..91fb8311c5b35 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/DepartmentBusinessHours.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/DepartmentBusinessHours.tsx @@ -7,7 +7,7 @@ import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; export const DepartmentBusinessHours = ({ bhId }: { bhId: string | undefined }) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const getBusinessHour = useEndpoint('GET', '/v1/livechat/business-hour'); const { data } = useQuery({ queryKey: ['/v1/livechat/business-hour', bhId], diff --git a/apps/meteor/client/views/omnichannel/additionalForms/EeNumberInput.tsx b/apps/meteor/client/views/omnichannel/additionalForms/EeNumberInput.tsx index 2eb518a3fa72c..ff737ed0b11bb 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/EeNumberInput.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/EeNumberInput.tsx @@ -4,7 +4,7 @@ import type { ComponentProps } from 'react'; import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; export const EeNumberInput = ({ label, ...props }: { label: string } & ComponentProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/EeTextAreaInput.tsx b/apps/meteor/client/views/omnichannel/additionalForms/EeTextAreaInput.tsx index 23a3d401b6c3f..cabe5cc5a1574 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/EeTextAreaInput.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/EeTextAreaInput.tsx @@ -4,7 +4,7 @@ import type { ComponentProps } from 'react'; import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; export const EeTextAreaInput = ({ label, ...props }: { label: string } & ComponentProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/EeTextInput.tsx b/apps/meteor/client/views/omnichannel/additionalForms/EeTextInput.tsx index d5c746821964a..7e7a303e2ff50 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/EeTextInput.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/EeTextInput.tsx @@ -4,7 +4,7 @@ import type { ComponentProps } from 'react'; import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; export const EeTextInput = ({ label, ...props }: { label: string } & ComponentProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgent.tsx b/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgent.tsx index efac2dd2b4dca..c65c14cd8e829 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgent.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgent.tsx @@ -9,7 +9,7 @@ import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; const MaxChatsPerAgent = ({ className }: { className?: ComponentProps['className'] }) => { const { t } = useTranslation(); const { control } = useFormContext(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const maxChatsField = useId(); diff --git a/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgentDisplay.tsx b/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgentDisplay.tsx index 0ad30bed45bf8..17f6f753185ab 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgentDisplay.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/MaxChatsPerAgentDisplay.tsx @@ -5,7 +5,7 @@ import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; const MaxChatsPerAgentDisplay = ({ maxNumberSimultaneousChat = 0 }) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); if (!hasLicense) { return null; diff --git a/apps/meteor/client/views/omnichannel/additionalForms/PrioritiesSelect.tsx b/apps/meteor/client/views/omnichannel/additionalForms/PrioritiesSelect.tsx index 5ca41e5abdc03..872d58658af0a 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/PrioritiesSelect.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/PrioritiesSelect.tsx @@ -19,7 +19,7 @@ type PrioritiesSelectProps = { export const PrioritiesSelect = ({ value = '', label, options, onChange }: PrioritiesSelectProps) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const [sorting] = useState>({}); const formattedOptions = useMemo(() => { diff --git a/apps/meteor/client/views/omnichannel/additionalForms/SlaPoliciesSelect.tsx b/apps/meteor/client/views/omnichannel/additionalForms/SlaPoliciesSelect.tsx index a3b406c1ca24f..17adf7998d0e1 100644 --- a/apps/meteor/client/views/omnichannel/additionalForms/SlaPoliciesSelect.tsx +++ b/apps/meteor/client/views/omnichannel/additionalForms/SlaPoliciesSelect.tsx @@ -13,7 +13,7 @@ type SlaPoliciesSelectProps = { }; export const SlaPoliciesSelect = ({ value, label, options, onChange }: SlaPoliciesSelectProps) => { - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const optionsSelect = useMemo(() => options?.map((option) => [option._id, option.name]), [options]); const fieldId = useId(); diff --git a/apps/meteor/client/views/omnichannel/appearance/AppearanceFieldLabel.tsx b/apps/meteor/client/views/omnichannel/appearance/AppearanceFieldLabel.tsx index b56c1fb67831b..9c0c058ac47d4 100644 --- a/apps/meteor/client/views/omnichannel/appearance/AppearanceFieldLabel.tsx +++ b/apps/meteor/client/views/omnichannel/appearance/AppearanceFieldLabel.tsx @@ -11,7 +11,7 @@ type AppearanceFieldLabelProps = ComponentProps & { const AppearanceFieldLabel = ({ children, premium = false, ...props }: AppearanceFieldLabelProps) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const shouldDisableEnterprise = premium && !hasLicense; if (!shouldDisableEnterprise) { diff --git a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx index 17f5c9ab666d2..6ef72ddf91b10 100644 --- a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx +++ b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx @@ -23,7 +23,7 @@ import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; const AppearanceForm = () => { const { t } = useTranslation(); - const isEnterprise = useHasLicenseModule('livechat-enterprise'); + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); const { control, watch } = useFormContext(); const { Livechat_enable_message_character_limit } = watch(); diff --git a/apps/meteor/client/views/omnichannel/components/OmnichannelVerificationTag.tsx b/apps/meteor/client/views/omnichannel/components/OmnichannelVerificationTag.tsx index 74b4591eb31ec..e868f0198ed32 100644 --- a/apps/meteor/client/views/omnichannel/components/OmnichannelVerificationTag.tsx +++ b/apps/meteor/client/views/omnichannel/components/OmnichannelVerificationTag.tsx @@ -10,7 +10,7 @@ type OmnichannelVerificationTagProps = { const OmnichannelVerificationTag = ({ verified, onClick }: OmnichannelVerificationTagProps) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const isVerified = hasLicense && verified; return ( diff --git a/apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx b/apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx index 261f6df39a043..cbb0a76a5577b 100644 --- a/apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx +++ b/apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx @@ -43,7 +43,7 @@ const OutboundMessageWizard = ({ defaultValues = {}, onSuccess, onError }: Outbo const hasOutboundModule = useHasLicenseModule('outbound-messaging'); const hasOutboundPermission = usePermission('outbound.send-messages'); - const isLoadingModule = hasOutboundModule === 'loading' || hasOmnichannelModule === 'loading'; + const isLoadingModule = hasOutboundModule.isPending || hasOmnichannelModule.isPending; const sendOutboundMessage = useEndpointMutation('POST', '/v1/omnichannel/outbound/providers/:id/message', { keys: { id: provider?.providerId || '' }, @@ -81,13 +81,13 @@ const OutboundMessageWizard = ({ defaultValues = {}, onSuccess, onError }: Outbo return; } - if (!hasOmnichannelModule || !hasOutboundModule || !hasProviders) { + if (!hasOmnichannelModule.data || !hasOutboundModule.data || !hasProviders) { upsellModal.open(); } - }, [hasOmnichannelModule, hasOutboundModule, hasProviders, isLoadingModule, isLoadingProviders, upsellModal]); + }, [hasOmnichannelModule.data, hasOutboundModule.data, hasProviders, isLoadingModule, isLoadingProviders, upsellModal]); const handleSubmit = useEffectEvent((values: SubmitPayload) => { - if (!hasOutboundModule) { + if (!hasOutboundModule.data) { upsellModal.open(); return; } diff --git a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.spec.ts b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.spec.ts index b84d3c68acefd..683f727835af9 100644 --- a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.spec.ts +++ b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.spec.ts @@ -1,4 +1,5 @@ import { usePermission } from '@rocket.chat/ui-contexts'; +import type { UseQueryResult } from '@tanstack/react-query'; import { renderHook } from '@testing-library/react'; import { useOutboundMessageAccess } from './useOutboundMessageAccess'; @@ -21,6 +22,35 @@ const usePermissionMock = jest.mocked(usePermission); const useOmnichannelEnabledMock = jest.mocked(useOmnichannelEnabled); const useHasLicenseModuleMock = jest.mocked(useHasLicenseModule); +// TODO: do not mock the hook itself, mock only its dependencies +const createSuccessfulQueryResult = (data: boolean): UseQueryResult => ({ + data, + error: null, + isPending: false, + isError: false, + isLoading: false, + isLoadingError: false, + isRefetchError: false, + isSuccess: true, + isPlaceholderData: false, + isFetched: true, + isFetchedAfterMount: true, + isFetching: false, + isInitialLoading: false, + isPaused: false, + isRefetching: false, + isStale: false, + status: 'success', + dataUpdatedAt: Date.now(), + errorUpdatedAt: Date.now(), + failureCount: 0, + failureReason: null, + errorUpdateCount: 0, + refetch: () => Promise.resolve(createSuccessfulQueryResult(data)), + fetchStatus: 'idle', + promise: Promise.resolve(data), +}); + describe('useOutboundMessageAccess', () => { beforeEach(() => { jest.clearAllMocks(); @@ -28,7 +58,7 @@ describe('useOutboundMessageAccess', () => { it('should return false if omnichannel is not enabled', () => { useOmnichannelEnabledMock.mockReturnValue(false); - useHasLicenseModuleMock.mockReturnValue(true); + useHasLicenseModuleMock.mockReturnValue(createSuccessfulQueryResult(true)); usePermissionMock.mockReturnValue(true); const { result } = renderHook(() => useOutboundMessageAccess()); @@ -37,7 +67,7 @@ describe('useOutboundMessageAccess', () => { it('should return true if omnichannel module is missing (upsell)', () => { useOmnichannelEnabledMock.mockReturnValue(true); - useHasLicenseModuleMock.mockImplementation((module) => module !== 'livechat-enterprise'); + useHasLicenseModuleMock.mockImplementation((module) => createSuccessfulQueryResult(module !== 'livechat-enterprise')); usePermissionMock.mockReturnValue(true); const { result } = renderHook(() => useOutboundMessageAccess()); @@ -46,7 +76,7 @@ describe('useOutboundMessageAccess', () => { it('should return true if outbound module is missing (upsell)', () => { useOmnichannelEnabledMock.mockReturnValue(true); - useHasLicenseModuleMock.mockImplementation((module) => module !== 'outbound-messaging'); + useHasLicenseModuleMock.mockImplementation((module) => createSuccessfulQueryResult(module !== 'outbound-messaging')); usePermissionMock.mockReturnValue(true); const { result } = renderHook(() => useOutboundMessageAccess()); @@ -55,7 +85,7 @@ describe('useOutboundMessageAccess', () => { it('should return true if both modules are missing (upsell)', () => { useOmnichannelEnabledMock.mockReturnValue(true); - useHasLicenseModuleMock.mockReturnValue(false); + useHasLicenseModuleMock.mockReturnValue(createSuccessfulQueryResult(false)); usePermissionMock.mockReturnValue(true); const { result } = renderHook(() => useOutboundMessageAccess()); @@ -64,7 +94,7 @@ describe('useOutboundMessageAccess', () => { it('should return true if all conditions are met and user has permission', () => { useOmnichannelEnabledMock.mockReturnValue(true); - useHasLicenseModuleMock.mockReturnValue(true); + useHasLicenseModuleMock.mockReturnValue(createSuccessfulQueryResult(true)); usePermissionMock.mockReturnValue(true); const { result } = renderHook(() => useOutboundMessageAccess()); @@ -73,7 +103,7 @@ describe('useOutboundMessageAccess', () => { it('should return false if all conditions are met but user does not have permission', () => { useOmnichannelEnabledMock.mockReturnValue(true); - useHasLicenseModuleMock.mockReturnValue(true); + useHasLicenseModuleMock.mockReturnValue(createSuccessfulQueryResult(true)); usePermissionMock.mockReturnValue(false); const { result } = renderHook(() => useOutboundMessageAccess()); diff --git a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.ts b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.ts index 942a103b3df39..be08df8e674b4 100644 --- a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.ts +++ b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundMessageAccess.ts @@ -5,8 +5,8 @@ import { useOmnichannelEnabled } from '../../../hooks/useOmnichannelEnabled'; export const useOutboundMessageAccess = (): boolean => { const isOmnichannelEnabled = useOmnichannelEnabled(); - const hasOmnichannelModule = useHasLicenseModule('livechat-enterprise') === true; - const hasOutboundModule = useHasLicenseModule('outbound-messaging') === true; + const { data: hasOmnichannelModule = false } = useHasLicenseModule('livechat-enterprise'); + const { data: hasOutboundModule = false } = useHasLicenseModule('outbound-messaging'); const hasPermission = usePermission('outbound.send-messages'); if (!isOmnichannelEnabled) { diff --git a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundProvidersList.ts b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundProvidersList.ts index 4bca4cab26a9c..083cdd1b5d888 100644 --- a/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundProvidersList.ts +++ b/apps/meteor/client/views/omnichannel/components/outboundMessage/hooks/useOutboundProvidersList.ts @@ -19,7 +19,7 @@ const useOutboundProvidersList = (options?: U const getProviders = useEndpoint('GET', '/v1/omnichannel/outbound/providers'); const isOmnichannelEnabled = useOmnichannelEnterpriseEnabled(); - const hasOutboundModule = useHasLicenseModule('outbound-messaging'); + const { data: hasOutboundModule = false } = useHasLicenseModule('outbound-messaging'); const canSendOutboundMessages = usePermission('outbound.send-messages'); return useQuery({ diff --git a/apps/meteor/client/views/omnichannel/components/outboundMessage/modals/OutboundMessageUpsellModal/useOutboundMessageUpsellModal.tsx b/apps/meteor/client/views/omnichannel/components/outboundMessage/modals/OutboundMessageUpsellModal/useOutboundMessageUpsellModal.tsx index 95fd3c7aca44b..42e92bf2248e6 100644 --- a/apps/meteor/client/views/omnichannel/components/outboundMessage/modals/OutboundMessageUpsellModal/useOutboundMessageUpsellModal.tsx +++ b/apps/meteor/client/views/omnichannel/components/outboundMessage/modals/OutboundMessageUpsellModal/useOutboundMessageUpsellModal.tsx @@ -10,7 +10,7 @@ export const useOutboundMessageUpsellModal = () => { const setModal = useSetModal(); const isAdmin = useRole('admin'); const license = useLicense(); - const hasModule = useHasLicenseModule('outbound-messaging') === true; + const { data: hasModule = false } = useHasLicenseModule('outbound-messaging'); const close = useEffectEvent(() => setModal(null)); const open = useEffectEvent(() => diff --git a/apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx b/apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx index 5e10d1ed68c29..03bd0328adb7c 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx @@ -16,7 +16,7 @@ type AdvancedContactModalProps = { const AdvancedContactModal = ({ onCancel }: AdvancedContactModalProps) => { const { t } = useTranslation(); const isAdmin = useRole('admin'); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const { shouldShowUpsell, handleManageSubscription } = useUpsellActions(hasLicense); const openExternalLink = useExternalLink(); const eventStats = useEndpoint('POST', '/v1/statistics.telemetry'); diff --git a/apps/meteor/client/views/omnichannel/contactInfo/ContactInfo/ReviewContactModal.tsx b/apps/meteor/client/views/omnichannel/contactInfo/ContactInfo/ReviewContactModal.tsx index 53a0f46bc06d6..32a73bb7fbd87 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/ContactInfo/ReviewContactModal.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/ContactInfo/ReviewContactModal.tsx @@ -26,7 +26,7 @@ type HandleConflictsPayload = { const ReviewContactModal = ({ contact, onCancel }: ReviewContactModalProps) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const { control, diff --git a/apps/meteor/client/views/omnichannel/contactInfo/EditContactInfo.tsx b/apps/meteor/client/views/omnichannel/contactInfo/EditContactInfo.tsx index 87e6a5bae9187..c9ca41a50f64a 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/EditContactInfo.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/EditContactInfo.tsx @@ -72,7 +72,7 @@ const EditContactInfo = ({ contactData, onClose, onCancel }: ContactNewEditProps const { t } = useTranslation(); const setModal = useSetModal(); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const canViewCustomFields = hasAtLeastOnePermission(['view-livechat-room-customfields', 'edit-livechat-room-customfields']); const editContact = useEditContact(['current-contacts']); diff --git a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoChannels/useBlockChannel.tsx b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoChannels/useBlockChannel.tsx index a647c7782d548..90a208c4e209f 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoChannels/useBlockChannel.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoChannels/useBlockChannel.tsx @@ -12,7 +12,7 @@ export const useBlockChannel = ({ blocked, association }: { blocked: boolean; as const { t } = useTranslation(); const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const queryClient = useQueryClient(); const blockContact = useEndpoint('POST', '/v1/omnichannel/contacts.block'); diff --git a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistory.tsx b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistory.tsx index a2b47f938387f..6746da49ba9fb 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistory.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistory.tsx @@ -28,7 +28,7 @@ const ContactInfoHistory = ({ contact, setChatId }: ContactInfoHistoryProps) => const setModal = useSetModal(); const [storedType, setStoredType] = useLocalStorage('contact-history-type', 'all'); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const type = isFilterBlocked(hasLicense, storedType) ? 'all' : storedType; const { getSourceName } = useOmnichannelSource(); diff --git a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistoryItem.tsx b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistoryItem.tsx index 323ad1e837840..8d10b22005fc9 100644 --- a/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistoryItem.tsx +++ b/apps/meteor/client/views/omnichannel/contactInfo/tabs/ContactInfoHistory/ContactInfoHistoryItem.tsx @@ -30,7 +30,7 @@ const ContactInfoHistoryItem = ({ source, lastMessage, verified, onClick }: Cont const getTimeFromNow = useTimeFromNow(true); const setModal = useSetModal(); const preventPropagation = usePreventPropagation(); - const hasLicense = useHasLicenseModule('contact-id-verification') as boolean; + const { data: hasLicense = false } = useHasLicenseModule('contact-id-verification'); const { getSourceName } = useOmnichannelSource(); const customClass = css` diff --git a/apps/meteor/client/views/omnichannel/departments/EditDepartment.tsx b/apps/meteor/client/views/omnichannel/departments/EditDepartment.tsx index f95fb09ca5ef1..07ea1422c0738 100644 --- a/apps/meteor/client/views/omnichannel/departments/EditDepartment.tsx +++ b/apps/meteor/client/views/omnichannel/departments/EditDepartment.tsx @@ -60,7 +60,7 @@ function EditDepartment({ data, id, title, allowedToForwardData }: EditDepartmen const { department, agents = [] } = data || {}; - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const canManageUnits = usePermission('manage-livechat-units'); const initialValues = getFormInitialValues({ department, agents, allowedToForwardData }); diff --git a/apps/meteor/client/views/omnichannel/directory/chats/ChatsFiltersContextualBar.tsx b/apps/meteor/client/views/omnichannel/directory/chats/ChatsFiltersContextualBar.tsx index 3532dc9c965d5..fb687d07f39cd 100644 --- a/apps/meteor/client/views/omnichannel/directory/chats/ChatsFiltersContextualBar.tsx +++ b/apps/meteor/client/views/omnichannel/directory/chats/ChatsFiltersContextualBar.tsx @@ -31,7 +31,7 @@ const ChatsFiltersContextualBar = ({ onClose }: ChatsFiltersContextualBarProps) const { t } = useTranslation(); const canViewLivechatRooms = usePermission('view-livechat-rooms'); const canViewCustomFields = usePermission('view-livechat-room-customfields'); - const isEnterprise = useHasLicenseModule('livechat-enterprise'); + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); const allCustomFields = useEndpoint('GET', '/v1/livechat/custom-fields'); const { data } = useQuery({ queryKey: ['livechat/custom-fields'], queryFn: async () => allCustomFields() }); diff --git a/apps/meteor/client/views/omnichannel/directory/hooks/useSlaInfo.tsx b/apps/meteor/client/views/omnichannel/directory/hooks/useSlaInfo.tsx index 60d8c270d5dfa..5faca4f06dfc2 100644 --- a/apps/meteor/client/views/omnichannel/directory/hooks/useSlaInfo.tsx +++ b/apps/meteor/client/views/omnichannel/directory/hooks/useSlaInfo.tsx @@ -4,7 +4,7 @@ import { useQuery } from '@tanstack/react-query'; import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule'; export const useSlaInfo = (slaId: string) => { - const isEnterprise = useHasLicenseModule('livechat-enterprise') === true; + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); const getSLA = useEndpoint('GET', '/v1/livechat/sla/:slaId', { slaId }); return useQuery({ queryKey: ['/v1/livechat/sla/:slaId', slaId], diff --git a/apps/meteor/client/views/omnichannel/directory/hooks/useSlaPolicies.tsx b/apps/meteor/client/views/omnichannel/directory/hooks/useSlaPolicies.tsx index 4c05262c7a1a9..082efef23e1e0 100644 --- a/apps/meteor/client/views/omnichannel/directory/hooks/useSlaPolicies.tsx +++ b/apps/meteor/client/views/omnichannel/directory/hooks/useSlaPolicies.tsx @@ -5,7 +5,7 @@ import { millisecondsToMinutes } from 'date-fns'; import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule'; export const useSlaPolicies = () => { - const isEnterprise = useHasLicenseModule('livechat-enterprise') === true; + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); const getSlaPolicies = useEndpoint('GET', '/v1/livechat/sla'); const { data: { sla } = {}, ...props } = useQuery({ queryKey: ['/v1/livechat/sla'], diff --git a/apps/meteor/client/views/omnichannel/hooks/useCannedResponsesRoomAction.ts b/apps/meteor/client/views/omnichannel/hooks/useCannedResponsesRoomAction.ts index c2de0ef534ca1..20d6f8e353921 100644 --- a/apps/meteor/client/views/omnichannel/hooks/useCannedResponsesRoomAction.ts +++ b/apps/meteor/client/views/omnichannel/hooks/useCannedResponsesRoomAction.ts @@ -7,7 +7,7 @@ import type { RoomToolboxActionConfig } from '../../room/contexts/RoomToolboxCon const CannedResponse = lazy(() => import('../cannedResponses/contextualBar/CannedResponse/WrapCannedResponseList')); export const useCannedResponsesRoomAction = () => { - const licensed = useHasLicenseModule('canned-responses') === true; + const { data: licensed = false } = useHasLicenseModule('canned-responses'); const enabled = useSetting('Canned_Responses_Enable', false); return useMemo((): RoomToolboxActionConfig | undefined => { diff --git a/apps/meteor/client/views/omnichannel/modals/CloseChatModal.tsx b/apps/meteor/client/views/omnichannel/modals/CloseChatModal.tsx index 3c7eb4f640368..8d88307497bea 100644 --- a/apps/meteor/client/views/omnichannel/modals/CloseChatModal.tsx +++ b/apps/meteor/client/views/omnichannel/modals/CloseChatModal.tsx @@ -75,7 +75,7 @@ const CloseChatModal = ({ department, visitorEmail, onCancel, onConfirm }: Close const userTranscriptEmail = useUserPreference('omnichannelTranscriptEmail') ?? false; const userTranscriptPDF = useUserPreference('omnichannelTranscriptPDF') ?? false; - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const transcriptPDFPermission = usePermission('request-pdf-transcript'); const transcriptEmailPermission = usePermission('send-omnichannel-chat-transcript'); diff --git a/apps/meteor/client/views/omnichannel/monitors/MonitorsPageContainer.tsx b/apps/meteor/client/views/omnichannel/monitors/MonitorsPageContainer.tsx index d1a7d06a9985b..830f625fc76fd 100644 --- a/apps/meteor/client/views/omnichannel/monitors/MonitorsPageContainer.tsx +++ b/apps/meteor/client/views/omnichannel/monitors/MonitorsPageContainer.tsx @@ -4,13 +4,13 @@ import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; import NotAuthorizedPage from '../../notAuthorized/NotAuthorizedPage'; const MonitorsPageContainer = () => { - const license = useHasLicenseModule('livechat-enterprise'); + const { isPending, data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); - if (license === 'loading') { + if (isPending) { return ; } - if (!license) { + if (!hasLicense) { return ; } diff --git a/apps/meteor/client/views/omnichannel/reports/ReportsPage.tsx b/apps/meteor/client/views/omnichannel/reports/ReportsPage.tsx index c4e9650a52f4e..a05b0577d416a 100644 --- a/apps/meteor/client/views/omnichannel/reports/ReportsPage.tsx +++ b/apps/meteor/client/views/omnichannel/reports/ReportsPage.tsx @@ -13,7 +13,7 @@ const ReportsPage = () => { const { t } = useTranslation(); const hasPermission = usePermission('view-livechat-reports'); - const isEnterprise = useHasLicenseModule('livechat-enterprise'); + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); if (!hasPermission || !isEnterprise) { return ; diff --git a/apps/meteor/client/views/omnichannel/triggers/actions/ActionForm.tsx b/apps/meteor/client/views/omnichannel/triggers/actions/ActionForm.tsx index f4537e58f9eab..4894aa6625ec1 100644 --- a/apps/meteor/client/views/omnichannel/triggers/actions/ActionForm.tsx +++ b/apps/meteor/client/views/omnichannel/triggers/actions/ActionForm.tsx @@ -40,7 +40,7 @@ export const ActionForm = ({ control, trigger, index, ...props }: SendMessageFor const actionFieldName = `actions.${index}.name` as const; const actionFieldValue = useWatch({ control, name: actionFieldName }); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const actionOptions = useMemo(() => { return [ diff --git a/apps/meteor/client/views/omnichannel/triggers/actions/ExternalServiceActionForm.tsx b/apps/meteor/client/views/omnichannel/triggers/actions/ExternalServiceActionForm.tsx index 15f724fb3dbae..34e78602a4e48 100644 --- a/apps/meteor/client/views/omnichannel/triggers/actions/ExternalServiceActionForm.tsx +++ b/apps/meteor/client/views/omnichannel/triggers/actions/ExternalServiceActionForm.tsx @@ -19,7 +19,7 @@ type SendMessageActionFormType = ComponentProps & { export const ExternalServiceActionForm = ({ control, trigger, index, ...props }: SendMessageActionFormType) => { const { t } = useTranslation(); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const timeoutFieldId = useId(); const timeoutFieldName = `actions.${index}.params.serviceTimeout` as const; diff --git a/apps/meteor/client/views/omnichannel/units/UnitsRoute.tsx b/apps/meteor/client/views/omnichannel/units/UnitsRoute.tsx index f121242039499..b6d52f4d55739 100644 --- a/apps/meteor/client/views/omnichannel/units/UnitsRoute.tsx +++ b/apps/meteor/client/views/omnichannel/units/UnitsRoute.tsx @@ -6,7 +6,7 @@ import NotAuthorizedPage from '../../notAuthorized/NotAuthorizedPage'; const UnitsRoute = () => { const canViewUnits = usePermission('manage-livechat-units'); - const isEnterprise = useHasLicenseModule('livechat-enterprise'); + const { data: isEnterprise = false } = useHasLicenseModule('livechat-enterprise'); if (!(isEnterprise && canViewUnits)) { return ; diff --git a/apps/meteor/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx b/apps/meteor/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx index 67bba30d71b4f..e3c734874253e 100644 --- a/apps/meteor/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx +++ b/apps/meteor/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx @@ -310,7 +310,7 @@ export const useQuickActions = (): { const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined; const canForwardGuest = usePermission('transfer-livechat-guest'); const canSendTranscriptEmail = usePermission('send-omnichannel-chat-transcript'); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const canSendTranscriptPDF = usePermission('request-pdf-transcript'); const canCloseRoom = usePermission('close-livechat-room'); const canCloseOthersRoom = usePermission('close-others-livechat-room'); diff --git a/apps/meteor/client/views/room/HeaderV2/Omnichannel/QuickActions/hooks/useQuickActions.tsx b/apps/meteor/client/views/room/HeaderV2/Omnichannel/QuickActions/hooks/useQuickActions.tsx index 9bb3a477543f6..f315b31ce3868 100644 --- a/apps/meteor/client/views/room/HeaderV2/Omnichannel/QuickActions/hooks/useQuickActions.tsx +++ b/apps/meteor/client/views/room/HeaderV2/Omnichannel/QuickActions/hooks/useQuickActions.tsx @@ -308,7 +308,7 @@ export const useQuickActions = (): { const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined; const canForwardGuest = usePermission('transfer-livechat-guest'); const canSendTranscriptEmail = usePermission('send-omnichannel-chat-transcript'); - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const canSendTranscriptPDF = usePermission('request-pdf-transcript'); const canCloseRoom = usePermission('close-livechat-room'); const canCloseOthersRoom = usePermission('close-others-livechat-room'); diff --git a/apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederation.tsx b/apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederation.tsx index ec75bdd4fa79b..4c13198f9d82a 100644 --- a/apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederation.tsx +++ b/apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederation.tsx @@ -9,7 +9,7 @@ import { useIsFederationEnabled } from '../../../../hooks/useIsFederationEnabled const ComposerFederation = ({ subscription, children, ...props }: ComposerMessageProps): ReactElement => { const federationEnabled = useIsFederationEnabled(); - const federationModuleEnabled = useHasLicenseModule('federation') === true; + const { data: federationModuleEnabled = false } = useHasLicenseModule('federation'); if (!federationEnabled) { return ; diff --git a/apps/meteor/client/views/root/hooks/useLivechatEnterprise.ts b/apps/meteor/client/views/root/hooks/useLivechatEnterprise.ts index 0e3763232d837..13ec6f603c449 100644 --- a/apps/meteor/client/views/root/hooks/useLivechatEnterprise.ts +++ b/apps/meteor/client/views/root/hooks/useLivechatEnterprise.ts @@ -14,7 +14,7 @@ const businessHours: Record = { export const useLivechatEnterprise = () => { const businessHourType = useSetting('Livechat_business_hour_type') as string; - const hasLicense = useHasLicenseModule('livechat-enterprise'); + const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); useEffect(() => { if (businessHourType && hasLicense) { From 1d80ce57411ea9f441161682822d89afd3f8e735 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 24 Nov 2025 15:56:21 +0100 Subject: [PATCH 007/302] chore: add verbose flag to yarn build command in meteor build action (#37590) --- apps/meteor/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index a792f9cbeac37..9c31a4964465a 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -15,7 +15,7 @@ ], "scripts": { "start": "meteor", - "build:ci": "METEOR_DISABLE_OPTIMISTIC_CACHING=1 meteor build --server-only --directory /tmp/dist", + "build:ci": "METEOR_DISABLE_OPTIMISTIC_CACHING=1 meteor build --verbose --server-only --directory /tmp/dist", "dev": "NODE_OPTIONS=\"--trace-warnings\" meteor --exclude-archs \"web.browser.legacy, web.cordova\"", "dsv": "meteor npm run dev", "ha": "meteor npm run ha:start", From 4102f12cc88e2188ff9ef2f4cc1bc34ae066ce95 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 24 Nov 2025 11:57:34 -0300 Subject: [PATCH 008/302] chore(ci): improve cache logic for multi arch builds (#37575) --- .github/actions/meteor-build/action.yml | 14 +++++++------- .github/actions/setup-node/action.yml | 4 ++-- .github/actions/setup-playwright/action.yml | 2 +- .github/workflows/ci.yml | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml index 934e51bc2ffc4..13fe7da5b302a 100644 --- a/.github/actions/meteor-build/action.yml +++ b/.github/actions/meteor-build/action.yml @@ -34,7 +34,7 @@ runs: id: cache-build with: path: /tmp/Rocket.Chat.tar.gz - key: ${{ runner.os }}-${{ runner.arch }}-${{ inputs.type }}-rc-build-${{ inputs.source-hash }} + key: ${{ runner.arch }}-${{ runner.os }}-${{ inputs.type }}-rc-build-${{ inputs.source-hash }} - name: Set Swap Space uses: pierotofy/set-swap-space@master @@ -73,27 +73,27 @@ runs: if: steps.cache-build.outputs.cache-hit != 'true' with: path: ./node_modules/.vite - key: vite-local-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package.json') }} + key: vite-local-cache-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('package.json') }} restore-keys: | - vite-local-cache-${{ runner.os }}-${{ runner.arch }}- + vite-local-cache-${{ runner.arch }}-${{ runner.os }}- - name: Cache meteor local uses: actions/cache@v3 if: steps.cache-build.outputs.cache-hit != 'true' with: path: ./apps/meteor/.meteor/local - key: meteor-local-cache-${{ runner.os }}-${{ runner.arch }}-${{ inputs.type }}-${{ hashFiles('apps/meteor/.meteor/versions') }} + key: meteor-local-cache-${{ runner.arch }}-${{ runner.os }}-${{ inputs.type }}-${{ hashFiles('apps/meteor/.meteor/versions') }} restore-keys: | - meteor-local-cache-${{ runner.os }}-${{ runner.arch }}-${{ inputs.type }}- + meteor-local-cache-${{ runner.arch }}-${{ runner.os }}-${{ inputs.type }}- - name: Cache meteor uses: actions/cache@v3 if: steps.cache-build.outputs.cache-hit != 'true' with: path: ~/.meteor - key: meteor-cache-${{ runner.os }}-${{ runner.arch }}-${{ inputs.type }}-${{ hashFiles('apps/meteor/.meteor/release') }} + key: meteor-cache-${{ runner.arch }}-${{ runner.os }}-${{ inputs.type }}-${{ hashFiles('apps/meteor/.meteor/release') }} restore-keys: | - meteor-cache-${{ runner.os }}-${{ runner.arch }}-${{ inputs.type }}- + meteor-cache-${{ runner.arch }}-${{ runner.os }}-${{ inputs.type }}- - name: Install Meteor shell: bash diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index 6865b342b2dc9..2bee636a47835 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -51,8 +51,8 @@ runs: apps/meteor/ee/server/services/node_modules packages/apps-engine/node_modules packages/apps-engine/.deno-cache - key: node-modules-${{ inputs.type }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package.json') }}-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }}-v3 - # key: node-modules-${{ inputs.type }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package.json') }}-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }}-v${{ github.run_id }} + key: node-modules-${{ inputs.type }}-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('package.json') }}-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }}-v3 + # key: node-modules-${{ inputs.type }}-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('package.json') }}-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }}-v${{ github.run_id }} # # Could use this command to list all paths to save: # find . -name 'node_modules' -prune | grep -v "/\.meteor/" | grep -v "/meteor/packages/" diff --git a/.github/actions/setup-playwright/action.yml b/.github/actions/setup-playwright/action.yml index 4231e139bddb1..1d71e06e2c473 100644 --- a/.github/actions/setup-playwright/action.yml +++ b/.github/actions/setup-playwright/action.yml @@ -11,7 +11,7 @@ runs: path: | ~/.cache/ms-playwright # This is the version of Playwright that we are using, if you are willing to upgrade, you should update this. - key: playwright-${{ runner.os }}-${{ runner.arch }}-1.52.0 + key: playwright-${{ runner.arch }}-${{ runner.os }}-1.52.0 - name: Install Playwright shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3e81ea150324..633220d653cab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -172,7 +172,7 @@ jobs: with: path: | /tmp/RocketChat-packages-build.tar.gz - key: ${{ runner.OS }}-packages-build-${{ needs.release-versions.outputs.source-hash }} + key: ${{ runner.arch }}-${{ runner.os }}-packages-build-${{ needs.release-versions.outputs.source-hash }} - name: Debug cache-hit run: echo "cache-hit=${{ steps.packages-cache-build.outputs.cache-hit }}" @@ -202,9 +202,9 @@ jobs: if: steps.packages-cache-build.outputs.cache-hit != 'true' with: path: ./node_modules/.vite - key: vite-local-cache-${{ runner.OS }}-${{ hashFiles('package.json') }} + key: vite-local-cache-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('package.json') }} restore-keys: | - vite-local-cache-${{ runner.os }}- + vite-local-cache-${{ runner.arch }}-${{ runner.os }}- - uses: rharkor/caching-for-turbo@v1.8 if: steps.packages-cache-build.outputs.cache-hit != 'true' From a629eb94803b02668aa70f527ee986c4baaddb67 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 12:05:58 -0300 Subject: [PATCH 009/302] chore(ui-video-conf): Review build configuration (#37586) --- packages/ui-video-conf/.babelrc.json | 9 --- packages/ui-video-conf/.eslintignore | 1 - packages/ui-video-conf/.eslintrc.json | 66 +------------------ packages/ui-video-conf/.storybook/main.ts | 2 +- packages/ui-video-conf/package.json | 3 +- .../VideoConfPopup/VideoConfPopupSkeleton.tsx | 2 +- yarn.lock | 3 +- 7 files changed, 6 insertions(+), 80 deletions(-) delete mode 100644 packages/ui-video-conf/.babelrc.json delete mode 100644 packages/ui-video-conf/.eslintignore diff --git a/packages/ui-video-conf/.babelrc.json b/packages/ui-video-conf/.babelrc.json deleted file mode 100644 index f474986efbca9..0000000000000 --- a/packages/ui-video-conf/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - ["@babel/preset-react", { - "runtime": "automatic" - }], - "@babel/preset-typescript" - ] -} diff --git a/packages/ui-video-conf/.eslintignore b/packages/ui-video-conf/.eslintignore deleted file mode 100644 index 608841ff3853c..0000000000000 --- a/packages/ui-video-conf/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -!.storybook diff --git a/packages/ui-video-conf/.eslintrc.json b/packages/ui-video-conf/.eslintrc.json index b05b092e98ade..341a302833736 100644 --- a/packages/ui-video-conf/.eslintrc.json +++ b/packages/ui-video-conf/.eslintrc.json @@ -1,66 +1,4 @@ { - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "@rocket.chat/eslint-config/original", - "@rocket.chat/eslint-config/react", - "prettier", - "plugin:anti-trojan-source/recommended", - "plugin:react/jsx-runtime", - "plugin:storybook/recommended" - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "func-call-spacing": "off", - "import/named": "error", - "import/order": [ - "error", - { - "newlines-between": "always", - "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], - "alphabetize": { - "order": "asc" - } - } - ], - "indent": "off", - "jsx-quotes": ["error", "prefer-single"], - "new-cap": ["error"], - "no-extra-parens": "off", - "no-spaced-func": "off", - "no-undef": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "no-use-before-define": "off", - "prefer-arrow-callback": ["error", { "allowNamedFunctions": true }], - "prettier/prettier": 2 - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts", ".tsx"] - } - } - }, - "ignorePatterns": ["**/dist"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/prefer-optional-chain": "warn" - } - } - ] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-video-conf/.storybook/main.ts b/packages/ui-video-conf/.storybook/main.ts index 0dcbc8e6afeeb..c23cca0484942 100644 --- a/packages/ui-video-conf/.storybook/main.ts +++ b/packages/ui-video-conf/.storybook/main.ts @@ -7,7 +7,7 @@ const config: StorybookConfig = { addons: [ getAbsolutePath('@storybook/addon-essentials'), getAbsolutePath('@storybook/addon-a11y'), - getAbsolutePath('@storybook/addon-webpack5-compiler-babel'), + getAbsolutePath('@storybook/addon-webpack5-compiler-swc'), getAbsolutePath('@storybook/addon-styling-webpack'), ], diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index fdbdf4b172328..67fd3b4c2a4b6 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -21,7 +21,6 @@ "@rocket.chat/emitter": "~0.31.25" }, "devDependencies": { - "@babel/core": "~7.28.5", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/fuselage": "~0.68.1", @@ -38,7 +37,7 @@ "@storybook/addon-docs": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-styling-webpack": "^1.0.1", - "@storybook/addon-webpack5-compiler-babel": "^3.0.6", + "@storybook/addon-webpack5-compiler-swc": "~3.0.0", "@storybook/react": "^8.6.14", "@storybook/react-webpack5": "^8.6.14", "@types/jest": "~30.0.0", diff --git a/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopupSkeleton.tsx b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopupSkeleton.tsx index 14c57b9728eb2..b8b867c9b7a7a 100644 --- a/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopupSkeleton.tsx +++ b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopupSkeleton.tsx @@ -1,5 +1,5 @@ import { Box, Skeleton } from '@rocket.chat/fuselage'; -import { ComponentProps } from 'react'; +import type { ComponentProps } from 'react'; import VideoConfPopup from './VideoConfPopup'; import VideoConfPopupContent from './VideoConfPopupContent'; diff --git a/yarn.lock b/yarn.lock index 97b7c37780ac2..4ff7b6b30c4ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10502,7 +10502,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-video-conf@workspace:packages/ui-video-conf" dependencies: - "@babel/core": "npm:~7.28.5" "@rocket.chat/css-in-js": "npm:~0.31.25" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" @@ -10520,7 +10519,7 @@ __metadata: "@storybook/addon-docs": "npm:^8.6.14" "@storybook/addon-essentials": "npm:^8.6.14" "@storybook/addon-styling-webpack": "npm:^1.0.1" - "@storybook/addon-webpack5-compiler-babel": "npm:^3.0.6" + "@storybook/addon-webpack5-compiler-swc": "npm:~3.0.0" "@storybook/react": "npm:^8.6.14" "@storybook/react-webpack5": "npm:^8.6.14" "@types/jest": "npm:~30.0.0" From 1d71678e37bfe0a2918fb741d3f993865908e406 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 24 Nov 2025 13:14:52 -0300 Subject: [PATCH 010/302] chore(meteor): enhance build command with debug flag and improve error logging in version compiler --- apps/meteor/package.json | 2 +- .../packages/rocketchat-version/plugin/compile-version.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 9c31a4964465a..58b26caee9c2d 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -15,7 +15,7 @@ ], "scripts": { "start": "meteor", - "build:ci": "METEOR_DISABLE_OPTIMISTIC_CACHING=1 meteor build --verbose --server-only --directory /tmp/dist", + "build:ci": "METEOR_DEBUG_BUILD=1 METEOR_DISABLE_OPTIMISTIC_CACHING=1 meteor build --verbose --server-only --directory /tmp/dist", "dev": "NODE_OPTIONS=\"--trace-warnings\" meteor --exclude-archs \"web.browser.legacy, web.cordova\"", "dsv": "meteor npm run dev", "ha": "meteor npm run ha:start", diff --git a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js index 8750c68512021..0a352020129d3 100644 --- a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js +++ b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js @@ -19,7 +19,7 @@ class VersionCompiler { const url = `https://releases.rocket.chat/v2/server/supportedVersions?includeDraftType=${type}&includeDraftTag=${currentVersion}`; function handleError(err) { - console.error(err); + console.error('Error getting supported versions', err); // TODO remove this when we are ready to fail if (process.env.NODE_ENV !== 'development') { reject(err); From 967de6ae2d79c390dc69f70e69eaafc2885e899d Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 24 Nov 2025 13:45:48 -0300 Subject: [PATCH 011/302] chore(version-compiler): add debug logging for version retrieval and file processing --- .../packages/rocketchat-version/plugin/compile-version.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js index 0a352020129d3..c0c261b6ca5e5 100644 --- a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js +++ b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js @@ -28,6 +28,8 @@ class VersionCompiler { resolve({}); } + console.log('Getting supported versions from', url); + https .get(url, function (response) { let data = ''; @@ -130,6 +132,7 @@ class VersionCompiler { }; for await (const file of files) { + console.log('Processing file', file.getDisplayPath()); switch (true) { case file.getDisplayPath().endsWith('rocketchat.info'): { await processFile(file); @@ -150,6 +153,7 @@ class VersionCompiler { throw new Error(`Unexpected file ${file.getDisplayPath()}`); } } + console.log('Processed file', file.getDisplayPath()); } } } From 6f8dc11e17b06e76ae7b27c527ba57b07186ac46 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 14:07:45 -0300 Subject: [PATCH 012/302] chore(ui-kit): Review build configuration (#37589) --- packages/ui-kit/.eslintignore | 2 - packages/ui-kit/.eslintrc.json | 6 +-- packages/ui-kit/.gitignore | 1 - packages/ui-kit/.prettierignore | 2 - packages/ui-kit/package.json | 45 +++++++++---------- ...{tsconfig.esm.json => tsconfig.build.json} | 2 +- packages/ui-kit/tsconfig.cjs.json | 11 ----- packages/ui-kit/tsconfig.json | 12 ++--- yarn.lock | 20 --------- 9 files changed, 26 insertions(+), 75 deletions(-) delete mode 100644 packages/ui-kit/.eslintignore delete mode 100644 packages/ui-kit/.gitignore delete mode 100644 packages/ui-kit/.prettierignore rename packages/ui-kit/{tsconfig.esm.json => tsconfig.build.json} (85%) delete mode 100644 packages/ui-kit/tsconfig.cjs.json diff --git a/packages/ui-kit/.eslintignore b/packages/ui-kit/.eslintignore deleted file mode 100644 index 8225baa4a77d8..0000000000000 --- a/packages/ui-kit/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/dist diff --git a/packages/ui-kit/.eslintrc.json b/packages/ui-kit/.eslintrc.json index 3b9bb45f4fd83..0ae720da7f0f4 100644 --- a/packages/ui-kit/.eslintrc.json +++ b/packages/ui-kit/.eslintrc.json @@ -1,6 +1,4 @@ { - "extends": "@rocket.chat/eslint-config", - "env": { - "jest": true - } + "extends": "@rocket.chat/eslint-config", + "ignorePatterns": ["dist"] } diff --git a/packages/ui-kit/.gitignore b/packages/ui-kit/.gitignore deleted file mode 100644 index b232802821e5c..0000000000000 --- a/packages/ui-kit/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/dist/* diff --git a/packages/ui-kit/.prettierignore b/packages/ui-kit/.prettierignore deleted file mode 100644 index 8225baa4a77d8..0000000000000 --- a/packages/ui-kit/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/dist diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 6f37135ff1fc8..059c6c1635057 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -3,42 +3,37 @@ "version": "0.37.0", "description": "Interactive UI elements for Rocket.Chat Apps", "homepage": "https://rocket.chat", - "author": { - "name": "Rocket.Chat", - "url": "https://rocket.chat/" + "bugs": { + "url": "https://github.com/RocketChat/Rocket.Chat/issues" }, - "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/RocketChat/Rocket.Chat.git" }, - "bugs": { - "url": "https://github.com/RocketChat/Rocket.Chat/issues" + "license": "MIT", + "author": { + "name": "Rocket.Chat", + "url": "https://rocket.chat/" }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/esm/index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "files": [ "/dist" ], - "publishConfig": { - "access": "public" - }, "scripts": { - "build": "run-s .:build:prepare .:build:clean .:build:esm .:build:cjs", - ".:build:prepare": "ts-patch install && typia patch", ".:build:clean": "rimraf dist", - ".:build:esm": "tsc -p tsconfig.esm.json", - ".:build:cjs": "tsc -p tsconfig.cjs.json", - "typecheck": "tsc --noEmit", + ".:build:prepare": "ts-patch install && typia patch", + ".:build:tsc": "tsc -p tsconfig.build.json", + "build": "run-s .:build:prepare .:build:clean .:build:tsc", "lint": "eslint . --ext .ts,.tsx", - "test": "jest" + "test": "jest", + "testunit": "jest", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "typia": "~9.7.2" }, "devDependencies": { - "@babel/core": "~7.28.5", - "@babel/eslint-parser": "~7.28.5", - "@babel/plugin-transform-runtime": "~7.28.5", - "@babel/preset-env": "~7.28.5", "@rocket.chat/eslint-config": "workspace:~", "@rocket.chat/icons": "~0.45.0", "@rocket.chat/jest-presets": "workspace:~", @@ -53,13 +48,13 @@ "ts-patch": "^3.3.0", "typescript": "~5.9.3" }, - "dependencies": { - "typia": "~9.7.2" - }, "peerDependencies": { "@rocket.chat/icons": "*" }, "volta": { "extends": "../../package.json" + }, + "publishConfig": { + "access": "public" } } diff --git a/packages/ui-kit/tsconfig.esm.json b/packages/ui-kit/tsconfig.build.json similarity index 85% rename from packages/ui-kit/tsconfig.esm.json rename to packages/ui-kit/tsconfig.build.json index a001f31970425..18f468d9eec0f 100644 --- a/packages/ui-kit/tsconfig.esm.json +++ b/packages/ui-kit/tsconfig.build.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "rootDir": "./src", - "outDir": "./dist/esm" + "outDir": "./dist" }, "include": ["./src/**/*"], "exclude": ["./src/**/*.spec.ts"] diff --git a/packages/ui-kit/tsconfig.cjs.json b/packages/ui-kit/tsconfig.cjs.json deleted file mode 100644 index 2784364aac387..0000000000000 --- a/packages/ui-kit/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist/cjs/", - "module": "CommonJS", - "plugins": [{ "transform": "typia/lib/transform" }] - }, - "include": ["./src/**/*"], - "exclude": ["./src/**/*.spec.ts"], -} diff --git a/packages/ui-kit/tsconfig.json b/packages/ui-kit/tsconfig.json index c342d0d521ac8..089d189604cdb 100644 --- a/packages/ui-kit/tsconfig.json +++ b/packages/ui-kit/tsconfig.json @@ -1,18 +1,12 @@ { "extends": "@rocket.chat/tsconfig/base.json", "compilerOptions": { - "target": "ES5", - "module": "ES2020", - "lib": ["ES2020"], + "target": "es2024", + "module": "esnext", + "lib": ["ES2024"], "declaration": true, "declarationMap": true, "sourceMap": true, - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node", - "resolveJsonModule": true, "plugins": [{ "transform": "typia/lib/transform" }] }, "include": ["./src/**/*.ts"], diff --git a/yarn.lock b/yarn.lock index 4ff7b6b30c4ba..558aba26b3d60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1917,22 +1917,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:~7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-runtime@npm:7.28.5" - dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - babel-plugin-polyfill-corejs2: "npm:^0.4.14" - babel-plugin-polyfill-corejs3: "npm:^0.13.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.5" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0d16c90d40dd34f1a981e742ad656ceef619b92d3662ec9ac8d7c8ba79f22bb425c3f9e097333659a4938f03868a53077b1a3aadb7f37504157a0c7af64ec2be - languageName: node - linkType: hard - "@babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" @@ -10442,10 +10426,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-kit@workspace:packages/ui-kit" dependencies: - "@babel/core": "npm:~7.28.5" - "@babel/eslint-parser": "npm:~7.28.5" - "@babel/plugin-transform-runtime": "npm:~7.28.5" - "@babel/preset-env": "npm:~7.28.5" "@rocket.chat/eslint-config": "workspace:~" "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/jest-presets": "workspace:~" From 20cbb8204dcbc609df583c6fc5beead74f1cf30a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:39:53 -0300 Subject: [PATCH 013/302] chore(deps): bump actions/checkout from 5 to 6 (#37566) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Guilherme Gazzo --- .github/workflows/ci-code-check.yml | 2 +- .github/workflows/ci-deploy-gh-pages.yml | 2 +- .github/workflows/ci-test-e2e.yml | 2 +- .github/workflows/ci-test-storybook.yml | 2 +- .github/workflows/ci-test-unit.yml | 2 +- .github/workflows/ci.yml | 24 +++++++++---------- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/new-release.yml | 2 +- .github/workflows/pr-update-description.yml | 2 +- .github/workflows/publish-release.yml | 2 +- .github/workflows/release-candidate.yml | 2 +- .../workflows/update-version-durability.yml | 2 +- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci-code-check.yml b/.github/workflows/ci-code-check.yml index c6368e5574db3..646f60609b95d 100644 --- a/.github/workflows/ci-code-check.yml +++ b/.github/workflows/ci-code-check.yml @@ -30,7 +30,7 @@ jobs: with: swap-size-gb: 4 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci-deploy-gh-pages.yml b/.github/workflows/ci-deploy-gh-pages.yml index 2494a819c1197..b8d92d6413158 100644 --- a/.github/workflows/ci-deploy-gh-pages.yml +++ b/.github/workflows/ci-deploy-gh-pages.yml @@ -11,7 +11,7 @@ jobs: deploy-preview: runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: rharkor/caching-for-turbo@v1.8 - name: Setup NodeJS diff --git a/.github/workflows/ci-test-e2e.yml b/.github/workflows/ci-test-e2e.yml index 828a50aaa4040..2cd22e83bf43b 100644 --- a/.github/workflows/ci-test-e2e.yml +++ b/.github/workflows/ci-test-e2e.yml @@ -115,7 +115,7 @@ jobs: username: ${{ secrets.CR_USER }} password: ${{ secrets.CR_PAT }} - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci-test-storybook.yml b/.github/workflows/ci-test-storybook.yml index 6729088ba107e..e265b1f4e6667 100644 --- a/.github/workflows/ci-test-storybook.yml +++ b/.github/workflows/ci-test-storybook.yml @@ -24,7 +24,7 @@ jobs: name: Test Storybook steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci-test-unit.yml b/.github/workflows/ci-test-unit.yml index 6f1d0096e0be6..86ac8b422b93a 100644 --- a/.github/workflows/ci-test-unit.yml +++ b/.github/workflows/ci-test-unit.yml @@ -34,7 +34,7 @@ jobs: theme: dark job_summary: true comment_on_pr: false - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 633220d653cab..2727da790aaca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: echo "github.event_name: ${{ github.event_name }}" cat $GITHUB_EVENT_PATH - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 # with: # sparse-checkout: | # package.json @@ -124,7 +124,7 @@ jobs: runs-on: ubuntu-24.04-arm needs: [release-versions] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: sparse-checkout: | package.json @@ -183,7 +183,7 @@ jobs: with: swap-size-gb: 4 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 if: steps.packages-cache-build.outputs.cache-hit != 'true' - name: Setup NodeJS @@ -257,7 +257,7 @@ jobs: job_summary: true comment_on_pr: false - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/meteor-build with: @@ -298,7 +298,7 @@ jobs: type: coverage steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Restore packages build uses: actions/download-artifact@v6 @@ -378,7 +378,7 @@ jobs: LOWERCASE_REPOSITORY: ${{ needs.release-versions.outputs.lowercase-repo }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 if: github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') with: sparse-checkout: | @@ -448,7 +448,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Track Docker image sizes uses: ./.github/actions/docker-image-size-tracker @@ -614,7 +614,7 @@ jobs: runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup NodeJS uses: ./.github/actions/setup-node @@ -662,7 +662,7 @@ jobs: needs: [release-versions, test-api-ee, test-ui-ee, test-ui-ee-watcher] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Use Node.js uses: actions/setup-node@v6.0.0 @@ -757,7 +757,7 @@ jobs: needs: [build-gh-docker-publish, release-versions] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: sparse-checkout: | package.json @@ -814,7 +814,7 @@ jobs: LOWERCASE_REPOSITORY: ${{ needs.release-versions.outputs.lowercase-repo }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: sparse-checkout: | docker-compose-ci.yml @@ -927,7 +927,7 @@ jobs: - docker-image-publish - release-versions steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: sparse-checkout: | package.json diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6ab011a49e0d8..3fdfebd584f75 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. diff --git a/.github/workflows/new-release.yml b/.github/workflows/new-release.yml index 9df9526ff1aa6..49266b3dd5042 100644 --- a/.github/workflows/new-release.yml +++ b/.github/workflows/new-release.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.base-ref }} fetch-depth: 0 diff --git a/.github/workflows/pr-update-description.yml b/.github/workflows/pr-update-description.yml index fdb7c40f93963..eb1ecbf6b9497 100644 --- a/.github/workflows/pr-update-description.yml +++ b/.github/workflows/pr-update-description.yml @@ -13,7 +13,7 @@ jobs: if: startsWith(github.head_ref, 'release-') steps: - name: Checkout Repo - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.CI_PAT }} diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 4dbc8d10d32fd..0465375a1727e 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout Repo - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.CI_PAT }} diff --git a/.github/workflows/release-candidate.yml b/.github/workflows/release-candidate.yml index 6c1b556809a39..504c7dfaca42c 100644 --- a/.github/workflows/release-candidate.yml +++ b/.github/workflows/release-candidate.yml @@ -6,7 +6,7 @@ jobs: new-release: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.ref_name }} fetch-depth: 0 diff --git a/.github/workflows/update-version-durability.yml b/.github/workflows/update-version-durability.yml index 5eb69ad3effbb..fc2e650a596f0 100644 --- a/.github/workflows/update-version-durability.yml +++ b/.github/workflows/update-version-durability.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Use Node.js uses: actions/setup-node@v6.0.0 From 333cdd3778ae1f31d7b5c3bb3c7a98e0733fedd4 Mon Sep 17 00:00:00 2001 From: Matheus Cardoso Date: Mon, 24 Nov 2025 16:43:20 -0300 Subject: [PATCH 014/302] ci: handle expected failures in jira reporter (#37595) --- apps/meteor/reporters/jira.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/meteor/reporters/jira.ts b/apps/meteor/reporters/jira.ts index c9fee4748fe5d..f429d1347970c 100644 --- a/apps/meteor/reporters/jira.ts +++ b/apps/meteor/reporters/jira.ts @@ -55,6 +55,10 @@ class JIRAReporter implements Reporter { return; } + if (test.expectedStatus === 'failed') { + return; + } + const payload = { name: test.title, status: result.status, From c77a05b34d9fc147d2c135906332a3497a15ea82 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 24 Nov 2025 17:30:17 -0300 Subject: [PATCH 015/302] chore(ui-composer): Review build configuration (#37599) --- packages/ui-composer/.babelrc.json | 9 --- packages/ui-composer/.eslintignore | 1 - packages/ui-composer/.eslintrc.json | 66 +------------------ packages/ui-composer/.storybook/main.ts | 2 +- packages/ui-composer/.storybook/preview.tsx | 2 +- .../ui-composer/.storybook/webpackAddon.ts | 3 - packages/ui-composer/package.json | 3 +- .../MessageComposerInputExpandable.tsx | 3 +- .../MessageFooterCalloutAction.tsx | 3 +- yarn.lock | 3 +- 10 files changed, 9 insertions(+), 86 deletions(-) delete mode 100644 packages/ui-composer/.babelrc.json delete mode 100644 packages/ui-composer/.eslintignore delete mode 100644 packages/ui-composer/.storybook/webpackAddon.ts diff --git a/packages/ui-composer/.babelrc.json b/packages/ui-composer/.babelrc.json deleted file mode 100644 index f474986efbca9..0000000000000 --- a/packages/ui-composer/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - ["@babel/preset-react", { - "runtime": "automatic" - }], - "@babel/preset-typescript" - ] -} diff --git a/packages/ui-composer/.eslintignore b/packages/ui-composer/.eslintignore deleted file mode 100644 index 608841ff3853c..0000000000000 --- a/packages/ui-composer/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -!.storybook diff --git a/packages/ui-composer/.eslintrc.json b/packages/ui-composer/.eslintrc.json index be0a37f02eb25..341a302833736 100644 --- a/packages/ui-composer/.eslintrc.json +++ b/packages/ui-composer/.eslintrc.json @@ -1,66 +1,4 @@ { - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "@rocket.chat/eslint-config/original", - "@rocket.chat/eslint-config/react", - "prettier", - "plugin:anti-trojan-source/recommended", - "plugin:react/jsx-runtime", - "plugin:storybook/recommended" - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "func-call-spacing": "off", - "import/named": "error", - "import/order": [ - "error", - { - "newlines-between": "always", - "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], - "alphabetize": { - "order": "asc" - } - } - ], - "indent": "off", - "jsx-quotes": ["error", "prefer-single"], - "new-cap": ["error"], - "no-extra-parens": "off", - "no-spaced-func": "off", - "no-undef": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "no-use-before-define": "off", - "prefer-arrow-callback": ["error", { "allowNamedFunctions": true }], - "prettier/prettier": 2 - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts", ".tsx"] - } - } - }, - "ignorePatterns": ["**/dist"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/prefer-optional-chain": "warn" - } - } - ] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-composer/.storybook/main.ts b/packages/ui-composer/.storybook/main.ts index 561cd8e5766c5..2f6a7e963dc2f 100644 --- a/packages/ui-composer/.storybook/main.ts +++ b/packages/ui-composer/.storybook/main.ts @@ -7,7 +7,7 @@ const config: StorybookConfig = { addons: [ getAbsolutePath('@storybook/addon-a11y'), getAbsolutePath('@storybook/addon-essentials'), - './webpackAddon', + getAbsolutePath('@storybook/addon-webpack5-compiler-swc'), getAbsolutePath('@storybook/addon-styling-webpack'), ], diff --git a/packages/ui-composer/.storybook/preview.tsx b/packages/ui-composer/.storybook/preview.tsx index 7b379177e448a..3a2059e5bf012 100644 --- a/packages/ui-composer/.storybook/preview.tsx +++ b/packages/ui-composer/.storybook/preview.tsx @@ -1,4 +1,4 @@ -import { Decorator, Parameters } from '@storybook/react'; +import type { Decorator, Parameters } from '@storybook/react'; import '../../../apps/meteor/app/theme/client/main.css'; import 'highlight.js/styles/github.css'; diff --git a/packages/ui-composer/.storybook/webpackAddon.ts b/packages/ui-composer/.storybook/webpackAddon.ts deleted file mode 100644 index 62a0c76db58fc..0000000000000 --- a/packages/ui-composer/.storybook/webpackAddon.ts +++ /dev/null @@ -1,3 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -export * from '@storybook/addon-webpack5-compiler-babel/preset'; diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index 9608675abb952..1e498b2c3e2f8 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -20,7 +20,6 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@babel/core": "~7.28.5", "@react-aria/toolbar": "^3.0.0-nightly.5042", "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", @@ -35,7 +34,7 @@ "@storybook/addon-docs": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-styling-webpack": "^1.0.1", - "@storybook/addon-webpack5-compiler-babel": "^3.0.6", + "@storybook/addon-webpack5-compiler-swc": "~3.0.0", "@storybook/react": "^8.6.14", "@storybook/react-webpack5": "^8.6.14", "@types/jest": "~30.0.0", diff --git a/packages/ui-composer/src/MessageComposer/MessageComposerInputExpandable.tsx b/packages/ui-composer/src/MessageComposer/MessageComposerInputExpandable.tsx index 86ed216e699b3..f457f2d639936 100644 --- a/packages/ui-composer/src/MessageComposer/MessageComposerInputExpandable.tsx +++ b/packages/ui-composer/src/MessageComposer/MessageComposerInputExpandable.tsx @@ -1,6 +1,7 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, IconButton } from '@rocket.chat/fuselage'; -import { useState, type ComponentProps, ChangeEvent, forwardRef } from 'react'; +import { useState, forwardRef } from 'react'; +import type { ChangeEvent, ComponentProps } from 'react'; import { useTranslation } from 'react-i18next'; import MessageComposerInput from './MessageComposerInput'; diff --git a/packages/ui-composer/src/MessageFooterCallout/MessageFooterCalloutAction.tsx b/packages/ui-composer/src/MessageFooterCallout/MessageFooterCalloutAction.tsx index 6dbd29627a6c2..93695db9b4b40 100644 --- a/packages/ui-composer/src/MessageFooterCallout/MessageFooterCalloutAction.tsx +++ b/packages/ui-composer/src/MessageFooterCallout/MessageFooterCalloutAction.tsx @@ -2,8 +2,7 @@ import { Button } from '@rocket.chat/fuselage'; import type { ComponentProps } from 'react'; import { forwardRef } from 'react'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface MessageFooterCalloutActionProps extends ComponentProps {} +type MessageFooterCalloutActionProps = ComponentProps; const MessageFooterCalloutAction = forwardRef( function MessageFooterCalloutAction(props, ref) { diff --git a/yarn.lock b/yarn.lock index 558aba26b3d60..3c18f4b862003 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10346,7 +10346,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-composer@workspace:packages/ui-composer" dependencies: - "@babel/core": "npm:~7.28.5" "@react-aria/toolbar": "npm:^3.0.0-nightly.5042" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/eslint-config": "workspace:^" @@ -10361,7 +10360,7 @@ __metadata: "@storybook/addon-docs": "npm:^8.6.14" "@storybook/addon-essentials": "npm:^8.6.14" "@storybook/addon-styling-webpack": "npm:^1.0.1" - "@storybook/addon-webpack5-compiler-babel": "npm:^3.0.6" + "@storybook/addon-webpack5-compiler-swc": "npm:~3.0.0" "@storybook/react": "npm:^8.6.14" "@storybook/react-webpack5": "npm:^8.6.14" "@types/jest": "npm:~30.0.0" From 95741a63c74eb40b010dc778b9582c762fbbfcc5 Mon Sep 17 00:00:00 2001 From: Harmeet Kour <87123067+Harmeet221@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:04:30 +0530 Subject: [PATCH 016/302] test: Add automation tests for internal voice call flow (#37374) --- .../e2e/page-objects/fragments/voice-calls.ts | 102 ++++++++++++ .../tests/e2e/page-objects/home-channel.ts | 4 + apps/meteor/tests/e2e/voice-calls-ee.spec.ts | 155 ++++++++++++++++++ 3 files changed, 261 insertions(+) create mode 100644 apps/meteor/tests/e2e/page-objects/fragments/voice-calls.ts create mode 100644 apps/meteor/tests/e2e/voice-calls-ee.spec.ts diff --git a/apps/meteor/tests/e2e/page-objects/fragments/voice-calls.ts b/apps/meteor/tests/e2e/page-objects/fragments/voice-calls.ts new file mode 100644 index 0000000000000..695f92c97e51e --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/fragments/voice-calls.ts @@ -0,0 +1,102 @@ +import type { Locator, Page } from '@playwright/test'; + +import { expect } from '../../utils/test'; + +export class VoiceCalls { + private readonly page: Page; + + constructor(page: Page) { + this.page = page; + } + + async initiateCall(): Promise { + await expect(this.callWidget).toBeVisible(); + await this.btnCall.click(); + await expect(this.btnCancel).toBeVisible(); + } + + async acceptCall(): Promise { + await expect(this.btnAcceptCall).toBeVisible(); + await this.btnAcceptCall.click(); + await expect(this.btnOpenDialpad).toBeVisible(); + } + + async rejectCall(): Promise { + await expect(this.btnRejectCall).toBeVisible(); + await this.btnRejectCall.click(); + } + + get callWidget(): Locator { + return this.page.getByRole('article', { name: 'New call' }); + } + + get btnCall(): Locator { + return this.page.getByRole('button', { name: 'Call', exact: true }); + } + + get callControlGroup(): Locator { + return this.page.getByRole('group'); + } + + btnEndCall(name: string): Locator { + return this.callControlGroup.getByRole('button', { name: `End call with ${name}` }); + } + + get btnCancel(): Locator { + return this.page.getByRole('button', { name: 'Cancel', exact: true }); + } + + get btnAcceptCall(): Locator { + return this.page.getByRole('button', { name: 'Accept', exact: true }); + } + + get btnRejectCall(): Locator { + return this.page.getByRole('button', { name: 'Reject', exact: true }); + } + + get btnOpenDialpad(): Locator { + return this.page.getByRole('button', { name: /Dialpad/i }); + } + + get btnMute(): Locator { + return this.page.getByRole('button', { name: /Mute/i }); + } + + get btnHold(): Locator { + return this.page.getByRole('button', { name: /Hold|Resume/i }); + } + + get btnTransfer(): Locator { + return this.page.getByRole('button', { name: 'Forward', exact: true }); + } + + get transferModal(): Locator { + return this.page.getByRole('dialog', { name: 'Transfer call' }); + } + + get inputUsername(): Locator { + return this.transferModal.getByRole('textbox', { name: 'Enter username or number' }); + } + + get btnHangupAndTransfer(): Locator { + return this.transferModal.getByRole('button', { name: 'Hang up and transfer call', exact: true }); + } + + get callTransferWidget(): Locator { + return this.page.getByRole('heading', { name: 'Transferring call...' }); + } + + get incommingCallTransferWidget(): Locator { + return this.page.getByRole('heading', { name: 'Incoming call transfer...' }); + } + + async transferCall(username: string): Promise { + await this.btnTransfer.click(); + await expect(this.transferModal).toBeVisible(); + await this.inputUsername.click(); + await this.inputUsername.fill(username); + await this.page.getByRole('option', { name: username }).getByRole('figure').click(); + await expect(this.transferModal).toContainText(username); + await this.btnHangupAndTransfer.click(); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts index 405990120eaaf..cd08bb9f49704 100644 --- a/apps/meteor/tests/e2e/page-objects/home-channel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts @@ -2,6 +2,7 @@ import type { Locator, Page } from '@playwright/test'; import { HomeContent, HomeSidenav, HomeFlextab, Navbar, Sidepanel, RoomSidebar, ToastMessages } from './fragments'; import { RoomToolbar } from './fragments/toolbar'; +import { VoiceCalls } from './fragments/voice-calls'; export class HomeChannel { public readonly page: Page; @@ -20,6 +21,8 @@ export class HomeChannel { readonly roomToolbar: RoomToolbar; + readonly voiceCalls: VoiceCalls; + readonly toastMessage: ToastMessages; constructor(page: Page) { @@ -31,6 +34,7 @@ export class HomeChannel { this.navbar = new Navbar(page); this.tabs = new HomeFlextab(page); this.roomToolbar = new RoomToolbar(page); + this.voiceCalls = new VoiceCalls(page); this.toastMessage = new ToastMessages(page); } diff --git a/apps/meteor/tests/e2e/voice-calls-ee.spec.ts b/apps/meteor/tests/e2e/voice-calls-ee.spec.ts new file mode 100644 index 0000000000000..5a95b0dbf519f --- /dev/null +++ b/apps/meteor/tests/e2e/voice-calls-ee.spec.ts @@ -0,0 +1,155 @@ +import type { Page } from '@playwright/test'; + +import { IS_EE } from './config/constants'; +import { createAuxContext } from './fixtures/createAuxContext'; +import { Users } from './fixtures/userStates'; +import { HomeChannel } from './page-objects'; +import { expect, test } from './utils/test'; + +test.describe('Internal Voice Calls - Enterprise Edition', () => { + test.skip(!IS_EE, 'Enterprise Edition Only'); + let sessions: { page: Page; poHomeChannel: HomeChannel }[]; + + test.beforeAll(async ({ api }) => { + await Promise.all([ + api.post('/users.setStatus', { status: 'online', username: 'user1' }), + api.post('/users.setStatus', { status: 'online', username: 'user2' }), + ]); + }); + + test.beforeAll(async ({ browser }) => { + sessions = await Promise.all([ + createAuxContext(browser, Users.user1).then(({ page }) => ({ page, poHomeChannel: new HomeChannel(page) })), + createAuxContext(browser, Users.user2).then(({ page }) => ({ page, poHomeChannel: new HomeChannel(page) })), + ]); + }); + + test('should initiate voice call from direct message', async () => { + const [user1, user2] = sessions; + + await test.step('should open direct message with user2', async () => { + await user1.poHomeChannel.sidenav.openChat('user2'); + await expect(user1.poHomeChannel.content.inputMessage).toBeVisible(); + }); + + await test.step('initiate a voice call from room toolbar', async () => { + await user1.poHomeChannel.content.btnVoiceCall.click(); + await expect(user1.poHomeChannel.voiceCalls.callWidget).toBeVisible(); + await user1.poHomeChannel.voiceCalls.initiateCall(); + }); + + await test.step('user2 accepts the call', async () => { + await user2.poHomeChannel.voiceCalls.acceptCall(); + }); + + await test.step('user2 ends the call', async () => { + await user2.poHomeChannel.voiceCalls.btnEndCall('user1').click(); + await expect(user2.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + await expect(user1.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + }); + }); + + test('should handle call controls during active call', async () => { + const [user1, user2] = sessions; + await test.step('establish call connection', async () => { + await user1.poHomeChannel.sidenav.openChat('user2'); + await expect(user1.poHomeChannel.content.inputMessage).toBeVisible(); + await user1.poHomeChannel.content.btnVoiceCall.click(); + await user1.poHomeChannel.voiceCalls.initiateCall(); + await user2.poHomeChannel.voiceCalls.acceptCall(); + }); + + await test.step('should mute/unmute microphone from user1', async () => { + // User1 mutes microphone + await user1.poHomeChannel.voiceCalls.btnMute.click(); + await expect(user1.poHomeChannel.voiceCalls.btnMute).toHaveAttribute('title', 'Unmute'); + + // User1 unmutes microphone + await user1.poHomeChannel.voiceCalls.btnMute.click(); + await expect(user1.poHomeChannel.voiceCalls.btnMute).toHaveAttribute('title', 'Mute'); + }); + + await test.step('should put call on hold from user1', async () => { + // User1 puts call on hold + await user1.poHomeChannel.voiceCalls.btnHold.click(); + await expect(user1.poHomeChannel.voiceCalls.btnHold).toHaveAttribute('title', 'Resume'); + + // User1 resumes call + await user1.poHomeChannel.voiceCalls.btnHold.click(); + await expect(user1.poHomeChannel.voiceCalls.btnHold).toHaveAttribute('title', 'Hold'); + }); + + await test.step('should access dialpad during call', async () => { + // User1 opens dial pad + await user1.poHomeChannel.voiceCalls.btnOpenDialpad.click(); + await expect(user1.poHomeChannel.voiceCalls.btnOpenDialpad).toHaveAttribute('title', 'Close dialpad'); + + // User1 closes dial pad + await user1.poHomeChannel.voiceCalls.btnOpenDialpad.click(); + await expect(user1.poHomeChannel.voiceCalls.btnOpenDialpad).toHaveAttribute('title', 'Open dialpad'); + }); + + await test.step('should end the call from user1', async () => { + await user1.poHomeChannel.voiceCalls.btnEndCall('user2').click(); + await expect(user1.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + await expect(user2.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + }); + }); + + test('should transfer call to another user', async ({ browser, api }) => { + const [user1, user2] = sessions; + + // Create user3 session only for this test + await api.post('/users.setStatus', { status: 'online', username: 'user3' }); + + const user3Context = await createAuxContext(browser, Users.user3); + const user3 = { page: user3Context.page, poHomeChannel: new HomeChannel(user3Context.page) }; + + await test.step('establish call between user1 and user2', async () => { + await user1.poHomeChannel.sidenav.openChat('user2'); + await expect(user1.poHomeChannel.content.inputMessage).toBeVisible(); + await user1.poHomeChannel.content.btnVoiceCall.click(); + await user1.poHomeChannel.voiceCalls.initiateCall(); + await user2.poHomeChannel.voiceCalls.acceptCall(); + }); + + await test.step('user1 transfers call to user3', async () => { + await user1.poHomeChannel.voiceCalls.transferCall('user3'); + await user1.poHomeChannel.toastMessage.waitForDisplay({ type: 'success' }); + await expect(user1.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + await expect(user2.poHomeChannel.voiceCalls.callTransferWidget).toBeVisible(); + }); + + await test.step('user3 receives transferred call', async () => { + await expect(user3.poHomeChannel.voiceCalls.incommingCallTransferWidget).toBeVisible(); + await user3.poHomeChannel.voiceCalls.acceptCall(); + }); + + await test.step('user3 ends the call', async () => { + await user3.poHomeChannel.voiceCalls.btnEndCall('user2').click(); + await expect(user3.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + await expect(user2.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + }); + await user3.page.close(); + }); + + test('should decline incoming voice call', async () => { + const [user1, user2] = sessions; + + await test.step('user1 initiates call to user2', async () => { + await user1.poHomeChannel.sidenav.openChat('user2'); + await expect(user1.poHomeChannel.content.inputMessage).toBeVisible(); + await user1.poHomeChannel.content.btnVoiceCall.click(); + await user1.poHomeChannel.voiceCalls.initiateCall(); + }); + + await test.step('user2 declines the call', async () => { + await user2.poHomeChannel.voiceCalls.btnRejectCall.click(); + }); + + await test.step('Verify call widget disappears', async () => { + await expect(user1.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + await expect(user2.poHomeChannel.voiceCalls.callWidget).not.toBeVisible(); + }); + }); +}); From 06a099e5228f56bd977cfb7d2fa6b91ca928a220 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 25 Nov 2025 11:20:48 -0300 Subject: [PATCH 017/302] chore: Apply `eslint-plugin-storybook` consistently across packages (#37602) --- apps/meteor/.eslintrc.json | 2 +- apps/meteor/package.json | 1 + ee/packages/pdf-worker/.eslintrc.json | 2 +- ee/packages/pdf-worker/package.json | 1 + packages/fuselage-ui-kit/package.json | 1 + packages/gazzodown/package.json | 2 +- packages/livechat/.eslintrc.json | 2 +- packages/livechat/package.json | 1 + packages/ui-composer/.eslintrc.json | 2 +- packages/ui-composer/package.json | 2 +- packages/ui-video-conf/.eslintrc.json | 2 +- packages/ui-voip/.eslintrc.json | 2 +- packages/ui-voip/package.json | 2 +- packages/web-ui-registration/.eslintrc.json | 2 +- packages/web-ui-registration/package.json | 1 + yarn.lock | 13 +++++++++---- 16 files changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/meteor/.eslintrc.json b/apps/meteor/.eslintrc.json index 41b02ad3a4520..013a5e0f6b171 100644 --- a/apps/meteor/.eslintrc.json +++ b/apps/meteor/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:you-dont-need-lodash-underscore/compatible"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:you-dont-need-lodash-underscore/compatible", "plugin:storybook/recommended"], "globals": { "__meteor_bootstrap__": false, "__meteor_runtime_config__": false, diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 58b26caee9c2d..ec68da9bebcfe 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -179,6 +179,7 @@ "eslint-plugin-prettier": "~5.2.6", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "~5.0.0", + "eslint-plugin-storybook": "~0.11.6", "eslint-plugin-testing-library": "~6.4.0", "eslint-plugin-you-dont-need-lodash-underscore": "~6.14.0", "fast-glob": "^3.3.3", diff --git a/ee/packages/pdf-worker/.eslintrc.json b/ee/packages/pdf-worker/.eslintrc.json index 98b4582994d2a..588c5c1dd335e 100644 --- a/ee/packages/pdf-worker/.eslintrc.json +++ b/ee/packages/pdf-worker/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], "parser": "@typescript-eslint/parser", "ignorePatterns": ["**/dist"] } diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index e1138e9469322..b76ff7535338c 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -43,6 +43,7 @@ "@types/react-dom": "~18.3.7", "buffer": "~6.0.3", "eslint": "~8.45.0", + "eslint-plugin-storybook": "~0.11.6", "i18next": "~23.4.9", "jest": "~30.2.0", "react-dom": "~18.3.1", diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index d5265654495d1..575868af7e0fa 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -81,6 +81,7 @@ "babel-loader": "~10.0.0", "cross-env": "^7.0.3", "eslint": "~8.45.0", + "eslint-plugin-storybook": "~0.11.6", "i18next": "^23.10.1", "jest": "~30.2.0", "normalize.css": "^8.0.1", diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index e14cbde444c44..f6b27bc42f12d 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -65,7 +65,7 @@ "eslint-plugin-anti-trojan-source": "~1.1.2", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "~5.0.0", - "eslint-plugin-storybook": "^0.11.6", + "eslint-plugin-storybook": "~0.11.6", "i18next": "~23.4.9", "identity-obj-proxy": "^3.0.0", "jest": "~30.2.0", diff --git a/packages/livechat/.eslintrc.json b/packages/livechat/.eslintrc.json index 32c219de3bd02..f7f540d58e6ba 100644 --- a/packages/livechat/.eslintrc.json +++ b/packages/livechat/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["@rocket.chat/eslint-config", "prettier"], + "extends": ["@rocket.chat/eslint-config", "prettier", "plugin:storybook/recommended"], "plugins": ["react", "react-hooks", "prettier"], "env": { "jest": true diff --git a/packages/livechat/package.json b/packages/livechat/package.json index c5a3f55e5093a..86a95acbc0a81 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -59,6 +59,7 @@ "eslint-plugin-import": "~2.31.0", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "~5.0.0", + "eslint-plugin-storybook": "~0.11.6", "file-loader": "^6.2.0", "html-webpack-plugin": "~5.6.4", "if-env": "^1.0.4", diff --git a/packages/ui-composer/.eslintrc.json b/packages/ui-composer/.eslintrc.json index 341a302833736..6e0406abd46a7 100644 --- a/packages/ui-composer/.eslintrc.json +++ b/packages/ui-composer/.eslintrc.json @@ -1,4 +1,4 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index 1e498b2c3e2f8..d7a2417ad7832 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -43,7 +43,7 @@ "eslint": "~8.45.0", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "~5.0.0", - "eslint-plugin-storybook": "^0.11.6", + "eslint-plugin-storybook": "~0.11.6", "jest": "~30.2.0", "react": "~18.3.1", "react-dom": "~18.3.1", diff --git a/packages/ui-video-conf/.eslintrc.json b/packages/ui-video-conf/.eslintrc.json index 341a302833736..6e0406abd46a7 100644 --- a/packages/ui-video-conf/.eslintrc.json +++ b/packages/ui-video-conf/.eslintrc.json @@ -1,4 +1,4 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-voip/.eslintrc.json b/packages/ui-voip/.eslintrc.json index 341a302833736..6e0406abd46a7 100644 --- a/packages/ui-voip/.eslintrc.json +++ b/packages/ui-voip/.eslintrc.json @@ -1,4 +1,4 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-voip/package.json b/packages/ui-voip/package.json index 1eff170a61b7a..7155fbe954734 100644 --- a/packages/ui-voip/package.json +++ b/packages/ui-voip/package.json @@ -62,7 +62,7 @@ "eslint": "~8.45.0", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "~5.0.0", - "eslint-plugin-storybook": "^0.11.6", + "eslint-plugin-storybook": "~0.11.6", "i18next": "~23.4.9", "jest": "~30.2.0", "jest-axe": "~10.0.0", diff --git a/packages/web-ui-registration/.eslintrc.json b/packages/web-ui-registration/.eslintrc.json index 341a302833736..6e0406abd46a7 100644 --- a/packages/web-ui-registration/.eslintrc.json +++ b/packages/web-ui-registration/.eslintrc.json @@ -1,4 +1,4 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index d2c7dc09009ad..69e0e95112b6b 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -48,6 +48,7 @@ "@types/react": "~18.3.26", "@types/react-dom": "~18.3.7", "eslint": "~8.45.0", + "eslint-plugin-storybook": "~0.11.6", "i18next": "~23.4.9", "react": "~18.3.1", "react-dom": "~18.3.1", diff --git a/yarn.lock b/yarn.lock index 3c18f4b862003..81934e8873ac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8676,6 +8676,7 @@ __metadata: babel-loader: "npm:~10.0.0" cross-env: "npm:^7.0.3" eslint: "npm:~8.45.0" + eslint-plugin-storybook: "npm:~0.11.6" i18next: "npm:^23.10.1" jest: "npm:~30.2.0" normalize.css: "npm:^8.0.1" @@ -8773,7 +8774,7 @@ __metadata: eslint-plugin-anti-trojan-source: "npm:~1.1.2" eslint-plugin-react: "npm:~7.37.5" eslint-plugin-react-hooks: "npm:~5.0.0" - eslint-plugin-storybook: "npm:^0.11.6" + eslint-plugin-storybook: "npm:~0.11.6" highlight.js: "npm:11.8.0" i18next: "npm:~23.4.9" identity-obj-proxy: "npm:^3.0.0" @@ -8986,6 +8987,7 @@ __metadata: eslint-plugin-import: "npm:~2.31.0" eslint-plugin-react: "npm:~7.37.5" eslint-plugin-react-hooks: "npm:~5.0.0" + eslint-plugin-storybook: "npm:~0.11.6" file-loader: "npm:^6.2.0" history: "npm:~5.3.0" html-webpack-plugin: "npm:~5.6.4" @@ -9414,6 +9416,7 @@ __metadata: eslint-plugin-prettier: "npm:~5.2.6" eslint-plugin-react: "npm:~7.37.5" eslint-plugin-react-hooks: "npm:~5.0.0" + eslint-plugin-storybook: "npm:~0.11.6" eslint-plugin-testing-library: "npm:~6.4.0" eslint-plugin-you-dont-need-lodash-underscore: "npm:~6.14.0" eventemitter3: "npm:^5.0.1" @@ -9867,6 +9870,7 @@ __metadata: buffer: "npm:~6.0.3" emoji-toolkit: "npm:^7.0.1" eslint: "npm:~8.45.0" + eslint-plugin-storybook: "npm:~0.11.6" i18next: "npm:~23.4.9" jest: "npm:~30.2.0" moment: "npm:^2.30.1" @@ -10369,7 +10373,7 @@ __metadata: eslint: "npm:~8.45.0" eslint-plugin-react: "npm:~7.37.5" eslint-plugin-react-hooks: "npm:~5.0.0" - eslint-plugin-storybook: "npm:^0.11.6" + eslint-plugin-storybook: "npm:~0.11.6" jest: "npm:~30.2.0" react: "npm:~18.3.1" react-dom: "npm:~18.3.1" @@ -10573,7 +10577,7 @@ __metadata: eslint: "npm:~8.45.0" eslint-plugin-react: "npm:~7.37.5" eslint-plugin-react-hooks: "npm:~5.0.0" - eslint-plugin-storybook: "npm:^0.11.6" + eslint-plugin-storybook: "npm:~0.11.6" i18next: "npm:~23.4.9" jest: "npm:~30.2.0" jest-axe: "npm:~10.0.0" @@ -10681,6 +10685,7 @@ __metadata: "@types/react-dom": "npm:~18.3.7" dompurify: "npm:~3.2.7" eslint: "npm:~8.45.0" + eslint-plugin-storybook: "npm:~0.11.6" i18next: "npm:~23.4.9" react: "npm:~18.3.1" react-dom: "npm:~18.3.1" @@ -21408,7 +21413,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^0.11.6, eslint-plugin-storybook@npm:~0.11.6": +"eslint-plugin-storybook@npm:~0.11.6": version: 0.11.6 resolution: "eslint-plugin-storybook@npm:0.11.6" dependencies: From ccc06a1e9cf0c519a415f862a247bde0b93b0a9c Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 25 Nov 2025 11:48:38 -0300 Subject: [PATCH 018/302] chore(ui-contexts): Review build configuration (#37598) --- packages/ui-contexts/.eslintrc.json | 4 +-- packages/ui-contexts/package.json | 34 ++++++++++++------------ packages/ui-contexts/tsconfig.build.json | 4 +++ packages/ui-contexts/tsconfig.json | 7 +++-- 4 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 packages/ui-contexts/tsconfig.build.json diff --git a/packages/ui-contexts/.eslintrc.json b/packages/ui-contexts/.eslintrc.json index 5fe546755bb70..9a131836901c4 100644 --- a/packages/ui-contexts/.eslintrc.json +++ b/packages/ui-contexts/.eslintrc.json @@ -1,4 +1,4 @@ { - "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:react-hooks/recommended"], - "ignorePatterns": ["**/dist"] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "ignorePatterns": ["dist"] } diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index a64b4fd682bb5..f455f4005c9fd 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -2,6 +2,22 @@ "name": "@rocket.chat/ui-contexts", "version": "24.0.0", "private": true, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc --watch --preserveWatchOutput -p tsconfig.build.json", + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "test": "jest", + "testunit": "jest" + }, + "dependencies": { + "@rocket.chat/password-policies": "workspace:^" + }, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/ddp-client": "workspace:~", @@ -32,23 +48,7 @@ "@rocket.chat/rest-typings": "workspace:^", "react": "*" }, - "dependencies": { - "@rocket.chat/password-policies": "workspace:^" - }, "volta": { "extends": "../../package.json" - }, - "scripts": { - "lint": "eslint --ext .js,.jsx,.ts,.tsx .", - "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json", - "build": "rm -rf dist && tsc -p tsconfig.json", - "test": "jest", - "testunit": "jest" - }, - "main": "./dist/index.js", - "typings": "./dist/index.d.ts", - "files": [ - "/dist" - ] + } } diff --git a/packages/ui-contexts/tsconfig.build.json b/packages/ui-contexts/tsconfig.build.json new file mode 100644 index 0000000000000..0e94f7dbe0656 --- /dev/null +++ b/packages/ui-contexts/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["./src/**/*.spec.ts", "./src/**/*.spec.tsx", "./jest.config.ts"] +} diff --git a/packages/ui-contexts/tsconfig.json b/packages/ui-contexts/tsconfig.json index b2507abff3df6..2f01e952e9193 100644 --- a/packages/ui-contexts/tsconfig.json +++ b/packages/ui-contexts/tsconfig.json @@ -1,9 +1,8 @@ { "extends": "@rocket.chat/tsconfig/client.json", "compilerOptions": { - "module": "CommonJS", - "rootDir": "./src", - "outDir": "./dist", + "rootDirs": ["./src", "./"], + "outDir": "./dist" }, - "include": ["./src/**/*"] + "include": ["./src/**/*", "./jest.config.ts"] } From f5eedbeefea517eecc01bd3fcf2b3dc7f5565c03 Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:44:31 -0300 Subject: [PATCH 019/302] chore: Fix `ui-voip` package folder structure (#37593) --- packages/ui-voip/src/{v2 => }/components/ActionButton.tsx | 0 packages/ui-voip/src/{v2 => }/components/DevicePicker.tsx | 4 ++-- packages/ui-voip/src/{v2 => }/components/Keypad/Key.tsx | 0 .../src/{v2 => }/components/Keypad/Keypad.stories.tsx | 2 +- .../ui-voip/src/{v2 => }/components/Keypad/Keypad.tsx | 0 .../ui-voip/src/{v2 => components/Keypad}/useKeypad.tsx | 2 +- .../ui-voip/src/{v2 => }/components/PeerAutocomplete.tsx | 2 +- .../src/{v2 => }/components/PeerInfo/InternalUser.tsx | 2 +- .../src/{v2 => }/components/PeerInfo/PeerInfo.stories.tsx | 0 .../ui-voip/src/{v2 => }/components/PeerInfo/PeerInfo.tsx | 0 .../src/{v2 => }/components/PeerInfo/PhoneNumber.tsx | 0 .../ui-voip/src/{v2 => }/components/PeerInfo/index.ts | 0 .../src/{v2 => components/PeerInfo}/useInfoSlots.ts | 2 +- packages/ui-voip/src/{v2 => }/components/Timer.tsx | 0 .../src/{v2 => }/components/ToggleButton.stories.tsx | 0 packages/ui-voip/src/{v2 => }/components/ToggleButton.tsx | 0 .../src/{v2 => }/components/Widget/Widget.stories.tsx | 0 .../ui-voip/src/{v2 => }/components/Widget/Widget.tsx | 2 +- .../src/{v2 => }/components/Widget/WidgetContent.tsx | 0 .../{v2 => }/components/Widget/WidgetDraggableContext.ts | 0 .../src/{v2 => }/components/Widget/WidgetFooter.tsx | 0 .../src/{v2 => }/components/Widget/WidgetHandle.tsx | 0 .../src/{v2 => }/components/Widget/WidgetHeader.tsx | 0 .../ui-voip/src/{v2 => }/components/Widget/WidgetInfo.tsx | 0 packages/ui-voip/src/{v2 => }/components/Widget/index.ts | 0 packages/ui-voip/src/{v2 => }/components/index.ts | 2 ++ packages/ui-voip/src/{v2 => context}/MediaCallContext.ts | 2 +- packages/ui-voip/src/{v2 => context}/MediaCallLogger.ts | 0 .../ui-voip/src/{v2 => context}/MediaCallProvider.tsx | 4 ++-- .../src/{v2 => context}/MockedMediaCallProvider.tsx | 0 packages/ui-voip/src/context/index.ts | 4 ++++ packages/ui-voip/src/{v2 => context}/useCallSounds.ts | 0 .../src/{v2 => context}/useDesktopNotifications.ts | 2 +- packages/ui-voip/src/{v2 => context}/useMediaSession.ts | 0 .../src/{v2 => context}/useMediaSessionInstance.ts | 0 packages/ui-voip/src/{v2 => context}/useMediaStream.ts | 0 packages/ui-voip/src/{v2 => context}/useTonePlayer.ts | 0 .../VoipPopupDraggable/DraggableCore.ts | 2 +- .../VoipPopupDraggable/useDraggable.stories.tsx | 0 packages/ui-voip/src/hooks/index.ts | 2 ++ packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx | 2 +- packages/ui-voip/src/{v2 => hooks}/useMediaCallAction.ts | 4 ++-- packages/ui-voip/src/index.ts | 6 +++--- .../ui-voip/src/{v2 => }/utils/convertAvatarUrlToPng.ts | 0 packages/ui-voip/src/v2/index.ts | 4 ---- .../MediaCallWidget}/IncomingCall.stories.tsx | 2 +- .../{v2/views => views/MediaCallWidget}/IncomingCall.tsx | 4 ++-- .../MediaCallWidget}/IncomingCallTransfer.stories.tsx | 2 +- .../MediaCallWidget}/IncomingCallTransfer.tsx | 4 ++-- .../MediaCallWidget}/MediaCallWidget.spec.tsx | 0 .../MediaCallWidget}/MediaCallWidget.stories.tsx | 3 +-- .../src/{v2 => views/MediaCallWidget}/MediaCallWidget.tsx | 4 ++-- .../views => views/MediaCallWidget}/NewCall.stories.tsx | 2 +- .../src/{v2/views => views/MediaCallWidget}/NewCall.tsx | 4 ++-- .../MediaCallWidget}/OngoingCall.stories.tsx | 2 +- .../{v2/views => views/MediaCallWidget}/OngoingCall.tsx | 8 ++++---- .../MediaCallWidget}/OutgoingCall.stories.tsx | 2 +- .../{v2/views => views/MediaCallWidget}/OutgoingCall.tsx | 4 ++-- .../MediaCallWidget}/OutgoingCallTransfer.stories.tsx | 2 +- .../MediaCallWidget}/OutgoingCallTransfer.tsx | 4 ++-- .../__snapshots__/MediaCallWidget.spec.tsx.snap | 0 .../src/{v2/views => views/MediaCallWidget}/index.ts | 1 + .../PermissionFlow/PermissionFlowModal.spec.tsx | 0 .../PermissionFlow/PermissionFlowModal.stories.tsx | 0 .../PermissionFlow/PermissionFlowModal.tsx | 0 .../__snapshots__/PermissionFlowModal.spec.tsx.snap | 0 packages/ui-voip/src/{v2 => views}/TransferModal.tsx | 5 ++--- packages/ui-voip/src/views/index.ts | 3 +++ 68 files changed, 56 insertions(+), 50 deletions(-) rename packages/ui-voip/src/{v2 => }/components/ActionButton.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/DevicePicker.tsx (96%) rename packages/ui-voip/src/{v2 => }/components/Keypad/Key.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Keypad/Keypad.stories.tsx (88%) rename packages/ui-voip/src/{v2 => }/components/Keypad/Keypad.tsx (100%) rename packages/ui-voip/src/{v2 => components/Keypad}/useKeypad.tsx (96%) rename packages/ui-voip/src/{v2 => }/components/PeerAutocomplete.tsx (96%) rename packages/ui-voip/src/{v2 => }/components/PeerInfo/InternalUser.tsx (97%) rename packages/ui-voip/src/{v2 => }/components/PeerInfo/PeerInfo.stories.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/PeerInfo/PeerInfo.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/PeerInfo/PhoneNumber.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/PeerInfo/index.ts (100%) rename packages/ui-voip/src/{v2 => components/PeerInfo}/useInfoSlots.ts (96%) rename packages/ui-voip/src/{v2 => }/components/Timer.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/ToggleButton.stories.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/ToggleButton.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/Widget.stories.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/Widget.tsx (94%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetContent.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetDraggableContext.ts (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetFooter.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetHandle.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetHeader.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/WidgetInfo.tsx (100%) rename packages/ui-voip/src/{v2 => }/components/Widget/index.ts (100%) rename packages/ui-voip/src/{v2 => }/components/index.ts (80%) rename packages/ui-voip/src/{v2 => context}/MediaCallContext.ts (98%) rename packages/ui-voip/src/{v2 => context}/MediaCallLogger.ts (100%) rename packages/ui-voip/src/{v2 => context}/MediaCallProvider.tsx (98%) rename packages/ui-voip/src/{v2 => context}/MockedMediaCallProvider.tsx (100%) create mode 100644 packages/ui-voip/src/context/index.ts rename packages/ui-voip/src/{v2 => context}/useCallSounds.ts (100%) rename packages/ui-voip/src/{v2 => context}/useDesktopNotifications.ts (96%) rename packages/ui-voip/src/{v2 => context}/useMediaSession.ts (100%) rename packages/ui-voip/src/{v2 => context}/useMediaSessionInstance.ts (100%) rename packages/ui-voip/src/{v2 => context}/useMediaStream.ts (100%) rename packages/ui-voip/src/{v2 => context}/useTonePlayer.ts (100%) rename packages/ui-voip/src/{components => hooks}/VoipPopupDraggable/DraggableCore.ts (100%) rename packages/ui-voip/src/{components => hooks}/VoipPopupDraggable/useDraggable.stories.tsx (100%) rename packages/ui-voip/src/{v2 => hooks}/useMediaCallAction.ts (93%) rename packages/ui-voip/src/{v2 => }/utils/convertAvatarUrlToPng.ts (100%) delete mode 100644 packages/ui-voip/src/v2/index.ts rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/IncomingCall.stories.tsx (91%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/IncomingCall.tsx (90%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/IncomingCallTransfer.stories.tsx (92%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/IncomingCallTransfer.tsx (89%) rename packages/ui-voip/src/{v2 => views/MediaCallWidget}/MediaCallWidget.spec.tsx (100%) rename packages/ui-voip/src/{v2 => views/MediaCallWidget}/MediaCallWidget.stories.tsx (93%) rename packages/ui-voip/src/{v2 => views/MediaCallWidget}/MediaCallWidget.tsx (84%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/NewCall.stories.tsx (90%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/NewCall.tsx (91%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OngoingCall.stories.tsx (96%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OngoingCall.tsx (92%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OutgoingCall.stories.tsx (90%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OutgoingCall.tsx (89%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OutgoingCallTransfer.stories.tsx (92%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/OutgoingCallTransfer.tsx (89%) rename packages/ui-voip/src/{v2 => views/MediaCallWidget}/__snapshots__/MediaCallWidget.spec.tsx.snap (100%) rename packages/ui-voip/src/{v2/views => views/MediaCallWidget}/index.ts (85%) rename packages/ui-voip/src/{components => views}/PermissionFlow/PermissionFlowModal.spec.tsx (100%) rename packages/ui-voip/src/{components => views}/PermissionFlow/PermissionFlowModal.stories.tsx (100%) rename packages/ui-voip/src/{components => views}/PermissionFlow/PermissionFlowModal.tsx (100%) rename packages/ui-voip/src/{components => views}/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap (100%) rename packages/ui-voip/src/{v2 => views}/TransferModal.tsx (91%) create mode 100644 packages/ui-voip/src/views/index.ts diff --git a/packages/ui-voip/src/v2/components/ActionButton.tsx b/packages/ui-voip/src/components/ActionButton.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/ActionButton.tsx rename to packages/ui-voip/src/components/ActionButton.tsx diff --git a/packages/ui-voip/src/v2/components/DevicePicker.tsx b/packages/ui-voip/src/components/DevicePicker.tsx similarity index 96% rename from packages/ui-voip/src/v2/components/DevicePicker.tsx rename to packages/ui-voip/src/components/DevicePicker.tsx index 82693aeda1a97..91845a8ca48d2 100644 --- a/packages/ui-voip/src/v2/components/DevicePicker.tsx +++ b/packages/ui-voip/src/components/DevicePicker.tsx @@ -8,8 +8,8 @@ import { forwardRef, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { ActionButton } from '.'; -import { useDevicePermissionPrompt2, stopTracks } from '../../hooks/useDevicePermissionPrompt'; -import { useMediaCallContext } from '../MediaCallContext'; +import { useMediaCallContext } from '../context'; +import { useDevicePermissionPrompt2, stopTracks } from '../hooks/useDevicePermissionPrompt'; type DevicePickerButtonProps = { secondary?: boolean; diff --git a/packages/ui-voip/src/v2/components/Keypad/Key.tsx b/packages/ui-voip/src/components/Keypad/Key.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Keypad/Key.tsx rename to packages/ui-voip/src/components/Keypad/Key.tsx diff --git a/packages/ui-voip/src/v2/components/Keypad/Keypad.stories.tsx b/packages/ui-voip/src/components/Keypad/Keypad.stories.tsx similarity index 88% rename from packages/ui-voip/src/v2/components/Keypad/Keypad.stories.tsx rename to packages/ui-voip/src/components/Keypad/Keypad.stories.tsx index 89b25ae33e19b..19e7e09b703ae 100644 --- a/packages/ui-voip/src/v2/components/Keypad/Keypad.stories.tsx +++ b/packages/ui-voip/src/components/Keypad/Keypad.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryFn } from '@storybook/react'; import Keypad from './Keypad'; -import { useTonePlayer } from '../../useTonePlayer'; +import { useTonePlayer } from '../../context/useTonePlayer'; export default { title: 'V2/Components/Keypad', diff --git a/packages/ui-voip/src/v2/components/Keypad/Keypad.tsx b/packages/ui-voip/src/components/Keypad/Keypad.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Keypad/Keypad.tsx rename to packages/ui-voip/src/components/Keypad/Keypad.tsx diff --git a/packages/ui-voip/src/v2/useKeypad.tsx b/packages/ui-voip/src/components/Keypad/useKeypad.tsx similarity index 96% rename from packages/ui-voip/src/v2/useKeypad.tsx rename to packages/ui-voip/src/components/Keypad/useKeypad.tsx index 59481e6b9f802..3a9ec4272e8fc 100644 --- a/packages/ui-voip/src/v2/useKeypad.tsx +++ b/packages/ui-voip/src/components/Keypad/useKeypad.tsx @@ -3,7 +3,7 @@ import type { ReactNode } from 'react'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Keypad } from './components'; +import Keypad from './Keypad'; type UseKeypad = { element: ReactNode; diff --git a/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx b/packages/ui-voip/src/components/PeerAutocomplete.tsx similarity index 96% rename from packages/ui-voip/src/v2/components/PeerAutocomplete.tsx rename to packages/ui-voip/src/components/PeerAutocomplete.tsx index b2cd745c645dd..90ea5ea1c9110 100644 --- a/packages/ui-voip/src/v2/components/PeerAutocomplete.tsx +++ b/packages/ui-voip/src/components/PeerAutocomplete.tsx @@ -3,7 +3,7 @@ import { AutoComplete, Option, Avatar, Field, FieldRow, FieldDescription, FieldE import { useId } from 'react'; import { useTranslation } from 'react-i18next'; -import { isFirstPeerAutocompleteOption } from '../MediaCallContext'; +import { isFirstPeerAutocompleteOption } from '../context'; export type PeerAutocompleteOptions = { value: string; // user id diff --git a/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx b/packages/ui-voip/src/components/PeerInfo/InternalUser.tsx similarity index 97% rename from packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx rename to packages/ui-voip/src/components/PeerInfo/InternalUser.tsx index 049c6f3cbca70..96cfa6c812ea6 100644 --- a/packages/ui-voip/src/v2/components/PeerInfo/InternalUser.tsx +++ b/packages/ui-voip/src/components/PeerInfo/InternalUser.tsx @@ -1,7 +1,7 @@ import type { UserStatus } from '@rocket.chat/core-typings'; import { Avatar, Box, Icon, StatusBullet } from '@rocket.chat/fuselage'; -import type { Slot } from '../../useInfoSlots'; +import type { Slot } from './useInfoSlots'; type InternalUserProps = { displayName: string; diff --git a/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.stories.tsx b/packages/ui-voip/src/components/PeerInfo/PeerInfo.stories.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.stories.tsx rename to packages/ui-voip/src/components/PeerInfo/PeerInfo.stories.tsx diff --git a/packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx b/packages/ui-voip/src/components/PeerInfo/PeerInfo.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/PeerInfo/PeerInfo.tsx rename to packages/ui-voip/src/components/PeerInfo/PeerInfo.tsx diff --git a/packages/ui-voip/src/v2/components/PeerInfo/PhoneNumber.tsx b/packages/ui-voip/src/components/PeerInfo/PhoneNumber.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/PeerInfo/PhoneNumber.tsx rename to packages/ui-voip/src/components/PeerInfo/PhoneNumber.tsx diff --git a/packages/ui-voip/src/v2/components/PeerInfo/index.ts b/packages/ui-voip/src/components/PeerInfo/index.ts similarity index 100% rename from packages/ui-voip/src/v2/components/PeerInfo/index.ts rename to packages/ui-voip/src/components/PeerInfo/index.ts diff --git a/packages/ui-voip/src/v2/useInfoSlots.ts b/packages/ui-voip/src/components/PeerInfo/useInfoSlots.ts similarity index 96% rename from packages/ui-voip/src/v2/useInfoSlots.ts rename to packages/ui-voip/src/components/PeerInfo/useInfoSlots.ts index 00ff776eb845b..d3a32181ce63e 100644 --- a/packages/ui-voip/src/v2/useInfoSlots.ts +++ b/packages/ui-voip/src/components/PeerInfo/useInfoSlots.ts @@ -2,7 +2,7 @@ import type { Keys as IconNames } from '@rocket.chat/icons'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import type { ConnectionState } from './MediaCallContext'; +import type { ConnectionState } from '../../context'; export type Slot = { text: string; diff --git a/packages/ui-voip/src/v2/components/Timer.tsx b/packages/ui-voip/src/components/Timer.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Timer.tsx rename to packages/ui-voip/src/components/Timer.tsx diff --git a/packages/ui-voip/src/v2/components/ToggleButton.stories.tsx b/packages/ui-voip/src/components/ToggleButton.stories.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/ToggleButton.stories.tsx rename to packages/ui-voip/src/components/ToggleButton.stories.tsx diff --git a/packages/ui-voip/src/v2/components/ToggleButton.tsx b/packages/ui-voip/src/components/ToggleButton.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/ToggleButton.tsx rename to packages/ui-voip/src/components/ToggleButton.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/Widget.stories.tsx b/packages/ui-voip/src/components/Widget/Widget.stories.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/Widget.stories.tsx rename to packages/ui-voip/src/components/Widget/Widget.stories.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/Widget.tsx b/packages/ui-voip/src/components/Widget/Widget.tsx similarity index 94% rename from packages/ui-voip/src/v2/components/Widget/Widget.tsx rename to packages/ui-voip/src/components/Widget/Widget.tsx index caf555916e929..4cff6c10f6bdd 100644 --- a/packages/ui-voip/src/v2/components/Widget/Widget.tsx +++ b/packages/ui-voip/src/components/Widget/Widget.tsx @@ -5,7 +5,7 @@ import { useLayoutEffect } from 'react'; import { FocusScope } from 'react-aria'; import { DragContext } from './WidgetDraggableContext'; -import { useDraggable } from '../../../components/VoipPopupDraggable/DraggableCore'; +import { useDraggable } from '../../hooks'; // TODO: Initial position from the draggable api instead of style props // TODO: A11Y diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetContent.tsx b/packages/ui-voip/src/components/Widget/WidgetContent.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetContent.tsx rename to packages/ui-voip/src/components/Widget/WidgetContent.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts b/packages/ui-voip/src/components/Widget/WidgetDraggableContext.ts similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetDraggableContext.ts rename to packages/ui-voip/src/components/Widget/WidgetDraggableContext.ts diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetFooter.tsx b/packages/ui-voip/src/components/Widget/WidgetFooter.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetFooter.tsx rename to packages/ui-voip/src/components/Widget/WidgetFooter.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx b/packages/ui-voip/src/components/Widget/WidgetHandle.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetHandle.tsx rename to packages/ui-voip/src/components/Widget/WidgetHandle.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetHeader.tsx b/packages/ui-voip/src/components/Widget/WidgetHeader.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetHeader.tsx rename to packages/ui-voip/src/components/Widget/WidgetHeader.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/WidgetInfo.tsx b/packages/ui-voip/src/components/Widget/WidgetInfo.tsx similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/WidgetInfo.tsx rename to packages/ui-voip/src/components/Widget/WidgetInfo.tsx diff --git a/packages/ui-voip/src/v2/components/Widget/index.ts b/packages/ui-voip/src/components/Widget/index.ts similarity index 100% rename from packages/ui-voip/src/v2/components/Widget/index.ts rename to packages/ui-voip/src/components/Widget/index.ts diff --git a/packages/ui-voip/src/v2/components/index.ts b/packages/ui-voip/src/components/index.ts similarity index 80% rename from packages/ui-voip/src/v2/components/index.ts rename to packages/ui-voip/src/components/index.ts index 6d7f5390ac1d8..66d3b4619f7bc 100644 --- a/packages/ui-voip/src/v2/components/index.ts +++ b/packages/ui-voip/src/components/index.ts @@ -5,6 +5,8 @@ export * from './PeerAutocomplete'; export { default as ToggleButton } from './ToggleButton'; export { default as ActionButton } from './ActionButton'; export { default as Keypad } from './Keypad/Keypad'; +export { useKeypad } from './Keypad/useKeypad'; +export { useInfoSlots } from './PeerInfo/useInfoSlots'; export { default as PeerAutocomplete } from './PeerAutocomplete'; export { default as Timer } from './Timer'; export { default as DevicePicker } from './DevicePicker'; diff --git a/packages/ui-voip/src/v2/MediaCallContext.ts b/packages/ui-voip/src/context/MediaCallContext.ts similarity index 98% rename from packages/ui-voip/src/v2/MediaCallContext.ts rename to packages/ui-voip/src/context/MediaCallContext.ts index 1e8b2d216bd8e..c063138807981 100644 --- a/packages/ui-voip/src/v2/MediaCallContext.ts +++ b/packages/ui-voip/src/context/MediaCallContext.ts @@ -4,7 +4,7 @@ import type { Device } from '@rocket.chat/ui-contexts'; import { keepPreviousData, useQuery } from '@tanstack/react-query'; import { createContext, useContext, useState } from 'react'; -import type { PeerAutocompleteOptions } from './components'; +import type { PeerAutocompleteOptions } from '../components'; type InternalPeerInfo = { displayName: string; diff --git a/packages/ui-voip/src/v2/MediaCallLogger.ts b/packages/ui-voip/src/context/MediaCallLogger.ts similarity index 100% rename from packages/ui-voip/src/v2/MediaCallLogger.ts rename to packages/ui-voip/src/context/MediaCallLogger.ts diff --git a/packages/ui-voip/src/v2/MediaCallProvider.tsx b/packages/ui-voip/src/context/MediaCallProvider.tsx similarity index 98% rename from packages/ui-voip/src/v2/MediaCallProvider.tsx rename to packages/ui-voip/src/context/MediaCallProvider.tsx index 7a0b834d482a4..2c665a9eb20ae 100644 --- a/packages/ui-voip/src/v2/MediaCallProvider.tsx +++ b/packages/ui-voip/src/context/MediaCallProvider.tsx @@ -18,8 +18,6 @@ import { useTranslation } from 'react-i18next'; import type { PeerInfo } from './MediaCallContext'; import MediaCallContext from './MediaCallContext'; -import MediaCallWidget from './MediaCallWidget'; -import TransferModal from './TransferModal'; import { useCallSounds } from './useCallSounds'; import { useDesktopNotifications } from './useDesktopNotifications'; import { getExtensionFromPeerInfo, useMediaSession } from './useMediaSession'; @@ -27,6 +25,8 @@ import { useMediaSessionInstance } from './useMediaSessionInstance'; import useMediaStream from './useMediaStream'; import { isValidTone, useTonePlayer } from './useTonePlayer'; import { stopTracks, useDevicePermissionPrompt2, PermissionRequestCancelledCallRejectedError } from '../hooks/useDevicePermissionPrompt'; +import { MediaCallWidget } from '../views'; +import TransferModal from '../views/TransferModal'; type MediaCallProviderProps = { children: ReactNode; diff --git a/packages/ui-voip/src/v2/MockedMediaCallProvider.tsx b/packages/ui-voip/src/context/MockedMediaCallProvider.tsx similarity index 100% rename from packages/ui-voip/src/v2/MockedMediaCallProvider.tsx rename to packages/ui-voip/src/context/MockedMediaCallProvider.tsx diff --git a/packages/ui-voip/src/context/index.ts b/packages/ui-voip/src/context/index.ts new file mode 100644 index 0000000000000..b0e94b134c883 --- /dev/null +++ b/packages/ui-voip/src/context/index.ts @@ -0,0 +1,4 @@ +export { useMediaCallContext, useMediaCallExternalContext, default as MediaCallContext, usePeerAutocomplete } from './MediaCallContext'; +export type { PeerInfo, ConnectionState } from './MediaCallContext'; +export { isFirstPeerAutocompleteOption } from './MediaCallContext'; +export { default as MockedMediaCallProvider } from './MockedMediaCallProvider'; diff --git a/packages/ui-voip/src/v2/useCallSounds.ts b/packages/ui-voip/src/context/useCallSounds.ts similarity index 100% rename from packages/ui-voip/src/v2/useCallSounds.ts rename to packages/ui-voip/src/context/useCallSounds.ts diff --git a/packages/ui-voip/src/v2/useDesktopNotifications.ts b/packages/ui-voip/src/context/useDesktopNotifications.ts similarity index 96% rename from packages/ui-voip/src/v2/useDesktopNotifications.ts rename to packages/ui-voip/src/context/useDesktopNotifications.ts index 7704312ecad01..30183cf53f58c 100644 --- a/packages/ui-voip/src/v2/useDesktopNotifications.ts +++ b/packages/ui-voip/src/context/useDesktopNotifications.ts @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next'; import type { PeerInfo } from './MediaCallContext'; import type { SessionInfo } from './useMediaSessionInstance'; -import { convertAvatarUrlToPng } from './utils/convertAvatarUrlToPng'; +import { convertAvatarUrlToPng } from '../utils/convertAvatarUrlToPng'; const getDisplayInfo = (peerInfo?: PeerInfo) => { if (!peerInfo) { diff --git a/packages/ui-voip/src/v2/useMediaSession.ts b/packages/ui-voip/src/context/useMediaSession.ts similarity index 100% rename from packages/ui-voip/src/v2/useMediaSession.ts rename to packages/ui-voip/src/context/useMediaSession.ts diff --git a/packages/ui-voip/src/v2/useMediaSessionInstance.ts b/packages/ui-voip/src/context/useMediaSessionInstance.ts similarity index 100% rename from packages/ui-voip/src/v2/useMediaSessionInstance.ts rename to packages/ui-voip/src/context/useMediaSessionInstance.ts diff --git a/packages/ui-voip/src/v2/useMediaStream.ts b/packages/ui-voip/src/context/useMediaStream.ts similarity index 100% rename from packages/ui-voip/src/v2/useMediaStream.ts rename to packages/ui-voip/src/context/useMediaStream.ts diff --git a/packages/ui-voip/src/v2/useTonePlayer.ts b/packages/ui-voip/src/context/useTonePlayer.ts similarity index 100% rename from packages/ui-voip/src/v2/useTonePlayer.ts rename to packages/ui-voip/src/context/useTonePlayer.ts diff --git a/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts b/packages/ui-voip/src/hooks/VoipPopupDraggable/DraggableCore.ts similarity index 100% rename from packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts rename to packages/ui-voip/src/hooks/VoipPopupDraggable/DraggableCore.ts index 93adfe5b55617..fdc1f2cae4852 100644 --- a/packages/ui-voip/src/components/VoipPopupDraggable/DraggableCore.ts +++ b/packages/ui-voip/src/hooks/VoipPopupDraggable/DraggableCore.ts @@ -1,5 +1,5 @@ -import type { OffCallbackHandler } from '@rocket.chat/emitter'; import { Emitter } from '@rocket.chat/emitter'; +import type { OffCallbackHandler } from '@rocket.chat/emitter'; import { useSafeRefCallback } from '@rocket.chat/ui-client'; import { useCallback, useRef, useState } from 'react'; diff --git a/packages/ui-voip/src/components/VoipPopupDraggable/useDraggable.stories.tsx b/packages/ui-voip/src/hooks/VoipPopupDraggable/useDraggable.stories.tsx similarity index 100% rename from packages/ui-voip/src/components/VoipPopupDraggable/useDraggable.stories.tsx rename to packages/ui-voip/src/hooks/VoipPopupDraggable/useDraggable.stories.tsx diff --git a/packages/ui-voip/src/hooks/index.ts b/packages/ui-voip/src/hooks/index.ts index 8b58b842e44f4..3f9656838500c 100644 --- a/packages/ui-voip/src/hooks/index.ts +++ b/packages/ui-voip/src/hooks/index.ts @@ -1 +1,3 @@ export * from './useDevicePermissionPrompt'; +export { useDraggable } from './VoipPopupDraggable/DraggableCore'; +export { useMediaCallAction } from './useMediaCallAction'; diff --git a/packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx b/packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx index 184d71009e46c..6540d92beabc5 100644 --- a/packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx +++ b/packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx @@ -2,7 +2,7 @@ import { useMediaDeviceMicrophonePermission, useSelectedDevices, useSetInputMedi import { useQueryClient } from '@tanstack/react-query'; import { useCallback } from 'react'; -import PermissionFlowModal, { type PermissionFlowModalType } from '../components/PermissionFlow/PermissionFlowModal'; +import { PermissionFlowModal, type PermissionFlowModalType } from '../views'; type OnAccept = (stream: MediaStream) => void; type OnReject = (error?: DOMException) => void; diff --git a/packages/ui-voip/src/v2/useMediaCallAction.ts b/packages/ui-voip/src/hooks/useMediaCallAction.ts similarity index 93% rename from packages/ui-voip/src/v2/useMediaCallAction.ts rename to packages/ui-voip/src/hooks/useMediaCallAction.ts index 1d6b74cd17212..937b5b3533347 100644 --- a/packages/ui-voip/src/v2/useMediaCallAction.ts +++ b/packages/ui-voip/src/hooks/useMediaCallAction.ts @@ -2,8 +2,8 @@ import type { Keys as IconNames } from '@rocket.chat/icons'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import type { PeerInfo } from './MediaCallContext'; -import { useMediaCallExternalContext } from './MediaCallContext'; +import type { PeerInfo } from '../context'; +import { useMediaCallExternalContext } from '../context'; export const useMediaCallAction = ( callee?: PeerInfo, diff --git a/packages/ui-voip/src/index.ts b/packages/ui-voip/src/index.ts index d28ae53a6c93b..1bdb9100eb5ac 100644 --- a/packages/ui-voip/src/index.ts +++ b/packages/ui-voip/src/index.ts @@ -1,5 +1,5 @@ -export { default as MediaCallProvider } from './v2/MediaCallProvider'; +export { default as MediaCallProvider } from './context/MediaCallProvider'; -export * from './hooks'; +export { MediaCallContext, useMediaCallExternalContext as useMediaCallContext, type PeerInfo } from './context'; -export { MediaCallContext, useMediaCallExternalContext as useMediaCallContext, useMediaCallAction, type PeerInfo } from './v2'; +export { useMediaCallAction } from './hooks'; diff --git a/packages/ui-voip/src/v2/utils/convertAvatarUrlToPng.ts b/packages/ui-voip/src/utils/convertAvatarUrlToPng.ts similarity index 100% rename from packages/ui-voip/src/v2/utils/convertAvatarUrlToPng.ts rename to packages/ui-voip/src/utils/convertAvatarUrlToPng.ts diff --git a/packages/ui-voip/src/v2/index.ts b/packages/ui-voip/src/v2/index.ts deleted file mode 100644 index d6e5aded77eaf..0000000000000 --- a/packages/ui-voip/src/v2/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { useMediaCallContext, useMediaCallExternalContext, default as MediaCallContext } from './MediaCallContext'; -export type { PeerInfo } from './MediaCallContext'; -export { default as MediaCallWidget } from './MediaCallWidget'; -export { useMediaCallAction } from './useMediaCallAction'; diff --git a/packages/ui-voip/src/v2/views/IncomingCall.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/IncomingCall.stories.tsx similarity index 91% rename from packages/ui-voip/src/v2/views/IncomingCall.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/IncomingCall.stories.tsx index ffc34e625c3c6..0b97769206685 100644 --- a/packages/ui-voip/src/v2/views/IncomingCall.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/IncomingCall.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import IncomingCall from './IncomingCall'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/views/IncomingCall.tsx b/packages/ui-voip/src/views/MediaCallWidget/IncomingCall.tsx similarity index 90% rename from packages/ui-voip/src/v2/views/IncomingCall.tsx rename to packages/ui-voip/src/views/MediaCallWidget/IncomingCall.tsx index 5ded8e7415495..6a22a99040ce9 100644 --- a/packages/ui-voip/src/v2/views/IncomingCall.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/IncomingCall.tsx @@ -1,8 +1,8 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext } from '../MediaCallContext'; -import { DevicePicker, PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent } from '../components'; +import { DevicePicker, PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent } from '../../components'; +import { useMediaCallContext } from '../../context'; const IncomingCall = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/views/IncomingCallTransfer.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.stories.tsx similarity index 92% rename from packages/ui-voip/src/v2/views/IncomingCallTransfer.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.stories.tsx index a0a48f3de288c..3cae7e88530e7 100644 --- a/packages/ui-voip/src/v2/views/IncomingCallTransfer.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import IncomingCallTransfer from './IncomingCallTransfer'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/views/IncomingCallTransfer.tsx b/packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.tsx similarity index 89% rename from packages/ui-voip/src/v2/views/IncomingCallTransfer.tsx rename to packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.tsx index aad6c4fedc5fb..c90aa674399d8 100644 --- a/packages/ui-voip/src/v2/views/IncomingCallTransfer.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/IncomingCallTransfer.tsx @@ -1,8 +1,8 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext } from '../MediaCallContext'; -import { DevicePicker, PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, WidgetInfo } from '../components'; +import { DevicePicker, PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, WidgetInfo } from '../../components'; +import { useMediaCallContext } from '../../context'; const IncomingCallTransfer = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/MediaCallWidget.spec.tsx b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.spec.tsx similarity index 100% rename from packages/ui-voip/src/v2/MediaCallWidget.spec.tsx rename to packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.spec.tsx diff --git a/packages/ui-voip/src/v2/MediaCallWidget.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.stories.tsx similarity index 93% rename from packages/ui-voip/src/v2/MediaCallWidget.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.stories.tsx index 4fe83d06c602e..b155f7b3dffd9 100644 --- a/packages/ui-voip/src/v2/MediaCallWidget.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.stories.tsx @@ -2,9 +2,8 @@ import { Button } from '@rocket.chat/fuselage'; import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn, StoryObj } from '@storybook/react'; -import { useMediaCallContext } from './MediaCallContext'; import MediaCallWidget from './MediaCallWidget'; -import MockedMediaCallProvider from './MockedMediaCallProvider'; +import { useMediaCallContext, MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/MediaCallWidget.tsx b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx similarity index 84% rename from packages/ui-voip/src/v2/MediaCallWidget.tsx rename to packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx index dbc2d4dd8a041..58ddd06bfd780 100644 --- a/packages/ui-voip/src/v2/MediaCallWidget.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/MediaCallWidget.tsx @@ -1,5 +1,5 @@ -import { useMediaCallContext } from './MediaCallContext'; -import { OngoingCall, NewCall, IncomingCall, OutgoingCall, IncomingCallTransfer, OutgoingCallTransfer } from './views'; +import { OngoingCall, NewCall, IncomingCall, OutgoingCall, IncomingCallTransfer, OutgoingCallTransfer } from '..'; +import { useMediaCallContext } from '../../context'; const MediaCallWidget = () => { const { state, hidden, transferredBy } = useMediaCallContext(); diff --git a/packages/ui-voip/src/v2/views/NewCall.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/NewCall.stories.tsx similarity index 90% rename from packages/ui-voip/src/v2/views/NewCall.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/NewCall.stories.tsx index 953485f7c4921..c365151de26a4 100644 --- a/packages/ui-voip/src/v2/views/NewCall.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/NewCall.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import NewCall from './NewCall'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/views/NewCall.tsx b/packages/ui-voip/src/views/MediaCallWidget/NewCall.tsx similarity index 91% rename from packages/ui-voip/src/v2/views/NewCall.tsx rename to packages/ui-voip/src/views/MediaCallWidget/NewCall.tsx index f47c106449358..d83f72264507c 100644 --- a/packages/ui-voip/src/v2/views/NewCall.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/NewCall.tsx @@ -1,7 +1,6 @@ import { Box, Button, ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext, usePeerAutocomplete } from '../MediaCallContext'; import { PeerInfo, PeerAutocomplete, @@ -12,7 +11,8 @@ import { WidgetContent, DevicePicker, ActionButton, -} from '../components'; +} from '../../components'; +import { useMediaCallContext, usePeerAutocomplete } from '../../context'; const NewCall = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/views/OngoingCall.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/OngoingCall.stories.tsx similarity index 96% rename from packages/ui-voip/src/v2/views/OngoingCall.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OngoingCall.stories.tsx index a8158cfb388a4..d97afe302369d 100644 --- a/packages/ui-voip/src/v2/views/OngoingCall.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OngoingCall.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import OngoingCall from './OngoingCall'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot().buildStoryDecorator(); diff --git a/packages/ui-voip/src/v2/views/OngoingCall.tsx b/packages/ui-voip/src/views/MediaCallWidget/OngoingCall.tsx similarity index 92% rename from packages/ui-voip/src/v2/views/OngoingCall.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OngoingCall.tsx index df07a09706173..f1827c563e69e 100644 --- a/packages/ui-voip/src/v2/views/OngoingCall.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OngoingCall.tsx @@ -1,7 +1,6 @@ import { ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext } from '../MediaCallContext'; import { ToggleButton, PeerInfo, @@ -14,9 +13,10 @@ import { Timer, DevicePicker, ActionButton, -} from '../components'; -import { useInfoSlots } from '../useInfoSlots'; -import { useKeypad } from '../useKeypad'; + useKeypad, + useInfoSlots, +} from '../../components'; +import { useMediaCallContext } from '../../context'; const OngoingCall = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/views/OutgoingCall.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.stories.tsx similarity index 90% rename from packages/ui-voip/src/v2/views/OutgoingCall.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.stories.tsx index fb02940f146c0..748f187a290f9 100644 --- a/packages/ui-voip/src/v2/views/OutgoingCall.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import OutgoingCall from './OutgoingCall'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/views/OutgoingCall.tsx b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.tsx similarity index 89% rename from packages/ui-voip/src/v2/views/OutgoingCall.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.tsx index 26dd5338bb9e2..94c669980aef8 100644 --- a/packages/ui-voip/src/v2/views/OutgoingCall.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCall.tsx @@ -1,8 +1,8 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext } from '../MediaCallContext'; -import { PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, DevicePicker } from '../components'; +import { PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, DevicePicker } from '../../components'; +import { useMediaCallContext } from '../../context'; const OutgoingCall = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/views/OutgoingCallTransfer.stories.tsx b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.stories.tsx similarity index 92% rename from packages/ui-voip/src/v2/views/OutgoingCallTransfer.stories.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.stories.tsx index f64fe038b7305..a7735a90b962c 100644 --- a/packages/ui-voip/src/v2/views/OutgoingCallTransfer.stories.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.stories.tsx @@ -2,7 +2,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import OutgoingCallTransfer from './OutgoingCallTransfer'; -import MockedMediaCallProvider from '../MockedMediaCallProvider'; +import { MockedMediaCallProvider } from '../../context'; const mockedContexts = mockAppRoot() .withTranslations('en', 'core', { diff --git a/packages/ui-voip/src/v2/views/OutgoingCallTransfer.tsx b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.tsx similarity index 89% rename from packages/ui-voip/src/v2/views/OutgoingCallTransfer.tsx rename to packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.tsx index 3fb07e2f94336..ef98641fe6999 100644 --- a/packages/ui-voip/src/v2/views/OutgoingCallTransfer.tsx +++ b/packages/ui-voip/src/views/MediaCallWidget/OutgoingCallTransfer.tsx @@ -1,8 +1,8 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; import { useTranslation } from 'react-i18next'; -import { useMediaCallContext } from '../MediaCallContext'; -import { PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, DevicePicker, WidgetInfo } from '../components'; +import { PeerInfo, Widget, WidgetFooter, WidgetHandle, WidgetHeader, WidgetContent, DevicePicker, WidgetInfo } from '../../components'; +import { useMediaCallContext } from '../../context'; const OutgoingCallTransfer = () => { const { t } = useTranslation(); diff --git a/packages/ui-voip/src/v2/__snapshots__/MediaCallWidget.spec.tsx.snap b/packages/ui-voip/src/views/MediaCallWidget/__snapshots__/MediaCallWidget.spec.tsx.snap similarity index 100% rename from packages/ui-voip/src/v2/__snapshots__/MediaCallWidget.spec.tsx.snap rename to packages/ui-voip/src/views/MediaCallWidget/__snapshots__/MediaCallWidget.spec.tsx.snap diff --git a/packages/ui-voip/src/v2/views/index.ts b/packages/ui-voip/src/views/MediaCallWidget/index.ts similarity index 85% rename from packages/ui-voip/src/v2/views/index.ts rename to packages/ui-voip/src/views/MediaCallWidget/index.ts index 163a89d90b8a9..8dc9f32853fcd 100644 --- a/packages/ui-voip/src/v2/views/index.ts +++ b/packages/ui-voip/src/views/MediaCallWidget/index.ts @@ -4,3 +4,4 @@ export { default as IncomingCall } from './IncomingCall'; export { default as OutgoingCall } from './OutgoingCall'; export { default as IncomingCallTransfer } from './IncomingCallTransfer'; export { default as OutgoingCallTransfer } from './OutgoingCallTransfer'; +export { default as MediaCallWidget } from './MediaCallWidget'; diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx b/packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.spec.tsx similarity index 100% rename from packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx rename to packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.spec.tsx diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx b/packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.stories.tsx similarity index 100% rename from packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx rename to packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.stories.tsx diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx b/packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.tsx similarity index 100% rename from packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx rename to packages/ui-voip/src/views/PermissionFlow/PermissionFlowModal.tsx diff --git a/packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap b/packages/ui-voip/src/views/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap similarity index 100% rename from packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap rename to packages/ui-voip/src/views/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap diff --git a/packages/ui-voip/src/v2/TransferModal.tsx b/packages/ui-voip/src/views/TransferModal.tsx similarity index 91% rename from packages/ui-voip/src/v2/TransferModal.tsx rename to packages/ui-voip/src/views/TransferModal.tsx index 7f0b7a6c11fdc..54c80332e752e 100644 --- a/packages/ui-voip/src/v2/TransferModal.tsx +++ b/packages/ui-voip/src/views/TransferModal.tsx @@ -12,9 +12,8 @@ import { import { useId, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { usePeerAutocomplete } from './MediaCallContext'; -import type { PeerInfo as PeerInfoType } from './MediaCallContext'; -import { PeerAutocomplete, PeerInfo } from './components'; +import { PeerAutocomplete, PeerInfo } from '../components'; +import { usePeerAutocomplete, type PeerInfo as PeerInfoType } from '../context'; type TransferModalProps = { onCancel(): void; diff --git a/packages/ui-voip/src/views/index.ts b/packages/ui-voip/src/views/index.ts new file mode 100644 index 0000000000000..1deba45f179e7 --- /dev/null +++ b/packages/ui-voip/src/views/index.ts @@ -0,0 +1,3 @@ +export { default as TransferModal } from './TransferModal'; +export * from './MediaCallWidget'; +export { default as PermissionFlowModal, type PermissionFlowModalType } from './PermissionFlow/PermissionFlowModal'; From 33e5015d75d50ea90ec37d0d0cd5ef8841d73c03 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 25 Nov 2025 17:03:09 -0300 Subject: [PATCH 020/302] chore(ui-avatar): Review build configuration (#37608) --- packages/ui-avatar/.eslintignore | 1 - packages/ui-avatar/.eslintrc.json | 65 +------------------ packages/ui-avatar/package.json | 25 ++++--- .../ui-avatar/src/components/AppAvatar.tsx | 3 +- .../ui-avatar/src/components/RoomAvatar.tsx | 3 +- ...sconfig-build.json => tsconfig.build.json} | 0 yarn.lock | 1 - 7 files changed, 18 insertions(+), 80 deletions(-) delete mode 100644 packages/ui-avatar/.eslintignore rename packages/ui-avatar/{tsconfig-build.json => tsconfig.build.json} (100%) diff --git a/packages/ui-avatar/.eslintignore b/packages/ui-avatar/.eslintignore deleted file mode 100644 index 608841ff3853c..0000000000000 --- a/packages/ui-avatar/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -!.storybook diff --git a/packages/ui-avatar/.eslintrc.json b/packages/ui-avatar/.eslintrc.json index d5db8560f3e86..341a302833736 100644 --- a/packages/ui-avatar/.eslintrc.json +++ b/packages/ui-avatar/.eslintrc.json @@ -1,65 +1,4 @@ { - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "@rocket.chat/eslint-config/original", - "@rocket.chat/eslint-config/react", - "prettier", - "plugin:anti-trojan-source/recommended", - "plugin:react/jsx-runtime", - "plugin:storybook/recommended" - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "func-call-spacing": "off", - "import/named": "error", - "import/order": [ - "error", - { - "newlines-between": "always", - "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], - "alphabetize": { - "order": "asc" - } - } - ], - "indent": "off", - "jsx-quotes": ["error", "prefer-single"], - "new-cap": ["error"], - "no-extra-parens": "off", - "no-spaced-func": "off", - "no-undef": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "no-use-before-define": "off", - "prefer-arrow-callback": ["error", { "allowNamedFunctions": true }], - "prettier/prettier": 2 - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts", ".tsx"] - } - } - }, - "ignorePatterns": ["**/dist"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/prefer-optional-chain": "warn" - } - } - ] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react"], + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 8faba0286edf8..5d919d7bda9af 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -2,8 +2,19 @@ "name": "@rocket.chat/ui-avatar", "version": "20.0.0", "private": true, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, "devDependencies": { - "@babel/core": "~7.28.5", "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/fuselage": "~0.68.1", @@ -23,18 +34,6 @@ "react-virtuoso": "^4.12.0", "typescript": "~5.9.3" }, - "scripts": { - "lint": "eslint --ext .js,.jsx,.ts,.tsx .", - "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "build": "rm -rf dist && tsc -p tsconfig-build.json", - "typecheck": "tsc -p tsconfig.json --noEmit", - "dev": "tsc -p tsconfig-build.json --watch --preserveWatchOutput" - }, - "main": "./dist/index.js", - "typings": "./dist/index.d.ts", - "files": [ - "/dist" - ], "peerDependencies": { "@rocket.chat/fuselage": "*", "@rocket.chat/ui-contexts": "workspace:^", diff --git a/packages/ui-avatar/src/components/AppAvatar.tsx b/packages/ui-avatar/src/components/AppAvatar.tsx index 35ec3e1cdd9ab..277e3ab572055 100644 --- a/packages/ui-avatar/src/components/AppAvatar.tsx +++ b/packages/ui-avatar/src/components/AppAvatar.tsx @@ -1,6 +1,7 @@ import type { ReactElement } from 'react'; -import BaseAvatar, { BaseAvatarProps } from './BaseAvatar'; +import type { BaseAvatarProps } from './BaseAvatar'; +import BaseAvatar from './BaseAvatar'; type AppAvatarProps = Pick & { iconFileContent: string; diff --git a/packages/ui-avatar/src/components/RoomAvatar.tsx b/packages/ui-avatar/src/components/RoomAvatar.tsx index c94565686624c..9632b2bf6b5fc 100644 --- a/packages/ui-avatar/src/components/RoomAvatar.tsx +++ b/packages/ui-avatar/src/components/RoomAvatar.tsx @@ -2,7 +2,8 @@ import { useRoomAvatarPath } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import { memo } from 'react'; -import Avatar, { BaseAvatarProps } from './BaseAvatar'; +import type { BaseAvatarProps } from './BaseAvatar'; +import Avatar from './BaseAvatar'; type RoomAvatarProps = Pick & { url?: string; diff --git a/packages/ui-avatar/tsconfig-build.json b/packages/ui-avatar/tsconfig.build.json similarity index 100% rename from packages/ui-avatar/tsconfig-build.json rename to packages/ui-avatar/tsconfig.build.json diff --git a/yarn.lock b/yarn.lock index 81934e8873ac2..2a6b0109183da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10266,7 +10266,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar" dependencies: - "@babel/core": "npm:~7.28.5" "@rocket.chat/core-typings": "workspace:~" "@rocket.chat/emitter": "npm:~0.31.25" "@rocket.chat/fuselage": "npm:~0.68.1" From 427f4eff0d382dda81a81dd4d17407dc9919942c Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 25 Nov 2025 17:27:37 -0300 Subject: [PATCH 021/302] chore(ui-client): Review build configuration (#37607) --- packages/ui-client/.babelrc.json | 9 --- packages/ui-client/.eslintignore | 1 - packages/ui-client/.eslintrc.json | 65 +------------------ packages/ui-client/package.json | 7 +- .../ui-client/src/components/AnchorPortal.tsx | 3 +- .../AnnouncementBanner.stories.tsx | 2 +- .../src/components/DotLeader.stories.tsx | 2 +- .../ui-client/src/components/DotLeader.tsx | 8 ++- .../EmojiPicker/EmojiPickerCategoryHeader.tsx | 6 +- .../EmojiPickerCategoryWrapper.tsx | 6 +- .../ui-client/src/components/ExternalLink.tsx | 6 +- .../FeaturePreview/FeaturePreview.spec.tsx | 4 +- .../FeaturePreview/FeaturePreview.tsx | 25 +++---- .../FeaturePreview/FeaturePreviewOff.tsx | 10 +++ .../FeaturePreview/FeaturePreviewOn.tsx | 10 +++ .../src/components/FeaturePreview/index.ts | 4 +- .../src/components/Header/Header.stories.tsx | 2 +- .../src/components/Header/Header.tsx | 6 +- .../src/components/Header/HeaderAvatar.tsx | 6 +- .../src/components/Header/HeaderContent.tsx | 6 +- .../components/Header/HeaderContentRow.tsx | 6 +- .../src/components/Header/HeaderDivider.tsx | 3 +- .../src/components/Header/HeaderIcon.tsx | 4 +- .../src/components/Header/HeaderState.tsx | 6 +- .../src/components/Header/HeaderSubtitle.tsx | 6 +- .../components/Header/HeaderTag/HeaderTag.tsx | 6 +- .../Header/HeaderTag/HeaderTagIcon.tsx | 8 +-- .../Header/HeaderTag/HeaderTagSkeleton.tsx | 3 +- .../src/components/Header/HeaderTitle.tsx | 8 +-- .../components/Header/HeaderTitleButton.tsx | 6 +- .../Header/HeaderToolbar/HeaderToolbar.tsx | 6 +- .../HeaderToolbar/HeaderToolbarAction.tsx | 5 +- .../HeaderToolbarActionBadge.tsx | 8 ++- .../HeaderToolbar/HeaderToolbarDivider.tsx | 3 +- .../components/HeaderV2/Header.stories.tsx | 4 +- .../src/components/HeaderV2/HeaderIcon.tsx | 4 +- .../HeaderV2/HeaderTag/HeaderTag.tsx | 4 +- .../HeaderV2/HeaderTag/HeaderTagIcon.tsx | 4 +- .../HeaderV2/HeaderToolbar/HeaderToolbar.tsx | 5 +- .../HeaderToolbar/HeaderToolbarAction.tsx | 5 +- .../Modal/GenericModal/GenericModal.tsx | 4 +- .../GenericModal/GenericModalSkeleton.tsx | 4 +- .../Modal/GenericModal/withDoNotAskAgain.tsx | 5 +- .../src/components/Modal/ModalBackdrop.tsx | 4 +- .../src/components/Modal/ModalRegion.tsx | 5 +- .../MultiSelectCustom/MultiSelectCustom.tsx | 9 +-- .../MultiSelectCustomAnchor.tsx | 4 +- .../MultiSelectCustomListWrapper.tsx | 6 +- .../src/components/TextSeparator.stories.tsx | 3 +- .../src/components/TextSeparator.tsx | 6 +- .../src/components/TooltipComponent.tsx | 4 +- .../UserAutoComplete/UserAutoComplete.tsx | 10 +-- .../src/components/UserStatus/Away.tsx | 6 +- .../src/components/UserStatus/Busy.tsx | 7 +- .../src/components/UserStatus/Loading.tsx | 7 +- .../src/components/UserStatus/Offline.tsx | 7 +- .../src/components/UserStatus/Online.tsx | 7 +- .../UserStatus/UserStatus.stories.tsx | 2 +- .../src/components/UserStatus/UserStatus.tsx | 6 +- .../src/components/Wizard/Wizard.tsx | 5 +- .../Wizard/WizardActions.stories.tsx | 4 +- .../src/components/Wizard/WizardActions.tsx | 2 +- .../components/Wizard/WizardBackButton.tsx | 4 +- .../components/Wizard/WizardNextButton.tsx | 4 +- .../Wizard/mocks/createMockWizardApi.ts | 2 +- .../ui-client/src/helpers/imperativeModal.tsx | 4 +- .../hooks/usePreferenceFeaturePreviewList.ts | 3 +- yarn.lock | 1 - 68 files changed, 197 insertions(+), 230 deletions(-) delete mode 100644 packages/ui-client/.babelrc.json delete mode 100644 packages/ui-client/.eslintignore create mode 100644 packages/ui-client/src/components/FeaturePreview/FeaturePreviewOff.tsx create mode 100644 packages/ui-client/src/components/FeaturePreview/FeaturePreviewOn.tsx diff --git a/packages/ui-client/.babelrc.json b/packages/ui-client/.babelrc.json deleted file mode 100644 index f474986efbca9..0000000000000 --- a/packages/ui-client/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - ["@babel/preset-react", { - "runtime": "automatic" - }], - "@babel/preset-typescript" - ] -} diff --git a/packages/ui-client/.eslintignore b/packages/ui-client/.eslintignore deleted file mode 100644 index 608841ff3853c..0000000000000 --- a/packages/ui-client/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -!.storybook diff --git a/packages/ui-client/.eslintrc.json b/packages/ui-client/.eslintrc.json index d5db8560f3e86..6e0406abd46a7 100644 --- a/packages/ui-client/.eslintrc.json +++ b/packages/ui-client/.eslintrc.json @@ -1,65 +1,4 @@ { - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "@rocket.chat/eslint-config/original", - "@rocket.chat/eslint-config/react", - "prettier", - "plugin:anti-trojan-source/recommended", - "plugin:react/jsx-runtime", - "plugin:storybook/recommended" - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "func-call-spacing": "off", - "import/named": "error", - "import/order": [ - "error", - { - "newlines-between": "always", - "groups": ["builtin", "external", "internal", ["parent", "sibling", "index"]], - "alphabetize": { - "order": "asc" - } - } - ], - "indent": "off", - "jsx-quotes": ["error", "prefer-single"], - "new-cap": ["error"], - "no-extra-parens": "off", - "no-spaced-func": "off", - "no-undef": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "no-use-before-define": "off", - "prefer-arrow-callback": ["error", { "allowNamedFunctions": true }], - "prettier/prettier": 2 - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts", ".tsx"] - } - } - }, - "ignorePatterns": ["**/dist"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/prefer-optional-chain": "warn" - } - } - ] + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "plugin:storybook/recommended"], + "ignorePatterns": ["dist", "storybook-static", "!.storybook"] } diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 1da04ff1f3c77..9cd3f1cb1e484 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -17,8 +17,10 @@ "testunit": "jest", "typecheck": "tsc --noEmit" }, + "dependencies": { + "dompurify": "~3.2.7" + }, "devDependencies": { - "@babel/core": "~7.28.5", "@react-aria/toolbar": "^3.0.0-nightly.5042", "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/css-in-js": "~0.31.25", @@ -68,8 +70,5 @@ }, "volta": { "extends": "../../package.json" - }, - "dependencies": { - "dompurify": "~3.2.7" } } diff --git a/packages/ui-client/src/components/AnchorPortal.tsx b/packages/ui-client/src/components/AnchorPortal.tsx index c0d01122c2cf8..83a4bd2a46162 100644 --- a/packages/ui-client/src/components/AnchorPortal.tsx +++ b/packages/ui-client/src/components/AnchorPortal.tsx @@ -1,4 +1,5 @@ -import { ReactNode, useLayoutEffect } from 'react'; +import type { ReactNode } from 'react'; +import { useLayoutEffect } from 'react'; import { createPortal } from 'react-dom'; import { ensureAnchorElement, refAnchorElement, unrefAnchorElement } from '../helpers/anchors'; diff --git a/packages/ui-client/src/components/AnnouncementBanner/AnnouncementBanner.stories.tsx b/packages/ui-client/src/components/AnnouncementBanner/AnnouncementBanner.stories.tsx index 165c0154d3361..4459c7d419c25 100644 --- a/packages/ui-client/src/components/AnnouncementBanner/AnnouncementBanner.stories.tsx +++ b/packages/ui-client/src/components/AnnouncementBanner/AnnouncementBanner.stories.tsx @@ -1,5 +1,5 @@ import { action } from '@storybook/addon-actions'; -import { Meta, StoryFn } from '@storybook/react'; +import type { Meta, StoryFn } from '@storybook/react'; import AnnouncementBanner from './AnnouncementBanner'; diff --git a/packages/ui-client/src/components/DotLeader.stories.tsx b/packages/ui-client/src/components/DotLeader.stories.tsx index 658ffc8131527..5bac732351f56 100644 --- a/packages/ui-client/src/components/DotLeader.stories.tsx +++ b/packages/ui-client/src/components/DotLeader.stories.tsx @@ -1,7 +1,7 @@ import { Box } from '@rocket.chat/fuselage'; import type { Meta, StoryFn } from '@storybook/react'; -import { DotLeader } from './DotLeader'; +import DotLeader from './DotLeader'; export default { title: 'Components/DotLeader', diff --git a/packages/ui-client/src/components/DotLeader.tsx b/packages/ui-client/src/components/DotLeader.tsx index 8340ba22d65e1..5a9b1db5fb568 100644 --- a/packages/ui-client/src/components/DotLeader.tsx +++ b/packages/ui-client/src/components/DotLeader.tsx @@ -1,11 +1,13 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, CSSProperties } from 'react'; +import type { CSSProperties } from 'react'; -type DotLeaderProps = { +export type DotLeaderProps = { color?: CSSProperties['borderColor']; dotSize?: CSSProperties['borderBlockEndWidth']; }; -export const DotLeader: FC = ({ color = 'neutral-300', dotSize = 'x2' }) => ( +const DotLeader = ({ color = 'neutral-300', dotSize = 'x2' }: DotLeaderProps) => ( ); + +export default DotLeader; diff --git a/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryHeader.tsx b/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryHeader.tsx index 509af85c68fe0..2a85ad0ba1e87 100644 --- a/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryHeader.tsx +++ b/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryHeader.tsx @@ -1,7 +1,9 @@ import { ButtonGroup, Box } from '@rocket.chat/fuselage'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const EmojiPickerCategoryHeader = (props: ComponentProps) => ( +export type EmojiPickerCategoryHeaderProps = ComponentPropsWithoutRef; + +const EmojiPickerCategoryHeader = (props: EmojiPickerCategoryHeaderProps) => ( diff --git a/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryWrapper.tsx b/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryWrapper.tsx index 306fc7203bffb..6093f6ea7e0ec 100644 --- a/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryWrapper.tsx +++ b/packages/ui-client/src/components/EmojiPicker/EmojiPickerCategoryWrapper.tsx @@ -1,6 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const EmojiPickerCategoryWrapper = (props: ComponentProps) => ; +export type EmojiPickerCategoryWrapperProps = ComponentPropsWithoutRef; + +const EmojiPickerCategoryWrapper = (props: EmojiPickerCategoryWrapperProps) => ; export default EmojiPickerCategoryWrapper; diff --git a/packages/ui-client/src/components/ExternalLink.tsx b/packages/ui-client/src/components/ExternalLink.tsx index 0e7ef7a56148b..65eb688085b15 100644 --- a/packages/ui-client/src/components/ExternalLink.tsx +++ b/packages/ui-client/src/components/ExternalLink.tsx @@ -1,11 +1,11 @@ import { Box } from '@rocket.chat/fuselage'; -import type { ComponentProps, FC } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; type ExternalLinkProps = { to: string; -} & ComponentProps; +} & ComponentPropsWithoutRef; -export const ExternalLink: FC = ({ children, to, ...props }) => ( +export const ExternalLink = ({ children, to, ...props }: ExternalLinkProps) => ( {children || to} diff --git a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx index 615887e10402c..14a8eb4dfdccb 100644 --- a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx +++ b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx @@ -1,7 +1,9 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { render, screen } from '@testing-library/react'; -import { FeaturePreview, FeaturePreviewOff, FeaturePreviewOn } from './FeaturePreview'; +import FeaturePreview from './FeaturePreview'; +import FeaturePreviewOff from './FeaturePreviewOff'; +import FeaturePreviewOn from './FeaturePreviewOn'; test('should renders off if the feature is disabled', async () => { render( diff --git a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.tsx b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.tsx index 1f537ef9d3897..1d40e89a07854 100644 --- a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.tsx +++ b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.tsx @@ -1,19 +1,16 @@ -/* eslint-disable react/no-multi-comp */ -import type { ReactElement, ReactNode } from 'react'; +import type { ReactElement } from 'react'; import { Children, Suspense, cloneElement } from 'react'; import { useFeaturePreview } from '../../hooks/useFeaturePreview'; -import { FeaturesAvailable } from '../../hooks/useFeaturePreviewList'; +import type { FeaturesAvailable } from '../../hooks/useFeaturePreviewList'; -export const FeaturePreview = ({ - feature, - disabled = false, - children, -}: { - disabled?: boolean; +export type FeaturePreviewProps = { feature: FeaturesAvailable; + disabled?: boolean; children: ReactElement<{ featureToggleEnabled?: boolean }>[]; -}) => { +}; + +const FeaturePreview = ({ feature, disabled = false, children }: FeaturePreviewProps) => { const featureToggleEnabled = useFeaturePreview(feature) && !disabled; const toggledChildren = Children.map(children, (child) => @@ -25,10 +22,4 @@ export const FeaturePreview = ({ return {toggledChildren}; }; -export const FeaturePreviewOn = ({ children, featureToggleEnabled }: { children: ReactNode; featureToggleEnabled?: boolean }) => ( - <>{featureToggleEnabled && children} -); - -export const FeaturePreviewOff = ({ children, featureToggleEnabled }: { children: ReactNode; featureToggleEnabled?: boolean }) => ( - <>{!featureToggleEnabled && children} -); +export default FeaturePreview; diff --git a/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOff.tsx b/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOff.tsx new file mode 100644 index 0000000000000..3b7ac103b47fe --- /dev/null +++ b/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOff.tsx @@ -0,0 +1,10 @@ +import type { ReactNode } from 'react'; + +export type FeaturePreviewOnProps = { + children: ReactNode; + featureToggleEnabled?: boolean; +}; + +const FeaturePreviewOff = ({ children, featureToggleEnabled }: FeaturePreviewOnProps) => <>{!featureToggleEnabled && children}; + +export default FeaturePreviewOff; diff --git a/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOn.tsx b/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOn.tsx new file mode 100644 index 0000000000000..a6fc6c3b284b9 --- /dev/null +++ b/packages/ui-client/src/components/FeaturePreview/FeaturePreviewOn.tsx @@ -0,0 +1,10 @@ +import type { ReactNode } from 'react'; + +export type FeaturePreviewOnProps = { + children: ReactNode; + featureToggleEnabled?: boolean; +}; + +const FeaturePreviewOn = ({ children, featureToggleEnabled }: FeaturePreviewOnProps) => <>{featureToggleEnabled && children}; + +export default FeaturePreviewOn; diff --git a/packages/ui-client/src/components/FeaturePreview/index.ts b/packages/ui-client/src/components/FeaturePreview/index.ts index f6b8e5f2071e7..9d23e58b4e050 100644 --- a/packages/ui-client/src/components/FeaturePreview/index.ts +++ b/packages/ui-client/src/components/FeaturePreview/index.ts @@ -1,2 +1,4 @@ -export { FeaturePreview, FeaturePreviewOn, FeaturePreviewOff } from './FeaturePreview'; +export { default as FeaturePreview } from './FeaturePreview'; export { default as FeaturePreviewBadge } from './FeaturePreviewBadge'; +export { default as FeaturePreviewOn } from './FeaturePreviewOn'; +export { default as FeaturePreviewOff } from './FeaturePreviewOff'; diff --git a/packages/ui-client/src/components/Header/Header.stories.tsx b/packages/ui-client/src/components/Header/Header.stories.tsx index cb3b006cc82bf..60bd3732722b3 100644 --- a/packages/ui-client/src/components/Header/Header.stories.tsx +++ b/packages/ui-client/src/components/Header/Header.stories.tsx @@ -3,7 +3,7 @@ import { Avatar, IconButton } from '@rocket.chat/fuselage'; import { SettingsContext } from '@rocket.chat/ui-contexts'; import { action } from '@storybook/addon-actions'; import type { Meta } from '@storybook/react'; -import { ComponentType } from 'react'; +import type { ComponentType } from 'react'; import { Header, diff --git a/packages/ui-client/src/components/Header/Header.tsx b/packages/ui-client/src/components/Header/Header.tsx index c204b4d4bc0d9..df8026b356bba 100644 --- a/packages/ui-client/src/components/Header/Header.tsx +++ b/packages/ui-client/src/components/Header/Header.tsx @@ -1,10 +1,12 @@ import { Box } from '@rocket.chat/fuselage'; import { useLayout } from '@rocket.chat/ui-contexts'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; import HeaderDivider from './HeaderDivider'; -const Header: FC> = (props) => { +export type HeaderProps = ComponentPropsWithoutRef; + +const Header = (props: HeaderProps) => { const { isMobile } = useLayout(); return ( diff --git a/packages/ui-client/src/components/Header/HeaderAvatar.tsx b/packages/ui-client/src/components/Header/HeaderAvatar.tsx index b650a1c898dad..c70660324fde1 100644 --- a/packages/ui-client/src/components/Header/HeaderAvatar.tsx +++ b/packages/ui-client/src/components/Header/HeaderAvatar.tsx @@ -1,6 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderAvatar: FC> = (props) => ; +export type HeaderAvatarProps = ComponentPropsWithoutRef; + +const HeaderAvatar = (props: HeaderAvatarProps) => ; export default HeaderAvatar; diff --git a/packages/ui-client/src/components/Header/HeaderContent.tsx b/packages/ui-client/src/components/Header/HeaderContent.tsx index 2b3fe0e369cdc..bd94ade6999bf 100644 --- a/packages/ui-client/src/components/Header/HeaderContent.tsx +++ b/packages/ui-client/src/components/Header/HeaderContent.tsx @@ -1,7 +1,9 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderContent: FC> = (props) => ( +export type HeaderContentProps = ComponentPropsWithoutRef; + +const HeaderContent = (props: HeaderContentProps) => ( ); diff --git a/packages/ui-client/src/components/Header/HeaderContentRow.tsx b/packages/ui-client/src/components/Header/HeaderContentRow.tsx index 22f879f1e2c1e..1df01a9785e9a 100644 --- a/packages/ui-client/src/components/Header/HeaderContentRow.tsx +++ b/packages/ui-client/src/components/Header/HeaderContentRow.tsx @@ -1,7 +1,9 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderContentRow: FC> = (props) => ( +export type HeaderContentRowProps = ComponentPropsWithoutRef; + +const HeaderContentRow = (props: HeaderContentRowProps) => ( ); diff --git a/packages/ui-client/src/components/Header/HeaderDivider.tsx b/packages/ui-client/src/components/Header/HeaderDivider.tsx index e9932f44a6a8f..2beadec2d0882 100644 --- a/packages/ui-client/src/components/Header/HeaderDivider.tsx +++ b/packages/ui-client/src/components/Header/HeaderDivider.tsx @@ -1,6 +1,5 @@ import { Divider } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; -const HeaderDivider: FC = () => ; +const HeaderDivider = () => ; export default HeaderDivider; diff --git a/packages/ui-client/src/components/Header/HeaderIcon.tsx b/packages/ui-client/src/components/Header/HeaderIcon.tsx index 82545aafe429c..c811c3c7b7404 100644 --- a/packages/ui-client/src/components/Header/HeaderIcon.tsx +++ b/packages/ui-client/src/components/Header/HeaderIcon.tsx @@ -1,8 +1,8 @@ import { Box, Icon } from '@rocket.chat/fuselage'; -import type { ComponentProps, ReactElement } from 'react'; +import type { ComponentPropsWithoutRef, ReactElement } from 'react'; import { isValidElement } from 'react'; -type HeaderIconProps = { icon: ReactElement | ComponentProps | null }; +export type HeaderIconProps = { icon: ReactElement | ComponentPropsWithoutRef | null }; const HeaderIcon = ({ icon }: HeaderIconProps) => icon && ( diff --git a/packages/ui-client/src/components/Header/HeaderState.tsx b/packages/ui-client/src/components/Header/HeaderState.tsx index 3a21eb949550e..0368175d08f7c 100644 --- a/packages/ui-client/src/components/Header/HeaderState.tsx +++ b/packages/ui-client/src/components/Header/HeaderState.tsx @@ -1,8 +1,8 @@ import { Icon, IconButton } from '@rocket.chat/fuselage'; import type { Keys as IconName } from '@rocket.chat/icons'; -import type { AllHTMLAttributes, ComponentPropsWithoutRef, FC, MouseEventHandler } from 'react'; +import type { AllHTMLAttributes, ComponentPropsWithoutRef, MouseEventHandler } from 'react'; -type HeaderStateProps = +export type HeaderStateProps = | (Pick, 'color' | 'title' | 'icon'> & { onClick: MouseEventHandler; } & Omit, 'is'>) @@ -11,7 +11,7 @@ type HeaderStateProps = onClick?: undefined; }); -const HeaderState: FC = (props) => +const HeaderState = (props: HeaderStateProps) => props.onClick ? : ; export default HeaderState; diff --git a/packages/ui-client/src/components/Header/HeaderSubtitle.tsx b/packages/ui-client/src/components/Header/HeaderSubtitle.tsx index facaadf599c0b..eef2190739743 100644 --- a/packages/ui-client/src/components/Header/HeaderSubtitle.tsx +++ b/packages/ui-client/src/components/Header/HeaderSubtitle.tsx @@ -1,6 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderSubtitle: FC> = (props) => ; +export type HeaderSubtitleProps = ComponentPropsWithoutRef; + +const HeaderSubtitle = (props: HeaderSubtitleProps) => ; export default HeaderSubtitle; diff --git a/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx b/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx index afbad5d734340..2123e2c360c8d 100644 --- a/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx +++ b/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx @@ -1,7 +1,9 @@ import { Box, Tag } from '@rocket.chat/fuselage'; -import type { ComponentProps, FC } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderTag: FC> = ({ children, ...props }) => ( +export type HeaderTagProps = ComponentPropsWithoutRef; + +const HeaderTag = ({ children, ...props }: HeaderTagProps) => ( {children} diff --git a/packages/ui-client/src/components/Header/HeaderTag/HeaderTagIcon.tsx b/packages/ui-client/src/components/Header/HeaderTag/HeaderTagIcon.tsx index b2115aad3d470..f17f1317bb933 100644 --- a/packages/ui-client/src/components/Header/HeaderTag/HeaderTagIcon.tsx +++ b/packages/ui-client/src/components/Header/HeaderTag/HeaderTagIcon.tsx @@ -1,12 +1,12 @@ import { Box, Icon } from '@rocket.chat/fuselage'; -import type { ComponentProps, FC, ReactElement } from 'react'; +import type { ComponentPropsWithoutRef, ReactElement } from 'react'; import { isValidElement } from 'react'; -type HeaderIconProps = { - icon: ReactElement | Pick, 'name' | 'color'> | null; +export type HeaderIconProps = { + icon: ReactElement | Pick, 'name' | 'color'> | null; }; -const HeaderTagIcon: FC = ({ icon }) => { +const HeaderTagIcon = ({ icon }: HeaderIconProps) => { if (!icon) { return null; } diff --git a/packages/ui-client/src/components/Header/HeaderTag/HeaderTagSkeleton.tsx b/packages/ui-client/src/components/Header/HeaderTag/HeaderTagSkeleton.tsx index d22c4c1a642ad..14fecc6c194be 100644 --- a/packages/ui-client/src/components/Header/HeaderTag/HeaderTagSkeleton.tsx +++ b/packages/ui-client/src/components/Header/HeaderTag/HeaderTagSkeleton.tsx @@ -1,6 +1,5 @@ import { Skeleton } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; -const HeaderTagSkeleton: FC = () => ; +const HeaderTagSkeleton = () => ; export default HeaderTagSkeleton; diff --git a/packages/ui-client/src/components/Header/HeaderTitle.tsx b/packages/ui-client/src/components/Header/HeaderTitle.tsx index bf2fce7b4e677..ad5e1023521fe 100644 --- a/packages/ui-client/src/components/Header/HeaderTitle.tsx +++ b/packages/ui-client/src/components/Header/HeaderTitle.tsx @@ -1,8 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC, ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderTitle: FC> = (props) => ( - -); +export type HeaderTitleProps = ComponentPropsWithoutRef; + +const HeaderTitle = (props: HeaderTitleProps) => ; export default HeaderTitle; diff --git a/packages/ui-client/src/components/Header/HeaderTitleButton.tsx b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx index cdfad6c88f06d..69adba8879b08 100644 --- a/packages/ui-client/src/components/Header/HeaderTitleButton.tsx +++ b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx @@ -1,8 +1,10 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, Palette } from '@rocket.chat/fuselage'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderTitleButton = ({ className, ...props }: { className?: string } & ComponentProps) => { +export type HeaderTitleButtonProps = { className?: string } & ComponentPropsWithoutRef; + +const HeaderTitleButton = ({ className, ...props }: HeaderTitleButtonProps) => { const customClass = css` border-width: 1px; border-style: solid; diff --git a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbar.tsx b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbar.tsx index 909814926c553..a8776ba2acbdd 100644 --- a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbar.tsx +++ b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbar.tsx @@ -1,8 +1,10 @@ import { useToolbar } from '@react-aria/toolbar'; import { ButtonGroup } from '@rocket.chat/fuselage'; -import { type ComponentProps, useRef } from 'react'; +import { type ComponentPropsWithoutRef, useRef } from 'react'; -const HeaderToolbar = (props: ComponentProps) => { +export type HeaderToolbarProps = ComponentPropsWithoutRef; + +const HeaderToolbar = (props: HeaderToolbarProps) => { const ref = useRef(null); const { toolbarProps } = useToolbar(props, ref); diff --git a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarAction.tsx b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarAction.tsx index 26d476e67a17b..7e66fa84595a8 100644 --- a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarAction.tsx +++ b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarAction.tsx @@ -1,7 +1,8 @@ import { IconButton } from '@rocket.chat/fuselage'; -import { ComponentProps, forwardRef } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; +import { forwardRef } from 'react'; -type HeaderToolbarActionProps = ComponentProps & { +type HeaderToolbarActionProps = ComponentPropsWithoutRef & { tooltip?: string; }; diff --git a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarActionBadge.tsx b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarActionBadge.tsx index 57f26b06bfd7e..682f04e978970 100644 --- a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarActionBadge.tsx +++ b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarActionBadge.tsx @@ -1,8 +1,10 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, Badge } from '@rocket.chat/fuselage'; -import type { ComponentProps, FC } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -const HeaderToolbarActionActionBadge: FC> = (props) => ( +export type HeaderToolbarActionBadgeProps = ComponentPropsWithoutRef; + +const HeaderToolbarActionBadge = (props: HeaderToolbarActionBadgeProps) => ( > = (props) ); -export default HeaderToolbarActionActionBadge; +export default HeaderToolbarActionBadge; diff --git a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarDivider.tsx b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarDivider.tsx index 52bb2d21222f2..f3823002e88e1 100644 --- a/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarDivider.tsx +++ b/packages/ui-client/src/components/Header/HeaderToolbar/HeaderToolbarDivider.tsx @@ -1,6 +1,5 @@ import { Divider } from '@rocket.chat/fuselage'; -import type { ReactElement } from 'react'; -const HeaderToolbarDivider = (): ReactElement => ; +const HeaderToolbarDivider = () => ; export default HeaderToolbarDivider; diff --git a/packages/ui-client/src/components/HeaderV2/Header.stories.tsx b/packages/ui-client/src/components/HeaderV2/Header.stories.tsx index 62b1e6abb40a3..840e0f1b873c8 100644 --- a/packages/ui-client/src/components/HeaderV2/Header.stories.tsx +++ b/packages/ui-client/src/components/HeaderV2/Header.stories.tsx @@ -3,7 +3,7 @@ import { Avatar, Box, IconButton } from '@rocket.chat/fuselage'; import { SettingsContext } from '@rocket.chat/ui-contexts'; import { action } from '@storybook/addon-actions'; import type { Meta } from '@storybook/react'; -import { ComponentProps, ComponentType } from 'react'; +import type { ComponentPropsWithoutRef, ComponentType } from 'react'; import { HeaderV2 as Header, @@ -87,7 +87,7 @@ const room: IRoom = { _updatedAt: new Date(), } as const; -const CustomAvatar = (props: Omit, 'url'>) => ; +const CustomAvatar = (props: Omit, 'url'>) => ; const icon = { name: 'hash' } as const; export const Default = () => ( diff --git a/packages/ui-client/src/components/HeaderV2/HeaderIcon.tsx b/packages/ui-client/src/components/HeaderV2/HeaderIcon.tsx index 31f3f1733d6e9..9175b66257d32 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderIcon.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderIcon.tsx @@ -1,8 +1,8 @@ import { Box, Icon } from '@rocket.chat/fuselage'; -import type { ComponentProps, ReactElement } from 'react'; +import type { ComponentPropsWithoutRef, ReactElement } from 'react'; import { isValidElement } from 'react'; -type HeaderIconProps = { icon: ReactElement | ComponentProps | null }; +type HeaderIconProps = { icon: ReactElement | ComponentPropsWithoutRef | null }; const HeaderIcon = ({ icon }: HeaderIconProps) => icon && ( diff --git a/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTag.tsx b/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTag.tsx index 222a01dcf4daa..8ea2d6895bfc1 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTag.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTag.tsx @@ -1,7 +1,7 @@ import { Box, Tag } from '@rocket.chat/fuselage'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -type HeaderTagProps = ComponentProps; +type HeaderTagProps = ComponentPropsWithoutRef; const HeaderTag = ({ children, ...props }: HeaderTagProps) => ( diff --git a/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTagIcon.tsx b/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTagIcon.tsx index fd124ea09a10f..3f46570719498 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTagIcon.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderTag/HeaderTagIcon.tsx @@ -1,9 +1,9 @@ import { Box, Icon } from '@rocket.chat/fuselage'; -import type { ComponentProps, ReactElement } from 'react'; +import type { ComponentPropsWithoutRef, ReactElement } from 'react'; import { isValidElement } from 'react'; type HeaderIconProps = { - icon: ReactElement | Pick, 'name' | 'color'> | null; + icon: ReactElement | Pick, 'name' | 'color'> | null; }; const HeaderTagIcon = ({ icon }: HeaderIconProps) => { diff --git a/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbar.tsx b/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbar.tsx index 2c2377a5778aa..df8b1e5b2ad17 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbar.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbar.tsx @@ -1,8 +1,9 @@ import { useToolbar } from '@react-aria/toolbar'; import { ButtonGroup } from '@rocket.chat/fuselage'; -import { type ComponentProps, useRef } from 'react'; +import { useRef } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -type HeaderToolbarProps = ComponentProps; +type HeaderToolbarProps = ComponentPropsWithoutRef; const HeaderToolbar = (props: HeaderToolbarProps) => { const ref = useRef(null); diff --git a/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbarAction.tsx b/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbarAction.tsx index 26d476e67a17b..7e66fa84595a8 100644 --- a/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbarAction.tsx +++ b/packages/ui-client/src/components/HeaderV2/HeaderToolbar/HeaderToolbarAction.tsx @@ -1,7 +1,8 @@ import { IconButton } from '@rocket.chat/fuselage'; -import { ComponentProps, forwardRef } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; +import { forwardRef } from 'react'; -type HeaderToolbarActionProps = ComponentProps & { +type HeaderToolbarActionProps = ComponentPropsWithoutRef & { tooltip?: string; }; diff --git a/packages/ui-client/src/components/Modal/GenericModal/GenericModal.tsx b/packages/ui-client/src/components/Modal/GenericModal/GenericModal.tsx index 8fe78ae7fa788..68d63088383b4 100644 --- a/packages/ui-client/src/components/Modal/GenericModal/GenericModal.tsx +++ b/packages/ui-client/src/components/Modal/GenericModal/GenericModal.tsx @@ -14,7 +14,7 @@ import { } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import type { Keys as IconName } from '@rocket.chat/icons'; -import type { ComponentProps, ReactElement, ReactNode, ComponentPropsWithoutRef } from 'react'; +import type { ReactElement, ReactNode, ComponentPropsWithoutRef } from 'react'; import { useId, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; @@ -46,7 +46,7 @@ const iconMap: Record = { success: 'check', }; -const getButtonProps = (variant: VariantType): ComponentProps => { +const getButtonProps = (variant: VariantType): ComponentPropsWithoutRef => { switch (variant) { case 'danger': return { danger: true }; diff --git a/packages/ui-client/src/components/Modal/GenericModal/GenericModalSkeleton.tsx b/packages/ui-client/src/components/Modal/GenericModal/GenericModalSkeleton.tsx index db08f9273fe39..60d35c3adcb74 100644 --- a/packages/ui-client/src/components/Modal/GenericModal/GenericModalSkeleton.tsx +++ b/packages/ui-client/src/components/Modal/GenericModal/GenericModalSkeleton.tsx @@ -1,9 +1,9 @@ import { Skeleton } from '@rocket.chat/fuselage'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; import GenericModal from './GenericModal'; -const GenericModalSkeleton = (props: ComponentProps) => ( +const GenericModalSkeleton = (props: ComponentPropsWithoutRef) => ( }> diff --git a/packages/ui-client/src/components/Modal/GenericModal/withDoNotAskAgain.tsx b/packages/ui-client/src/components/Modal/GenericModal/withDoNotAskAgain.tsx index 3d0f988953b36..86e73bd53730b 100644 --- a/packages/ui-client/src/components/Modal/GenericModal/withDoNotAskAgain.tsx +++ b/packages/ui-client/src/components/Modal/GenericModal/withDoNotAskAgain.tsx @@ -18,7 +18,10 @@ export type RequiredModalProps = { dontAskAgain?: ReactElement; }; -function withDoNotAskAgain(Component: ComponentType) { +function withDoNotAskAgain( + // eslint-disable-next-line @typescript-eslint/naming-convention + Component: ComponentType, +) { type WrappedComponentProps = DoNotAskAgainProps & Omit; const WrappedComponent = function ({ onConfirm, dontAskAgain, ...props }: WrappedComponentProps) { const t = useTranslation(); diff --git a/packages/ui-client/src/components/Modal/ModalBackdrop.tsx b/packages/ui-client/src/components/Modal/ModalBackdrop.tsx index c70124ad02841..4a11349d10796 100644 --- a/packages/ui-client/src/components/Modal/ModalBackdrop.tsx +++ b/packages/ui-client/src/components/Modal/ModalBackdrop.tsx @@ -1,5 +1,5 @@ import { Box } from '@rocket.chat/fuselage'; -import type { MouseEvent, ReactElement, ReactNode, RefObject } from 'react'; +import type { MouseEvent, ReactNode, RefObject } from 'react'; import { useCallback, useEffect, useRef } from 'react'; const useEscapeKey = (onDismiss: (() => void) | undefined): void => { @@ -72,7 +72,7 @@ type ModalBackdropProps = { onDismiss?: () => void; }; -const ModalBackdrop = ({ children, onDismiss }: ModalBackdropProps): ReactElement => { +const ModalBackdrop = ({ children, onDismiss }: ModalBackdropProps) => { const ref = useRef(null); useEscapeKey(onDismiss); diff --git a/packages/ui-client/src/components/Modal/ModalRegion.tsx b/packages/ui-client/src/components/Modal/ModalRegion.tsx index 76bcc23b48e72..3cafd84ca0157 100644 --- a/packages/ui-client/src/components/Modal/ModalRegion.tsx +++ b/packages/ui-client/src/components/Modal/ModalRegion.tsx @@ -1,14 +1,13 @@ import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { useCurrentModal, useModal } from '@rocket.chat/ui-contexts'; -import type { ReactElement } from 'react'; import { lazy, Suspense } from 'react'; import ModalBackdrop from './ModalBackdrop'; import ModalPortal from './ModalPortal'; -const FocusScope = lazy(() => import('react-aria').then(({ FocusScope }) => ({ default: FocusScope }))); +const FocusScope = lazy(() => import('react-aria').then((module) => ({ default: module.FocusScope }))); -const ModalRegion = (): ReactElement | null => { +const ModalRegion = () => { const currentModal = useCurrentModal(); const { setModal } = useModal(); const handleDismiss = useEffectEvent(() => { diff --git a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx index a6e348ef82e27..4e2b2d053daa8 100644 --- a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx +++ b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx @@ -1,6 +1,7 @@ -import { Box, Button } from '@rocket.chat/fuselage'; +import type { Button } from '@rocket.chat/fuselage'; +import { Box } from '@rocket.chat/fuselage'; import { useButtonPattern, useOutsideClick, useToggle } from '@rocket.chat/fuselage-hooks'; -import type { ComponentProps, FormEvent, ReactElement, RefObject } from 'react'; +import type { ComponentPropsWithoutRef, FormEvent, RefObject } from 'react'; import { useCallback, useRef } from 'react'; import MultiSelectCustomAnchor from './MultiSelectCustomAnchor'; @@ -47,7 +48,7 @@ type DropDownProps = { selectedOptions: OptionProp[]; setSelectedOptions: (roles: OptionProp[]) => void; searchBarText?: string; -} & ComponentProps; +} & ComponentPropsWithoutRef; export const MultiSelectCustom = ({ dropdownOptions, @@ -57,7 +58,7 @@ export const MultiSelectCustom = ({ setSelectedOptions, searchBarText, ...props -}: DropDownProps): ReactElement => { +}: DropDownProps) => { const reference = useRef(null); const target = useRef(null); const [collapsed, toggleCollapsed] = useToggle(false); diff --git a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomAnchor.tsx b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomAnchor.tsx index e28c0a7ad452c..c480bdfdb72e4 100644 --- a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomAnchor.tsx +++ b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomAnchor.tsx @@ -1,7 +1,7 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, Icon } from '@rocket.chat/fuselage'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; -import type { ComponentProps } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; import { forwardRef } from 'react'; import { useTranslation } from 'react-i18next'; @@ -11,7 +11,7 @@ type MultiSelectCustomAnchorProps = { selectedOptionsTitle: string; selectedOptionsCount: number; maxCount: number; -} & ComponentProps; +} & ComponentPropsWithoutRef; const MultiSelectCustomAnchor = forwardRef(function MultiSelectCustomAnchor( { className, collapsed, selectedOptionsCount, selectedOptionsTitle, defaultTitle, maxCount, ...props }, diff --git a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomListWrapper.tsx b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomListWrapper.tsx index 51ebd06c37c07..f0c63486ed8bd 100644 --- a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomListWrapper.tsx +++ b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomListWrapper.tsx @@ -1,8 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import { forwardRef, type ComponentProps } from 'react'; +import { forwardRef } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface MultiSelectCustomListWrapperProps extends ComponentProps {} +export type MultiSelectCustomListWrapperProps = ComponentPropsWithoutRef; const MultiSelectCustomListWrapper = forwardRef(function MultiSelectCustomListWrapper( { children }, diff --git a/packages/ui-client/src/components/TextSeparator.stories.tsx b/packages/ui-client/src/components/TextSeparator.stories.tsx index 2a4c9e708eef5..7ed0ddda9193f 100644 --- a/packages/ui-client/src/components/TextSeparator.stories.tsx +++ b/packages/ui-client/src/components/TextSeparator.stories.tsx @@ -1,5 +1,4 @@ import type { Meta, StoryFn } from '@storybook/react'; -import type { ReactElement } from 'react'; import TextSeparator from './TextSeparator'; @@ -9,7 +8,7 @@ export default { parameters: { layout: 'centered', }, - decorators: [(fn): ReactElement =>
{fn()}
], + decorators: [(fn) =>
{fn()}
], } satisfies Meta; const Template: StoryFn = (args) => ; diff --git a/packages/ui-client/src/components/TextSeparator.tsx b/packages/ui-client/src/components/TextSeparator.tsx index 978804a7f7da5..f4a2635570f84 100644 --- a/packages/ui-client/src/components/TextSeparator.tsx +++ b/packages/ui-client/src/components/TextSeparator.tsx @@ -1,14 +1,14 @@ import { Box } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; +import type { ReactNode } from 'react'; -import { DotLeader } from './DotLeader'; +import DotLeader from './DotLeader'; type TextSeparatorProps = { label: ReactNode; value: ReactNode; }; -const TextSeparator = ({ label, value }: TextSeparatorProps): ReactElement => ( +const TextSeparator = ({ label, value }: TextSeparatorProps) => ( {label} diff --git a/packages/ui-client/src/components/TooltipComponent.tsx b/packages/ui-client/src/components/TooltipComponent.tsx index 4a46e5536a530..e65c95c063233 100644 --- a/packages/ui-client/src/components/TooltipComponent.tsx +++ b/packages/ui-client/src/components/TooltipComponent.tsx @@ -1,5 +1,5 @@ import { Tooltip, PositionAnimated, AnimatedVisibility } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; +import type { ReactNode } from 'react'; import { useRef } from 'react'; type TooltipComponentProps = { @@ -7,7 +7,7 @@ type TooltipComponentProps = { anchor: Element; }; -export const TooltipComponent = ({ title, anchor }: TooltipComponentProps): ReactElement => { +export const TooltipComponent = ({ title, anchor }: TooltipComponentProps) => { const ref = useRef(anchor); return ( diff --git a/packages/ui-client/src/components/UserAutoComplete/UserAutoComplete.tsx b/packages/ui-client/src/components/UserAutoComplete/UserAutoComplete.tsx index 9673d716193da..bc1b89f122e46 100644 --- a/packages/ui-client/src/components/UserAutoComplete/UserAutoComplete.tsx +++ b/packages/ui-client/src/components/UserAutoComplete/UserAutoComplete.tsx @@ -3,7 +3,7 @@ import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { UserAvatar } from '@rocket.chat/ui-avatar'; import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; -import type { ComponentProps, ReactElement } from 'react'; +import type { ComponentPropsWithoutRef } from 'react'; import { memo, useMemo, useState } from 'react'; const query = ( @@ -13,11 +13,11 @@ const query = ( selector: string; } => ({ selector: JSON.stringify({ term, conditions }) }); -type UserAutoCompleteProps = Omit, 'filter'> & { +type UserAutoCompleteProps = Omit, 'filter'> & { conditions?: { [key: string]: unknown }; }; -const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps): ReactElement => { +const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps) => { const { conditions = {} } = props; const [filter, setFilter] = useState(''); const debouncedFilter = useDebouncedValue(filter, 1000); @@ -38,7 +38,7 @@ const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps): filter={filter} setFilter={setFilter} data-qa-id='UserAutoComplete' - renderSelected={({ selected: { value, label } }): ReactElement | null => ( + renderSelected={({ selected: { value, label } }) => ( @@ -46,7 +46,7 @@ const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps): )} - renderItem={({ value, label, ...props }): ReactElement => ( + renderItem={({ value, label, ...props }) => (