diff --git a/.changeset/rare-walls-press.md b/.changeset/rare-walls-press.md new file mode 100644 index 0000000000000..ba1b05402b187 --- /dev/null +++ b/.changeset/rare-walls-press.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': patch +'@rocket.chat/meteor': patch +--- + +Fixes an issue where the encryption toggle was incorrectly reset/disabled/enabled in the Teams creation modal when Broadcast or Private was toggled, or when the user lacked unrelated permissions. diff --git a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.spec.tsx b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.spec.tsx new file mode 100644 index 0000000000000..8e7c4a3a5bad5 --- /dev/null +++ b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.spec.tsx @@ -0,0 +1,258 @@ +import { mockAppRoot } from '@rocket.chat/mock-providers'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import CreateTeamModal from './CreateTeamModal'; +import CreateTeamModalOld from '../../../sidebar/header/CreateTeam'; + +jest.mock('../../../lib/utils/goToRoomById', () => ({ + goToRoomById: jest.fn(), +})); + +type CreateTeamModalComponentType = typeof CreateTeamModal | typeof CreateTeamModalOld; +// eslint-disable-next-line @typescript-eslint/naming-convention + +describe.each([ + ['CreateTeamModal', CreateTeamModalOld], + ['CreateTeamModal in NavbarV2', CreateTeamModal], +] as const)( + '%s', + // eslint-disable-next-line @typescript-eslint/naming-convention + (_name: string, CreateTeamModalComponent: CreateTeamModalComponentType) => { + it('should render with encryption option disabled and set to off when E2E_Enable=false and E2E_Enabled_Default_PrivateRooms=false', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', false).withSetting('E2E_Enabled_Default_PrivateRooms', false).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + expect(encrypted).toBeInTheDocument(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + }); + + it('should render with encryption option enabled and set to off when E2E_Enable=true and E2E_Enabled_Default_PrivateRooms=false', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', false).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + expect(encrypted).toBeInTheDocument(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeEnabled(); + }); + + it('should render with encryption option disabled and set to off when E2E_Enable=false and E2E_Enabled_Default_PrivateRooms=true', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', false).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + expect(encrypted).toBeInTheDocument(); + + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + }); + + it('should render with encryption option enabled and set to on when E2E_Enable=true and E2E_Enabled_Default_PrivateRooms=True', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + expect(encrypted).toBeChecked(); + expect(encrypted).toBeEnabled(); + }); + + it('when Private goes ON → OFF: forces Encrypted OFF and disables it (E2E_Enable=true, E2E_Enabled_Default_PrivateRooms=true)', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + const priv = screen.getByLabelText('Teams_New_Private_Label') as HTMLInputElement; + + // initial: private=true, encrypted ON and enabled + expect(priv).toBeChecked(); + expect(encrypted).toBeChecked(); + expect(encrypted).toBeEnabled(); + + // Private ON -> OFF: encrypted must become OFF and disabled + await userEvent.click(priv); + expect(priv).not.toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + }); + + it('when Private goes OFF → ON: keeps Encrypted OFF but re-enables it (E2E_Enable=true, E2E_Enabled_Default_PrivateRooms=true)', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + const priv = screen.getByLabelText('Teams_New_Private_Label') as HTMLInputElement; + + // turn private OFF to simulate user path from non-private + await userEvent.click(priv); + expect(priv).not.toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + + // turn private back ON -> encrypted should remain OFF but become enabled + await userEvent.click(priv); + expect(priv).toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeEnabled(); + }); + + it('private team: toggling Broadcast on/off does not change or disable Encrypted', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const priv = screen.getByLabelText('Teams_New_Private_Label') as HTMLInputElement; + + expect(priv).toBeChecked(); + expect(encrypted).toBeChecked(); + expect(encrypted).toBeEnabled(); + expect(broadcast).not.toBeChecked(); + + // Broadcast: OFF -> ON (Encrypted unchanged + enabled) + await userEvent.click(broadcast); + expect(broadcast).toBeChecked(); + expect(encrypted).toBeChecked(); + expect(encrypted).toBeEnabled(); + + // Broadcast: ON -> OFF (Encrypted unchanged + enabled) + await userEvent.click(broadcast); + expect(broadcast).not.toBeChecked(); + expect(encrypted).toBeChecked(); + expect(encrypted).toBeEnabled(); + + // User can still toggle Encrypted freely while Broadcast is OFF + await userEvent.click(encrypted); + expect(encrypted).not.toBeChecked(); + + // User can still toggle Encrypted freely while Broadcast is ON + await userEvent.click(broadcast); + expect(broadcast).toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeEnabled(); + }); + + it('non-private team: Encrypted remains OFF and disabled regardless of Broadcast state', async () => { + render( null} />, { + wrapper: mockAppRoot().withSetting('E2E_Enable', true).withSetting('E2E_Enabled_Default_PrivateRooms', true).build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const encrypted = screen.getByLabelText('Teams_New_Encrypted_Label') as HTMLInputElement; + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const priv = screen.getByLabelText('Teams_New_Private_Label') as HTMLInputElement; + + // Switch to non-private + await userEvent.click(priv); + expect(priv).not.toBeChecked(); + + // Encrypted must be OFF + disabled (non-private cannot be encrypted) + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + + // Broadcast: OFF -> ON (Encrypted stays OFF + disabled) + await userEvent.click(broadcast); + expect(broadcast).toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + + // Broadcast: ON -> OFF (Encrypted still OFF + disabled) + await userEvent.click(broadcast); + expect(broadcast).not.toBeChecked(); + expect(encrypted).not.toBeChecked(); + expect(encrypted).toBeDisabled(); + }); + + it('should disable and turn on ReadOnly toggle when Broadcast is ON and no set-readonly permission', async () => { + render( null} />, { + wrapper: mockAppRoot().build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const readOnly = screen.getByLabelText('Teams_New_Read_only_Label') as HTMLInputElement; + + expect(readOnly).not.toBeChecked(); + + // Broadcast: OFF -> ON (ReadOnly stays ON + disabled) + await userEvent.click(broadcast); + expect(broadcast).toBeChecked(); + expect(readOnly).toBeChecked(); + expect(readOnly).toBeDisabled(); + }); + + it('should disable and turn on ReadOnly toggle when Broadcast is ON with set-readonly permission', async () => { + render( null} />, { + wrapper: mockAppRoot().withPermission('set-readonly').build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const readOnly = screen.getByLabelText('Teams_New_Read_only_Label') as HTMLInputElement; + + expect(readOnly).not.toBeChecked(); + + // Broadcast: OFF -> ON (ReadOnly stays ON + disabled) + await userEvent.click(broadcast); + expect(broadcast).toBeChecked(); + expect(readOnly).toBeChecked(); + expect(readOnly).toBeDisabled(); + }); + + it('should disable and turn off ReadOnly toggle when Broadcast is OFF with no set-readonly permission', async () => { + render( null} />, { + wrapper: mockAppRoot().build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const readOnly = screen.getByLabelText('Teams_New_Read_only_Label') as HTMLInputElement; + + expect(broadcast).not.toBeChecked(); + expect(readOnly).not.toBeChecked(); + expect(readOnly).toBeDisabled(); + }); + + it('should enable ReadOnly toggle when Broadcast is OFF with set-readonly permission', async () => { + render( null} />, { + wrapper: mockAppRoot().withPermission('set-readonly').build(), + }); + + await userEvent.click(screen.getByText('Advanced_settings')); + + const broadcast = screen.getByLabelText('Teams_New_Broadcast_Label') as HTMLInputElement; + const readOnly = screen.getByLabelText('Teams_New_Read_only_Label') as HTMLInputElement; + + expect(broadcast).not.toBeChecked(); + expect(readOnly).not.toBeChecked(); + expect(readOnly).toBeEnabled(); + }); + }, +); diff --git a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.tsx b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.tsx index 2ef57ce9ab5d7..e7d0401c5a21b 100644 --- a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.tsx +++ b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/CreateTeamModal.tsx @@ -53,13 +53,13 @@ type CreateTeamModalProps = { onClose: () => void }; const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => { const t = useTranslation(); const e2eEnabled = useSetting('E2E_Enable'); - const e2eEnabledForPrivateByDefault = useSetting('E2E_Enabled_Default_PrivateRooms'); + const e2eEnabledForPrivateByDefault = useSetting('E2E_Enabled_Default_PrivateRooms') && e2eEnabled; const namesValidation = useSetting('UTF8_Channel_Names_Validation'); const allowSpecialNames = useSetting('UI_Allow_room_names_with_special_chars'); + const canSetReadOnly = usePermissionWithScopedRoles('set-readonly', ['owner']); const dispatchToastMessage = useToastMessageDispatch(); const canCreateTeam = usePermission('create-team'); - const canSetReadOnly = usePermissionWithScopedRoles('set-readonly', ['owner']); const checkTeamNameExists = useEndpoint('GET', '/v1/rooms.nameExists'); const createTeamAction = useEndpoint('POST', '/v1/teams.create'); @@ -113,15 +113,11 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => { setValue('encrypted', false); } - if (broadcast) { - setValue('encrypted', false); - } - setValue('readOnly', broadcast); }, [watch, setValue, broadcast, isPrivate]); - const canChangeReadOnly = !broadcast; - const canChangeEncrypted = isPrivate && !broadcast && e2eEnabled && !e2eEnabledForPrivateByDefault; + const readOnlyDisabled = broadcast || !canSetReadOnly; + const canChangeEncrypted = isPrivate && e2eEnabled; const getEncryptedHint = useEncryptedRoomDescription('team'); const handleCreateTeam = async ({ @@ -265,7 +261,7 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => { render={({ field: { onChange, value, ref } }): ReactElement => ( { )} /> - {getEncryptedHint({ isPrivate, broadcast, encrypted })} + {getEncryptedHint({ isPrivate, encrypted })} @@ -286,7 +282,7 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => { { + it('returns "Encrypted_not_available" when room is not private and E2E is enabled', () => { const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { wrapper: wrapper.withSetting('E2E_Enable', true).build(), }); const describe = result.current; - expect(describe({ isPrivate: false, broadcast: false, encrypted: false })).toBe(`Encrypted_not_available`); + expect(describe({ isPrivate: false, encrypted: false })).toBe('Encrypted_not_available'); }); - it('returns "Not_available_for_broadcast" when broadcast=true (even if encrypted is true)', () => { + it('returns "Encrypted_messages" when private and encrypted are true and E2E is enabled', () => { const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { wrapper: wrapper.withSetting('E2E_Enable', true).build(), }); const describe = result.current; - expect(describe({ isPrivate: true, broadcast: true, encrypted: true })).toBe(`Not_available_for_broadcast`); - - expect(describe({ isPrivate: true, broadcast: true, encrypted: false })).toBe(`Not_available_for_broadcast`); - }); - - it('returns "Encrypted_messages" when private, not broadcast, and encrypted is true', () => { - const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { - wrapper: wrapper.withSetting('E2E_Enable', true).build(), - }); - const describe = result.current; - - expect(describe({ isPrivate: true, broadcast: false, encrypted: true })).toBe(`Encrypted_messages`); + expect(describe({ isPrivate: true, encrypted: true })).toBe('Encrypted_messages'); }); - it('returns "Encrypted_messages_false" when private, not broadcast, and encrypted is false', () => { + it('returns "Encrypted_messages_false" when private and encrypted are false and E2E is enabled', () => { const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { wrapper: wrapper.withSetting('E2E_Enable', true).build(), }); const describe = result.current; - expect(describe({ isPrivate: true, broadcast: false, encrypted: false })).toBe('Encrypted_messages_false'); - }); - - describe('when broadcast is undefined', () => { - it('returns "Encrypted_messages" if private and encrypted is true and broadcast is undefined', () => { - const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { - wrapper: wrapper.withSetting('E2E_Enable', true).build(), - }); - const describe = result.current; - - expect(describe({ isPrivate: true, encrypted: true })).toBe(`Encrypted_messages`); - }); - - it('returns "Encrypted_messages_false" if private and encrypted is false and broadcast is undefined', () => { - const { result } = renderHook(() => useEncryptedRoomDescriptionHook(roomType), { - wrapper: wrapper.withSetting('E2E_Enable', true).build(), - }); - const describe = result.current; - - expect(describe({ isPrivate: true, encrypted: false })).toBe('Encrypted_messages_false'); - }); + expect(describe({ isPrivate: true, encrypted: false })).toBe('Encrypted_messages_false'); }); }); }); diff --git a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/useEncryptedRoomDescription.tsx b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/useEncryptedRoomDescription.tsx index 4a193aed413cb..32b54f89601e5 100644 --- a/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/useEncryptedRoomDescription.tsx +++ b/apps/meteor/client/NavBarV2/NavBarPagesGroup/actions/useEncryptedRoomDescription.tsx @@ -5,17 +5,13 @@ export const useEncryptedRoomDescription = (roomType: 'channel' | 'team') => { const { t } = useTranslation(); const e2eEnabled = useSetting('E2E_Enable'); - return ({ isPrivate, broadcast, encrypted }: { isPrivate: boolean; broadcast?: boolean; encrypted: boolean }) => { + return ({ isPrivate, encrypted }: { isPrivate: boolean; encrypted: boolean }) => { if (!e2eEnabled) { return t('Not_available_for_this_workspace'); } if (!isPrivate) { return t('Encrypted_not_available', { roomType }); } - // TODO: This case will be removed once we enable E2E for broadcast teams in teams creation modal - if (broadcast !== undefined && broadcast) { - return t('Not_available_for_broadcast', { roomType }); - } if (encrypted) { return t('Encrypted_messages', { roomType }); } diff --git a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx index 44d1a847afe4c..af7511436bcf9 100644 --- a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx @@ -51,12 +51,12 @@ type CreateTeamModalInputs = { const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => { const t = useTranslation(); const e2eEnabled = useSetting('E2E_Enable'); - const e2eEnabledForPrivateByDefault = useSetting('E2E_Enabled_Default_PrivateRooms'); + const e2eEnabledForPrivateByDefault = useSetting('E2E_Enabled_Default_PrivateRooms') && e2eEnabled; const namesValidation = useSetting('UTF8_Channel_Names_Validation'); const allowSpecialNames = useSetting('UI_Allow_room_names_with_special_chars'); + const canSetReadOnly = usePermissionWithScopedRoles('set-readonly', ['owner']); const dispatchToastMessage = useToastMessageDispatch(); const canCreateTeam = usePermission('create-team'); - const canSetReadOnly = usePermissionWithScopedRoles('set-readonly', ['owner']); const checkTeamNameExists = useEndpoint('GET', '/v1/rooms.nameExists'); const createTeamAction = useEndpoint('POST', '/v1/teams.create'); @@ -110,15 +110,11 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => setValue('encrypted', false); } - if (broadcast) { - setValue('encrypted', false); - } - setValue('readOnly', broadcast); }, [watch, setValue, broadcast, isPrivate]); - const canChangeReadOnly = !broadcast; - const canChangeEncrypted = isPrivate && !broadcast && e2eEnabled && !e2eEnabledForPrivateByDefault; + const readOnlyDisabled = broadcast || !canSetReadOnly; + const canChangeEncrypted = isPrivate && e2eEnabled; const getEncryptedHint = useEncryptedRoomDescription('team'); const handleCreateTeam = async ({ @@ -262,7 +258,7 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => render={({ field: { onChange, value, ref } }): ReactElement => ( void }): ReactElement => )} /> - {getEncryptedHint({ isPrivate, broadcast, encrypted })} + {getEncryptedHint({ isPrivate, encrypted })} @@ -283,7 +279,7 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => { const { t } = useTranslation(); const e2eEnabled = useSetting('E2E_Enable'); - return ({ isPrivate, broadcast, encrypted }: { isPrivate: boolean; broadcast?: boolean; encrypted: boolean }) => { + return ({ isPrivate, encrypted }: { isPrivate: boolean; encrypted: boolean }) => { if (!e2eEnabled) { return t('Not_available_for_this_workspace'); } if (!isPrivate) { return t('Encrypted_not_available', { roomType }); } - // TODO: This case will be removed once we enable E2E for broadcast teams in teams creation modal - if (broadcast !== undefined && broadcast) { - return t('Not_available_for_broadcast', { roomType }); - } if (encrypted) { return t('Encrypted_messages', { roomType }); } diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index 0ea5130b42452..e77873d349842 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -3693,7 +3693,6 @@ "Not_Visible_To_Workspace": "Not visible to workspace", "Not_assigned": "Not assigned", "Not_authorized": "Not authorized", - "Not_available_for_broadcast": "Not available for broadcast {{roomType}}", "Not_available_for_this_workspace": "Not available for this workspace", "Not_enough_data": "Not enough data", "Not_following": "Not following", diff --git a/packages/i18n/src/locales/nb.i18n.json b/packages/i18n/src/locales/nb.i18n.json index 033e49a6c985c..5a5bcda6b16f2 100644 --- a/packages/i18n/src/locales/nb.i18n.json +++ b/packages/i18n/src/locales/nb.i18n.json @@ -3676,7 +3676,6 @@ "Not_Visible_To_Workspace": "Ikke synlig for arbeidsområdet", "Not_assigned": "Ikke tildelt", "Not_authorized": "Ikke autorisert", - "Not_available_for_broadcast": "Ikke tilgjengelig for kringkasting {{roomType}}", "Not_available_for_this_workspace": "Ikke tilgjengelig for dette arbeidsområdet", "Not_enough_data": "Ikke nok data", "Not_following": "Følger ikke", diff --git a/packages/i18n/src/locales/nn.i18n.json b/packages/i18n/src/locales/nn.i18n.json index 1a3372473edfb..1cc0d21b3f30e 100644 --- a/packages/i18n/src/locales/nn.i18n.json +++ b/packages/i18n/src/locales/nn.i18n.json @@ -3595,7 +3595,6 @@ "Not_Visible_To_Workspace": "Ikke synlig for arbeidsområdet", "Not_assigned": "Ikke tildelt", "Not_authorized": "Ikke autorisert", - "Not_available_for_broadcast": "Ikke tilgjengelig for kringkasting {{roomType}}", "Not_available_for_this_workspace": "Ikke tilgjengelig for dette arbeidsområdet", "Not_following": "Følger ikke", "Not_found_or_not_allowed": "Ikke funnet eller ikke tillatt", diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json index 8bd86f2d2f8bd..9a108344555ce 100644 --- a/packages/i18n/src/locales/pt-BR.i18n.json +++ b/packages/i18n/src/locales/pt-BR.i18n.json @@ -3639,7 +3639,6 @@ "Not_Visible_To_Workspace": "Não visível para o workspace", "Not_assigned": "Não atribuído", "Not_authorized": "Não autorizado", - "Not_available_for_broadcast": "Não disponível para transmissão {{roomType}}", "Not_available_for_this_workspace": "Não disponível para este workspace", "Not_enough_data": "Não há dados suficientes", "Not_following": "Não segue", diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json index de49b8c65ca44..a1935757e8a0c 100644 --- a/packages/i18n/src/locales/sv.i18n.json +++ b/packages/i18n/src/locales/sv.i18n.json @@ -3656,7 +3656,6 @@ "Not_Visible_To_Workspace": "Inte synlig för arbetsytan", "Not_assigned": "Ej tilldelad", "Not_authorized": "Inte auktoriserad", - "Not_available_for_broadcast": "Ej tillgänglig för sändning {{roomType}}", "Not_available_for_this_workspace": "Inte tillgängligt för denna arbetsyta", "Not_enough_data": "Inte tillräckligt med data", "Not_following": "Följer inte",