Merge remote-tracking branch 'origin/develop' into hs/roomstatusbar-vm
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
@ -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>
|
||||
|
||||
@ -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 }) => {
|
||||
|
||||
@ -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();
|
||||
|
||||
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 25 KiB |
@ -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>
|
||||
|
||||
@ -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>
|
||||
);
|
||||
|
||||
@ -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}
|
||||
</>
|
||||
);
|
||||
|
||||
@ -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}
|
||||
</>
|
||||
);
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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": "We’ve refreshed your sounds"
|
||||
},
|
||||
"voip": "Audio and Video calls"
|
||||
},
|
||||
"preferences": {
|
||||
|
||||
@ -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 <a>contacter l’administrateur de votre service</a> pour continuer à l’utiliser.",
|
||||
"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 n’a pas été envoyé car ce serveur d’accueil a été bloqué par son administrateur. Veuillez <a>contacter l’administrateur de votre service</a> 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 <a>contacter l’administrateur de votre service</a> pour continuer à l’utiliser.",
|
||||
"requires_consent_agreement": "Vous ne pouvez voir aucun message tant que vous ne lisez et n’acceptez pas nos <consentLink>conditions générales</consentLink>.",
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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 пп)",
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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>,
|
||||
);
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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>
|
||||
`;
|
||||
|
||||
@ -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 () => {
|
||||
|
||||