Merge remote-tracking branch 'origin/develop' into hs/roomstatusbar-vm

This commit is contained in:
Half-Shot 2025-12-19 15:48:23 +00:00
commit ecc4671b57
25 changed files with 158 additions and 234 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -31,7 +31,7 @@ exports[`HistoryVisibleBannerView renders a history visible banner 1`] = `
class="content"
>
<span>
Messages you send will be shared with new members invited to this room.
This room has been configured so that new members can read history.
<a
class="_link_1v5rz_8"
data-kind="primary"
@ -40,7 +40,7 @@ exports[`HistoryVisibleBannerView renders a history visible banner 1`] = `
rel="noreferrer noopener"
target="_blank"
>
Learn more
Learn More
</a>
</span>
</span>

View File

@ -25,7 +25,8 @@ test.describe("Release announcement", () => {
labsFlags: ["feature_new_room_list"],
});
test(
// There is no release announcement currently live
test.skip(
"should display the new room list release announcement",
{ tag: "@screenshot" },
async ({ page, app, room, util }) => {

View File

@ -35,7 +35,10 @@ test.describe("Create Room", () => {
axe.disableRules("color-contrast"); // XXX: Inheriting colour contrast issues from room view.
await expect(axe).toHaveNoViolations();
// Snapshot it
await expect(dialog).toMatchScreenshot("create-room.png");
// Mask topic to avoid flakiness with top border
await expect(dialog).toMatchScreenshot("create-room.png", {
mask: [dialog.locator(".mx_CreateRoomDialog_topic")],
});
// Submit
await dialog.getByRole("button", { name: "Create room" }).click();
@ -74,7 +77,10 @@ test.describe("Create Room", () => {
// Fill room address
await dialog.getByRole("textbox", { name: "Room address" }).fill("test-create-room-video");
// Snapshot it
await expect(dialog).toMatchScreenshot("create-video-room.png");
// Mask topic to avoid flakiness with top border
await expect(dialog).toMatchScreenshot("create-video-room.png", {
mask: [dialog.locator(".mx_CreateRoomDialog_topic")],
});
// Submit
await dialog.getByRole("button", { name: "Create video room" }).click();
@ -102,7 +108,10 @@ test.describe("Create Room", () => {
axe.disableRules("color-contrast"); // XXX: Inheriting colour contrast issues from room view.
await expect(axe).toHaveNoViolations();
// Snapshot it
await expect(dialog).toMatchScreenshot("create-room-no-public.png");
// Mask topic to avoid flakiness with top border
await expect(dialog).toMatchScreenshot("create-room-no-public.png", {
mask: [dialog.locator(".mx_CreateRoomDialog_topic")],
});
// Submit
await dialog.getByRole("button", { name: "Create room" }).click();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -14,6 +14,7 @@ import { useAsyncMemo } from "../../../../hooks/useAsyncMemo";
import { _t } from "../../../../languageHandler";
import Modal from "../../../../Modal";
import { ManualDeviceKeyVerificationDialog } from "../ManualDeviceKeyVerificationDialog";
import RestoreKeyBackupDialog from "../../dialogs/security/RestoreKeyBackupDialog";
interface KeyBackupProps {
/**
@ -43,6 +44,20 @@ export function Crypto({ onBack }: KeyBackupProps): JSX.Element {
>
{_t("devtools|manual_device_verification")}
</button>
<button
type="button"
onClick={() => {
Modal.createDialog(
RestoreKeyBackupDialog,
undefined,
undefined,
/* priority = */ true,
/* static = */ true,
);
}}
>
{_t("devtools|restore_from_backup")}
</button>
</>
) : (
<span>{_t("devtools|crypto|crypto_not_available")}</span>

View File

@ -23,7 +23,6 @@ import {
useRoomListHeaderViewModel,
} from "../../../viewmodels/roomlist/RoomListHeaderViewModel";
import { RoomListOptionsMenu } from "./RoomListOptionsMenu";
import { ReleaseAnnouncement } from "../../../structures/ReleaseAnnouncement";
/**
* The header view for the room list
@ -46,38 +45,23 @@ export function RoomListHeaderView(): JSX.Element {
{vm.displaySpaceMenu && <SpaceMenu vm={vm} />}
</Flex>
<Flex align="center" gap="var(--cpd-space-2x)">
<ReleaseAnnouncement
feature="newRoomList_sort"
header={_t("room_list|release_announcement|sort|title")}
description={_t("room_list|release_announcement|sort|description")}
closeLabel={_t("room_list|release_announcement|next")}
placement="bottom"
>
<div className="mx_RoomListHeaderView_ReleaseAnnouncementAnchor">
<RoomListOptionsMenu vm={vm} />
</div>
</ReleaseAnnouncement>
<div className="mx_RoomListHeaderView_ReleaseAnnouncementAnchor">
<RoomListOptionsMenu vm={vm} />
</div>
{/* If we don't display the compose menu, it means that the user can only send DM */}
<ReleaseAnnouncement
feature="newRoomList_intro"
header={_t("room_list|release_announcement|intro|title")}
description={_t("room_list|release_announcement|intro|description")}
closeLabel={_t("room_list|release_announcement|next")}
>
<div className="mx_RoomListHeaderView_ReleaseAnnouncementAnchor">
{vm.displayComposeMenu ? (
<ComposeMenu vm={vm} />
) : (
<IconButton
onClick={(e) => vm.createChatRoom(e.nativeEvent)}
tooltip={_t("action|new_conversation")}
>
<ComposeIcon color="var(--cpd-color-icon-secondary)" aria-hidden />
</IconButton>
)}
</div>
</ReleaseAnnouncement>
<div className="mx_RoomListHeaderView_ReleaseAnnouncementAnchor">
{vm.displayComposeMenu ? (
<ComposeMenu vm={vm} />
) : (
<IconButton
onClick={(e) => vm.createChatRoom(e.nativeEvent)}
tooltip={_t("action|new_conversation")}
>
<ComposeIcon color="var(--cpd-color-icon-secondary)" aria-hidden />
</IconButton>
)}
</div>
</Flex>
</Flex>
);

View File

@ -11,8 +11,6 @@ import { useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewM
import { RoomList } from "./RoomList";
import { EmptyRoomList } from "./EmptyRoomList";
import { RoomListPrimaryFilters } from "./RoomListPrimaryFilters";
import { _t } from "../../../../languageHandler";
import { ReleaseAnnouncement } from "../../../structures/ReleaseAnnouncement";
/**
* Host the room list and the (future) room filters
@ -30,17 +28,9 @@ export function RoomListView(): JSX.Element {
}
return (
<>
<ReleaseAnnouncement
feature="newRoomList_filter"
header={_t("room_list|release_announcement|filter|title")}
description={_t("room_list|release_announcement|filter|description")}
closeLabel={_t("room_list|release_announcement|next")}
placement="right"
>
<div>
<RoomListPrimaryFilters vm={vm} />
</div>
</ReleaseAnnouncement>
<div>
<RoomListPrimaryFilters vm={vm} />
</div>
{listBody}
</>
);

View File

@ -31,7 +31,6 @@ import QuickThemeSwitcher from "./QuickThemeSwitcher";
import Modal from "../../../Modal";
import DevtoolsDialog from "../dialogs/DevtoolsDialog";
import { SdkContextClass } from "../../../contexts/SDKContext";
import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement";
const QuickSettingsButton: React.FC<{
isPanelCollapsed: boolean;
@ -169,16 +168,7 @@ const QuickSettingsButton: React.FC<{
return (
<>
<ReleaseAnnouncement
feature="newRoomList_settings"
header={_t("room_list|release_announcement|settings|title")}
description={_t("room_list|release_announcement|settings|description")}
closeLabel={_t("room_list|release_announcement|done")}
placement="right"
>
{button}
</ReleaseAnnouncement>
{button}
{contextMenu}
</>
);

View File

@ -79,7 +79,6 @@ import { Landmark, LandmarkNavigation } from "../../../accessibility/LandmarkNav
import { KeyboardShortcut } from "../settings/KeyboardShortcut";
import { ModuleApi } from "../../../modules/Api.ts";
import { useModuleSpacePanelItems } from "../../../modules/ExtrasApi.ts";
import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement";
const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
@ -415,74 +414,65 @@ const SpacePanel: React.FC = () => {
onDragEndHandler();
}}
>
<ReleaseAnnouncement
feature="newNotificationSounds"
header={_t("settings|notifications|sounds_release_announcement|title")}
description={_t("settings|notifications|sounds_release_announcement|description")}
closeLabel={_t("action|ok")}
displayArrow={false}
placement="right-start"
<nav
className={classNames("mx_SpacePanel", {
collapsed: isPanelCollapsed,
newUi: newRoomListEnabled,
})}
onKeyDown={(ev) => {
const navAction = getKeyBindingsManager().getNavigationAction(ev);
if (
navAction === KeyBindingAction.NextLandmark ||
navAction === KeyBindingAction.PreviousLandmark
) {
LandmarkNavigation.findAndFocusNextLandmark(
Landmark.ACTIVE_SPACE_BUTTON,
navAction === KeyBindingAction.PreviousLandmark,
);
ev.stopPropagation();
ev.preventDefault();
return;
}
onKeyDownHandler(ev);
}}
ref={ref}
aria-label={_t("common|spaces")}
>
<nav
className={classNames("mx_SpacePanel", {
collapsed: isPanelCollapsed,
newUi: newRoomListEnabled,
})}
onKeyDown={(ev) => {
const navAction = getKeyBindingsManager().getNavigationAction(ev);
if (
navAction === KeyBindingAction.NextLandmark ||
navAction === KeyBindingAction.PreviousLandmark
) {
LandmarkNavigation.findAndFocusNextLandmark(
Landmark.ACTIVE_SPACE_BUTTON,
navAction === KeyBindingAction.PreviousLandmark,
);
ev.stopPropagation();
ev.preventDefault();
return;
<UserMenu isPanelCollapsed={isPanelCollapsed}>
<AccessibleButton
className={classNames("mx_SpacePanel_toggleCollapse", {
expanded: !isPanelCollapsed,
})}
onClick={() => setPanelCollapsed(!isPanelCollapsed)}
title={isPanelCollapsed ? _t("action|expand") : _t("action|collapse")}
caption={
<KeyboardShortcut
value={{ ctrlOrCmdKey: true, shiftKey: true, key: "d" }}
className="mx_SpacePanel_Tooltip_KeyboardShortcut"
/>
}
onKeyDownHandler(ev);
}}
ref={ref}
aria-label={_t("common|spaces")}
>
<UserMenu isPanelCollapsed={isPanelCollapsed}>
<AccessibleButton
className={classNames("mx_SpacePanel_toggleCollapse", {
expanded: !isPanelCollapsed,
})}
onClick={() => setPanelCollapsed(!isPanelCollapsed)}
title={isPanelCollapsed ? _t("action|expand") : _t("action|collapse")}
caption={
<KeyboardShortcut
value={{ ctrlOrCmdKey: true, shiftKey: true, key: "d" }}
className="mx_SpacePanel_Tooltip_KeyboardShortcut"
/>
}
>
<ChevronRightIcon />
</AccessibleButton>
</UserMenu>
<Droppable droppableId="top-level-spaces">
{(provided, snapshot) => (
<InnerSpacePanel
{...provided.droppableProps}
isPanelCollapsed={isPanelCollapsed}
setPanelCollapsed={setPanelCollapsed}
isDraggingOver={snapshot.isDraggingOver}
innerRef={provided.innerRef}
>
<ChevronRightIcon />
</AccessibleButton>
</UserMenu>
<Droppable droppableId="top-level-spaces">
{(provided, snapshot) => (
<InnerSpacePanel
{...provided.droppableProps}
isPanelCollapsed={isPanelCollapsed}
setPanelCollapsed={setPanelCollapsed}
isDraggingOver={snapshot.isDraggingOver}
innerRef={provided.innerRef}
>
{provided.placeholder}
</InnerSpacePanel>
)}
</Droppable>
{provided.placeholder}
</InnerSpacePanel>
)}
</Droppable>
<ThreadsActivityCentre displayButtonLabel={!isPanelCollapsed} />
<ThreadsActivityCentre displayButtonLabel={!isPanelCollapsed} />
<QuickSettingsButton isPanelCollapsed={isPanelCollapsed} />
</nav>
</ReleaseAnnouncement>
<QuickSettingsButton isPanelCollapsed={isPanelCollapsed} />
</nav>
</DragDropContext>
)}
</RovingTabIndexProvider>

View File

@ -849,6 +849,7 @@
"number_of_users": "Number of users",
"only_joined_members": "Only joined users",
"original_event_source": "Original event source",
"restore_from_backup": "Restore from backup",
"room_encrypted": "Room is <strong>encrypted ✅</strong>",
"room_id": "Room ID: %(roomId)s",
"room_not_encrypted": "Room is <strong>not encrypted 🚨</strong>",
@ -2130,7 +2131,7 @@
"exceeded_resource_limit_description": "Please contact your service administrator to continue using the service.",
"exceeded_resource_limit_title": "Your message wasn't sent because this homeserver has exceeded a resource limit.",
"failed_to_create_room_title": "Could not start a chat with this user",
"history_visible": "Messages you send will be shared with new members invited to this room. <a>Learn more</a>",
"history_visible": "This room has been configured so that new members can read history. <a>Learn more</a>",
"homeserver_blocked_title": "Your message wasn't sent because this homeserver has been blocked by its administrator.",
"monthly_user_limit_reached_title": "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit.",
"requires_consent_agreement_title": "You can't send any messages until you review and agree to our terms and conditions.",
@ -2220,26 +2221,6 @@
"one": "Currently removing messages in %(count)s room",
"other": "Currently removing messages in %(count)s rooms"
},
"release_announcement": {
"done": "Done",
"filter": {
"description": "Filter your chats with a single click. Expand to view more filters.",
"title": "New quick filters"
},
"intro": {
"description": "The chats list has been updated to be more clear and simple to use.",
"title": "Chats has a new look!"
},
"next": "Next",
"settings": {
"description": "To show or hide message previews, go to All settings > Preferences > Room list",
"title": "Some settings have moved"
},
"sort": {
"description": "Change the ordering of your chats from most recent to A-Z",
"title": "Sort your chats"
}
},
"room": {
"more_options": "More Options",
"open_room": "Open room %(roomName)s"
@ -2909,10 +2890,6 @@
"rule_suppress_notices": "Messages sent by bot",
"rule_tombstone": "When rooms are upgraded",
"show_message_desktop_notification": "Show message in desktop notification",
"sounds_release_announcement": {
"description": "Your notification ping and call ringer have been updated—clearer, quicker, and less disruptive",
"title": "Weve refreshed your sounds"
},
"voip": "Audio and Video calls"
},
"preferences": {

View File

@ -2122,7 +2122,7 @@
"status_bar": {
"delete_all": "Tout supprimer",
"exceeded_resource_limit": "Votre message na pas été envoyé car ce serveur daccueil a dépassé une de ses limites de ressources. Veuillez <a>contacter ladministrateur de votre service</a> pour continuer à lutiliser.",
"history_visible": "Les messages que vous enverrez seront partagés avec les nouveaux membres invités dans ce salon.<a> En savoir plus</a>",
"history_visible": "Ce salon a été configuré afin que les nouveaux membres puissent lire l'historique.<a> En savori plus</a>",
"homeserver_blocked": "Votre message na pas été envoyé car ce serveur daccueil a été bloqué par son administrateur. Veuillez <a>contacter ladministrateur de votre service</a> pour continuer à lutiliser.",
"monthly_user_limit_reached": "Votre message na pas été envoyé car le serveur daccueil a atteint sa limite mensuelle dutilisateurs. Veuillez <a>contacter ladministrateur de votre service</a> pour continuer à lutiliser.",
"requires_consent_agreement": "Vous ne pouvez voir aucun message tant que vous ne lisez et nacceptez pas nos <consentLink>conditions générales</consentLink>.",

View File

@ -574,6 +574,7 @@
"someone": "다른 사람",
"space": "스페이스",
"spaces": "스페이스",
"state_encryption_enabled": "실험적 상태 암호화 활성화됨",
"sticker": "스티커",
"stickerpack": "스티커 팩",
"success": "성공",
@ -681,6 +682,8 @@
"join_rule_restricted_label": "<SpaceName/> 의 모든 사용자는 이 방을 찾아 참여할 수 있습니다.",
"name_validation_required": "방 이름을 입력해주세요",
"room_visibility_label": "방 표시 여부",
"state_encrypted_warning": "상태 이벤트 암호화 실험 기능을 활성화하여 방 이름, 주제 등의 메타데이터를 서버로부터 숨깁니다. 단, 나중에 방에 참여하는 사용자나 MSC4362를 지원하지 않는 클라이언트 사용자에게는 이 정보가 표시되지 않습니다.",
"state_encryption_label": "암호화된 상태 이벤트",
"title_private_room": "개인 방 만들기",
"title_public_room": "공개 방 만들기",
"title_video_room": "영상 방 생성",
@ -1509,6 +1512,8 @@
"dynamic_room_predecessors": "동적 채팅방 이전 항목",
"dynamic_room_predecessors_description": "MSC3946 활성화 (지연 도착 채팅방 아카이브 지원)",
"element_call_video_rooms": "Element Call 영상 채팅방",
"encrypted_state_events": "암호화된 상태 이벤트(MSC4362)",
"encrypted_state_events_description": "상태 이벤트 암호화 실험 기능을 활성화하여 방 이름, 주제 등의 메타데이터를 서버로부터 숨깁니다. 단, 나중에 방에 참여하는 사용자나 MSC4362를 지원하지 않는 클라이언트 사용자에게는 이 정보가 표시되지 않습니다.",
"exclude_insecure_devices": "메세지 송수신 시 보안이 취약한 기기 제외",
"exclude_insecure_devices_description": "이 모드가 활성화되면 암호화된 메시지는 인증되지 않은 기기와 공유되지 않으며, 인증되지 않은 기기에서 보낸 메시지는 오류로 표시됩니다. 이 모드를 활성화하면 기기를 인증하지 않은 사용자와 통신할 수 없게 될 수 있음을 유의하십시오.",
"experimental_description": "실험적인 기분이 드시나요? 개발 중인 최신 아이디어를 시험해 보세요. 이 기능들은 아직 완성되지 않았으며, 불안정할 수 있고 변경되거나 아예 중단될 수도 있습니다. <a>자세히 알아보기</a>.",
@ -3514,6 +3519,7 @@
"enabled_dm": "여기서 메시지는 종단 간 암호화됩니다. 상대방 프로필에서 %(displayName)s 를 확인하세요 - 프로필 사진을 탭하세요.",
"enabled_local": "이 채팅의 메시지는 종단 간 암호화됩니다.",
"parameters_changed": "일부 암호화 매개변수가 변경되었습니다.",
"state_enabled": "이 방의 메시지와 상태 이벤트는 종단간 암호화됩니다. 참여자의 프로필 사진을 누르면 신원을 검증할 수 있습니다.",
"unsupported": "이 방에서 사용하는 암호화 방식은 지원되지 않습니다."
},
"m.room.guest_access": {

View File

@ -1775,6 +1775,11 @@
"failed_send_poll_title": "Не вдалося надіслати опитування",
"notes": "Результати показуються лише після завершення опитування",
"option_label": "Варіант %(number)s, %(answer)s",
"option_label_with_total": {
"one": "Варіант %(number)s, %(answer)s, %(count)s голос",
"few": "Варіант %(number)s, %(answer)s, %(count)s голоси",
"many": "Варіант %(number)s, %(answer)s, %(count)s голосів"
},
"options_add_button": "Додати варіант",
"options_heading": "Створіть варіанти",
"options_label": "Варіант %(number)s",
@ -2121,6 +2126,7 @@
"status_bar": {
"delete_all": "Видалити всі",
"exceeded_resource_limit": "Не вдалося надіслати повідомлення, бо домашній сервер перевищив ліміт ресурсів. <a>Зв'яжіться з адміністратором сервісу,</a> щоб продовжити використання.",
"history_visible": "Цю кімнату налаштовано, щоб нові учасники могли переглядати історію. <a>Докладніше</a>",
"homeserver_blocked": "Ваше повідомлення не надіслано, оскільки цей домашній сервер заблокований його адміністратором. <a>Зверніться до адміністратора служби</a>, щоб продовжувати користуватися нею.",
"monthly_user_limit_reached": "Не вдалося надіслати повідомлення, бо домашній сервер перевищив свій ліміт активних користувачів за місяць. <a>Зв'яжіться з адміністратором сервісу,</a> щоб продовжити використання.",
"requires_consent_agreement": "Ви не можете надсилати жодних повідомлень, поки не переглянете та не погодитесь з <consentLink>нашими умовами та положеннями</consentLink>.",
@ -2342,6 +2348,7 @@
"no_aliases_space": "Простір не має локальних адрес",
"other_section": "Інше",
"publish_toggle": "Опублікувати цю кімнату для всіх у каталозі кімнат %(domain)s?",
"publish_warn_invite_only": "Ви не можете опублікувати кімнату, доступ до якої дозволено лише за запрошеннями.",
"publish_warn_no_canonical_permission": "Щоб опублікувати цю кімнату, вам потрібен дозвіл на встановлення основної адреси.",
"published_aliases_description": "Щоб зробити адресу загальнодоступною, спершу додайте її в локальні.",
"published_aliases_explainer_room": "Загальнодоступні адреси можуть бути використані будь-ким на будь-якому сервері для приєднання до вашої кімнати.",
@ -2421,6 +2428,7 @@
},
"security": {
"cannot_change_to_private_due_to_missing_history_visiblity_permissions": {
"description": "У вас немає дозволів на зміну видимості історії кімнати. Це небезпечно, оскільки може дозволити читати повідомлення користувачам, які не приєдналися.",
"title": "Неможливо зробити кімнату приватною"
},
"enable_encryption_confirm_description": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. <a>Дізнатись більше про шифрування.</a>",
@ -2483,6 +2491,7 @@
"other": "Оновлення просторів... (%(progress)s із %(count)s)"
},
"join_rule_upgrade_upgrading_room": "Поліпшення кімнати",
"join_rule_world_readable_description": "Зміна умов приєднання до кімнати також змінить видимість майбутніх повідомлень.",
"public_without_alias_warning": "Щоб посилатись на цю кімнату, додайте їй адресу.",
"publish_room": "Зробити цю кімнату видимою в каталозі загальнодоступних кімнат.",
"publish_space": "Зробити цей простір видимим у каталозі загальнодоступних кімнат.",
@ -2630,7 +2639,7 @@
"do_not_close_warning": "Не закривайте це вікно, поки не завершиться скидання",
"export_keys": "Експорт ключів",
"import_keys": "Імпорт ключів",
"other_people_device_description": "Попередження: користувачі, які не пройшли явну верифікацію з вами (наприклад, за допомогою емодзі), не отримають ваші зашифровані повідомлення. Також неверифіковані пристрої верифікованих користувачів не отримуватимуть ваші зашифровані повідомлення.",
"other_people_device_description": "Попередження: користувачі, які не пройшли явну верифікацію з вами (наприклад, за допомогою емодзі), не отримають ваші зашифровані повідомлення. Також неверифіковані пристрої верифікованих користувачів не отримуватимуть ваші зашифровані повідомлення. Зміни набудуть чинності після перезапуску застосунку.",
"other_people_device_label": "У кімнатах з увімкненим шифруванням надсилати повідомлення лише верифікованим користувачам",
"other_people_device_title": "Пристрої інших людей",
"reset_identity": "Скинути криптографічну ідентичність",
@ -2897,6 +2906,7 @@
"rule_tombstone": "Коли кімнати поліпшено",
"show_message_desktop_notification": "Показувати повідомлення у стільничних сповіщеннях",
"sounds_release_announcement": {
"description": "Ваші сигнали сповіщень та викликів оновлено — вони стали чіткішими, швидшими та не такими докучливими.",
"title": "Ми оновили ваші звуки"
},
"voip": "Голосові та відеовиклики"
@ -3103,7 +3113,8 @@
"start_automatically": {
"disabled": "Ні",
"enabled": "Так",
"label": "Відкрийте %(brand)s після входу на комп'ютері."
"label": "Відкрийте %(brand)s після входу на комп'ютері.",
"minimised": "Згорнуто"
},
"tac_only_notifications": "Показувати сповіщення лише в центрі діяльності в гілках",
"use_12_hour_format": "Показувати час у 12-годинному форматі (напр. 2:30 пп)",

View File

@ -17,14 +17,10 @@ import ToastStore from "./ToastStore";
/**
* The features are shown in the array order.
* We include a `_test_dummy` value to enable tests to function even where there are no running release announcements.
* This value must be at the end of the list.
*/
const FEATURES = [
"newNotificationSounds",
"newRoomList_intro",
"newRoomList_sort",
"newRoomList_filter",
"newRoomList_settings",
] as const;
const FEATURES = ["_test_dummy1", "_test_dummy2"] as const;
/**
* All the features that can be shown in the release announcements.
*/

View File

@ -22,12 +22,7 @@ describe("ReleaseAnnouncement", () => {
function renderReleaseAnnouncement() {
return render(
<ReleaseAnnouncement
feature="newNotificationSounds"
header="header"
description="description"
closeLabel="close"
>
<ReleaseAnnouncement feature="_test_dummy1" header="header" description="description" closeLabel="close">
<div>content</div>
</ReleaseAnnouncement>,
);

View File

@ -25,7 +25,7 @@ exports[`<RoomListHeaderView /> compose menu should display the compose menu 1`]
class="_icon-button_1pz9o_8 mx_SpaceMenu_button"
data-kind="primary"
data-state="closed"
id="radix-_r_q_"
id="radix-_r_i_"
role="button"
style="--cpd-icon-button-size: 20px;"
tabindex="0"
@ -55,7 +55,6 @@ exports[`<RoomListHeaderView /> compose menu should display the compose menu 1`]
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x); --mx-flex-wrap: nowrap;"
>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
@ -63,11 +62,11 @@ exports[`<RoomListHeaderView /> compose menu should display the compose menu 1`]
aria-expanded="false"
aria-haspopup="menu"
aria-label="Room Options"
aria-labelledby="_r_12_"
aria-labelledby="_r_m_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_10_"
id="radix-_r_k_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -93,18 +92,17 @@ exports[`<RoomListHeaderView /> compose menu should display the compose menu 1`]
</button>
</div>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
aria-disabled="false"
aria-expanded="false"
aria-haspopup="menu"
aria-labelledby="_r_1d_"
aria-labelledby="_r_t_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_1b_"
id="radix-_r_r_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -165,7 +163,7 @@ exports[`<RoomListHeaderView /> compose menu should not display the compose menu
class="_icon-button_1pz9o_8 mx_SpaceMenu_button"
data-kind="primary"
data-state="closed"
id="radix-_r_1k_"
id="radix-_r_14_"
role="button"
style="--cpd-icon-button-size: 20px;"
tabindex="0"
@ -195,7 +193,6 @@ exports[`<RoomListHeaderView /> compose menu should not display the compose menu
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x); --mx-flex-wrap: nowrap;"
>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
@ -203,11 +200,11 @@ exports[`<RoomListHeaderView /> compose menu should not display the compose menu
aria-expanded="false"
aria-haspopup="menu"
aria-label="Room Options"
aria-labelledby="_r_1s_"
aria-labelledby="_r_18_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_1q_"
id="radix-_r_16_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -233,11 +230,10 @@ exports[`<RoomListHeaderView /> compose menu should not display the compose menu
</button>
</div>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
aria-labelledby="_r_25_"
aria-labelledby="_r_1d_"
class="_icon-button_1pz9o_8"
data-kind="primary"
role="button"
@ -329,7 +325,6 @@ exports[`<RoomListHeaderView /> should render 'room options' button 1`] = `
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x); --mx-flex-wrap: nowrap;"
>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
@ -337,11 +332,11 @@ exports[`<RoomListHeaderView /> should render 'room options' button 1`] = `
aria-expanded="false"
aria-haspopup="menu"
aria-label="Room Options"
aria-labelledby="_r_8_"
aria-labelledby="_r_4_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_6_"
id="radix-_r_2_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -367,18 +362,17 @@ exports[`<RoomListHeaderView /> should render 'room options' button 1`] = `
</button>
</div>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
aria-disabled="false"
aria-expanded="false"
aria-haspopup="menu"
aria-labelledby="_r_j_"
aria-labelledby="_r_b_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_h_"
id="radix-_r_9_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -439,7 +433,7 @@ exports[`<RoomListHeaderView /> space menu should display the space menu 1`] = `
class="_icon-button_1pz9o_8 mx_SpaceMenu_button"
data-kind="primary"
data-state="closed"
id="radix-_r_4e_"
id="radix-_r_36_"
role="button"
style="--cpd-icon-button-size: 20px;"
tabindex="0"
@ -469,7 +463,6 @@ exports[`<RoomListHeaderView /> space menu should display the space menu 1`] = `
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x); --mx-flex-wrap: nowrap;"
>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
@ -477,11 +470,11 @@ exports[`<RoomListHeaderView /> space menu should display the space menu 1`] = `
aria-expanded="false"
aria-haspopup="menu"
aria-label="Room Options"
aria-labelledby="_r_4m_"
aria-labelledby="_r_3a_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_4k_"
id="radix-_r_38_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -507,18 +500,17 @@ exports[`<RoomListHeaderView /> space menu should display the space menu 1`] = `
</button>
</div>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
aria-disabled="false"
aria-expanded="false"
aria-haspopup="menu"
aria-labelledby="_r_51_"
aria-labelledby="_r_3h_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_4v_"
id="radix-_r_3f_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -577,7 +569,6 @@ exports[`<RoomListHeaderView /> space menu should not display the space menu 1`]
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x); --mx-flex-wrap: nowrap;"
>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
@ -585,11 +576,11 @@ exports[`<RoomListHeaderView /> space menu should not display the space menu 1`]
aria-expanded="false"
aria-haspopup="menu"
aria-label="Room Options"
aria-labelledby="_r_5e_"
aria-labelledby="_r_3q_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_5c_"
id="radix-_r_3o_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -615,18 +606,17 @@ exports[`<RoomListHeaderView /> space menu should not display the space menu 1`]
</button>
</div>
<div
aria-haspopup="dialog"
class="mx_RoomListHeaderView_ReleaseAnnouncementAnchor"
>
<button
aria-disabled="false"
aria-expanded="false"
aria-haspopup="menu"
aria-labelledby="_r_5p_"
aria-labelledby="_r_41_"
class="_icon-button_1pz9o_8"
data-kind="primary"
data-state="closed"
id="radix-_r_5n_"
id="radix-_r_3v_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"

View File

@ -4,7 +4,6 @@ exports[`QuickSettingsButton should render the quick settings button in expanded
<DocumentFragment>
<button
aria-expanded="true"
aria-haspopup="dialog"
aria-label="Quick settings"
class="_icon-button_1pz9o_8 mx_QuickSettingsButton expanded"
data-kind="primary"

View File

@ -3,12 +3,8 @@
exports[`<SpacePanel /> should show all activated MetaSpaces in the correct order 1`] = `
<DocumentFragment>
<nav
aria-controls="_r_2_"
aria-describedby="_r_2_"
aria-haspopup="dialog"
aria-label="Spaces"
class="mx_SpacePanel collapsed newUi"
data-floating-ui-inert=""
>
<div
class="mx_UserMenu"
@ -336,11 +332,11 @@ exports[`<SpacePanel /> should show all activated MetaSpaces in the correct orde
aria-expanded="false"
aria-haspopup="menu"
aria-label="Threads"
aria-labelledby="_r_16_"
aria-labelledby="_r_12_"
class="_icon-button_1pz9o_8 mx_ThreadsActivityCentreButton"
data-kind="primary"
data-state="closed"
id="radix-_r_14_"
id="radix-_r_10_"
role="button"
style="--cpd-icon-button-size: 32px;"
tabindex="0"
@ -368,7 +364,7 @@ exports[`<SpacePanel /> should show all activated MetaSpaces in the correct orde
<button
aria-expanded="false"
aria-label="Quick settings"
aria-labelledby="_r_1f_"
aria-labelledby="_r_17_"
class="_icon-button_1pz9o_8 mx_QuickSettingsButton"
data-kind="primary"
role="button"
@ -394,30 +390,5 @@ exports[`<SpacePanel /> should show all activated MetaSpaces in the correct orde
</div>
</button>
</nav>
<span
aria-hidden="true"
data-floating-ui-inert=""
style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;"
tabindex="-1"
/>
<span
data-floating-ui-focus-guard=""
data-type="outside"
role="button"
style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;"
tabindex="0"
/>
<span
aria-owns="_r_1k_"
data-floating-ui-inert=""
style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;"
/>
<span
data-floating-ui-focus-guard=""
data-type="outside"
role="button"
style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;"
tabindex="0"
/>
</DocumentFragment>
`;

View File

@ -117,13 +117,13 @@ describe("ReleaseAnnouncementStore", () => {
it("should listen to release announcement data changes in the store", async () => {
const secondStore = new ReleaseAnnouncementStore();
expect(secondStore.getReleaseAnnouncement()).toBe("newNotificationSounds");
expect(secondStore.getReleaseAnnouncement()).toBe("_test_dummy1");
const promise = listenReleaseAnnouncementChanged();
await secondStore.nextReleaseAnnouncement();
expect(await promise).toBe("newRoomList_intro");
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBe("newRoomList_intro");
expect(await promise).toBe("_test_dummy2");
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBe("_test_dummy2");
});
it("should return null when there are toasts on screen", async () => {