);
diff --git a/src/components/views/rooms/RoomListPanel/RoomListView.tsx b/src/components/views/rooms/RoomListPanel/RoomListView.tsx
index a0c9184211..b29affc0be 100644
--- a/src/components/views/rooms/RoomListPanel/RoomListView.tsx
+++ b/src/components/views/rooms/RoomListPanel/RoomListView.tsx
@@ -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 (
<>
-
-
-
-
-
+
+
+
{listBody}
>
);
diff --git a/src/components/views/spaces/QuickSettingsButton.tsx b/src/components/views/spaces/QuickSettingsButton.tsx
index 95171bb957..1bd3c49291 100644
--- a/src/components/views/spaces/QuickSettingsButton.tsx
+++ b/src/components/views/spaces/QuickSettingsButton.tsx
@@ -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 (
<>
-
- {button}
-
-
+ {button}
{contextMenu}
>
);
diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx
index fb2e4cc1df..7a51cfe0c6 100644
--- a/src/components/views/spaces/SpacePanel.tsx
+++ b/src/components/views/spaces/SpacePanel.tsx
@@ -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(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
@@ -415,74 +414,65 @@ const SpacePanel: React.FC = () => {
onDragEndHandler();
}}
>
- {
+ 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")}
>
-
-
+
+
)}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 4ca6ec3b1a..4e7f3cf1dc 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -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 encrypted ✅",
"room_id": "Room ID: %(roomId)s",
"room_not_encrypted": "Room is not encrypted 🚨",
@@ -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. Learn more",
+ "history_visible": "This room has been configured so that new members can read history. Learn more",
"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": "We’ve refreshed your sounds"
- },
"voip": "Audio and Video calls"
},
"preferences": {
diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json
index 2bd3942f93..4079121294 100644
--- a/src/i18n/strings/fr.json
+++ b/src/i18n/strings/fr.json
@@ -2122,7 +2122,7 @@
"status_bar": {
"delete_all": "Tout supprimer",
"exceeded_resource_limit": "Votre message n’a pas été envoyé car ce serveur d’accueil a dépassé une de ses limites de ressources. Veuillez contacter l’administrateur de votre service pour continuer à l’utiliser.",
- "history_visible": "Les messages que vous enverrez seront partagés avec les nouveaux membres invités dans ce salon. En savoir plus",
+ "history_visible": "Ce salon a été configuré afin que les nouveaux membres puissent lire l'historique. En savori plus",
"homeserver_blocked": "Votre message n’a pas été envoyé car ce serveur d’accueil a été bloqué par son administrateur. Veuillez contacter l’administrateur de votre service pour continuer à l’utiliser.",
"monthly_user_limit_reached": "Votre message n’a pas été envoyé car le serveur d’accueil a atteint sa limite mensuelle d’utilisateurs. Veuillez contacter l’administrateur de votre service pour continuer à l’utiliser.",
"requires_consent_agreement": "Vous ne pouvez voir aucun message tant que vous ne lisez et n’acceptez pas nos conditions générales.",
diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json
index cd91b89c2d..3413595ebd 100644
--- a/src/i18n/strings/ko.json
+++ b/src/i18n/strings/ko.json
@@ -574,6 +574,7 @@
"someone": "다른 사람",
"space": "스페이스",
"spaces": "스페이스",
+ "state_encryption_enabled": "실험적 상태 암호화 활성화됨",
"sticker": "스티커",
"stickerpack": "스티커 팩",
"success": "성공",
@@ -681,6 +682,8 @@
"join_rule_restricted_label": " 의 모든 사용자는 이 방을 찾아 참여할 수 있습니다.",
"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": "실험적인 기분이 드시나요? 개발 중인 최신 아이디어를 시험해 보세요. 이 기능들은 아직 완성되지 않았으며, 불안정할 수 있고 변경되거나 아예 중단될 수도 있습니다. 자세히 알아보기.",
@@ -3514,6 +3519,7 @@
"enabled_dm": "여기서 메시지는 종단 간 암호화됩니다. 상대방 프로필에서 %(displayName)s 를 확인하세요 - 프로필 사진을 탭하세요.",
"enabled_local": "이 채팅의 메시지는 종단 간 암호화됩니다.",
"parameters_changed": "일부 암호화 매개변수가 변경되었습니다.",
+ "state_enabled": "이 방의 메시지와 상태 이벤트는 종단간 암호화됩니다. 참여자의 프로필 사진을 누르면 신원을 검증할 수 있습니다.",
"unsupported": "이 방에서 사용하는 암호화 방식은 지원되지 않습니다."
},
"m.room.guest_access": {
diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json
index bfc97d0fde..e275091bd2 100644
--- a/src/i18n/strings/uk.json
+++ b/src/i18n/strings/uk.json
@@ -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": "Не вдалося надіслати повідомлення, бо домашній сервер перевищив ліміт ресурсів. Зв'яжіться з адміністратором сервісу, щоб продовжити використання.",
+ "history_visible": "Цю кімнату налаштовано, щоб нові учасники могли переглядати історію. Докладніше",
"homeserver_blocked": "Ваше повідомлення не надіслано, оскільки цей домашній сервер заблокований його адміністратором. Зверніться до адміністратора служби, щоб продовжувати користуватися нею.",
"monthly_user_limit_reached": "Не вдалося надіслати повідомлення, бо домашній сервер перевищив свій ліміт активних користувачів за місяць. Зв'яжіться з адміністратором сервісу, щоб продовжити використання.",
"requires_consent_agreement": "Ви не можете надсилати жодних повідомлень, поки не переглянете та не погодитесь з нашими умовами та положеннями.",
@@ -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": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.",
@@ -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 пп)",
diff --git a/src/stores/ReleaseAnnouncementStore.ts b/src/stores/ReleaseAnnouncementStore.ts
index f828ff198f..f005fd4b30 100644
--- a/src/stores/ReleaseAnnouncementStore.ts
+++ b/src/stores/ReleaseAnnouncementStore.ts
@@ -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.
*/
diff --git a/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx b/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx
index d7f576ddef..bb0274e9af 100644
--- a/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx
+++ b/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx
@@ -22,12 +22,7 @@ describe("ReleaseAnnouncement", () => {
function renderReleaseAnnouncement() {
return render(
-
+
content
,
);
diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap
index df1080844e..16a67295af 100644
--- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap
+++ b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap
@@ -25,7 +25,7 @@ exports[` 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[` 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;"
>
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[` compose menu should display the compose menu 1`]
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[` 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;"
>
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[` compose menu should not display the compose menu
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[` 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;"
>
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[` space menu should display the space menu 1`] = `
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;"
>
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[` space menu should not display the space menu 1`]
-
-
-
-
`;
diff --git a/test/unit-tests/stores/ReleaseAnnouncementStore-test.tsx b/test/unit-tests/stores/ReleaseAnnouncementStore-test.tsx
index 824c757905..7a7a735c9a 100644
--- a/test/unit-tests/stores/ReleaseAnnouncementStore-test.tsx
+++ b/test/unit-tests/stores/ReleaseAnnouncementStore-test.tsx
@@ -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 () => {