From 6da1412de8eca504a13acd9af8852c91ff474c22 Mon Sep 17 00:00:00 2001 From: David Langley Date: Thu, 5 Feb 2026 21:05:14 +0000 Subject: [PATCH] Migrate the room list view to shared components (#31921) * Add NotificationDecoration component Add the NotificationDecoration component to shared-components. This is a leaf component that renders notification badges and indicators for rooms/items including mentions, unread counts, call indicators, etc. * Add RoomListItem component Add the RoomListItem component to shared-components. Includes context menu, hover menu, notification menu, and more options menu. * Add RoomListPrimaryFilters component Add filter chips component for filtering the room list by unread, people, rooms, favourites, mentions, invites, and low priority. * Update VirtualizedList component Update VirtualizedList to support the room list virtualization requirements. * Add RoomList component Add RoomList component that renders a virtualized list of room items. Includes story mocks for testing. * Add RoomListView component Add RoomListView component that composes RoomList with filters, empty states, and loading skeleton. * Export room-list components from shared-components Add exports for RoomListView, RoomListItem, RoomListPrimaryFilters, and RoomList. Include i18n strings for room list components. * Add RoomListItemViewModel Add view model for individual room list items. Manages per-room subscriptions and updates only when specific room data changes. * Add RoomListViewViewModel Add view model for the room list view. Manages room list state, filtering, keyboard navigation, and child view models. * Integrate shared components into RoomListView Update RoomListView to use the new ViewModels and shared components. Includes i18n string updates for element-web. * Remove old room list implementation Remove old ViewModels, hooks, and view components that are now replaced by the shared-components implementation. * Update sliding-sync playwright test Update test expectations for new room list implementation. * Add figma links * Move viewModels to the right folder * Rename to RoomListEmptyStateView * Update VirtualizedRoomListView naming * Update screenshots and snapshots * Move viewmodel tests to the right location and fix some imports * lint * Use unknown as an Opaque type rather than any. It discourages property access within shared components and can still be cast back in EW. * Update screenshots for new shared component rendering params * Make room order tests deterministic --- .../activity-indicator-auto.png | Bin 0 -> 3766 bytes .../invited-auto.png | Bin 0 -> 3968 bytes .../mention-auto.png | Bin 0 -> 4635 bytes .../mention-with-count-auto.png | Bin 0 -> 17991 bytes .../muted-auto.png | Bin 0 -> 4018 bytes .../muted-without-activity-auto.png | Bin 0 -> 4018 bytes .../no-notification-auto.png | Bin 0 -> 3522 bytes .../notification-with-count-auto.png | Bin 0 -> 17139 bytes .../unsent-message-auto.png | Bin 0 -> 4007 bytes .../video-call-auto.png | Bin 0 -> 3860 bytes .../video-call-without-activity-auto.png | Bin 0 -> 3860 bytes .../voice-call-auto.png | Bin 0 -> 3936 bytes .../RoomListItem.stories.tsx/bold-auto.png | Bin 0 -> 21101 bytes .../RoomListItem.stories.tsx/default-auto.png | Bin 0 -> 20491 bytes .../invitation-auto.png | Bin 0 -> 21568 bytes .../no-message-preview-auto.png | Bin 0 -> 18920 bytes .../selected-auto.png | Bin 0 -> 20566 bytes .../unsent-message-auto.png | Bin 0 -> 21353 bytes .../with-hover-menu-auto.png | Bin 0 -> 20491 bytes .../with-mention-auto.png | Bin 0 -> 21606 bytes .../with-notification-auto.png | Bin 0 -> 21013 bytes .../without-hover-menu-auto.png | Bin 0 -> 20491 bytes .../default-auto.png | Bin 0 -> 25569 bytes .../narrow-container-auto.png | Bin 0 -> 20772 bytes ...arrow-with-active-wrapping-filter-auto.png | Bin 0 -> 20870 bytes .../no-filters-auto.png | Bin 0 -> 3522 bytes .../people-selected-auto.png | Bin 0 -> 26297 bytes .../RoomListView.stories.tsx/default-auto.png | Bin 0 -> 62678 bytes .../RoomListView.stories.tsx/empty-auto.png | Bin 0 -> 34769 bytes .../empty-favourite-filter-auto.png | Bin 0 -> 29253 bytes .../empty-invites-filter-auto.png | Bin 0 -> 26646 bytes .../empty-low-priority-filter-auto.png | Bin 0 -> 27174 bytes .../empty-mentions-filter-auto.png | Bin 0 -> 27112 bytes .../empty-people-filter-auto.png | Bin 0 -> 30127 bytes .../empty-rooms-filter-auto.png | Bin 0 -> 27385 bytes .../empty-unread-filter-auto.png | Bin 0 -> 28259 bytes .../empty-without-create-permission-auto.png | Bin 0 -> 30196 bytes .../large-list-auto.png | Bin 0 -> 62678 bytes .../RoomListView.stories.tsx/loading-auto.png | Bin 0 -> 14916 bytes .../small-list-auto.png | Bin 0 -> 40067 bytes .../with-active-filter-auto.png | Bin 0 -> 62779 bytes .../with-selection-auto.png | Bin 0 -> 62789 bytes .../default-auto.png | Bin 0 -> 45283 bytes .../src/i18n/strings/en_EN.json | 61 + packages/shared-components/src/index.ts | 4 + .../NotificationDecoration.stories.tsx | 126 + .../NotificationDecoration.test.tsx | 80 + .../NotificationDecoration.tsx | 90 + .../NotificationDecoration.test.tsx.snap | 242 + .../NotificationDecoration/index.tsx | 9 + .../RoomListItem/RoomListItem.module.css | 106 + .../RoomListItem/RoomListItem.stories.tsx | 213 + .../RoomListItem/RoomListItem.test.tsx | 123 + .../room-list/RoomListItem/RoomListItem.tsx | 207 + .../RoomListItem/RoomListItemContextMenu.tsx | 40 + .../RoomListItem/RoomListItemHoverMenu.tsx | 42 + .../RoomListItemMoreOptionsMenu.test.tsx | 227 + .../RoomListItemMoreOptionsMenu.tsx | 137 + .../RoomListItemNotificationMenu.test.tsx | 164 + .../RoomListItemNotificationMenu.tsx | 105 + .../src/room-list/RoomListItem/RoomNotifs.ts | 20 + .../__snapshots__/RoomListItem.test.tsx.snap | 1236 ++ .../RoomListItem/default-snapshot.ts | 39 + .../src/room-list/RoomListItem/index.ts | 26 + .../RoomListPrimaryFilters.module.css | 32 + .../RoomListPrimaryFilters.stories.tsx | 91 + .../RoomListPrimaryFilters.test.tsx | 140 + .../RoomListPrimaryFilters.tsx | 116 + .../RoomListPrimaryFilters.test.tsx.snap | 388 + .../RoomListPrimaryFilters/index.tsx | 12 + .../useCollapseFilters.ts | 71 + .../useVisibleFilters.ts | 55 + .../RoomListEmptyStateView.module.css | 33 + .../RoomListView/RoomListEmptyStateView.tsx | 182 + .../RoomListLoadingSkeleton.module.css | 24 + .../RoomListView/RoomListLoadingSkeleton.tsx | 18 + .../RoomListView/RoomListView.stories.tsx | 221 + .../RoomListView/RoomListView.test.tsx | 177 + .../room-list/RoomListView/RoomListView.tsx | 101 + .../__snapshots__/RoomListView.test.tsx.snap | 11387 ++++++++++++++++ .../RoomListView/assets/skeleton.svg | 14 + .../src/room-list/RoomListView/index.tsx | 12 + .../VirtualizedRoomListView.module.css | 8 +- .../VirtualizedRoomListView.stories.tsx | 94 + .../VirtualizedRoomListView.test.tsx | 67 + .../VirtualizedRoomListView.tsx | 198 + .../VirtualizedRoomListView.test.tsx.snap | 1277 ++ .../VirtualizedRoomListView/index.ts | 9 + .../src/room-list/story-mocks.tsx | 138 + .../utils/VirtualizedList/VirtualizedList.tsx | 47 +- .../shared-components/src/viewmodel/index.ts | 2 +- .../e2e/read-receipts/room-list-order.spec.ts | 30 +- .../e2e/sliding-sync/sliding-sync.spec.ts | 2 +- res/css/_components.pcss | 7 - .../rooms/RoomListPanel/_EmptyRoomList.pcss | 33 - .../RoomListPanel/_RoomListItemMenuView.pcss | 12 - .../RoomListPanel/_RoomListItemView.pcss | 102 - .../_RoomListPrimaryFilters.pcss | 34 - .../_RoomListSecondaryFilters.pcss | 12 - .../RoomListPanel/_RoomListSkeleton.pcss | 24 - .../roomlist/MessagePreviewViewModel.tsx | 57 - .../roomlist/RoomListItemMenuViewModel.tsx | 226 - .../roomlist/RoomListItemViewModel.tsx | 250 - .../viewmodels/roomlist/RoomListViewModel.tsx | 100 - .../viewmodels/roomlist/useFilteredRooms.tsx | 131 - .../roomlist/useMessagePreviewToggle.tsx | 32 - .../roomlist/useRoomListNavigation.ts | 56 - .../viewmodels/roomlist/useStickyRoomList.tsx | 138 - .../rooms/RoomListPanel/EmptyRoomList.tsx | 182 - .../views/rooms/RoomListPanel/RoomList.tsx | 144 - .../RoomListItemContextMenuView.tsx | 44 - .../RoomListPanel/RoomListItemMenuView.tsx | 242 - .../rooms/RoomListPanel/RoomListItemView.tsx | 124 - .../RoomListPanel/RoomListPrimaryFilters.tsx | 169 - .../rooms/RoomListPanel/RoomListView.tsx | 62 +- src/i18n/strings/en_EN.json | 54 +- .../room-list/RoomListHeaderViewModel.ts | 2 +- .../room-list/RoomListItemViewModel.ts | 327 + .../room-list/RoomListViewViewModel.ts | 450 + .../room-list}/utils.ts | 12 +- .../roomlist/MessagePreviewViewModel-test.tsx | 58 - .../RoomListItemMenuViewModel-test.tsx | 221 - .../roomlist/RoomListItemViewModel-test.tsx | 280 - .../roomlist/RoomListViewModel-test.tsx | 341 - .../roomlist/useRoomListNavigation-test.ts | 152 - .../RoomListPanel/EmptyRoomList-test.tsx | 92 - .../rooms/RoomListPanel/RoomList-test.tsx | 78 - .../RoomListItemMenuView-test.tsx | 144 - .../RoomListPanel/RoomListItemView-test.tsx | 162 - .../RoomListPrimaryFilters-test.tsx | 155 - .../rooms/RoomListPanel/RoomListView-test.tsx | 65 - .../__snapshots__/EmptyRoomList-test.tsx.snap | 279 - .../__snapshots__/RoomList-test.tsx.snap | 1255 -- .../RoomListItemMenuView-test.tsx.snap | 155 - .../RoomListItemView-test.tsx.snap | 234 - .../RoomListPrimaryFilters-test.tsx.snap | 47 - .../room-list/RoomListHeaderViewModel-test.ts | 4 +- .../room-list/RoomListItemViewModel-test.tsx | 439 + .../room-list/RoomListViewViewModel-test.tsx | 546 + .../room-list}/utils-test.ts | 20 +- 140 files changed, 20046 insertions(+), 5950 deletions(-) create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/activity-indicator-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/invited-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-without-activity-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/no-notification-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/notification-with-count-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/unsent-message-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-without-activity-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/voice-call-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/bold-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/default-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/invitation-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/no-message-preview-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/selected-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/unsent-message-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-hover-menu-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-mention-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-notification-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/without-hover-menu-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-container-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-with-active-wrapping-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/no-filters-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/people-selected-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/default-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-favourite-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-rooms-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-unread-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-without-create-permission-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/loading-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/small-list-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-active-filter-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png create mode 100644 packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/__snapshots__/NotificationDecoration.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/index.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItem.module.css create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItem.stories.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItem.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItem.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemContextMenu.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemHoverMenu.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.tsx create mode 100644 packages/shared-components/src/room-list/RoomListItem/RoomNotifs.ts create mode 100644 packages/shared-components/src/room-list/RoomListItem/__snapshots__/RoomListItem.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/RoomListItem/default-snapshot.ts create mode 100644 packages/shared-components/src/room-list/RoomListItem/index.ts create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.tsx create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/__snapshots__/RoomListPrimaryFilters.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/index.tsx create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/useCollapseFilters.ts create mode 100644 packages/shared-components/src/room-list/RoomListPrimaryFilters/useVisibleFilters.ts create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.module.css create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.tsx create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.module.css create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.tsx create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListView/RoomListView.tsx create mode 100644 packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/RoomListView/assets/skeleton.svg create mode 100644 packages/shared-components/src/room-list/RoomListView/index.tsx rename res/css/views/rooms/RoomListPanel/_RoomList.pcss => packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.module.css (63%) create mode 100644 packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx create mode 100644 packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx create mode 100644 packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx create mode 100644 packages/shared-components/src/room-list/VirtualizedRoomListView/__snapshots__/VirtualizedRoomListView.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/VirtualizedRoomListView/index.ts create mode 100644 packages/shared-components/src/room-list/story-mocks.tsx delete mode 100644 res/css/views/rooms/RoomListPanel/_EmptyRoomList.pcss delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListItemMenuView.pcss delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListItemView.pcss delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListSkeleton.pcss delete mode 100644 src/components/viewmodels/roomlist/MessagePreviewViewModel.tsx delete mode 100644 src/components/viewmodels/roomlist/RoomListItemMenuViewModel.tsx delete mode 100644 src/components/viewmodels/roomlist/RoomListItemViewModel.tsx delete mode 100644 src/components/viewmodels/roomlist/RoomListViewModel.tsx delete mode 100644 src/components/viewmodels/roomlist/useFilteredRooms.tsx delete mode 100644 src/components/viewmodels/roomlist/useMessagePreviewToggle.tsx delete mode 100644 src/components/viewmodels/roomlist/useRoomListNavigation.ts delete mode 100644 src/components/viewmodels/roomlist/useStickyRoomList.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/EmptyRoomList.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/RoomList.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/RoomListItemContextMenuView.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/RoomListItemMenuView.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/RoomListItemView.tsx delete mode 100644 src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx create mode 100644 src/viewmodels/room-list/RoomListItemViewModel.ts create mode 100644 src/viewmodels/room-list/RoomListViewViewModel.ts rename src/{components/viewmodels/roomlist => viewmodels/room-list}/utils.ts (83%) delete mode 100644 test/unit-tests/components/viewmodels/roomlist/MessagePreviewViewModel-test.tsx delete mode 100644 test/unit-tests/components/viewmodels/roomlist/RoomListItemMenuViewModel-test.tsx delete mode 100644 test/unit-tests/components/viewmodels/roomlist/RoomListItemViewModel-test.tsx delete mode 100644 test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx delete mode 100644 test/unit-tests/components/viewmodels/roomlist/useRoomListNavigation-test.ts delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemMenuView-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemView-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/EmptyRoomList-test.tsx.snap delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomList-test.tsx.snap delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemMenuView-test.tsx.snap delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemView-test.tsx.snap delete mode 100644 test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPrimaryFilters-test.tsx.snap create mode 100644 test/viewmodels/room-list/RoomListItemViewModel-test.tsx create mode 100644 test/viewmodels/room-list/RoomListViewViewModel-test.tsx rename test/{unit-tests/components/viewmodels/roomlist => viewmodels/room-list}/utils-test.ts (79%) diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/activity-indicator-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/activity-indicator-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac546adbccfdea05bc0f93180ab6545553ec292 GIT binary patch literal 3766 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk17EhMi(^Q|oHuuDvqTd` z8XoSv9%9(}QlwmgLr*P&B_w9nqNIiITm@p9X6XHoHTtRGduq?!a2x;9bCCy68yH)^ z-lfODaNzM99U!@wGlPMFgT;h_frUv5Xb&SV14Cm28$*MG12cnz!U9GH1%V3;3<4ZT z$`Y(z@A~(<-l%Q5{=9s%*{lsSIWih{{`vR$`|0oT;?u*E?QYz!uCMv>?CWaQhRhss zhGm7t)xUq>#{J##$3J|$d%G}(VaBnv*y}*+fAq>8I0N>Boe~RP zrxWSJQDtaRJ{lmS0fN6!7)>FgDP%N-kW`P3W|`3}Gn!>avkcZo_GsZSS~v`R;jn|5 of#LuEmn-KN0ehcppl&BKL(&F!P5GIxBY+|dp00i_>zopr0MGn5HUIzs literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/invited-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/invited-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd3f0f556f61e591ef2007ff96671d63487bedf GIT binary patch literal 3968 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1HY-Ki(^Q|oHw^^yJb@) z8Xj7vD|-stH+OU>u=TbIu4&0wD$o-V5phJRW38CdFXk&~7}p{t zj}qy?4YxeDO(@;$XlD54WMiucr^@p@qv#m%;4^zZUpajC%%0t8n{NVb)JeMzB7Gc~ z85|TAFfu3zTwq`j;K*QL;9xOfU|?aA0y>V7mw}G=55<-}y5^7dIza}pE zyZZ5c#)gf)>{caY|WS|nxjE0Z7XSYoY z4>!}xsr!3Ldj9?opK7aM$3?qUWOc01$JZq{}*prei_JM19hO88ML{pt2W9{Sq~Ip N@O1TaS?83{1OO5ws`~%{ literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..bacce8176c82bd8357dfe9435300ace9cf0702a6 GIT binary patch literal 4635 zcmeHLeNYl+7=M+9rZd`AYo$dSSFV+4Sy_r=PII0m)ppCT1pD$6Sd;=0VA-in({t7o z5$XCoXF}OhBoj5Wbt+h}+Y%*6i=v z$SEqT#S^?eb(_1=4#huA{l#NG-;pnc!_ehpMyh#UGfERv%hSH*#qO|b?-Bb#0Kio( zOa#Dj!4?1(*srvjX6FLHnG7h%2n>XPz%`fcz?#LKRx2I<+_nS?>TjW@TeOp^x=BTL zu?wKA?>z&hP$Oqsv=FgzqMIy74Pg_G(BDSU5C+*HtgagjTZX;{sboft(z zz^GFhRhpe|`ANYq8Oo)Cml4*B#J4jsbt>)EfT=rI6&B4{1oG6YLWHOP*fctp z-o(I~$Md2ju2BsyDx%QakD03-q^HMRq#TOw<3Y;64K@sXlwiLS7kq4xWKtw>Nl(n# z42q%My*%!CzkCCndFoMidani_v&S{ge^#p#ofuhL3paFlxD)FQ&(Da=eFX%;A-u|> z!jlEs3`7=91_7-_FeBLY^X=ROb#2%EtQnM?#4s%kbt5&gM1qM@4#r?8X3$!vluzNW zThiGLO2GzXH2p|qFS?vI60Km0&-(F2dY&D4x!dYsvxl?#!PxN8N`_K@FZ>u0m6R!h z)1P@{yV0cag8`cUHgR2=YHFT9lutCvh;ejf{#s|Q2X~2irpW;c^1SU_yqv<}%v4I* zj1r&qxYC^d`1ZA%x6nzi_37-?**h!licLC^y`d_GV60dBO4oeY2@uw@*%dDsL7@T! z^G}D5E1|9(G1cRB;kBMrT=(3Cbvz$bfZ=(Og%!=r+__H*nfioM=+yY>`{ZJuNb-vg zXLTQSQo6c+(g9}ZkibNgS)Po*G-C;+wI?;rp>P(xZ6;yh^uTll8xuz~b>D=B9E3II zzR`N5U=`V{C=1uq+x+xQ8Lbt1*u8yjKyv`Q`9y9NKVT?_+x{R~eHYV5(q8OJx4cp! z_~odhxfkN*#WioC1$PwZy-6(be#N)cC% zB2HXcej1@aejt|8a(!%3PqTu^c-&`n+YWGL3llS*?oijD8QQ!h+4se0IbNjS&2HF+ zknm#X6km$ACNyzU;%ZFm*d6|_OZKe8|8b~Lh}W37<#go**v66{#X>k|)8qlJ@3qouwN;3%LTnZCpMIw{$k-rbgNzL_f7`mg zyW}vHaLojOUCWzUz*~3X@2)%lUl)eB*4c{1k{qz?iFE;elTQd(>_Z|i_3?sPB_J#$ KBA6G1JNqjgKs%rS literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..571b86c600f1216aa71da82f315f5c08698b095a GIT binary patch literal 17991 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dbca6e3921e1a547802f6979ccb4a9497365d4 GIT binary patch literal 4018 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1An@wi(^Q|oHuv9SBIra zG(6mz&41*LiN?lRrW*{r7J0Ga{GIb%~4>AO6ruI5HR*I9N;= z7+9F3fR13~WngG*U}I=-aA0O|P*}jopdf&$tVx=ULG8iR>t%cYUp#pAcWZb3oS*-W z$JhO?Wk{&XS-`0F@L%uuefwVDJ$?GLe}46!+3(N2sY-uu5fc+rlk$04p%H_DB$HHv zkld{;AD_*>w(rlYbFHndZ=>aBpA9Q}f75*SSw0!NeI@@MdF$I*GZ^p!)oO|5MM#|g z+unEf`RBsdHfCR{<>e&Q^G8$G|{QUaz>ggS&a_6;q_Zr>) z{qf<)e{W}Q2AZJ6VsaqlPvy%?_1`xxJZ}4?PknyG%(ZW*Z;MJ*uJZ8-jAZfkH?;G%eO53^@ibq3D7Q2>xwU%Z|0=lapq_6 zY35(a;B)lS&+h-$^4~Ayzx$WKkRS!LQRPid_4)J9>-OHdtbBaG#D4<@1IDGhCnAz&4|0xA`5*e_`*vpX=}Wcx`I!XYTVk zyZ>&B4sVyfc7J2Z!$%AUzHT!BMW@=c8_(5`7k_5{&dcD_1B$u>+A`!uERpd)s*JpR zGa7EA;fB9t9ZeylDP%N-kkl9%%`&4|W;Dx;W*MwKmC?dsv~a*(IQ$3pxc~nTy0La0 gu;T)wPq|~pTUA~liCs2gJ)78&qol`;+0PSkiQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-without-activity-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/muted-without-activity-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dbca6e3921e1a547802f6979ccb4a9497365d4 GIT binary patch literal 4018 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1An@wi(^Q|oHuv9SBIra zG(6mz&41*LiN?lRrW*{r7J0Ga{GIb%~4>AO6ruI5HR*I9N;= z7+9F3fR13~WngG*U}I=-aA0O|P*}jopdf&$tVx=ULG8iR>t%cYUp#pAcWZb3oS*-W z$JhO?Wk{&XS-`0F@L%uuefwVDJ$?GLe}46!+3(N2sY-uu5fc+rlk$04p%H_DB$HHv zkld{;AD_*>w(rlYbFHndZ=>aBpA9Q}f75*SSw0!NeI@@MdF$I*GZ^p!)oO|5MM#|g z+unEf`RBsdHfCR{<>e&Q^G8$G|{QUaz>ggS&a_6;q_Zr>) z{qf<)e{W}Q2AZJ6VsaqlPvy%?_1`xxJZ}4?PknyG%(ZW*Z;MJ*uJZ8-jAZfkH?;G%eO53^@ibq3D7Q2>xwU%Z|0=lapq_6 zY35(a;B)lS&+h-$^4~Ayzx$WKkRS!LQRPid_4)J9>-OHdtbBaG#D4<@1IDGhCnAz&4|0xA`5*e_`*vpX=}Wcx`I!XYTVk zyZ>&B4sVyfc7J2Z!$%AUzHT!BMW@=c8_(5`7k_5{&dcD_1B$u>+A`!uERpd)s*JpR zGa7EA;fB9t9ZeylDP%N-kkl9%%`&4|W;Dx;W*MwKmC?dsv~a*(IQ$3pxc~nTy0La0 gu;T)wPq|~pTUA~liCs2gJ)78&qol`;+0PSkiQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/no-notification-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/no-notification-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..9f58a62407b42321e1382e699e8f73b601b1bbd6 GIT binary patch literal 3522 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^!cyxh~pF{EP7n`?%Q3RpHy&-Hg3U`)H(`Vn$=l#oN=kB@ZJg3}q&OPJuh_H}4HVthEf~eCw zw8ub#sKF8hRj93rZ$`y8I7SdUqIZvOkqPAM$IDkz)xql1oOMq>~JGH7VF09 zzPs{B`B@cz9NH}A?0-I8PX<179(5+L^ki|uyVCN{+ZR49O*@~rEk0m7HlJl%mdOT_ zWaZAK;k?kMT(-2j)b{G9bFbc94L|p;?v~`QMH9BPUHGDJ-M9Wp-&2yS@6CT_H^pvB zv(xVxp8ZX_xQl)u(J-a0Kw<~mHK<|2sLC~?MizfrzBV)Hea`cok2$5U$Jh$OF@vd& z&em+lo=KiOw@Wn(KkZIF@%7DwF2}2moqu>f^G>7IE%-;8AFcbUPMb(w>3fdn2!p`5)@!b1* zSEr0D-|*~U^5;KxyEl0>fA-E4!I)SNSfgXwUz(dXUONcpB9&bIAiQMW)0N4kL(}e6 zUvB0Tn{+weCp_ujkLT)TJ)B>$?)qr#FJkv_%e_q@6T*b~$ZAVo;agP1}k)ZV(>BGab zK;q1t5C5DqzdZgf`BR18xsUCyy2Vy5f7ZWQV#z_jlvuV4G zuMn$+ujjQLe)i?%Q8V5@-j`C4aC6X>p+VI>_imXwZ-S5DQE@$K;_RY--1xt|+{+If zPO7Rnk@hYB`P1U>kGq}<{NKLtlG6pt#!`acGp``yoVq2v#B@7m=)zaFX+r}`t@alL z90+@%m)LzYLH*mm2W2ujW01n-W`Ei3r!&4Y{wD;5O->0_8#9kI{$8*>`9;9l_<8T@e&hYQ+1C@!ZBpXh z-_5KKp`X_;3}W(Ny?N74iy#W3wIT0hI_Zqz6$!ls!xSwgN^|{=H<9I7ktxI#F&Hk> zxdak*+qv}@mk9<*lO&l-jJfaT)XRcMU5&#4dHmJH~0xsbEKZwWUnHa&0wXE*HyticoR$YGI>z1fcJ+XLmWixxX1b}#>qc| z!|l1P1?v?_FE$cnOG*RM&r#?}yCpyy8=Pq5T+7euc0jaQt zZI4)Ir>V8J7it*Px!6A6%`{L&=Q@tM3C7bNw0^O%p#+~syTe&$ENB$f4VHbM`jxYA ze$QdViv7d zG>=C)FrJb9e;VC^{2&@1|Jbk+viH0?oSLDD6r(-&nC%7G-O`_Fv^{hYHF&&u+24Tc zx$Of$uW%^)M&7^~Ts!~vpa&=W8BI}N5rf=F$R2sU3om=&NLJ*CwFB{5nFocR(|yT! zK7C;pfOwa#d6IUgX^MD`xJdALiJfei**@kZP~3#b($}l=VnO40N(Ygij{1mDnrNeW z;iAHOvethi-3ea52WuFtCO9!-S6vwn?nB&f@XB@>s}EWgg{amuK@hTO(0uD-j&Y7Mt|S!z zJ~E6a9QB3W*(M61k4Tul)XCt??i3X!WDR)g<*Fx~N6*%B1a3RTwGj!KHW`VSJ~un@ zzc-yWItoxSi(nGn`h|!|qPx`&L4qqt@_q`+kiwvso7ss&&8rQFd(P2I+_59cFCY|w zh<9k`%YF*5X}0%!8)u_MKq%{!8?ZGysJ^+@)6JcsYhC}V&k39#^Ya&EENf}eD zCLeY*PO%LT^FmS8-L;y!Z1Yu4@NS70e5e6GTc47xb|~=d0iJiyj+jK2s#9Up&j4iL zttibEYyag65#~<-GCJaty*{El+ki)l-{K0;e%3!D6lgD?=JKg4w{axWpZz(VH*o~o z)XR~KBBCzwG)sr?ZTe+_ihMe+4|%Z9vXTCa5{AOmW0zQ%>gcDWnO}n zIb)nWPy_=c)}#bI7*x zF8pu$l{Y^qDg#pqF{TeCRNRyqpVUYhX=lbj=B{M=N(}P+8z_?Wzq#&?Dl}m0J78|| zF}vcHh9H$xNpH3BjT#*exy%c;w5t0(StoXZ85Fxvzv zWatZffagD7J8(Sb_GM>@ywj}!-{xcUd6U5@8!p%mvkdSBPaP_XGSn(bFt}-OrxV4~ zCATheF8Aa(?SSKA`^LO=3VirB5e5}>`>~u-_#QPDTkFbN=!y76@zP-nO?9%G-5)WX zC@LuaTP5B#4^zn@a4~dYnrtzU($JJC&ah$6c$yblz(3KouoKbo#SM2A32wQ)asGFQ zT&^}z9&AHc{X2Wa>_Ke2>RatGHHC9bmLYn?H)AM?v8T3W9NhLW8SNnDC}H!dL^oQWY9tzu(_K-_ z+;@-hkoE!`?&-DeYKV}QWkrCE>=|Av<0q-7+8(cZ5Nm$4w>Z^|bUo%GncJtXox5;G zOWaI=T^#LUIKO0$aEBV z%_9zZ`lcA$D30?UX7;6kw$f-MSS;i_?Q(ca{7XF{oX!#;Z%+FS{x!975 z4KM7=mLs43sPUn-PTNvX)M~Qoh_qOv{nshNkIBX2q6f$jWea4cQZMVEj!$X2_KC6> zg;a<>@fRxYz4bmR6bc}(&_>#^JtqstlH%z1LE@c9;0)tXHMn|RFPgAxzv4fe8}{;! z_}~h;*YDZ6WxeLTD(KL@ko!KpDcDe(9HEd-h1{36FJFOdyNyZqGiDt`$^XrZ)A2m3 zNa?Ieh1?+-t4?vE=yw~piN?)hvH2gb)x6yQIz$K_p9-cgWv+cG$j!8-UUFF$Q;x-z z_TEwe(T$>)La2PCxD(PhD0!)?ZT4z{X@SKXx_NJu5vBW)gOS+kiPEi``zYq3OZ6~i zMq=@=GrYIRi}7KG=Ez`IV#4lU=wm*68;f85=WS6ZzR?^hX+ccLGF7P-BO-5RuM?+V+F6z@MmiqJYk~H)MPOk% zfbO;df3=G2sYW>;XUK$YTZX$?XD?NuJPwPGFy3i&ZE~<;%lWY7((PMU;OOyD&J1P~ z7GL?zdmDcLO;aRvgMbBWc|yjHQyj;p6k~u0-~}vx@{e~0zuB>Rag79&VauhNSue#! zL#Vf0Rn5G|;wt;eQZS1c#nu7yF5PIN>F5=Sa!AhhHczEAH4&0)HTd~Q$<~l}+Q+qI zW+1H37{AX^igDPlkF9^K7ck16G1($gKhyLI=uI@8wyR2A(-SC-8`UVk(LT_kiXo|g zV9Y*lM=bmSJtQqVDdgVSxQ>c-!psnbcg#zi9P4dvqhe$O4!+B^vXdyOkl)Zuo-8PJQ@yx` zJkBmi2%ApHJSEE4$J#%IQ^YcKSW_D9TP8vG#cBr!zdZ!B-}|el#4##^j}Cg@Y;;r0 z49Ark!~6r8r(FeeUK+P}W0|t)_+i2xq{$DVht#1 z3^nf9F+WgYif(-~AxUw+IX#SG0l{;jS%%~#rSbkf_-Wkl#ta!~NHV~4e_KuxzJA~z z7z_Z~{Lf?|I8SxV;oJbHDhzsU(5S~E8dIzeaETtnnan>S2fB%9u=B`P*u{4-_&C4m zL#TvCTpu=o(s;n2JsTYRQMLeWW9RZsY#?L_JbIUJnTk?(v`WhALlc>ki?*qqo(*Om zbg^cS_K!Iy3c<0aOOG`7A~GYpJyL(E_dShjaL$D;>I~7yA~u)j?0#IFuB!Opfl)A{ zd8ZN|xf+!0lcW|yQH$#io3FWRJxs9w^)4FLs%x* z)p+Oh0HUDFf^RYgU__LxWa=G@1o|4{azTe_XGYd5->TR*a~aNlx#pn})F-R2y(Md* z!5o=zcIzwYG~%}#gg`WC&4^oQbG9}~v>_c;eqiH0?qcM*Q=y+I1sVZ?|CJx-(~zUq zWkR>>8pJIKN`5Tl)blj6`TLPu(DAKm8$$HM@w!633EX-m@%p5~&}{M>EZ+?ON?Q9z zGsVt&)hl!+skNZ7wy&ToLGR3en%ObX_krdE=-*FZm!Tq-nS3?0aC zqW2C(P}tv4a=fS7vL(EfMTqyY#!4P_?1xj2|7Bb>I#$!3SWA{gPbcp{MdoaPx9P87 z1-vM$+x?B~2(UQfhfI~ptqZ6B(uAR+^o%>LPQ+*r@^~f+;qWg?smohZC(ZRC=v})X zk>C`}xtGo*fLQC>JV+Enz=XC(6|5b5EjUt%0Nn5DLdcZ*T~@oB8YwJlv@tk&4$r9U zZg3(OsOZEEf{@-%0!T`z6GUOnsSr~0mm4UIs~>@R=a^T&yjMOFy$8-%*id^0d^BwE_B{;j&(lT@ zQE3NF!rIK=gVEByJk`>)S5afF%&QzD+Dn}9)H~pi*zSAs_X|F%EfG55j7cX~cl=!w zDN4eR9%moHw;M#vOTovi?g-9exghR51Xj{&U2E7kJ&rsspX>*qw0oVR zcm=n!k`+A+0pswVBSPiT!!bg*7}e*XdMw`clXy_*LTGoMQ^RfmXn$>{s6$#q`f<## za{*x9R^_-^U{!>;#H<8|EAOl7iNd}tngB7#GDo$X&`gEN8>^yFLkfu3C=f0s1an1C zBJLg+D6_I2TR>IV%kasEDxcoHmdXGjaZRR(^k1CQP!$`H$SpxTU`*|_dZQ7?RAdgI zp1v0y)u1o!r}|cRA7MQ9$&qy0iR7ziUS;TX4+bPH$D=j%%_>r451X6O%BrL~M8k{= z2eAs5X-I0)et*E@y+BhWMTFd8aFX=vy?8zfhqDWWo!O=k(xs%ouha`zn+c#e+2{bW zBdAH*B3aSE%nAGs%!A3szSGc`#<;KoZy(*yLYV)rR zYj1UjZ`aF!dcy{s#-1AWb61IR{*iemV4E2b@W>`tNDFwG;(Z*pY2nIlC)G;SSpU4B_C z;Hva=-67gh%xwzP?T*+b$^?CF|t5XLOMvr`sa=;<=U zQ4aY;0eRVE_?~V(?71R$jYS_DJ>6H3bIyVc{!o`Gz0&-8*ul8pF;9|D#9Mp8jK!w5x%xbbaR+N<2oe45wBF-N);i|CI&cCS|ko)J_P;;p4=5B3~% z?}0#;O(a|Kc0vCH-TaXAR5Fq&ngd+U&s2ex1!FtP8sAaBoU7gX!%RG`wNc7~xHMy_ zMtcmWM0D>wzCIFVc|>LECZfdecwufmwf7&gsVu_1-Sk&)EL;A$Z41AKlewLKx0P7o zIW?uw2Z*9zHba2}8~83oWSMxakHQDXb0T;SiuR0^>I#wh!BF|Hr|mp*hOnJg+L?^R z>iE(OjGPFCg@|egn06z59%tI(B|FdkL>zc0XUw(b{@^ML(KrkHL6lx^gp(~!ZtR+V zK_hYCqY)z5Qe&4M3$WYez7imk8@q+D?CG&@h1i6sE;M#&XDqhOQ;tEQv3mv@7+LXF zDP8!+?rfA{0Z;Oz^O!>ejon8>Y2xjxcXL%zYp=N$o&nBZv`(VHB1%4*s+#8dO-?Bn zaJ-0tI5WDgD16oIlgg9$=t$;f9N&&xiC!x2VD>--gQln1TMi{@kHMv*SLUrHn4d-~ z+nP|y6_Jl|xuBX#BA70q(JcNX_A?A27f8pw(9<2kcTD85B&nw>%r2$(rVk57gAM}U z#})Q^t}Ars^rrN2d6}6TR_~G5sQbA5uMIII3UhTIS5UUg06N^Vk1LSB=up_-vX3i} zAE5d3LvxEhuE5+f`VkScyT$|yKnbQEjv1Su2lm|&tOAtl5^2l}KOTL2V3b;mvoXey zSCN<0l*~|(DMY&aHi-P>nBI+EE7%^#I)(T_E;DH;&BgkKa%TYTD$@UA<47E4%mAzR z{DFzzXkq9n4VHH2Y}61)HWB02dax0CD}uLwol9@JEl*yb4nLf#zaskKMO`7E`dvWI z^Yrf?QuB;?O})fT1s#eF{~hKe?WA8flzxUAX^65rte5C39KS!D)29l+oZBC z8uKC-VMt>OLewdvF5gvmHjMQDn(7p4ftUhlOnCLcuVhnN}WdcApPt^ zk#%`C+%iyJtktEuo3_PZ@u7M9Ec$f=G&k=wC-yelx=6JcnV17}gsj|P^V%XBlT;m; z%%c1?>avLtuO-Iq?{`Lxz82XqcP&w&&6Xl7hea8f;I1X;nxvm%=An9U?6Lu~YpFga zIidp-DsD}ueO&*VuPy|XLt)N)8*J{*ajefY;%b3MxgQqqnY2%6k@Rp7?K;#0lpCeb z6vShs36Uf$KD%|F)G;WGX1{SLdxLW0?Ym?ws;qOj5)7IKad$88Q}wUwlJO3qtwFhI z=1qAq?)O@mPZVMC+t2$f`qu|FH%r`zz0G#k6nN$J4_{o(o+VB{uQ|oyTO*BPJK>UU zs&XE1zy*SCW>nApkwI#dL*2n~!?ZC^wb@E~O5j?EiaW7^6SDQ^E(#d8b#WdH z1CwKx?W?B>l~-*1ry)8g9GLggqJRC1W?4W8(RBLH4J{3HEcJ*g|IIPbBJ~!=Lh1w` zQCTPSQh}^--h_LnW?J06>yM))otU&D*3;~vV&n+&jR&6D3o#2I6cD^>44nRq%_lRK z6Cp0a5PR&JQxKcx>jxl&4VOXelm@@_;>1=BgmA%m{hoc!{BB(NAdto-TS5*qSHLHzVk=mXVCaO{?J&7F^-RZ2+iT0=JuCz$MN+G(f>LM3qKk*vP4F0mQC3<7I$pr z7tY`7EJ_yX9=l%Z1t2Ir(7X>ocPQ}F*E!*W-Ey4cTH#iFOCr3w6`_0yY}#wl+6}z4 zV-89+1*sQSd+gX-;mwq<@XP}hlV`(^tA{L5>DI_bf}6;vcV9~tgYcVlm~`f}Cspoo zx^g8uG<1i){@gibtHmTpI=X?Gv)-QapbaC*3<-ffNV4`eIdc)3wOzo($*^Bvgzd-tfO=qBQRXX*7m&H6-Q#XEmG8wblaCwXT(N-Dem_oqFcfp zeNAj6nZSOYBo9aM#D;*sRy%7B+hb*699Hm{4l?$w`lAF5bZ9r-Dc_C`ka#NSt4jbri zUm`h=)YJ`up}ToCmHP-{Q+ExHl}jT66)O^&x%axiv|e0wb$KKeakg<%}J}N@_BCDwVR+u?t_6~cGf5-{&$0tq;licjZ6&YDMy^(ND##IfXIz3_T8v{p*e?@6-3x<6i#7mc) zmS(9gI7c++2p&Mp8mf+s~y!AWT2-1J&Ib>ogEtuA$#MPeq!|#ylO9U)O7>{-1 z!4?s-Ka)F5APDQ7~%U{i;e z9N|ZbTy5kzq#U#_M#lccm)KnG&`{XGfG~b~`PDJPU-}is&in@K5QLZg=^sQunD10e zP6Eajnzt>SDjP|ew|P2#8iSO4)bsJG{G$ss-JLd%fr`g;786b05HSzZg_;j4L5a9{ zSMW1s7`M-boB`xCNyR*nOnvIhJDu@Uqt42_KWE7f+Mn%M>!i(mfRokM4TSZJb4|6m zhOm*6S%CqL`nGp4?IkS+OF83zYv*u;Z&0!)Li&=B# z1SO3{TF#mex6T#9@@s^C)vS4TTXRj0kQb^bXL`0qVvg=lPJm;XR-sLJ@rJi7xaOtS ze>1_1L3ZA*Pc1q6V6I{~J5SRGz`FZo^i+rLnN(QI)*xPUPGgBU55Xp#SMo9gBW8oN;hfQtGa1t&5GU`fmt~)? z;f9XrCg}35**{2e?iddPtX-VRm2ClWcfaw2Jd>-&`vWy(2oh6%CRYvkUG42rZqiJy zVznBbwu!MurI)4Ea|1z7?FRlNv&VygmmS)qzR2D{T~{aMbQE|#u=kdBlYN|xYRA72 zWS;zN*Mc@2HmZX6WMsU4kr@cK%vGz`QaY^5M&n`VqB*TO0x_-zsq13GJ$OvP-OD^9 zhV8~X0!Q>yQpICWQ0$3y65+Gts~*KLP&j|Z*y!(W<{DoQ!OFB9 zkL8$7n{$o03GIN?a{GWh{{0dGC>+9P9Va5*oxD9)i9Mju)TZ(_u9BwLek*q#cm({l z$Exj(kGAJoOxS2TYnRxtO{(IB;3x%-elYG!4UY9ul)@RvE(nf6^JvWhwaLqa<_8>e zltV`~XdV~FN^f*RaAnY(eM}Y0p{fH;XKB!Ujdg-lw@t)hCJ&nDwlNC>X8OWNNGK1Q zn`e;8yzek~0k&$;e9KajlYKT0$^cWIR2=x8G`@wF3PaF~eEN2X0>#!^ABoXo1XYHRl(&&-8Y2h?Syqk_jdJ=m0-M#WV($X2-ko;1|XuEW-; znx#&7U^%%Euw-mmMT*i!=bdpUPEXyV!SaB)Xk^jg?%>Hs+9GklT*U8hu=o7mHnQn* zdSsdcjJk8;G2_J#n2WmYjASCiJfbfabi#nS$YdGV_;fU$zm2};VG>)prv2bza|wE& z*vBBXa+zWferL_UgoGzjD_4h-&CXZjE~!*(<&J?xw|j1~kzwXrxwH%Vlh?eQy2~K( zt=v?&T*$U%!&P?2wQ~P}vlwa&5W<%z$3CAi!?K$L(sGHcXF4Gx|z1wTz{?|Y#@Es0QoM99zxE+2mr3K>;f7tl@_D(>uDN8 zt;gd0TLVOQ;!mipn%fOAEo0Y3|4dno#4CmV+S1Bg*?yopb;LEYF1w-8_I9aOQmlY> zL=QydKNH^T_;(Lw9q4g#HJ<1)cJnTafsqT4d+guAe!I10s%sr44sz$N_e!M~l1*e) z=~7XpgzQ+c4I;EQDGfgp78m~E#htdDtRf|YPDR7-QpV~loaXqKd3icaAr_bY=OtX- zqOK6;?o!);a@M*k!R(mY)MUPL*I@CY=H61k)J4-=TR$IXb7}gqviN9Q_L>1a?zJ*>hul2<1RW2 z8j&IR&jS*;|1V(XwJ=LZV6lh!pMP8SKQ7xOKBVIC=jP0hXtR|*yE11^Cz16O)6R!! z3v=eFtxZ2lidN5=s|H5$-GGZYXRhC7OccRH!$6rcM`a=OQ1X#AD|6uaniQ*Y%}|>wazT^s8`>g#fE zwAH9Rz*e*i@l8M01(~bMtlRPdCG>TDk#7fH^YT+7HQ(1=)uOzbAc*Sf*wqVr<3ml( c25S&whaOt=mv6#jd_(l^8P?-acf+Fp1BUOj!vFvP literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/unsent-message-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/unsent-message-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bcf320c59f347878ce3ceb08a80703715042fb GIT binary patch literal 4007 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1AmOCi(^Q|oHuv(ubx`U zaQx%*IMe*=0n7)TqE%LGk-ulU=Fuigq zAR*;x0Eb?dsY}+9>ni@+I_79UseW16cD>tp&gaT~^#^7juAH~I%xpF<1H*x_%V_xZ;ee*FK* zCY4b0I`7uDmlN+UxBKzp(x=zi`RC@|-1Gcl>Fqojpkekwj5E5D{omUD{kS}Q&z8dP z%(w5?B}07C^5@^Z-~0FcdG+Sasimnv|G(DOkNN*&9%Dl$FhVXDJ-qUAGP~WM-%nO{ zzrUVyZ_Ce%?PBJ+G7K|#z;QF1gS?m{GJ;2yjRr6NB49LyjHZy$6hcz1Ihtigv&?9g z8O<_So7AI)!)W0!S~yU@aQMf_!0`Y7wUg(89d8CUP(PcQ!R1fa_2Yt)Y(NnPPgg&e IbxsLQ0I3DV?*IS* literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6f8b5b35282dfcd688b33e9c1305c8c5589cbb GIT binary patch literal 3860 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1K&wc7srr_IdAUTul7%5 zIPmfDu8lv!*%k&!+&JO1@x(Hf`~wQjM^7c0Zi>)2nQ-KhsKiq~E=k?#Gycd<3A z&YgFE{hpV<{w(RY{CQ>Ef$h(2mZz5)&E#QVIB@C=ACT7}U}2I1TF%JJ zz|h#h#?av4z|7#Fuz-<4LEr)dg8&C^Wj?LnT}%Uo5Wf?>}1x11&~g zgMF#>?mwf?Gx#urU2c4VVfBHzo1e2YENgCHleoWY>**T)Jq1sWZ1%psE%(Nj`q$eS z8v-p4F&gZ<8@)|$_p=k{Y~QcHC&M5yTNY?>tXUfg%i^ Lu6{1-oD!M<+je(= literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-without-activity-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/video-call-without-activity-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6f8b5b35282dfcd688b33e9c1305c8c5589cbb GIT binary patch literal 3860 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1K&wc7srr_IdAUTul7%5 zIPmfDu8lv!*%k&!+&JO1@x(Hf`~wQjM^7c0Zi>)2nQ-KhsKiq~E=k?#Gycd<3A z&YgFE{hpV<{w(RY{CQ>Ef$h(2mZz5)&E#QVIB@C=ACT7}U}2I1TF%JJ zz|h#h#?av4z|7#Fuz-<4LEr)dg8&C^Wj?LnT}%Uo5Wf?>}1x11&~g zgMF#>?mwf?Gx#urU2c4VVfBHzo1e2YENgCHleoWY>**T)Jq1sWZ1%psE%(Nj`q$eS z8v-p4F&gZ<8@)|$_p=k{Y~QcHC&M5yTNY?>tXUfg%i^ Lu6{1-oD!M<+je(= literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/voice-call-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.stories.tsx/voice-call-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..86f5cde837ccf25a264e080cd733d413a0899bd8 GIT binary patch literal 3936 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz;uCw2`F+wwC^zk1HY)Ji(^Q|oHut4zP?|~ zaQq|x-(%-9xqnOxYr{WJ(Yp-yIo?f=j0o*Y4Q4qaz?D zW{aXoooP~b+B5O}C-?ony1ne?)9*I5_uG#@{_<;&{r>}-{pa7){`|8BXydl@R1oRw zz|7#Fuz-<4LEr)dg8)Yc0|N((2?GNQlN8WxjJymCjSXxJ4Gvh99T2FqD$e?Q=H=Rr z_3v-pi@om4(DSP6XN?`>hMe7Tc3VE)|GBpC{Jv=W+FwUG8vVNa&XD~=iZD5l)bny1Oh@Sp= zRS%Ed-3&B_GowM#rs%=Co3BixAK!VlUzmYe7^ri`+IKbo-mz~xcG&%%P2snGh|0h{ zCGVTR->vz5^KAV)`#-l<_7-;^=HF*u_GY{AbUDTdtM5QZq&)uf>|lA^|0mDi=k2UJ zfAKhQttLn=B>=3gm2mU8_F6f6t$qf3F^LHl%*$W-u?dw{5F`FH~1&mgt@X?ir=M#Bw%sW+NJMpMXW3L&YXFq&mXv&?9g8O<_Sdl93B!)W1v tuW--<_EZ1=XZ{!S6xdH@19gy@8B(SfRi0Z_z8EON;OXk;vd$@?2>^Z(u0H?( literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/bold-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/bold-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5fa14a484ce7af2f388529ec3cb21aa8e56f27 GIT binary patch literal 21101 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/invitation-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/invitation-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..b9613435e858887fe01a48cc8b1f2029f2fe5d2b GIT binary patch literal 21568 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 KTiO=83;zdD%e0LE literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/no-message-preview-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/no-message-preview-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..c1caeadc0566547a11390f492f08e6b82b6bf923 GIT binary patch literal 18920 zcmZ8pc|gqD7yr)J#8hNj$dfW2TB$6NO1`8>R0t(4o=CPrsic~*l(l-6XG;xP5-m?f zv<>m>8j47%Y^9XazW>g5oo~Ot-niX4_ngl;_uO+n_s%=yXun{X!e|8qL5A5boWBe~ z21yVEmGTC|h)3Wb83@8hZ0FB)3gY}Mm(N(gB3P&Kn68Soa-`=V1N+zR+@%jMPE_1F z=<3^p6Gu<1=PDeuS*rRa#`DjE??3Y{scdl(E-D(0CHxQ{Re2~LrTxf$&};6+eTySr ztL=*k^j*5*SMI%ExgiZ7s$*yOIG3$zk4rE7RMFo3>96Ge-76mTHna}spj;kbfC&-e zLn2lgcCj{mx&!rZ@(-Cjo+NYe?q%^Q%FIjwCjOJd$-1<5bHGKR14~BnL;+G_;#;ob zY*4vMCj6~DPxAKIngT9wzl0GkwgD0UU9UTfi0;Yx(~BlLVMvO9W2rVK#FEi2_z$jJ z?FhcG?n3S>dC*pD$<;s%a-T@ zOP#T*_IH0qR;_9;+v#B&HjcE1KpmUJ>E=5dNo|q7r$#A?-J$haY4vM|>>p%5TQ9af zJ$`YI&#%dWHhzt-mfp36*ZPa1tJ^x}XZ5wYUJLtgp3J4V)6H#*m?_dEN0*yxW$%7heuH`3)OXa@Q z=sb&zZ9Qh=>apkP@PZrex!%sL$JHZu7S1w=-Sg&j!Or;fo$o{9dmmV$44&py{mqt+UapRR()l~?A~~TzOOoSMto|0HAf*eqaCXlfzpox)+x&xj?p5wpEU@!vdzRMyyq)J;_G@z0)$`j%dxSTS zZ5V6Wcc`GCDE{tp)8-exk#7Ublt1;x%~322`tBRu-rw{3aa2j?JfXx9eKnDB4S!x8 zvZrgr>0Px!kIMrin^XI$ufNKwjthA(t76v7pSM3Anc>|3{;`F&MWg8a(bTcKI+Uxr zG`8`=n~$YNtc&i9uc{m#rrYz=d)2XD<-fu-4txv`4(WKK9xbmkCVWjt#9GGT5XX2i((%}cJ=KOx`SD)Dwex#$r&x43SVKS!JRkIZ zUe*1=aF;C4{(TQxe|7ttZmwwGU-B!fIq1U)t-I^9>ct5&g0`l2j{MSnB!5jnlna ztGP1Q>yBUT^=r|;j^$Z|m$=#F?@zv6s&CO#HGFu9N4Ql-_Rc)jU1i%N(|X$+v?@Z1 z!n*e_&+ANX>VAFNEv`MMsq1xjXnU}gY3&n-$jI40*H&G3_+YsuxAk3B(v6hS<-h*~ zCyCzaAsRMwl=HeF zcWU_NOoGJ)o-cVJk& zj-cixV>9kwO;Ggi``RC&KHH}|t;pA6T;2@hw>mdIzwUlx zW&KFY<{t$Gr~7LkrWHgLD&*%jH$PaFx8tw(n+r=K=7j#r{x78GwRzj{_Wb_df~3=Z zVeji&yCcr~=FPJBVe2ra!nO8!jZSX-tj}qU4eeTd_wIW$_wTdxd(sh}I^C!Dd1KvslV(2<4GHtR@B1>YC3Z8jxwmtF&V!9$i|6iXcY@0vy`$;x6!hps{J#yKdS*HV zx6EjslhP4(M?GIRHn?l%c>@{-V*YR2^1*)9*o(2k)18Wp0(Ey+3$V?=fjY#qQpMBM{ZM zJ6lAS9g$3}flcGwkmozk69*uD~+mp|&yKL9Lc3-YdesAYlR|lmJ8k2U37|Dp}nOug0rw<+s zclvXzMja@=61_37`mIB`Pq~Bl$NH~6vcrwbQ!^Cju9sUqq|zfqGU&nBUp;%*4?o-b z-D+%>Pf*EDchkBrapRdo1W#0lxhpqi1|V9RX@y1cAD=piD!P8U6?}i*Gr1@sJ(qp7 zV?xPvbSVl4u_WHD^>j0#{f?G+376Om}Kd&lMag1Omw z{w=p#>;4{IIw`gz=}yGbv~9UAFEwf|$jpQ?GvytdFkIed_2g57+?l&G-l{Y1)@{ohl@b^JqUVl53 znmqQNbK%9&#`N_Bhs${hS1 z!d~`OCAEi5-LtMRaDT$C3WGhBo!ODmIeyXGO)Y=D4A(LYsg5j&^k_WXxIePLt7eK3 z?!t`*m1JRzyX6piL9Vj%+Sc1o2Nf7bSIo%S6?x%7O`&{#>xb;41x+=+yOsLLbgV45 z#hN~87Ku+IImJ~eR3*JsZi@~1r%B@lh|#_;BS{yd_}^Nt(jz5reA%wFtLnP?h(pEg zQ%vT754sqpc#O-fv{^HfvW1eak1na>3(p^Rq1z8qa~B1*k;3#?(IvtxI;zA&ptBhA z^;47|pSFbf(Iiw?lEi~m^9_=5GIr(M*3O8oDIr+q4(0}p|o;{ zsEQj4&CgL-^r)W}YtMV~INmB}+%P1r{M8ATmHe7j5}#zieB~Z3s)-{P5#@19+*@Rv(OHmk_PqrGsg=Cx zY062)H(=2lvDJhjSU+k%fsFIj&>~N6w4g9=(W{(9Vr~!8tE=gRip@do@jWJbhoXL) z=V{>h6N3HEAKV^Ga{-e*!{N&h!Hes3OZPF+fd!(wv@yYPAu>k(%?y@h{^L9y&?e9~ z=$~D9sYqjrt>I)_L)VU<(aaK z3W4a$y{HK@rOCo_X0u%aJeQ8z3g1)#l1%fOt8uUT^r)tt=<=1^gvoyNyr6d$f%BccPSWvjjbX@6F4 zJRm%wM`}++{VG1cVuOW<=5kdOCHqF1o`mIP@an^6TR!^MYSxNirNBhup7 zv)#Z*x7yP4k`{C&ea_)V{tH@9NvoIVpRtjQmI*Ic1WYu{@dAU*LP(Fmbj5Tld`V9| zP6-`#p+J;{+M1IoZHsQD0;#7o0j7_?oj__R>O?;g*o(rz&0)D0=mXGse5C>Yg%(4= z#J&NOsR720nuj4;^UBXMcAF?d!6Xs^tfERyJ31CHu|3C4brhs7tyiC(GLyNyVr_B7 zTv%^zr=~qK8GNvt8`0o|XzfN{>9FeZ>$K}h%GO08=|cN^eY0T@EKmH@F&iA$APiP3_~sa83+)7&x7PJ<$%kL#X5F z43nM1uTcS?$*Vbmhs0pmO+&_tP&#hDDc0awMGxP+7=;Gh?HEn|e{ zKki>;RwT8y2Cc0x9aLlrI#T>T0DIr-lEAbm1|zV*_%fVrm-Es$t4N6$A~qNY9R%?^ zXt<<_Tg#UcwH&$esvr=myu~QWU8F7@OY4rQfH5lT9Jw&?Y=ra=YFsb^j5%eSNbK}Q zYEmju#l*nTE;T+$q_zga7ZVoDb&ONZccCg=zdotY|fbZ+{sF2(D~ zW#F*ov4_vmKH%;c>1fVD55X=yq-5hFL*%!bqlw5L)b{sIm@4xDcZaH@?;BA2&6lNP zD18ZVe=9G{UB)qOmA^jVfa6}``HvAM6mL{z$$-VBtKqC)lJ#QnHd;YKBWx;&o|>SW z%GYF%3nl_0S9}t$OyJ~FK;xRmoB>4MV<)Y|Lpg4;@r4e6h_AN(pO_$!)5;tn6W~zQ znKjZH1PeSkr|9uzZ~`sAaP%I&zF+~zgc_FzN6HUh;6orHFyg!=l9wn05Xq=cFe9xI zsB;2{9q}8~{ylz~fc9W0X9SE3pa3?F)Vt0Ut%CKOOl3g~93Qby#V2Jwj9>|81zz?d zue?|4vua|238&R-q5$zWF?>XLVE9JoMWo?A z@`>aw{tAXyn;4P6gM1#jA#SPih3Oh+_tJ(JC??_oI13_pmi>~KjL}vKrsomSVo-bW zkZW6H(O1ATJ%#0g+Ii{A>FkCJfYQupGpJqHq&MII>y`f+b{vWA=Dr=+^DLLo7%EwQ zVJ*>U$bxSaULsFJ3)$`xVl!a983~J09Y+iZYaLkcn$LBUiJVNC1VPMMfa!zeq#fOL zP%uGQzw+InuZ?+b}eXurAyKQ_ixjvj2AsihT7jxm@*soX1umEB^ zPKc_&@t_b{^F)v-tIot4oNN_c2x~*{f6S=-L~OI$!rsGBD;*hqZ37WT)B=15amEF1 zqFHIOVnLNl4adFd1ta%dNz_Td>)tD zK){ZOeB^H8#jWTwfb@C6&AF5gKqKH3f_N~9j?k-PQnlwSPCJjEI3I3Ty`-g7;|ijT zT_h{eRw!9oU#z~yvTxGJ#=H6;BWe5Qf9U;!d!|lqQ-}^yGGlu$I~>K!MAn?FWpZ2T z7$Re%3Fv|z<&c4i<`FpiQPl0=b#bhC7Gh5UqNhb~T~#@oS@7#Z`Z3%iDIHID6XX_n z1_!|N_r4kMENU-A{+d86X)0WSo%4Mes0%X6fgXkW}xc5ETl@#ikEcC$D5u1UGdw*}Hj}|^U2qqLmIG30P%%-ib9Vwm7 zK~I5!rjL+(qyd$6qAkRMPwDOpMwOs2 zBl#3W@2O#Hvbpbg9Tb~^+inTA=bf#iZ6{o?0*qV{pw>)-md$-Z6`6;1mtb>9L6SY7TwX*w`7dl1N*!EBK)AKQlHSCN_|ic* z&|4s)eK&rl`c619KcPtwPZHo*g8n>mM5f%15su(xI|vxNr&+9q5DP=~wbPCYk({AX ztbESnKe5GM@|RGOVK3A>=GxK?zDI$<9GhT6_^`NCIKI8uwIj% z4ha5`PdtbLQc07pdY0o(P#WfPz}He+RSXGl5jwof2g zzfpID`kHdKNDma$ieUq zKxV$aMIBWP`zyW(B^Ce04r(=;{S|!&lXgyXprV0ce_z0nQ26lsI9fRlO0d5o7g*Hg zn+2=lAlP5&JgALD)k|g5fqT)bytxaco6m6=i1{2e*+E(8s#^MgnDd{QBh`YNHf$mM zg&^7fuc7H9s`LhopMfxs`}FKt2G@zr0f=m1#qowmR0)H2Bj$`e3r!fsB#8%$)B2xUJa-r-xG8(1X zh(6W?Q<&E{NNfp7;wyl;iu4O5R%FSIor~LC4R!wVc?9jjm))hu$k3$L_{^JMVU0xD zZ?a-x0^zh&kcz}!63a*fd=aY0OV)eCdbkGq(RUlY3Z?_3CqvxgcN@~v!ksK7H^TNL z?>5R6O=YPIgC4^ay)+qSO0NiWnSJpYGXM55^#lh}&U;UHs1)5hp3s}`DhVUO#Av#g z@TDjS-9_TS(7j}AJ>;hmoC%BWCB84dAiM@Ev*}*)3orC5XQA8ybT0|vOF4_V|3~+d zk`4(o|Bvn^Q}I>Rnmwlm(!B(@a-xhuehTwgcP}ts^e14r|8e5<0q!{n>GN@V#&Wp8 zkmWw`PZHdHoGRJ?7Z~qZS3aWm5c*q|b}I{{?h+*uCOintAeEbAnK)-v$_rvjSZLum zSsJUd@mQ8@LF4E+@`rLh&}Q>GLKCTzgzg;eV7i?fbc2L>%tfsk)Z*rYZ_~At=V;Dm z+)QXFIawj=@TQUkc9K!0A!x80c1pi z22v~J;V!&eAg9BJ?}|Ycsj#t9?-Vg(_y^Bp*e?&c%1=)<7m`a-Yg_Ryj}S)k{j}La zcuwPhGn&5P3Zo$YfxgSwrtL}J4-%rxU{B$98FZ^bNrD!Vy30trB^)8sa5o?xg6+b| zzkgKy814i*QBKxaZ=xHOcyU(Ip-*wX2MNQW+c--iz;M2Vm6F{Y@{yyA^Chi3%FV$i z$T(jT@J;H{Ij}y9^CiSU@off4kj43uizP0_3b_L~U(#^_@-@2#a=wI_;*p~J-D(3k zUvhl7Xzd`sv6^PGy9`493&^KCc~-r3Ygmrt@oS(GZ73|YRg~L9hacgFREXr%GNtip zD7EEAWyF60u-$ir4K%3S2#B=E?SXje-ZVmr*WpBv z7{g@a-9zv&#zIjuitUboIEyR}gqvuX1uX%&s;4JRuH=|ftWlyBb{ZFA4D5tO&rl~? z1*!pnP6h znGnj-^Q{GUExDCnZ7vB0qBl=mfs|PfX_NJ^#1hLPlP(uLTK(5Ru7$kG$h&=_bwH6q z-DJ2&3+)-~;53AihPcUa+$YqMjZc6ZdmUr$L}(0d3#tAaFna?5Uvy@lJ{aSeB+R32 zdJ2j>Jvwh3Zj57`Fp3-(orGL>^6EwMI^OZP(482^{sO1}HE1c-t2#yq4e@coY&b4* z&nA+)1B%FOVHfBVa~bHJug+@BrAJJv@R>Yb7$WuoQ)^|>6q6u4CqDrSOC5_bS6Epz z=Cp8A5#+9-xae9^FET=6j$pq76eLfh7mC~o!lkqyobXi=}wh@P@*R`U3^S) z0hGPceQ*jYe^@!dOED<`Lc^9FHx}oz#}`60+wZnG{Cwd1lgj|YHOq0W%1`EE$7J)T zLNresbzB9)$rTG=#)AQb;1{;1V1VpDh)57^0T8y>TyexTh5HF>az17cAlMfzBX5xK z_JbG~z+I|ox=4?@$X{rM5ywVMJg8mq!ifffc)tUU;xZsBcWgP#T&<6?m%v5jSAC$* z&1MD2s_IemBxku(A)2RY#l4|@2MgjaPlBP-3@&tNCG{e~tFaSw@8nkgT#!hmMGE{g zHexp~Yn46-_Bh?+JwX ztKi+6NVX?b!IZoW@dEF9TVmfRn0k4p2XO0uLx?xWUu1e+H^uk(9lSMo*ZSyERR*SV z`Sw_Wb%%71{~d1nzYpdoQaAJvaX)MqXm z#>zfWa!n9z-~_!<8t_{Z$R|T#!NFFy{ts%XKbkMNRh%+siU}M77jUghv_n&`yeW0z zLS&ONXbj4962t!Qi3taE=2#V@`16GK4AgMJ#>qN5s}?70ST9T*fwx%mLf3>S$D8DS zQYF<%XbVqIUqW8h$sU*-0G}Ti=44KShmGN6<9h?hCe$x@+FSY_g?eA&2&sF`S7#F@ zbsJ|3b>#WFkh%>6Zgt60xA767H%|>xx4OleWEObR#gf`vVB@Xo8|E^<;Cz5%4?HgE zP~OZuX(3|R27NxH^0fl-7LZIYxSozeU}j$M%Vq1~>3j#kzhlE6*{V=RlbIYp9K=vB zWhHLkq#Y-`z&b2|TS5%CUg{dhw~}Zvfx}gRVnT6D(m(L>P^Z#|)=)GRRGwO$WB>zX zmqAFv{soZ!O?W#B52fkqjd;Ftuq95FwxcZ{s zAo{oWO}e?0EJ7O~>ctA6_2DU-nM*xSA5I{YH`c&-u7A@ds~U`LB_`+y@ZpGIt~X?M z@FuA>UN;08DZzCEvi4@Vr0x|+%C@hgnaqT{`vR&s$nV17d+b3(qyUHpTeS@k0C(cR zT3^^&^a?t1!Y~qx*MP@`_Mkd`CNX4DRV zjU4d81+Ubc7fAvr_%Ra@ZIbW~fBXQ{9{rpIekz5mDavRiDN^Vx90=L^a1&{uk+q9V zr6LnF5ATwoUPS#ur)28XQHN%f^xM?_|F{!7Gv0hXVu zHZyxqh;2o?l3l?aA$|8)K!~+OwdNy)H~L2+EOZdjXzo1t@zi~=*4k8d&dsQj&6;I`>ob?E$>-Xjtcx9eu*_i0y?^A34P~4= z7{aYIt4`TG;0=j*HCR^qdUGr!5fg$>FbJ|zWj|?#orH;!P(M*~5tL#qJQwQ$0V%&i zGIcV$C=_o3Flw7higSox;Zfn82oFP3dd;zZ`d4_=76v+B8x|mcg-6XD1^yT>hv%!4 z24d#UPt*-Nsaw!Pq~wVTHFV0S2w&2ny3j+A8Zv}0xwZ7rE;2wE!k0vwdOgCE5x%5} zG3mlm2s1X}OV&FUa!yNx0|;O03+IKqW9p$VGaY(MZLt>f(3b_5K$CNddFV?aLRhNDo1QwCe&{O;+9!_U zL?rfN{&99U?^{|p@c zan>)VfoQUopjMa$?D(_?!NhBx2pLlbzoX>@?J{>D>FzMOSh5=7WdP=`O~F)$Sz{-e zMd%9k9a6SZ+Ds`fYLJU1B1ReV7VqF~#+aIAl20(_;CNs+w`a&6B#5?ge=ZVY)1mes zedQR-`h$}_=b%%-q%-H**yS2#!7;anu4nwd(kOP6bN}K!tgu3&d^as%rwaZ;N5Ksw zRvdqvB^#no6&5@(_W<9Cbx{i9CWG1|gS6_GOIVNR@R|;2?dIm`qA+eOk%~!kF`NrD zxi}00VYQ@>f&enrUr>%rQLBd>BqDw_P3g(Eg;&g6AL1=}%{)mQjad+6ISV^;VmFAg zQ2NdGC2-KvSz9UmAF8C0KUhBqgxKSene?+majsAkH%*M+fDLkTCH#hGOY&_A_a1a? z+1oQ^uNp-kxE9tz%o`T<&X~cf+r-y}t=xN10Av?u($pET!>+2Q-C76I*Li-FwV&Ww z*v;js%EIiKyP&_2SYX;aUp_C_jpEEYoxoaL~U{iF%=%oPUC zhKw|OpZUOew?TXJ;Z69<3sjp%*)xbYVT5ocb!KP3P4TO*#@p zabSC#Sd%y~PjJ`JcbhG+m)gDSClK?}93?vB7sRW;_Ep;=sWV}-9QA~u3-)^V$Uy2k z853{^V0;E9kILOgPliVuI^uPx z6nvsr}-)qYB19s{Qx#0EO6XvXQ2)+;j zJXNG)Alz#ZO$Q~yQvgX@5cC)}Kk>i|+o{litF)WhU%goag zZUiVD87FKeQG&jsg$OKpfK-0yTzW5yZpr!Mfju3ZJN>(u2z~;JWpXW$Rmcawj;yPm z-(3Is^n+i5i@}o>2sqAdISzgy9{f^)M2t`6zNwo>J@{phD{*%ZlV}$E+WjBYr@&n! zmY=kq!9F4p5eH(G(^O}+`VKp?M?qw3y{q^^zhS3zxet@?FAyUr^@g4N3S5_?ehSMS z;Rq+*uv1tIl;P<3d#)~i+rfH(5)*~*ut`qD4ud!B6hF2Qx-a`pV-AzrF%gI0X#v2vEOgMN2g( zeQ^+h0yfzWYBzE829Qa?yvrU}kl4PXP6LyOGS_UFM7cJdU0%TA`y$fA+mAVQ+A;C>X~uYQ}!pzvA5LtfT!$F zmS7a|i@gEUnWyaV0-JmfA_xG}Wlz~@;x|SFYTu7JNt;d)zfj2{uh!WoF((H}{CYv< z;yq3O0CT>Q#P1F$i*}y-XSFQ15bsXT!l`n0*y6j49q?hHl^|cATiLVW>R$t5_{?0v zCM2$EPc)M#$Q|MiTP*0sE_U&Qi1vfe_eY*s<&(rN!{N~k>Q~yl)QxFBh=m2gV0fpp zUJTZS>NEBTV)lXI1t*Ia4t#U+WIh<~<@gLHV&~8#dfl&Jc=a@cQ@G*SCbX8?XScxc z^wFpPA`FM$ap;rdcfs(xOK2vZd2uon)E*jn)r&G*l7`wt!HmU$+HpIVGxx6K|CU4G z3Tl6Rt%oxUB!I+w6X;Hn*ya}5!z2(8kG^^aZzNys5k6xV;P7L^&iFr(>N!@L13;Ci zp~+~YTDR-KbC7!+va0vkeZWZKIf&lq<3WvtwO3XoZ6fmoIS!XdNNh=t)A_?fGuHSM zdr)JWmx4Cj6e`HZze3KhHZ_6YAsAm4rZe)VLVYt$Gxin?7#|fbr^h>Cqj$ct|At#F zy(4TU<%n(qdN&_m3nI{9eq4w(0D29oPWY8CK0i`84WBQDtI;gsxJ@+SE+v0k2zP79 zn*YWGKv7D~KP3zW2G$1X%nc_;%d#i&)51k69m5d>>F<9wY*93P7>pNQgOL3RW-kjh So;tt?Vry+bKV_ch-v0p`6{0Wz literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/selected-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/selected-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..c44d733d2f04b8ee6a1f25561fd2e13e1cd0ae97 GIT binary patch literal 20566 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-hover-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-hover-menu-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..e045a22515ea4e3adc3dbf3b400de237b4b3fe79 GIT binary patch literal 20491 zcmZ8pc_38#7oV91Guo6aEtpa%k~UGcTZtB-qR3jkBEnR5Vx~wtt$Nn!m1wb)?8$`o zLM3EhDzYnE*5A2v@0}UHzuvs#JKyg)pL4!v`=05Xsj=Zy@j2oo5^3tzE&97iq)A*7 ziBdun1&W>5?58A>1Zk`O1~YGRdky{iA#)$K?i!>2J|s*RS-@aZ|81UcPYVkXJ$j5= zNWZ>S@$3}|(~GCJP?Z)3pOrv<%s9u{d51cCjWMkf`7&j}DWmg7qK;hAecm3fU%r}u z&3MqsJd;~ImX(>&nNnO^H!$pUC^690yl-alkOG-PrAaUl7K!)a4Pt*TtZ#gc3I6}s zAF^mPZkAEDRjjQdu@L@%7*HrogMzYFZ*sBl7TXb0k#lYKq7+l^Ucu(y=rr!POV$Nc zS`e4NIm3`l)_i@x?Ozi6nTR`a=o>TG!M(e3F`SV^8G`?y%>9;Z`_TQP$Zspc~HWkA=+~{*%pZQcAi?_+Y z-KDi`q+U!T4E~LbB^d;fk1?+8? zwAc3(?#^!r8QtVPTvaz`kL95oDV0v+O3!*OB~K5x@jT}JQgp7nr+@4H`1}yP-=9*N zoo!`o`!rS;ls_N4RMhse=3bCb(c+zxV6Ys%>5Uu3A;jZcQ*s%|9_rFifm>zC7mb;?stx|!WT+fS?uVq^9{d#{M zomk&iJp;2wp1pGRkV7s>F3};`{i)I_NK%ab9iulKzdt}BwpChBel)c1?>6r?5r--B zPQ}h%*CnPmva{ku@!nA9C*Du`_c;eQ>$v^fxL@e4=PyyTujTyQ2aA(O z4J{m^(+ZA_AJ0GKeA9Z>hwPsb-HC42vpj41lJk9dVvAD?UP9U1v-SEKplwL|`-(Bh82 z5y6uK$A`zK{%I~&_*?3g7OWPm(_gLf=Si)nyG{?M^y9jkfym2b$W+ zx7+hSl()}bp7s56k>AT2*PPB>{`7~*&wVXCzM2C7+OlKKVtP}ojy|@m@NT-azALwl zGg{!ae5|XesnIn&+N<-Cn!G~FxK=^4$@ozVpC300?nNG*S7veW5_6!&OU5lrST!tU z6D3Zh-bx``t=+G|vSGT3o{qap`DOp}{)2DgUyQmw9r^v|=WdKZHu3%&&a!@qT&E z(F*_69RZK$r(~y}dH~cBo$Y)2-)^6M6=yjbDjoC8KyMr&- zcooht4AvPKjAZ_~RPIqW{wp>qry|0@mbpaewo+F~FIhy2{hQhqVy9y^)|DAB6f$1( zxB2SOzr}2^b{XBiU)RIyXNR{@>onZQy3L#42IbgYY&WO&H2zR|J}}Dc z%FUZ>Qmim`t>=JV#tRYatpZSxTFNG|`o=GH3ljFcu<-xSzgnuU-MQ`G)dN#vhuhya zsEqe~P5CBW6(r|bz0R8XVsF9o;b*G;^=}Ha{6-6gr_r~orkUOPTd5IrvhEn-{r!qz z{!m+TxsThEoW^Ul#nHaI2ICb&#ohddwF*`$=p_9qR`IYJuRT4k+n(Ar)}ZQErD5&! z!yG;Y?A9D=3H1mF&#dxIo{_MDJ3|nxp2*0qCk6ib>AZdPQ}a2=zk#XAQ~nH%^tu=8 z*vc)>>uoFwRj~WpG)|9?8u_ms*Pi}!+e7!-Snq-NVu2bxi;B@u$U;mg z(!}kQ7Kfv|0^6?y`&}9yV&_#Wwr6}bZuqVcsBzT$_s#~pz@c2`2Uow~k9+N$-D|X# zYpW~^{E%blHlY1G?@rgHlgzs6PKS#&O)D`IPPxUB!5C(*MA;2#9^L=J^MZWm^IC(3 zt5$9_yXXB%(RtrTzRnGhE*tya&`?=dyDqz>T0?%t(9&-6u75{j=Vy04HZ)A`A+zweU?)=-y2 z^Nu93x1y{C=GLCE$%xSy|J8lF%XU`!VD+c{aR=)p_Y4mX=eHFNAHCHVsg8=#)p~BJtjt&1uDl;ADt~7U)^~VLRoT(A_ny+jj&~0o zf;B$)dwBnT8=qg3m*w^N&`YJKFO|5VI%E3HU*0#FXsgbO{a$pky{D-1!t-Ot1`D^2 z&oS2Q>1BQ`PHubV+0mzQra0!9Yx6NZFUbMl#&dc>in_mhx<9Ngc2Cc0O7hE(H(qz= zk9T`bVcYqA)3sU;Hhgo4?N~PawZkjOBsRM~`<(Ly5gF^=L}q`u8f~+ijDJU7e%#)X z6z{APT77?-gRES0b*y#Tvb!IfM9tLo&41f4GCo*ryd$-_dX}-)pY08IzZ8ip#g4f( zSjpIxW!=kc^DNr6U3C#jM$=UY34JxwZKUP8BDyX=tA@vR{%doM{ z+LY-gqCimwYHM-q+*`fx8={igNzrPs>HvCyMb@Q9pl?M$noeR5chI7?N z3jF$~>kamp-yXd3+f`j^IYg0vmJ})Xdrl}iK2Ww_H?MwJR;M{Hwat0^x6aLK7P|g@ zAH_lzSPbMegeHwxR`_1np>_Lcyj(h6FYo8jCzBmYogS~F2ZHqM+-i#6Z@%UK!|v$Z zfW9`Zf*pC8X@BU90+Jwb1pAY|sAhRa;Wt{nXB(xo*>}+_HY%?UTMx7Vzy8P?*P=`Ns}k2v_NwiROnJ416Y%0sY~9~L>ydAQqdw6xHjNLkb_v~@Xzkx-6pcRiDRF?8tiqidRWm_l+#7e%Np>yZIRRdqDiZb~mr+ zf@J66pxM!TZ_57d&HQ7ZZPUA$6~xl^-C#cq0)Tk6XLImVtfzZGL&C8gvaZ}8K5w(4l=kHgVzi><1BPJF0I zS8PkpYxsG^6AFJ`UB(t&OIuhq}O|};ewyS{*=?kL@z+r)6VTqO7E<|Mc$XB z_R_m*0y0(%mmDkzHz>>V&XPK>Dw_TAdBeSwCQqx7*{h}fuUa1c{Z1}@>Iv7O&CLTA z7n%>c`L#cH&g>}n3YOIKIz0IEWq7cvMqTEgBVGFfpB!E?W?E`#H?+;dD>`kxp0UkH zz|p)w>chdi8CABMr&hV-`gnKWt_ztu?myc2E3?Y1TuM)Lv?+E>`{?6e2GP#<_ElMS zSJ(WB&4ZF4PO4y!qRyEs<5IEmd7bJxA;sfWJ`E=vqUN4AIj-@|@$?n1>~W26>r#^< zzx=&pS(E%*nSGBMwVeq2i2X6BS((Q^T%5f+f3AVaPXs!o>YO<6tuGx>GLPHNsY6V3IH zGV^~oG#M&<@^Nd>J8kCwpD*`$pv*L_@7(SN#c3VX!UHeb9G)xB8|w5r(`XneGv@8q z)0f-jYuMADS+$|de|xjnvDeQn+U-UhPxS1|$UR?vp>B1pM{}O6OxcBUncBrUNrO5+ zzL;n)pLKFanrBye#|+QfV>!Xw^RJocNOcB6omh}=b?NyYsC~NG!$F%2hLp>SZ>?0E zH9xcENW*{sg*U!VywF_ZRCzr0(x%6TJnwDX-ddn|cS>CE9e=7|cI=4hv1&j)ks4(bN%^8WbHYx4VL zsVxJioYz&)hk%k`$vuY074}=I6P{nChy5qgC z@3m=unT;+lIm_C_OC?F{rBrJDQs%SGnAYwteG^N7O7e${H0Jtm0(C*K=M3j+|l!vMAHe&`nHNcT}Dz`H)%88Il{h#OodL@ z)Hi8z4Gdu~C2Uz&)*ZDJ-WSUPq>^q$LP)Wn>(dj~`9~w2)Mau@a#s*)1Ud*^fL>ORlp{ z5NbLN@}GW}b(zOnsam~0CYe1Al=Cq1yhz~IDbJLSB z37$f;D4r_j2x<9^FNcN1hrMqi--c=2Ll-JT1Scb_8+`(LG)f@@TYG3uiva05x#%h3`ZyL;$|l84CGHfsHY;Esv5 zzLTae&$_c>7nP3*`r#>{e%a@&lW?j_Vt{L3RK`Ou9K1IOywaMNgBz6SI8o`mQmi&qNpdaZ-kzYKFgA-c?@QQMo`LZHas!0F@u@P?j@(AveDrUo zaR7N-QZBuBx&0!c&85Jwq$X9xkl41=M*?qTnhVQwA4{Uhrm^^Ok?J%2|hVH;eS?2UPDiG-aX{EVud7!H1k*?n#a9X8%m?kv_kJy~{5QLia%zMmEKcrO>$dFH>a3M{wxJl8JkdHG;S&zOWO#$+h-KLZH97Kxr8nBRsKwfy-RLBK-inp9c zw1KRhYDyQJ6<1cVcdk@G)i!Oiz%K?utbUl!*R` zeFR+Wk#pOu?Nx*@h3=veLUO&Rn|In{g8y0!s~7i0N8?Xt`1NzNfW_XV%SvG(tmOg) zuK}zz^d?Dxd-EiZ@^zyRciM2J=w|fV=Tg=ac3HT9L3+K4?t!`hWUffBKDN0&cvr(U zQ{s4@f$d3eIm3gp5LEM8efn42VYtjF5kpbXhd^qmF;j#%?6XV>8R!SVMh-@ukKo(E zE@@M6L02G3UzuiLDKMtbvrN_5-XNs6!<|(^fb5bqbt?t5OPhAi6Gr>h{90hDUg8FjUE3dFH~-1V}QQ@2tnTW=N4ec*flekn}3< zV&IT40?1N8XNbUqYVgwgR|unL944pDV1%7zk)qyku5abz!7wJ9&)8xJDTKow;nbJ0 zmfW`x6s)Aa{H3tDGUVB%$}?EIBX9W%tPJ?KXRxnM>PFNv&k`qMN0=>VkixefRhx+Q z9)QVn%`d5Y6VlDXWnfU+a%piynF5ys#9AOD!BSKR`%Sw$pR-M{PY=M z(Ix2Yg%Fk&zPh^w2!$#f!hjHEfJyn) z2{4sCGsBDB!UddZD1D1Dz~uUmI1!N7sBtJjzq^D%iq}*J^)->SR}sAcjCb0arS(TC z)R~}ZNx7&e0?5`V)|*j&f${$;GX5cCaHXpC&+dYz@4k-r#(2bVEL92{+Dc)zN}BOK zCXeUdg)9Ccb^e-iLC84K+Y3IgdxauXRrsdR7Ak^5S3ejOH=iL)-vv3_?ueWF4$d?c zZhD`C$a-$7Q5LmP!W1oauoKw50C4YNRC5v1OkIMGTm^uy9^AbK2w44rnXfqj{Ppeq zNR-(K2__!Z!cqX>?(XYYI@v14oWt8^ixmLu7w`ag{;e~a(@^?CaAHb&8>bTY?12oE z0`y8KH!}90_eFgu@9PP>xV4a(L6+qDmXWprr-F-{L(ZA$7z$NojAg4(m}5T?X)jlX zP-)&&I>CXzlXR>yrZB4(KTsgV<{i+YT;f3L%np$e=n>@!LGPfR;u97!}l$ppId5bQj(x)dC!`Q(aNOiU0+ z3dkz266nAkR(9}ogIIxT(v5a0pwOEJvve>v+0vj$)j9X}V2hyY!2Ep&sJ%+vqy}gB z5WOM#&LKXIkQ8uY~pN-JM|u&8?8R^$(@D# z2Fo^6?46h~J~aUDJ}!ChR)`lI7*vkefV+D~TH}n!endP16iQYB8;2%+oyM;>c*e>( z39t?yexOL9o{?he@KlZ}K?QWP=d$^3ScH`un99=O_PRtrdXBvq$< zLrH8SP_U6`;tqjT)`&dY#!!Gu7Hipd9TOT@Cb7>^VjLDRNDk_*ABnAbd|p9ZL#g%E zi<9gGdr)crD6g1La(KXT5hhAFLQ<^lStw7$E6jeJ0gbZD>Eo}g1vd;1Tnl#X5|dOr zG$Tdm9l z5Ziijq6x}f%i?-T6%5-C`j_)9Lv$|UiF7{**f3%~+ZihYE4U+cb z5+bxIAWqmF@Iy_deMExw#tIog(E#Aqd%N)E{;te%qx=PR|1Gjb9~e=DL6+Z=CCAFZ zWXhV#wfUlf?&#lZACjVmy;x(yej+RckzlQ!{dDaFVh&OZlTW|e_;(xKc{W_w*;D-v zJdEM90B16kK;HNxZ61$UuLVrd{#gv%u4Q)2v|!Z7@GSrd0LB7Vm*Wq=7{gB>2TPro zbB`|Z#uDk`qYDbPR!VjQWWF!uIOE_Rgu|K|oTJelk4u)Q@dN~XNJV~Q*_ea=OKaho z+!L_j)NyGNb_ne|gJXzpLfb&C-IywQ__F)y zEoZrCvtr7b5Fv3T;7;4V0`qCo(I)a%>Wo5ynXR_z;CvIFNoJ$lRk@~g9rY6F> zFiKF@Ah}yh`WJfN_RN(EzmE(Upe9t-Rk zw+Y%speoYFfHj0yPvD!UK)=AY9#c@|QVx;na}(f-ZEHXiWY{Q@6@VER`!P5X-k z2)BjSf`u(3s121^-rIQQ2VXeNl1IN_e+*zcCYj7<;;t&k7j|@q5R~)8TM&Pc2b9*u zh&{MJ?^Uytg^VjKhIO891XY0vyJ!X{%ll5ds9% zEXwv2t6yuhW%>j%)-F026`62e7;P#Vnl3EUb_!>?@~;(qSOJ-q{OblfJDt`d=!>9U zjnb_@1Lh>Q*dbzq1F`{g8`EbHn%LJxO8Gsi5*vin+1Y50V!LHG@)iFAdn?GZ^~f{K zeL-1)**0Uv4ba7n%LBLy+^J?5&i9}P5KsQS7Pk^et<_QA!iA{c-D|Li4|<_02Tjg< z7ef28@E<{j#kLSB-ONIg!G@A|l?jC*iCEToS}%Y;z&^B8$OfqgW}0pfgyn&@dxUfZ z7B!D@a_@Z7zz(oSf%G8UPL2&(^Cdmu-wEJi&5NXFiFiJb=m+k1VEp^q+O6A>G~r!t z?Skg`)z^{KT{BF1c{2X3FQB6@be~ufdr-t|3vPOlgor^96=nj7(awmQ(m}3IVO;)@oE*8-W9s*x8tZ{;$ zkK(OhE&?(kN0$>x3m77=6)X##K6$eu48^yF`MeMgd!%H0vVaJCfp27y}c7r z*P(2RT|kXzXjyqf`k+D6RqGWkbzHkb42q% zo>AbfVD>Hus=H)e1RXgJuN7-JIFq=rojevp^F4JVdCqVjXb=G$2$bt%w%ti4bWyj93INe-Vb5Fe3!X>JuD%&k0?KN&E5km5CJiCF>Nt$;$Y!0>z zcUHVQr0}2_R=x4Tf&wDk;Yj>(k#+;V`GZ;R0=K(sor?iy8F`qGEEFo~09JYeG|Xjf zxzhx?Rt8H~LDJCX?U@;ZLKaa6w$+n7c}d+1s`Y04hy){Oyc zWhyQc+6_i7QC>X~u_t-~6y~Lh%L3N~E*Lt)Z4jK>`aCCMw@e~o)RvSKUCkB%f$A{` zu_kBI$qvG~JPVNqDD)5R5y#bmiD(A!?{#o)=2srrPDmUqj(fINspKI`*d3aw!gAH4 zffOoUdf>~k7u3suA=ivjOPHoaf+67c`rA@;Rf!GvA@}6 zV}vEM;70|H+o0szR-1({hGUP}%b%NMZvR$C#`R%BV=-oKyHc%aS|dk zN~GB>L$LSUbEkyK@S?}|oy3%qtGFiYo*|0@Kn7T5Wiy3c1;B6uggnuo75!*J{kjG! zHjQ^(-TqW}zLmh@FR=KFBvY3?kJ>9pTo@FH(5L1vVUyUNlUuO&VNfx=vy(M1uS-D7 z0T-zf+({!0m;um?*tvw4fLAJUpgDjFz*r3Adq?mm`=?tGHH-|YwdND{5?&_-5_D+B z^H%Eu`T4&IL~}GOn>7UfNg@tjw0>C3B77JlEQ$4wE^*cz+M^z;S_K{>>_1inT^}@Q zs68)^xHPaaG%B5%ps~;t6WS^aYuI_D*F&89DRj$3KVo_YNh4=o6z>o&-9hc!K<(R+ zsH2mGYXSfed-QO$S~MhhDg&|^;0li(Mt)RxUg*Pa6(n`oqX&B}twreFJ_yJ`n|98G znqhJRze0t^Gg-4Ji&qca7f;|d2tfpiM1Z8jaTYIf{Gun^!p!2VB|ze{9)E6KN>9Ly zTYot~qRaS!Lqd$PG=gzA#a1cM2m1=zL_VYrgN^7p?BHAehOC3Dz-v4`wI(67R+zBc>DMieH7E?EkvFNNG_ z>5lD*JYK=h(|G=mT?jB0ir(YB#PM#6IZ8)-fo(GSw0ga3!(RD^y~#-*&(v0wiBj+2_*;IMO(hybKh5Zld$W+U1{d5xuL9W zLi8;=fIF81t&1d1vxM@Wg-f6-t+{5AB%|aJ>kEJX&yeGNiHdvx1mS6vx6nO$d)c@F zJ>N8sC5f$va+O+tJwD!(2a;(#E0uRH(g>h7PBO#0>!zWs-6)-L64)M{-HK;C#3)J$ zR2-R72TS<_3Wx{Ab1}kEg-xs$-{+;0m_70)Q7(WUrKj#z;UR%-bzQ|i!xOaL5fMM3 z3^%=rwDr$mS!wK=O4tm>p9Xu3!px9+CY;{^*fRm_VcDy3LR*86N&-|n+gp>WeT3;- z_5rHC{^ye?j-lLz8y&B^p-(bl6L+>?{XPf>8TM!QfdT9z=kN{U=_Uy4ujhGyJ7Yhf zwr|Igal8b*ors-IJfHneCPfi5!V>V=nLECeVvih4c5`ic2XGDnQ13+_$l;bckDSA^ z>|p?^|Dzd}vA_ZQMXb?mWDjUEao)pwJS0#P6O~~?lIjBKT-AEZlLDY*_2J_01E-zg zow<*nK!F5$8V829GJo$f-HM3?Oy$ZUU5!n=X6lIOJqU-jVL)VJ5dE2w$e0H zoxxZU#d^p$?Mg`IGEO9ALtMft4vfjCXl~WvsLnHn(aD*3Kg}@}l<@OcD^_P1%vUtyrsUCz+*)g%L`52pbvTI z^N;|ik{w)U>MBS)R?kV_!{-=k3K%`H1x#%JludXGlNSGHz?@X%`h5=Zn#a?545euj zGe$I9m`Gwz0rXaG>L+-^lvAk!Xn3WMdLHKIYbdh&P|f;2i)gdq3O!a*E5WWaPUa6O zmRw*7g@aX~#MQD-q@fSKkDJ4{cOQsUJ|8T@fpE)++lJHGM}d!{28laSz$~n}_!UNs zK|bRzWhy)?msP39eDND2!02dwC0Z!KU!-Z7sC#9Pz#b!qlMZ6Wj=}m5DAr+}=MLgt z9hWYFr}-=}^ekiBIssSWEfL5oIP6tH`Fh@AsJXDKslAaIpr(Nl54ax$9nqzH^HL@` zjH{9aMEL7ES`hT-S31}TMKgrq$9^=4+5bfh;}tV$_C;Xz;u)RW<|aZ4WrRVSF6wKh zdd?Ouo{RDJKMra5iO9?V`YZ}DO$My20!v;!FZ(9_`*IGHIQYie;B~c|lb|C0EmcBH zvM{W`yH$r%qmDQR*#F8U=A9r5$g&gq<$Sj z0-`HyuMZuF4c+{wExaqt7J+JlA_lJwsNJEcVO?PZU~Q-PbUqdD3SR{8^4iH;IK4o- z!vCCtmL<7xHz64he85?pz5N|h zCH!|lE+p{XCnTQpZku4lM8aYrJODiD#uDVG+Yt@yR4&?(n-`*l{U1DV_JXSiDHj9N zlAE=OgyF6lhu52HfdLk;4Ly)*;$L`2ae_4n+I!2nuvcJ4cb9UUU>87DDXvE_>O-cW zlfh8%!V}|qLD35UqLabV2GAfCeN!a_2mp18+p8|l{W8}Q1E()2L&-wPmE11T1P_g%EXAoJ2y;!C`p?Jt5-MGFen(pv;C!LYmuOru9WW(HAI z;Md9m?z!#7!pSg*u$&Vhu!I`G-&NTbq6U&pQ6`X*xCQnYLw)rgJ&IRW;P!V79zL#B z!C)WC;N3->eb`R++du)^3IG@K&Jo9UTzlsd9v(j5=esJe(>Ywv1mc zK;rHKOImh7EB@nKo~y^q@t8QI{_Gf#Ddzq%fgeZE!4ruVLs)M39_IlQv`~?ARTq}) zzF5W=2HlD+OC3tyKWzQ1QVdkxi0$l|$A!9+_wV8BhH(yl|-CfwkNaLjrqoua^A1vb4(y<;F^_W6EP zU%Y|?7huU&=vvc1uSHoA455%IKfv4lu&l(=PpCL}9X}As4B#>|j>Pk3VhV+J9dsS8 z>ZFG=!tJJb@}Ln1=EY52_;(Q-Lt&Ug%5Qz?p^d=BPgz_K?nW8X0+l;yM0twx2y-YV zpeu6bHXBr5eB3!+WEB;VRYf#?LPkgHU0^yohn(qqPzm>y7|IBhvQw;{=6_wV1-h3i zRMky#ci&A^oIaeVZ)A02slA#Iw6yDRqr=;dXi$F8DukRp`!g8D=dCVVSlkp!lEB>o zo+Rtw2k2nWicFRYUsz>Gd{s`R@iN>g3+m_KM}S@^OpkOZ26=MRE%3VAOc{E<@0?Fy z%Q$<fdc!li?s_>19-Y7sYhXpY< z0epSZrOFLLwrDh~I|_-0-J>gu2;ax^TnosdP5`;HsMmy%AlfWSUmdl6=wtL2{^sb1 zsWg2l*4&mlK??^xBs8HtKCW5f zE%2-KSFre1iyYtUVgJ^SBRuB1?y5t>0Ab?a7jnwafL)yttDi7h_jEtXSFFd zhCr+@Wt2FQl5Xo6@^|2UU|)txZNKC9qT51y1Fm;K6vgyAuf!*2slITcZ*H`KJ)0%` zH0K09*jdSoArv~Ov^5Y8G;VhqK`WnEfnW!~zfMA7ZtA{_cEMvP{L*ZV5-fJ;`Ulm( zn;l3VzW5F-zB4invteRFg|-H~iG~jR>I@TZ9j%2o6oGb!6lG7%BtYtrE|CL{8iCw& z>$EaKrdBF*;M)ENH~Y@);EjAT?WqZ32(R_f9FI7&PeA6)s4M`_qd52MaUn9JWEy)g z8}^PocV3u`a4773lb9lXRlHx}3I2r55}3VP5II2y`1rezT%zzVUTAB;nZWpauQj!o zFdYz=KmHCwS1p2=FEsw{B3%N%V#M(i8h;m>Q<*US{&WYThp)yv!PxX9j941;c;|P5 zv0Y0<$vPo(o zXm@+9RYqGr>{4p!c8o!Nuwp|U`Io#{$>tBJ9DuuYFg6TNL)o*ar97`mhx~*-W$QVf z%&29f0#1 z8}6D%I0-v#3GkEi2K>#!&$HGG(a+ifOac1h3nlVc{ANE?FA%TdS1eMWIdL#$CR|_1 z+1FRW1`_eC2gEJ=1u*^ku#MNWl!#>cVs!Rhfa&h5I13(M5=2KBaRQi}BzNN@LqtcI zu>shAaeFB-e}i{~!|nl0Kdbp_#XG`VAfYt&bQdS$EZz~myA0UY)=3k}Nzjh)Owg{R z0_V4o+ziuDWGEikE;bdzwTs`h(_B+>X2__ju%QCBJ3+?Np)YPsSR57x+?Av>Dx0ed z)3|~y0zaW3YxdC};G>a5L%0NqH(fXNy&S+rv$ZH5A&Y;J#i@OwYDtrlT2(#DHM*>MC()f7g=`wxz eAd1%JlSn}`C`0#}hF$`Nv~{zwe$qz!Q~v`no#=l6 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-mention-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/with-mention-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..345a8775f82304edd2ab9e0c0894f828faf24ea5 GIT binary patch literal 21606 zcmZ8pc_38n_n(L7E@xH&sEDg zQgo3A53D4l$s5SK7}B{+vV_!ei40Zxy+z8dh+E2YPIw}3wx5oazbMa+3 z*?b9*?JCTp%s6TS+x%DxWQW?(`nbDx%U- zERaF&YStYQ8b^KM+caTudhtH8zZA}3`y6p*m7Z@D`cGt(dTJ-ewYfU%>oXRvj4|aX zS*(U`o^l8wIgNTTCtwTsg5^nTzJbcLku+e8a}Qz{dy{8L(h<6piaM#tukCBbpME3R0`Ar00TdZ(ll`xJOh{w%kujMk1fdTND{>sAj8k7XxKT!=VTyJ(`&E2n&2 zwEpuq6PFJU>Kn|98Tn$B^ykO?nL&TO@@8pQUyBNU+VQ!zvLL%Q^_{O?`D9;3V}nOx zoq<)xpV!?#4|!eI>&STMUOkPl4OFP@5-&e4pk&UdcX!TEN|Or+8_fScIWKgeE5T`? zyE$}xBDQ7?aIf~H}eX*fy!u1Wic8uogIwY2^8@PQoN6yH< z$v3Idw{BslUw&1CyKms4!u7pvg_);g3+Bg0_5>zXJh+@UyVJ+0>EZXF1tY12nNK_P zhHvHMO72)L(OK24@0vSjf1bQT-Re8?2}g1?0}LkI8nz`(l4p37b@Pl0`;aSorDjn% zX{$@-ZKFDBb;y^&=?*_5Ju_H~@#l?)}slRr2 zKh-w`o{pp+IDYSOW3XCcOJqb#_IVle6$6!{$w|2~njuXFUi}$PLs6Zb3;GKRjgn&C zjJO{j=@Zp$_2#=i>Loowe?B^VR&&l-=Q%XItGj-2=*+jjPQU9^>|8nK^UL?uH_1lT3~zRuFW)`v-Q-#qVmk3R!~0!mw!9|zc2Yx_XXlt_|Btn?F8tWI zRQQ)9GsnMdnQLi#`Y)@Vu*r%1LhG=S_W!;=F~00SP^;FFHCQ{8=x9|sym{XY`BN?@ z`-2@DtKEw(+ZwhWjC!0_)sc!?;d}qVT3IoJAsfH;R-^Y(UNxobv@17h4i-eNYmMrP zaC*HiWTIBAp(TEDp;w*1m!;ds$2T2+TCym6m;1jrGz~5v?|OM)m>rsbc(hGgb9jK< z{n1dqyx(Zd)?mQSug}Xcq&?8>pY=n{&pV$c`B$H+(@)Ax9|%2}nAG%EiErxl%UG;w zE(0CTGJ9goSLN7N>U|oG?u&?)@#~LIyQ-kjJAUBAJNj<${z17>wCsFP<_50lF^y-Gw4medFI}&Q@ zr~1U&<$nv@x>&BQFVb`W4O+0aQl?PrpL#>DI*Iv#jiO1t!ujvN|B2EbsPKyzni$Z_ z)BS9y7U1^pyza401`7i-8va}Mrl$X#LhgQ3J=agI#|;J!*d{thpYHjmT-Ssjv->I2 zX4KbN`dB3>_{-~ES1>lzmk+OxN=zy*49NO@Cn7&F@U*3++t=al!JKie*`qE0c88?r zXvtW4|14bETVxpM7Z8)xFy>x##c*OmJIeZ8>AIC;E@k&(^Hv(J_Zg~u9vC=SWt|%{ z;j*!5v*zH7^$R#f2CXR>Z8!e9Hvc;#H?8Vq&9F+}uDXdWvC)B(t*;8h<-?U-db{*q zMfmq#PAc~6&EKn_M-Lb%i#i-;oE}`B<1(((R_Yw;VA%b;qCIzVPU6_aqV6}JV@+vY zu@HV17mehsE7VLbe&G6Lp!0J6;JC@#6IW+7>4arfG!Eu(87RMYtjPbWOjjiD7D3)~ z$U~a%CY7_ceh5gw<5j$;6-^RM^oSohK z^-p5xWo|^D$O)|C9by*t*u*D2)C)Rcro`* zU9sJ!p5#})Ni4*?<7uo#V)pT)hVO>n^_sMfDK#}}=&J2Aa0%7vyx_1!W2831bHQoZ zp({}Xa_bBRwhc&pOUi$%bnO9W+G^W8x68|AE*m(qGENK`R#$h|k9U9D8)LY;MRkXU zRFRe6Q=Q*+$pO>-uG&5q-(Tn2`eC@z^mz5@(Y9Fs@pX+FouombCM610PKmt`i;XK{ zIUKV0B_Wwe_uO5He`3};H|q_bcIaY}ZBX90xu*`}itm3L zD3^qf*2Py^?>JTWCFpSGX4%lTuzgW({m)-U+}3R@tZMl2rt_kne1@U#yikLQ17GwU z&6|dsgN&oITAITa7v*&Il;=xXk2x*ZsT*^xuJR1F&T4$OxM_>w>4{aJLj(S-FrD!Mvna=Rj$r=+oQZ z9=+Y<5pp%)fY-2XXu!Ijv1H|mRTm6;qpv5nhYbJtkXdQ^XP#WJ#~t6Ywy=pMn1{TO zE?xsX=1GCMIj1zJHollY8q@Qpa5B?yEVVOuzM+TR*pRxyMT?Fc<=N}{ix!uMPS8#b z>`1Cj`Evmk^q_C%9HX4RNaPhoZF$XiQ6F?ij3yz9;0CQHM` z2^sBwu3P(QjfB~Zk3C3kGFKbj`ge=k6@^z#uPewDVcLR}f{4an@tT+S`%hlW=>2!J z@ph4gp2kFTc9g=j4-@u}+G=WY-r9y{I3&JnbVxkyyWF5KRATv>y0Pw`#_28b5&G6W zpRzmLrBMAsaloEOc}-uD1o|B+Ewa#lbxpTh=4{mID&2@Y$goT=fARZuz2aDCQC{c7 zsc#?r#q|4J{Cr}j=_L-|)l(P0IYJ&d`|G8YVw$A69@rZtA#dn#D`e_wUnyQM{b^dq2 zFDbX-xqH*hC&{uuM$O*j?%tuXa`ds`4Dk;EtnVqV0hhj$cC2kE+rQrSYDV9~(cH`X zeN6mXO!M>2gZ$U#jh?Rg7+w%?sXA$L{QliG*@COtljlFLUmfCIqi3YhBXB#!Q=iy- z){`O~yJ}~pE&p|>K1#dNzB)AMxUb28$H={=_w%jaIIbV-`Z841uU+VIVqmu8!0ayn zLBrzHgKm>&#X{Sns(m{n`Xf$ezqE2I5uijvc*T1>lsf%;UPuG5a zSCK03UH|XUd#lmh#!$oBgU9ny%X2qa>%Z#t>w8x*`pVpEvQHLjwCH9_&(hM>4WEMw zUOTs?Rtn|I2X6Em49ee9R+W@9GQI2hpo^_CaZ*#`jr})M%?uDV6et+YWipW8E zp@9SOCdS`2-!7RwIUv?>?OkZ_rqCgi$gUtMy}_emjqR&D-}YW0MgILV-v1@{&c&E4 zkJyYRccb^EzJ5=8U7Io!!^b{++M%(~Ypk=pQLQR_sm$Co`OX$wjo1H-1q9XTDkK*g z=<3&Mg-8&0n>bzkI^?ajLI&WfZNm>g-JC@qo%^>VVsN6P6H-9g^0B6o1724nBPEDl zK)Y<7()<^)u~DuA=c>j!OarerC1l(C*$+k?8TTl^()+|(TGq<%;QFEBP2C@B45WQK zvdzYRYAWX+@~V-FPkilmap5qboA2o#*w+6s^nJ}>?fiou6y)TB9fHOUx}wwbjl6uE$J$F)D~@g* z_SQP4(Oame{wnKLs=x8_m!EEYexEF3ZQmfOv~Km9HPUaKvptk)G0DA64M9~on%OD+ z1FmCLo*_F7M{@6Wcc0bGan&Eo(joJW-2ojz$nH>=iry{PbwFYkBBe;=liRjlY* zZQ&KN{D7%n>5%P&>&U^RuOqFeHde|+WT_My44%2}Wt?BTvN621VK_dqY+dB}kLuQM zT`l`N9U5+YPH1~OEiy~guSkC|&qKR& zx~*n%-|p+AecSsDKb75NlMp2E5VKLbv-$MJvKYecBj-FH5 zee&vgSu2%}`2n_m55ix01;!eGZm&|Q`c_V*h!$!GKA-$@yJ2CglUz)NTb1`ax%uyV z!wwq!>6Pdce!qa9u){^W-aUIkTWS7qB6`oPOsq|R zXVGX8v~WdF|Cirk3o{SDO?}m$FkIx}I(}7qvu8U+biL!RkxJ9NH_l+GEpOc;h1%L| z@5)-)mDT;bzBaW|x3@ssdcdg3A=!9s+t|*&%y*q`&IZ-iP4#z!?$2#maL;zArm^tm zN^r&GUy_&eeH=n3BRKihRwFy+^U_5K7U=wm&ADQ1oibq=Z*r$541j+H4=U^;2-z%xp%IJIgj+*&2DXKobj$)Gr8+QrKG>VaZdA%3cs6I58K(5 z>D{YTv~WsuwejTJwXmB2K1QReO#uOv>wxiO7mce0d?{D<@~j}=D?bBYd4*a}hQDZxs9UF$9q?;V(O224 zUCVlf-|?|P@2$Re^%)p0vJmD-HF=@1gUE=~IN z)DIQBF_5gQb_%L!`dyV9mUh}*c|pv?zmr!#d({~Z)QuRURmuma`OOZkFRUaJ{eP?d zIj~qXAV|I|^T5fkn-Av{`9E-X8n8ZlE9>Fw#@Uk#-*on5549V^{wpjDNA27_PlDAqRu;{3?*ArRBvF>! zn4F{ZT61*W@5QrgwO?f`z406^&r!8{J*PJf2VlLV{moT=IqV0Oq4t7kMQ#`auZQ#&pZQLo)C=-A&y|Hk;xfqO0sB9fjpzMaABvNQlpc+)PCz?8(fQK z2IJDQ~FDJE9WMfJh2j<7CGH()Gqkr{Vq{5L-CVSHjw7H#q z{I8IMl(QX+Nn)za0etD!88~3D|5CHXJUs7(`X#wnfE&-tG7;}AA%zfnPslf zBKLFkjBO9?cyflUdb#9QBV?%nn|&&D(je`R8-==CoWT>9#HxjtiQ0nd4PXxTLT$Vj zQE?dHB^wcel@6-pQR4m?fyar_+wKaOrKnhQLhvIvBv3ZV+lgxcpQK;PVk_qEL`d>q zifXuwu-vF^8&N5y0rS(O%y|N_?Z~YF5?zc;))Cw6z!ylxg!73?`vp%hP1F$L zf2qV817(jbfAJ4*ACSUN==q&^CMi-aHkWV!>~y*&>utFNvsWfn9%GHjQI{-ZB$FZ^ z-G4A;HG4W3z^n^vc0W)S01@6&(g7FksQI5|Ug8*Vx0x;>&YbbpU6a*AZ4+RJ!vtKI zOebZ8J(KLq7i+F1;8I;I0(-0M+$CLN_HlV5v7?K&|)Ff3by&%LgNlDtg4VH-L-YQz60$sMF`T7@{YM zi!(1XQk8hPuqK46w=t0ofWd~BcLcnetw0_WS200I8ii$`7rsEv#+=gg@SJtN$6Vkh zhYerPQ5n%CXW0D@)h}O9h$Q9GjQS;4q`~lb$D*N1oM|Ti;D^A@U=`XRz4ms|-|9B{ z0v15~wG5iT-jl3XlhVx3GU-!Hl(t9l+5u9+d(IO<#nFo?fbQc( z@#pyn0#71vp6J6=mqbbe(eOiALaqZS*I$<@6=yNkcnE?K9{^D1R`gJ5rxw@C@s*Sd zex5tOiUoV$6xG>5=$a7>SBXfnF$$24A~~Pf>6kE$b8K5x5XQ zTLtSYB^t9OmK!MAEvua{^SevyucLptT~?gALpgmB4_frYo<(%h{`*d*1aGXhqRmkx zRxm`6;Ce?MX9zor@>&UkJ;^dE3j#jReC#5a0csHZ)PAR9Ei>YqAB!0tu@sk5sh6lH z@$L4OBEyxW@z^MWSjc5woEbl+^iq53S|vIuY>VT=B#M=wldyM!a(6oVN_cPQtQOdN zJKR}2rl&6?Q|>V}`Sjm__3wzP>m*j1XmbpqO|~R#BIy|c0bH*PU398|vzh{nLI_n`>neDm&WbwENrq4}~@}_)fg8-S%P+*m)&0(6wTpJN2BXn8TnQ1N>TKJ8{|7zxP zI!SD&&PR#~AvX3MvI@e-s)u$~i*yCmfNTfy_V0`xH>rJCdVph#90u~?X}e~#j?b9c-j;@xzdjL`kbb5Mtx4djJS9`UkR z)-9ouElk81j4FKQ_IvnIs3CrnX3SxYz~$b5@3vqvyww=dPX!e_XldjUDHh5$eIe`h zUPV&5K=Xy3ZjyA#^*h~Mq-r+mGH(s7@`nXWRC1!f(kc> zF^>xjTLTa|r1aPXWpC>)Kmy|kxeAEL&D!x4`zKwUT#9?255)Wa@Gu;Ev>qwJ(t%X4 zZU^mELIl^(WErS+w?MX2?rLw(D`Mhyb84xyl0671;cxvdJZPckvE|5bB;yjnhwCbz z3Zx^fS3+(39f0w&Mlj=H#H@1-fqJoRhP_TlzK#vDPTXPW>dQBNM1-J+HV8g~I|B(rvAQoo5agm}!bMo>s1?ga~r z$C+~`cn73{XFIH0yBQ#1>yq^dWLi`K5)Zc)6cUyywT-K{61a{Ny1Q=S>HMcTFXv+i z#6j|E**W}_JNBfqgJXam!0-je2NsubZ3$s}ll4#(g@JLYCvh_fpje7R&yAVLCSd%+ z%-!>OyitQCUaGSGfOQw#du+l3l_vhdg5z@)tb4weNdcyCu9$Q~){_@YNZO7MM)(C5 zDuJtz&rD8Z!cRI65A4HME2z4T{liVPxaYEdK*E)}@X+vixbg(ndqDVVU9X=Sw#-K0 za-`a808)O;Ps)rC<{>_hCDwq{hp|ereeJnJRgFJwNJhL!8gI;80H(=n*A{O)p62;NPf^L1<9Io z3NYT>ZO^Np(d(~9bj|p7a>ie&vZ)E-De4m%C(2>Hpl*P_A7I@#uNJQ(^p1gRcLg@S zyX#NgMKpotMU!GQU)}b-WJffmjL#v${vROnZu+x@lwsNderAdE0wRA3_83uVGga$( zzQ)=Ds=T@&{s|yboWs;34lsrbDnj?5KZ*!co=S2*=d3#sUx- z@blots8ee7SaZPcEigVL;c$(s!xgDaHT0b6!1ye)vc-hyK)<3;f?kZKOH0p|3DiQ} zLJO7_%L7?IxojD+8a6v3^w#M%?ETEu;SP6i3>H)2l=ge1>agYOLamR4i#m@AMHA#7^9^j;C7Mk* zd-+}&t_d&&=IJg$Y*fij1g2DTNQBc5e+h@zRnB`#A)!m|@Z$*j=*sG*F5vdah~Y>4 zqHq`S-i$HC8-BzM;kf7!mJ#xYA91$-S%GSfKm3Rt#_|+xjwT5XKjNGGP-Qz)1cx7S z$?am8Ar|U_!;hGVY-5UJ=U&0#M;wvj*(`CU#VR{T!RwUWPHCUbag534&Pj5YDuPls zzmuXjrR~0uh{&i@vu}g- ztK}y^kL$;BwikCXVgXuBGqI|JP3>Zt3AjdBGN4p-`Rp?EpI{s#IMVG9#j5lJYp`uu z1GHu=pEU=SrcYRqxHbVctdFH9=SXc(+H*~U{g*O=HW-Z{Xs!^Ld@J5V22WZ6UJ|YT zlUE19AB8Kk7gHXBXYQICJq5LG6rX$0@QVKaPH^xQxWB-$JVfKTU)RAkM+7osX}kR- zrv_@jKnDc4It20V&`PaF#Y33>2{sD=q=?wMgjx@N^~FR!14wrQr`hGGQ!rcPu0}`$ z`XE!U(5bCFL2clcli$*%iHd-g7&srSgV1wXJ|h&>UGYxxAtIh`0SP5UOtD4CcWNKE z$9e^jHgfRhcD~jaA$Y^b2IAfN>F;+C%9En@VZyqDy4)jlcsDu2nOq7=vay6tpQX$U zo}1B1_9D>s+PMVkjwSpjZh)g-im{S4wTX=L6h$r3o!Ugkg=dJdmc>g?X(D5~UbBH+ zNzM?K`o?ePp?~m85!xdE-TkBZOdueGQ^$h*vCG#x++jN5K;gTu2m(Q81j$mv71?5Z zyQbzrOg^$1#^Bf!6kUG6Ul9V!X9sTrbmNklKX~%yK@iIKa>dNFWf|L^yA$UeDC683 z6WsG(3&(L|;$85j=$-l8JBDpQQN``v46+C_(mEoSi#yAdLyxer2YBrl@8=oNBXu?! z-A^rrE^zKIMLyq8MdB`#SWaL?PLC~l=_;6x4@Fh6_$;{gv^zU^Tmul-ZZOS#z=?f( z-L!B-xJLbGQL+0Ric8T^C%*LX6-!rSjT+>k6n-9xe$Uzs@b13*x$?b+K+u5hO%mXh zbai#VBttM}QN6Xo3 z33*u^aB4@SB^H%Wh{OeRgFtaA2k6x#r?r?hbMEFUO7eZRVKIk^_X#OrP(6nrt% zMuW(I9?_xy31T$EczH+7mxVluN<}Kr2A4m0w0}}2zv+g*VX>_tpjxjRBs>n#Wn?oK z3eTiNHOOqj-$}UW-dbjp_%AU3?^rdVY#ip_w3%-&lh&`eFGLenaDZ5c|3-kPdH4Wz zSO08|hxk6;<&BBG1Ta!wd0`^h1#dnRYC8o{)64nyrxfZQuFqqev7+Jl=nTu9^f_b? zf$fXq0lWCSt&o9RAwoRSsUuL&k0S1(U?k6^`5hc25U>k$>Oh^1WlwF}&W%sa5NJCh z3a?@tuuqalxu~243qRYO$@K#jQ;rF?!Uh2gN04;l9{D8x63a4YLf$IoWGBSa_+g>v z5UW_0z`W&LbzU4o*ec{!N%}SD+ed~y@(}Rw57wMusv9Ji?(b93;+XeUkMzrZ*}!~u z^gixwkAKDTqq|_Mb?*1)ir8JmH9&BkywQnUm z5b)4`Erux9XoscTDqA?uxJR(60hekOb^HeEk$K5&_FszyTw5qN;W9v_eiV1DAsK70fX_MW?wgFa%Y`~!W?bEOaX0*%aZfuwpfIK<|U<^l;H zJgii2V1rUK5X&7ru2CuA_YyK{bdqeVgNJ}Jz}ZaLUGdcV|1LT5rAKXP8ST+RrkVKe zsZoB-MucSIeP#Pp&2b+@ZV@F2R~y&Bq_GE)UrTN9Sw#GZ9*`b?5aHG!xLgPsq$kJS zK~qFJrGwWbP}u^~=aphuV?_wpYtDo8=f9fY#ZK!}t@pv@0)3G)wjLsMRwJ5$KTAqO z{w_Q7UFr^Q2#q$wXgMRW`$^=PQ-?m@7%TM3PvqK+~@twF|g3 zr^Y~^JQ61oiKNH`oM%s@)>{wZpPmPH1`>atYxJ`Q(C5Q9e=QdwE`ll~Oy6B!qQ zx?d8ck-X*z`9A9-HIm1r3S@B_`IXq6vLc)LkjoG28!Z18=ZG6|o`^R$hTeiUXV_Cm zZsA+Mj9i4dG(37!Tt3$G9=?xKvQawQ4|w!**CUd?9~$gHka!Oy5c~ggG9!d%4Tv-Y z-p}C3XTREa@bWMARf>-i<398h7G=NSUsd9EVN9oZxZdLX)Aa-#occqNaXN`F^I1)YkHvshJ`Mhitu%xR~O0 zLX+T1Z65mP#Rg;|*WU{fYi~;x{MWHY#$(x%!?z? zD?UXYhZ}(|4B_q4N)=vvlbuP?U5vn$MAo^zEsp!<1UDHXCDiv1eG!oF|4)TqQIlB5 zg`1Vsf&Aih+yy~gjU~1wh>>+Nud7Ubt`8Ph(I&}$WoZd$4BcNAM3>!q`p{v)00Bv! z3CLcU?Wi}kn!OFO-|ne;t54D8g$EE4(zJ{g;ffe!KDCdZsKYBbS%+B%+n zQA+(MZ~7HG z){$N+LFZN{+|>{qV%N#;1+!x(P_UjMD((`vjFk1{&ZGGWGEUvIle-$CbnN= z(iM)ojWM`H16CW*e`91QX2cobLy(ke!fM0CXjdHj^WCxxwAW<62)b^EcLwwB(XIQD zW6-jNke=}QkwD^0-%Qq$h`SCh{P2Iv@RRT$07;t}ynbg`_3oaMKkt@^JG7AE(!S-1 z4H2g>-8CE0>qyn6LPWEOKxHXpDeDw1c#6lk#9u&+YgFL~fn9FEwTQlev@B-t79j72 z5(j$$DcJxGZDM1pJ!H4#He0tZLFkU;QZ6na<0gpdKa+a78f+7SajWh+5B~iWw~-S~wFeECdwXvuvVJs5S(4wB zLgJb*IJO5i_;Z)a*jGf2UA*)Hzr*w&ND^{dF-!`>Nj33Z5=cW17E-`+< zhaGI!)~Q`$>;RkftXfK!x0;SX+ZX){)CLDvED0mr4_AUeKr&L8(Dtcapb!Qtfg3SZ zKBnQb)Jws60uM0nR)Y=wQYxD`@?7{}YdP3j+vcJ<7{>u}JkNyIY=U-J-U1IaVR=A( zPGkk#HnBYxynAF{D&o2%+Qb-|;vdX7<~UxwHZk^3x&k>KGjD#I7>93zP&I1a0&QX( zz7bg$xatMl#5jD-MjUu}BxU8N%`lptg=!{rRn4(v$%sxut-gePsAYQ_glis>+bPm9YR~)!JN#F}djN(_K;i35uhg+y4H$m}Aru&`o zMc5CtK_1oxQ2Z=~mjgJ*&^y5U1_hw_2*V=_3FCPp>4GLNFCay-Sb5x-Ak%g(ub)Y# zID(i}t4{dy$l`NNIV&mZ@Xlkg=Hv@LnZ6>HxxXFARa(w90%XJ{4QZW_W?E>w&ElC8 zr~xJ~+^5%j$~EKdd`vMQt~uCWsN5@gorE}|7Z59eBV=UIddtX6ZcklZK4rVFfX&1F z_{~JrD??%VicpC9!1Seo&wLN=8`xt|jLn9&Q0LPawD7O-56= z71x=K+=E$VKz=bVbqg9*Y@EnOTtwGGYU&uCW`)IHjvcuO`+$6gXnkjv0Fro<)(Mxaj?PPINgjlv1qNrR0qM z?=x^0;EE;#qN&Rb+})SOyUWpwC>})Hchw@Nd8_p{^psFfVbYIpihj zF3sjj#h&DGo~}}$#q88n?Ez1VzCx!=xT>;y0mA+G>VQ7qI!YJAEr#w>d>n);_+E~M z{gfR@I<`6cH>mn^4mkzCvVJJC@xqNx8kHyRo;B7;5W08;TzX=Qhj^7b`y<5%sx43o z+565}fyRD;bTN3_Vz|d>=kb;>&KWqaA$1FQ(nGEF0yifUai^YIwFP<`(;Bdhh!C2# zW`j+KJheX4c)`@i&gmj4sw8cf0Q0Hs6b-OXjr(#g_hfjup@O5Cb!nrsS+9>^zTFOj zSLICWtD8+eB;aD=l$XvF2;G`+=kVaa2i5DcAvg?i7dpjLR@WmYX>7?kL-a6#aTMD6 zrF4?vv7h+Ez8$Y;%vuMUU8nPw3oEZ@ykZ|nuGTG%~%N3TpG8XVek$M2J~pp7?N)6*rTr znZtJIV=JHR1`*2r%ubhikS+^YJVyl#Li$3iv1BoRX>q^&1C6w%zOG2 zOE476C9@%u!z&H$S947P7t>rcK$q-Ce)Eo%f&e1L(ZOVoh4Pjxu++f3sBPqbk1F?Z~rO+Dh#t*OQ2CfJ@nt&G(pfw#Jk9|n@n>oc5(rR zRuDd1-?E6kU4R|_aQ#!!xKN%ppru4{(cX@>m5|pIRbDrxc{ku9`3Wizw42G~%}LdO zJJ(ob;_azNOWAVx5o|OmSJsf_hN`DDZav-y+89**!)7x7a+itKoa+=~P2ZN{b z;>GPerJ^4g7dZ94&^VoMKGmx2>5NvA3l6ag2-v&|1@rt`uR`T-FGy4V2? zW1{ZhT5mHXDIEo$VN^_TMukk#2fXxeWLqTg0^-h5y6Jl7Pp@LO+}VeRanuBAH(abGNhLHf%w zX$IWW;Pn%G`9#o(Ea4CQka>3}2er#vfO%NsNm)MTjiNf+naBxPexhV8@A3tcd(JGU zeu69Pb4eP}Z^ICXmh5_d6l6N;QZ*GXCB{S;$uc{0p`eBkHih+w;vzI&HRXp!RC5&a z)pmkaJXk9W*kEPc>DbIk<@+M~!v|<>mzB3rUrV{5bqx*`nQ|T=KQC1UdVNae-E3&2 z1FSB*(uZa6rn;K9d?~o|(hXHu?=w%z58%DO(TO)2%t{k!jv#Soi5>YS z&i1G1DiO290{Fp%iIp0t7@H+V<1d$Im|bakBh8&9=93XNm9>4Ei|}}*Kwg9bb_%R& z_NJv`YXwq5fK3wOgk+MVmO00rk1ALR^!dVC9knUR)b)fwASB~8NUobXOMpKRTm%Fc z@$i*IGwv*2s=f!zdq33~oeGDnotT+3j2QT2Lj3IV>^nWf+@L`!*1s1%K%VWVgk;#91Sv%>v|LAP1Z6 zf<~B!41?cId;sJJXLrc}CIZtekW5lsUMKIus-hBONYF7Ek#9i$*0>9QMdtn95orN( zi_~uJ&?RFASql{gnFa15H*?!1ZU|$g2<_>HJZuw8(8YJE!6!`H8AaRR@7Wc>p2FQZ2Y z<*#TQ|3L&<2%_um+y>qADN`)rAiCDPTdP3yYfqRw>+1*6TUV>y#!%xAvDhyK(d{jR z@u>Hg7Kb$(X`l~MLe={cuIR)JOWb`3L+|b{BW8HPHPIikFd*H_h;}z4Dpn?Uge47R zcQg|G-^_lCR$ND-KptIFQ^DjLonQ%vyGl!e-NVxvAjt?p#=Rt%t%jQx58OYjBa11*-y44KKuTyVDcQ+HZc_$`o|1SR8kxWUy9|A~ETvTt&n*med?!2E4Euf4 zEp;11`~Y?tK=L9#)*JgL+^hJViqrrkuT2@_I2Xt~$^d3;(?OTB=04zcFLFf=pbe@5 zh;b1sjrb#g(o1a)L5l*eQtjinHVL~Y_ zRMza3$ew-oJNMqXGvoLE^NwfkJkL3wv!CbO&RbiWiHpjKl1L=+b>^!#lSorIBod{V zHWgN!d}qHRk?5p#t5?|gk=trSUdMZ9nReBg2;V+XZj|46*mHjC&&VgDK1o5iTv_GvQeSKQ}1`!j7d3tKtMkEQIrX`wi6KPu3ri=35xmOYMQU z-a%a}jMj+xY+H2mgBeUxb#EeR47NbO_)ITWL20CtD`d$8u}HhnQghgABl{J}sJ+xS z*VxKfQ7fl2!EQ336f$hn9>sva*#3uYU4W@>9$aZ9p zbR_i&r-*j`IC|CdSEyb{QQ)p<&m!Z2{?xQg0y;R|d?S)ht(8`vPpTWrSKd|N6e(XD zlwZ56vnP1AR@T6ml&F4_o^KZ$UbSjVD2+w!$!jqSRF)4OTGKFeGdgSgj+==utgcBI zG#4jvC}O9@f_&WvJEsgt2rKn|?rL=!oA-JmDs`Hb@z_zG*Zmw#0kXNtt$=-kx<`=Z+Rhqb3nY-}Bl ziaO>$$PrEzS(uoyfAE`D=2^9Seh+-Ar3ewBB3>_<^nu2zp3+q+Q7yG>&giv)5{+Q- z#H0UW-TT|WP8{zj%2Ts6%xAcg>{W0-yNn00>tH&R#U^{Za4P9)4kFZox%e#gQ055rP+ zYGpJ(h&O#19TwCkwJUbtwu8pY>bjj?u4)LL7%1PBCtfDuG@9F#D{GRo$L_@Qx4Fl2 z#@t$~IUK~!lO>c_-aqUz*wT@Cc8$z-{pw>Q3h~}jHF`~Vy-$w~jI6ELd)4>s^=|KJh+Ak^)|Ui40M$cK_(^FHo9ZHPL;#EBB-JK-O>F zQ&ICeO$HBnriy8%)l=df6a$rM2R!roShjC^Nji{e(j2m%$f1RBlb&w z+Hizx-YfaT_7?+O9&yC9t;B3=f_?QHe{9IRA8epK+VbRCo@SWIt*W9Ty%}4-^UN)D z#(Ndg0n?9}pJNM7$7*NYno~PlZ|BVHo|}K83Xf$p&lA&@m)X&)lzaQYn5t3tTJ{c~ z(yjJU{g(Ik-6;FtRaFa@z@M2N8Lh8QddXaVS@6Ya^hE2ZomFJD-tlk0?^l6tuRG;) zSHW`d&45D`H8FeGWmVIHfL*`#3I!d{yB_Z}Kegkz@M$-ziCq;vqu=vFf{q>a8@b{n zu_4ekwamlTDrNZ@t}_CX)z>j@l1B3uYKi(9jhlC<1dkNuxQ+R&i_|hY-u*jiB534v z?3U=W6RB@U9CF^b6z5HsxRd4a(X+3#{PeyXJ2R3?${ajqx@WehbhVWn$P?3kP0#l2 zectdP`kqVVoX*%gBTp>ujISG9C1EUYX)vVLkdQepb1!K4ujh9Qy|C0X-a?{}(t2On zI*B+fZz@UpJRv`4r{BKe@{(o~MgRWWNgpJpPcInn%l#Vt8g;i^b9BCi)RFZ^diBJf z=9PVF-`9V>ntTgMg(a)qZ z`^uvJpx=2)q5*BmzWQxdW~VLmD)nD`KNNRpdKb|0C)+J`%+K!d*EM+^0Vgy!rgsc` z<~M|#HB$;)Bp;N&>6crBJWG<2d3Wq(SIq{kSzd89cMc_H%N;Wqx#n5j7<|~*!0^us z9;xhqltAJ7m+slB&(wDy0f2Zd3FfsC95P&fKz<5iq=Xde)v!)Y&B^qKn z6%|c}&Ie0)f7Z2a{jYNW9ZmV936q8&&$K0Sj0fV%v~yh|XPwCS*?loj!_@dtS7~o> z(a`6_yrHJZ8vpN~13!vS?OK?aHoyAF_iLWN8$!-#rdGV}i!W9i?HY;qA3xTl8Lw+B zIcr1xXq5-8!0BJGvSs4)if;`ktvVI&)eMX@oZXQNi`^ z$P}J0WYLGGb8?hMmHw_-ncZ8su%UZoeA{oCGF5sc=c=}mtclON^E#!;g%38IHmyGH zZ8y?9mixaRZRus(-5*Pq8x3^7N*epCc1iz_IE%>#N~PGBl->6{#6c`HD8i@vw5&-pOaJ12qmQ6VEB?GG#9 ztd_x$vf;Eq(G!)j1GC|{w|PY-I$X8~u7;(ycRrE`Hn{t;#&%`D=C{P`et*A@i(aN= zb#z3Zpj6AeTS1}9sj_!qInUzF>`s!=M4R^|N3V*^O4Xuo{;7S1t`b5uTTC+cwA%GA z9hIu@3o~XImh?YwuI@=O?qIMoL=Pu@>UMK5{8wliGBkBUXP~(}Ow{}HG6(&R7yUVX zLv9xr)%FJoqd5S31;t(kES7Z}Ww7V7Nz=xQ`-R6nn=E#HyuM9rj@HYSgEjSPZp6! zt$D;^g^#5)-?r4por2ta_EzBQl@y3DF}1{@Dt^xN?B=_kqm8m>_N4sKG8#-)&WlwV zarFD0ejry;cEY`RxS@^`Ikq`2EH0y?IK4r8o73Ug29GRN>i|}%tb@Vc6)88@+BzQm zy0{?jW#5r!0eF7O@~1VQB(avDOm#YVT~FDNGg$bsp*6=)IWDj_dsp_9>{&9#%^w?1 zMW4`i^qHt>NGVWM9DZx-Eis~Em-D)z@OD{Y_So?(m8y`o+git%hz0eJ{IsM!V<(@T zx36y9F=6yoZa)_3nR-g#l#g33`&?4X+? zD|6MoM$^EPN(hy~|NylIHG zPkd>0@TCnNF;%*b{Xs*EKP#%>GYDK&Mzp;J{#6YlGFp&W|oNZk--y%bkL= zd@2=uYZS5rOL|AvI^Egf`D6Bh5T&u+SK)ofeoTz3j*jP=9td#=dwAJUquPIDM??3s z1o67jGT*%M5c%1bV{a23bS=`yp8)c~GcN1@IqmuTx!T#6MVV|LtNs%AsO|f2uOWT$ z6!l+}%E@gwKVe{S;=sqSGnK;eRcROT4inDoZq^~?sX%p;%NzAT@R z*!6hkO$nzex9Ft)h-YVApH$Nma{k@u%Dt$4*4TG!Wrb_1_Sv4GiGr?@Ek&ni-gMGB zJf>X}_^rl0{?PZG(-$sEJ)G9?#KFO5M__y3u2a5orT)ghVrv2uUyrW0b2q8#)r983mvK+ z&SJrTZzdKUt`*I-ZGYu4_;*>9c-@Z^cRb$}_=@TUH|FHkI2p(F%_%<>EKqIEvUUEJ zb|6zf{q6c^XU3L|AhN!f0{`ZEe^IcU7>Hac6IYP^bnJGHqyHK^k9J-A`-iWF)=DP4 z9?rOLWnot5HDEk&CN(~7Wvi!*s$O8zaKq)C8Y%aT#{M!jR2W4@I=a;ZoKw3x(wjs# zXs7$N{`hKTI{I(ow1RJ?Yx5PMPi+y;%YGaj^U1wrbt6$}T5fB6^4eoV#e3pLUdSb8 zbv!BaDX;PKw)2S8eHW*fc`$w7jlyx-#YL~3-v>SHQVugwOvoC4mo%Q?dN!aV%XHE5 zSuss__gpTU`1Lbt-0RGJ&#|(7H>X$rYx|S_Cql=_aPY&Ro$kK6aiil$+@01|-cZ~_ z`?RF>@UC{18{$!p-g!v{PaMul#J{lgtD1K)WV_q;u*XC%AW&?0*6!(qbE45_X)HeU zyK204tf^itCFJmP3#W^(eOPDm&KS1Mz7gTUx>uI|`^7W+DEs}aqltkMB32SpEADt? z?fI1aBzV=o_uuavPTTq3g#1M@MCrAaolj%1-0?RtzEL&fb$Jq(4fZxaha`Raj<4?V zhqD64gPhVP-h`|?*539qXJ7O1Z0#R4si3dPCdJWSL{5~n zKh8;>%gb@#!&$N4a?F=!d~2Owmemd25vptp)C+5qieEIUl~X^jrh3`Y_Ei$5ay$Kx z+v|^K3QL^%DiQ4b(erPkt;7zU(YHrFYR&9;-P%!hU!%NEdffBt+jtM3?8bgWhk_ST zsbh_|n^J<7rTDNvMz>WxsfyQKym;{}Ia~4Q(NWu7dA@PR-=FTO(Hp3be%|v*$9C{n zl(u-M-GR?#fqQmT87yx*H1?)7F|*;%8!PW93D5>>yJNRi^2Q{LN`{yHZF|vn;DW8= zuJpEjRRwkL1a}NkRbzQXLu7JzfL`fH}KRgy+o4qZ~{ierRC6AuUB*;Q8 zk7!10_>zeXemmPKzUA0*#^~Oz;Wd9E)Epi}7hId;E;`2}Y3Hn2x5n4)PkH}jPP|e= z&fgnlMbGzlhM3mo4DE0Dl2bEhy6JF8LtKv*tu-#$zV&6xUU@ z&!NsTa_q$6)Ew%XD_S?nh#HDWYYx}2`yTHRiBf#+IlG?z^)D=#nu@-M88*gEyKpE~ek z!m!N5c1J*9>&^YiIUhGswu)5TDgXx45mP!hHj9*F0Jvk9xQ&zsG=X34Ml;NgG*1(_bYKlp~z!=RR5@lkITf)+cNj+Fgrv&&3=@vE|Ewnu-5?`2wR<-gfs&pSQ_ zSq@d?Nle@B^lL}vXW=@f+N^(5b+kmZE$+xD9&h`X^mVv(y23}3HMM_VR-K6y9w|&v znl+2Io%Y2)!fR96hW_@l%8_Hb@h|_l%ym#U>|DV_=2HrJW%t2_)^;St?5gUQSt_p& z45g+99k=TD&NX!Fy0=aLOVIb8uGWZdgOP=2pHzE#`*mjOX*_OhYYG}LY(CeO=#Z`V zX<5}BQ(4EtKg;GKOymP4MHx@gXqQy1*OL@od!8uP`9v$^c7Th2k+U*p+Nrjx#}c(3 zMfW}KXzj5IKwEE!3S}9ZJc1FvlcX~X-gsTWg=W4EiN^|U=M!YI-wCAyM7!w_E#^P; z5mjkAQ*Hhcerv6b(gFk^YLsMAPEpR_X21S)S>suQa?L%i^^LYW+kfYnIu9 zQ3};SI%X^Bo_Bxh>GY=!64ma zI{uJZHo29vM2K3yFHZKNGe%=YaU|c2W?baTJ!MpF?-pJ=0p2OA>nvnVhyoqa3SQSc6oX)i`2D z=Q2pXtj5haDhyR}GS)a{b-<||uN^J8#of782znBuI2oFuy0_;LP*I=CB$>hy{vhLk zP2Lhb09Y;5wv9|A3}6iNbSD%Dttv#x0W+F+Af%3(FOfW|;e)y@$2|~;5B!&Yo6kOM zSU98ESBaeFv|@lCw@?k6K{+p6KmXFqbzB;8Xe4Pgj^woaO*5*YAIl?$Oi>U6T(+by zUPkW2IOKlCo&&hd(JY^F&J0lzAm^wC;3D$p2!Kepp2FLQ)d9lm_*@O$0hWtUndqY$7xn`32q7nbXg>#B_g2C-PqA?${|*)Fd(23IW1F`C|5C;6 zRNA$<&Juj`$AJH_Irc2r`>m*5Byj`-8u0qEYcHalAe$&6#hFY)5xTlLLeip@y$}GVcV4|B%!K%y=3D z`f3E+8|lWcVVIH^3iN2hUjp|!F^x3(`&Aq{KJneaeUD!9JlK0!%2SUx0+|bE&W)47 zIs-d}s)-}i*8}(K%QA4n0?58xr4)i|8KIx{5xC5n*K(5aC+vWGJEvy^_Xbj)GtncY zwHPE>%ftL@o%7VYDCV=_)Y*moJom>~oWj%rH33b(Np+he0M-u?{k3c(*xkt0P=HOu z`4Q9iF%a|kNR>dv1!wN3T^oxgIi{qIO$K)c>pjI&WhxQI@Gn_Y!M`jK->%6A3cj$u z#Uwe-ia(P%)6kwC%lgO26%kK4-yvVPXOV^XiK*vom83)z->$Qa3Cmy z+c4>3UGVkP`j)o#jeKoGzEgW0Vqs&AoX>(A7t6Dr8qQ=syT=?8Tt?W^tP4{-HH?3p z#`T1dGnJfHs7(nVv;<=iIRxk(Dp@9{Sw9KvLIC??Ns25>Pw2Hk#AWXVR`z;UNixDk z`~5&tYKPy*?E$D z)#?(#WisUq?V3DO?C+ZgJf^V^&MP4wTlqj#=DPnG4~3Oeg&4lF208I-lD?Bt)6}pmdlN7xJ;I;L6lH_=#j8oV=heu zJ98&Q7}n2iLP(dr7P#;f#C$sf;b!#$2Fc7|);_+&FyDfdQh!4D{uLQoh#M9L3!1iV zf^f7c%*;y=Kyx!j|9YYN3bjWjeCvP*-mhWTlkRQ^m4RGZP`B}re)%PHi{LH{dMJ?n zS-r*f++~478Fa`m+iXEPPzgHFYAbqzFe)apNxAvK-PZn+ro`+1=r7Q2X#4a;Ie_JT5xh!LzFTz zVKhpbuR^Z#pZ^IV^HpPqyv++Rn9glLbg^}YCcqSbJoW}xlxq+LbUpkoz*PNSnlR0norn;un}e2H zdbtqdqtRnFb84xy`5;|21O0t`cN(*nlR*6jTK+vUvQWSyt2=Ol)`4`_g<1W>>B7%d zw_@}~QtM09VuB`Vd9yjYh*bSmQHy6+xHeu#6Sqs8EWte(;g^8uPcc6i+N=>=hsuy- zdC1-+bR8lXUFU=UQCqgSaRyO?;OhJhhCsgGxqU%|9%IiL=k2o&BK*3`7GGf@#**`e zyUwx!m9$Zdc1MYhS;@JFuOqpDb#C4k0}N}l0KwK7Zh&?BQ0zS}&l@;chz)-YWRKEx z33F24$w4D^%qj3~AsQ`ca*F+&ZBBNTVpvN-$WT31GL=ww5^Fa#Zav!sjttx%DA6Opw4T6d3WyO>$bh99%;Yw4fg_yK`Ur+g@O6 zP=#%P>anAZvhHSr>yH*ONYO^d$u~8ewFTB^fCft`vAadCDLc#Z*Z+bT{}x$;1C`cv z=4GZVdr<7;Sr1i#I_ta4>xBOJKrz_*zjc9_aY|B%MA-$Bhw_8B>~TjpBx)CmAyxue zOhUPl57&SHR&mDi_89Qrj+s|nutF9ND26m1J;w}Sy}YHAXVXwhbf_TgCjhI3@H0H2 z$56=(Pbv!}h>WvSQ*NL0F*|P?IRlY&F?6#*YH1d)eT8l2o1X zj&~w1XLHEa6g^IVnf$C9i1Ejz|4poo6RbX222cX{L_FEqEuAF8(+4s|7j)QlnRPq; zy%}c#pTrh50LtTu!90ZRMCKR0C7S`LMmt@|>sYly)$6#PG3FTnRsNynB1)IPq$jrq zx84Ily~`_=!_I5AROF(#--6<{=tn)&SXjE1O30vHH zp-709`cBI8GKqB-mc?hkTE<(Zy^{63hIj+_e?Hkq^I4%?lIhCc1V=u67thOQQHow` z6u+{icz#z+aN?^O>1e{{_878byi z+5(zgemuj!l_)jvAC-XDPZ(k*o3VAswtS&M7DjTMnB5vqV&RnrF5QEtp`Jgt#1-ue z?Ge-G>L&f*1z5het`!SbXrY1cz0@2A$BL7Z@nE%9)DO>aB2-|?%(XUy8?5%z2C?7C zfq3=Yf6EcQrPCaA7YoQ<@96s&6TUe@lN|uJz2LF+j&}VZo~0jr%FGs7Y76IewE0-_ z@L(UO7`VRz;+p@ta@`i@5>!Q&X4#U{{yLF|i4c!jr4AKzI(&sIKkA|+$R0dKav$#P zv*PUwDlipvS6r^Yd0W<`9j=0`RV^G6^MnL${1EmokagbFgdLRcLPi8DFhh3_NPB&| z6`!-?dbm*Fc+T=;7E+Ajz2q$7;RuvtpKf$g577}i$`$!i=ythxbtPjQTSygaV-kl! zKT>tuP%F;yQZoe8ykbAl{C`dq5^mj~!_8Mvsjj3m17~v2rqW7wAi$##>%U3J(2gcO>Eh|a) z&gTniC&Y_~$V-Z+f?AB4;4buL(4mfVv5K;PCv{LPAoIFoG`7DlL7?cO%0d32H!6mV zSV$JD32aYEN`${!wAripd!GW^VVn#GgTgBd%sEnN8^O~@8~UM&#qt+z=5}Wpi@`}t zZ1TfWZ)%GwTM6IDISm+h%)=`k1cI0W?!_O17HneF5`n0N!4^h;a0}9=dzJZ;1Qo1T zLN=gOtQ61=2N`U-09Ua`3)m2o-@%+`!GB(Yw;H`vn~l!$P?5;XM+pnWd9pkaW16l&ZBbyhE}m;Vd07i6(YoZN^07`y*BMPW%VX(8TaFQfT6;@lh%_8CIo3 zgPe4P+fiYJpJd9RJ38-%$9F5+^7zcxWE;RvM?s>#`M>88RFEmpMPn|KSeBr(mX95I z#TaPp3Ce!F6KI8^N$Xeb|cbK#yiVCB(;V2;&>%t3m~Zoxy7e z;~f2?#o#RoenS}B0GUQ{L7xz42;)3i$1`hyYr%#vPKb?)GlaTH4PpFudvSUR^7N|@c#vSv1DO1RW|FG!0FSuCEBzL-h|(e;Rki~N&tXY9WVTsMQ36CNt(U+i6TE%s)oQk2_SgjK|2U84$-xeN*oN?r0oVA$@zSeSJYP2`?hS+voxRdh5lo0L9`qhX1$ReKpYw!1x9%Vh?dM zXkL?;br-O>yF!!j6GW33@FU&LiRHG|0XS}xSQG>)wkug3S5?$PuqH9cf#SL81+PU9 ztgz80vAQ+1;ppYxcpSioX2{&$LLK*Z*q+zw#}wQ^N_}(zIn8tT96k~#NYf}@!u7LG z^LuC*+{xf4l@%Z2O$)+J0AFN%(+vw77dq=sk~*XvO@)V+P>ze(g%A$|@vnjV*K6X< zn8*ZW8{ZtPnUFS;o~odh9>xsdDZ~Zf{-RehhI_ASJz;SOnilPPC4;ANHKJ)mX$dL4 z*5-1q{E#L}0^Tzdg8D>giUX0!6`yCiq80}_Ku+`9!`FjL+VzV7==E^whFvKle9WIy zwh57|0TC$ehDo@>TwvzmWv);gbMn({Oj9Ebz3?ob^>rJd$*MS~iZ5b!9}oH8F_S5h(v|4WZq3p~E7 zNdO+PQiMzAbqE^QzgA)SeS{i&4{loQ^}yr$K)ij=QWa^&qks)mXtqYADlY593pF;{ zuxvVom!h|5u}xv0)u>J_nYxCDNQo^1^?d$3=v4ks#D}*Gi8b>cZ8anZW=p3DYM`|? zxh7u)p4OEp>9F+L2C@DXc>j8N?JjiR@Ow;X zIii7pbqjdE75#7-Mjcw0VC%?lp!@ff&D>k_@UzSX=sF_^;?DT&Sb}$YCUY3w?leTv z{9DqzLX)1zgxdzlcuAJ~He>B{oO}91W&~|M2v}|DqQ?Sy2DcwB-ynDR9&yu!pckc+ zei1q1L*sl1-S|cT4v1D4k!*6>P0{MfI!s*;!P0wm%H*q`{Dpv?;hmBNTex`{uEYZBady@v{#eYg!OXB+jx}>|`UX|btmfbU~@dCmeQhUq8&V}3t%TKyBrrD1` zv!nHNW)iNIJEQU+NcXDzod-Oao=PR@kSVbs-B?S@8a_-<=}Bs=(;(f`A<;(#bgyt` zlEV)m`$x}~$rq0^%!8E3`a_Z~xGoa9Y9QIHP4azl3X9$RuMjHip|r|#p#XMJD1u%` z>pZJiuvJ2E{XdZHRk@qHe@R;N!#fZSJ}1^JbGFblbnpinXi zlfff!+R>(~6bPO#$RwG-F)rY^%6DIiKn(>WLmeATfy+5k!pHf2D|l$IX=K+KF>tfz z_;8mC?yqp`g1MA!khQ1n>?si^7{T1djF=h&if8-Ur*j2F1JOvWcn8Tn_2eGD9Kj3_ z1{wCaI5(Y03vhby8;>28*Q>&C@^Ctd8;?ejiu3$+Rtcbr-FWPyRbW{Gx-k=(x(?TJ!MSJU0%0!{~* zS6v)L`jXJalP~^37raQp><5#tG_93@I+K^5GNoFHSc4wH-Uiggzl*&+N{w61(+9X9 z23RvJY)m0ABne!e$bp&a%0ImU<$)E4Z>)V_)UC^HcfihUTk-&LfD3r8@?)>$(4iwJ z(b0J=REbI;%S-4v+P4<_6Mv}|g%!P;?;*Q#m7#ef2kRDC2Ls{bI%UL2vGY7~6QEs8 zgJsD*W%CKO;O%0UPLY+4h{v)o}=RuiYf@q<6cHJ9MHA^&vj?18$KPtYM|`I+%fAccrNid zX~*ziv;I=xg>8`CaiF_re*!mg#6ejK)sg$}3SA2>Mh9OoYvJwgrvPZlht@lUg|cr` zGE|G50sS|5<@i+|2HO*n=G02q_GMEdbkccR9id!2Xem_xE?9(w6N-O@NTCg4E_*zo zz`K8;(>bA0CM1C!Xxx6kS#k@!l+E8+P6fKMF4Yl%TQ~~^mLpVQ+3n}B%B1;|gKS`f zbKmtg@?EGGdZYM8#T$W*+ur3MYQgc7=fK7uvqbb&o~4@*Zbt#R3PM%2a)P-W&_3Su z$yt!8_ynaGb;IBmFEC9osF|cTSK<^sl1ZU@kr2bOv9+chW*F6zZGB*(m=Ljpb+mJPtt4NpIPv(J8#*d79XYr}HZeQp)B zuqOb5#e`^aunzSoFSi0afGYq=I5~hU;LhHI!`b)-b?kjJi)Z6<08O3)-N!lfaZHsA zM4Jg>x}GpeqfgEN1gP5Xq-5Zpo4OX>y-i%Jj&PsWPG+~oKHjeZ7`?jRWo z`u3g8Y5&f_j z0+Zs|hJBIL-j#$pfw_ZAqjZ@|bka&zA+iEL_ypmtX!TE&Ua^=c_#gfqVhHRMj`@tRnaSuly^L`qlF~rCu%=(dxQbO^|ahQZC<>K=TV#2R(eXf8X&0|~Qm_s^Y zbS1opyDe)_$i^I{RRMNaV5IZ3jj^AcjK&QeAVx<`;8O7176byoQ7BV=H#V;1(u@+n zTgqC3TmaCf`xg=BryjBi&`^{5R=o z_I#jZe)Ei!=U5)gGp5`o7z?q4aBRlt0v<(jWs?1{ZzeI{5PIaF6J}BkCH4o zw&!^YhkoFW+WD*J367lrE@xnCxCz-qlp9>TA#Org`cxZkUV%yqDF-Kw-Gs1RpuXoB zSu^Ck9cw-t!%+egDS!(ouW@cVHUxoI99%iEeE}C=LtjkASx1E0xN_=M0bJfT?Z>4F ztv$T0#|i?E5hPSYL=f&!3M2d!WbsoTsGvf{?DT?k(lR)r8-jI@*DF!(X`l+|R0O9;F?ktzfZIRPldS*j6uK|8%n=} zET(NBM-8~e-I^xY0GYCeW=FIy z!y&Q08};})1{ab|*~Xn#KLRrb-i@!g|5#1D!0X#IdwzsMJSZJ7-mw^nUu-YNR~ANbJhN3q8r;2Xtg9PAH7cy5 zTJ?n|LDnZ(nuM%z$wtzogF{J| z2!9CND?fSs|Hf0O-N1cM-zz!R32K~xw?{gF`;JF4P+O{@CbBD6?I=G{o)7-h^GF%;fPc00F&F@rUa|OJE7tqfwAlVk@X!6w%)lhU`-ssde z!SWrH5`47mIoH4L)X9NlH!!(7Fy3~!S{70+QV=?NAaxu*-vQs zX%5E!0w@C(BB^*>fc^3IFro_&>vkOD1t`2d9D^3Jmulbf;l|p-TfzBlZK>kr@SvH{ z9!`cU?6jZc3gX@a^IV_lG1(i)X~VN)xae~gdOba6Dd}c$6kqU|AP}^$T4K|^cMBgS zI9wejBDEx|woM*aVIt{3b$abF<;6QV&VoEpM5)q=rG`%i_+C~NwU^C=zSNyf@5t4teb62cihXH^uRET zflIvvdd_x-)=4uOrNDdXa8;HDWmw=ci4Cv%rFBcH1GPd&u{;fv0%I!BcUB{Y1=Qk| z2);Z6mj7F!j-~6;#rWk7csoT{zPBB}tLKlcFko(9|EZTce!;`nmVjiBzB48-}3)l6;e+%^E`g@ZRt_$agLuTPjLe2e&tz4-TWiNC8bOdCx;{ zSQ(NjWu@?L3^%Y=l$r3e$mmv4&c7n_GZ=5Y=T9N`$@(F~iv+R@^e0Ckc6;wSoO$ll zq{q2)@hw{~xC`!1%*Ah!C1aDA+(UVD@kA+tuk+{P8T-h|ynrMy7cV%mA~+Y%&?OUd z*OTVr(Lw}IVk*F=@#o@+*BB8BC=X@TX7mLklx~JQxfDQSh=UM9m&fwj6pU?TAL!Fx zf)Mp7MtVH~62dSc&y*x)hIw8GHh^~+c{9U&As~$Dtlp=@%&@>ZTbSiI#ZzJ=Q@}t_ zlCHr8Q&YiV6~0pdGS9&r+GRieL)V{7nzGH;1fd%%l|Cj)5M1^TK8N?tka&)8&hFu08Fu7 z8n}VwE3;={bcVyN=iMLqCEPSQp8>Ck0omqYkd~eY*ArueHVd77Vf_*08PUu2w(`V{ z&8R4C&G#me$d}Q7JCOPxqySeHB6InMe@)xjjG_VlQNzlrT|g19X*eh5gQW9?V@_bS zaP|M1a`?Cw#dBDvgv^yRF2bXXVp~#&bKuQME``KW2N-G#>hV&Jupx7EVBnyg*Y&3Y zZ7N_u1sKrPE`2wTJze0;|6o?>>YUprMQpU$Pz4cIp#lC!!_wmO|C>}<4MeXNjy?)6^Ux;A;A6bKMg!YT~l+$r})A%0QX^PDK|MG z##CZh5Qk6Ab>TViIA$pzX$|jfrYU-t@Txp~N(FR*;_0?FR=}AKiP>F&;iqv^5{Wc1 kp|gPI1RtiNl9@tED=i*go-)4%R!HmCSguZ3>3s740KCK-y#N3J literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/without-hover-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItem/RoomListItem.stories.tsx/without-hover-menu-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..e045a22515ea4e3adc3dbf3b400de237b4b3fe79 GIT binary patch literal 20491 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..95078643c6de19488f37ff4f5df55a737b045307 GIT binary patch literal 25569 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 z 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 aV?=S;L$}5g%M$M330EYQ<_*|gE&l)Ro@BQ%l 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%0A71GQ7Wb1;Y1FIRlmR-im7G*bW4q33O! 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%0A;?F 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e995e46b869c2597ec7afdf7a70ce476c506af GIT binary patch literal 26646 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 U?Nf{40eHg1#Uw=A4`!GB2OHVeEdT%j literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..af7e8570888c72d2ad5cf8b433d64aa90a7f327b GIT binary patch literal 27174 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

wHQs=Hy03&$MkFSU)8x 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

8z1 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 ( +

+ +
+ ), + ], + args: defaultProps, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=101-13062", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const NoNotification: Story = {}; + +export const UnsentMessage: Story = { + args: { + hasAnyNotificationOrActivity: true, + isUnsentMessage: true, + }, +}; + +export const VideoCall: Story = { + args: { + hasAnyNotificationOrActivity: true, + callType: "video", + }, +}; + +export const VoiceCall: Story = { + args: { + hasAnyNotificationOrActivity: true, + callType: "voice", + }, +}; + +export const Invited: Story = { + args: { + hasAnyNotificationOrActivity: true, + invited: true, + }, +}; + +export const Mention: Story = { + args: { + hasAnyNotificationOrActivity: true, + isMention: true, + }, +}; + +export const MentionWithCount: Story = { + args: { + hasAnyNotificationOrActivity: true, + isMention: true, + count: 5, + }, +}; + +export const NotificationWithCount: Story = { + args: { + hasAnyNotificationOrActivity: true, + isNotification: true, + count: 3, + }, +}; + +export const ActivityIndicator: Story = { + args: { + hasAnyNotificationOrActivity: true, + isActivityNotification: true, + }, +}; + +export const Muted: Story = { + args: { + muted: true, + }, +}; + +export const MutedWithoutActivity: Story = { + args: { + hasAnyNotificationOrActivity: false, + muted: true, + }, +}; + +export const VideoCallWithoutActivity: Story = { + args: { + hasAnyNotificationOrActivity: false, + callType: "video", + }, +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.test.tsx b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.test.tsx new file mode 100644 index 0000000000..f79e092f4d --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect } from "vitest"; + +import * as stories from "./NotificationDecoration.stories"; + +const { + NoNotification, + UnsentMessage, + VideoCall, + VoiceCall, + Invited, + Mention, + MentionWithCount, + NotificationWithCount, + ActivityIndicator, + Muted, +} = composeStories(stories); + +describe("", () => { + describe("snapshots", () => { + it("renders NoNotification story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders UnsentMessage story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders VideoCall story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders VoiceCall story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Invited story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Mention story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders MentionWithCount story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders NotificationWithCount story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders ActivityIndicator story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Muted story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.tsx b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.tsx new file mode 100644 index 0000000000..03be962fbf --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/NotificationDecoration.tsx @@ -0,0 +1,90 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { + MentionIcon, + ErrorSolidIcon, + NotificationsOffSolidIcon, + VideoCallSolidIcon, + EmailSolidIcon, + VoiceCallSolidIcon, +} from "@vector-im/compound-design-tokens/assets/web/icons"; +import { UnreadCounter, Unread } from "@vector-im/compound-web"; + +import { Flex } from "../../../utils/Flex"; + +/** + * Data representing the notification state for a room or item. + * Used in snapshots and passed to the NotificationDecoration component. + */ +export interface NotificationDecorationData { + /** Whether there is any notification or activity to display */ + hasAnyNotificationOrActivity: boolean; + /** Whether there's an unsent message */ + isUnsentMessage: boolean; + /** Whether the user is invited to the room */ + invited: boolean; + /** Whether the notification is a mention */ + isMention: boolean; + /** Whether there's activity (not a full notification) */ + isActivityNotification: boolean; + /** Whether there's a notification (not just activity) */ + isNotification: boolean; + /** Whether there are unread messages with a count */ + hasUnreadCount: boolean; + /** Notification count */ + count: number; + /** Whether notifications are muted */ + muted: boolean; + /** Optional call type indicator */ + callType?: "video" | "voice"; +} + +/** + * Props for the NotificationDecoration component. + */ +export interface NotificationDecorationProps extends NotificationDecorationData {} + +/** + * Renders notification badges and indicators for rooms/items + */ +export const NotificationDecoration: React.FC = ({ + hasAnyNotificationOrActivity, + muted, + callType, + isUnsentMessage, + invited, + isMention, + isNotification, + isActivityNotification, + count, +}) => { + // Don't render anything if there's nothing to show + if (!hasAnyNotificationOrActivity && !muted && !callType) { + return null; + } + + return ( + + {isUnsentMessage && ( + + )} + {callType === "video" && ( + + )} + {callType === "voice" && ( + + )} + {invited && } + {isMention && } + {(isMention || isNotification) && } + {isActivityNotification && } + {muted && } + + ); +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/__snapshots__/NotificationDecoration.test.tsx.snap b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/__snapshots__/NotificationDecoration.test.tsx.snap new file mode 100644 index 0000000000..a7c7da94f4 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/__snapshots__/NotificationDecoration.test.tsx.snap @@ -0,0 +1,242 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > snapshots > renders ActivityIndicator story 1`] = ` +
+
+
+
+
+
+
+
+
+`; + +exports[` > snapshots > renders Invited story 1`] = ` +
+
+
+ + + +
+
+
+`; + +exports[` > snapshots > renders Mention story 1`] = ` +
+
+
+ + + +
+
+
+
+`; + +exports[` > snapshots > renders MentionWithCount story 1`] = ` +
+
+
+ + + + + 5 + +
+
+
+`; + +exports[` > snapshots > renders Muted story 1`] = ` +
+
+
+ + + + +
+
+
+`; + +exports[` > snapshots > renders NoNotification story 1`] = ` +
+
+
+`; + +exports[` > snapshots > renders NotificationWithCount story 1`] = ` +
+
+
+ + 3 + +
+
+
+`; + +exports[` > snapshots > renders UnsentMessage story 1`] = ` +
+
+
+ + + +
+
+
+`; + +exports[` > snapshots > renders VideoCall story 1`] = ` +
+
+
+ + + +
+
+
+`; + +exports[` > snapshots > renders VoiceCall story 1`] = ` +
+
+
+ + + +
+
+
+`; diff --git a/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/index.tsx b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/index.tsx new file mode 100644 index 0000000000..42c7a3451f --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/NotificationDecoration/index.tsx @@ -0,0 +1,9 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { NotificationDecoration } from "./NotificationDecoration"; +export type { NotificationDecorationProps, NotificationDecorationData } from "./NotificationDecoration"; diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItem.module.css b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.module.css new file mode 100644 index 0000000000..008a4462ac --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.module.css @@ -0,0 +1,106 @@ +/* + * Copyright 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +/** + * The RoomListItem has the following structure: + * button--------------------------------------------------| + * | <-12px-> container------------------------------------| + * | | room avatar <-8px-> content----------------| + * | | | room_name <- 20px ->| + * | | | --------------------| <-- border + * |-------------------------------------------------------| + */ +.roomListItem { + /* Remove button default style */ + background: unset; + border: none; + padding: 0; + text-align: unset; + + cursor: pointer; + height: 48px; + width: 100%; + + padding-left: var(--cpd-space-3x); + font: var(--cpd-font-body-md-regular); + color: var(--cpd-color-text-primary); + + /* Hide the menu by default */ + .hoverMenu { + display: none; + } +} + +/* Show hover menu and background on hover/focus/menu-open states */ +.roomListItem:hover, +.roomListItem:focus-visible, +/* When the context menu is opened */ +.roomListItem[data-state="open"], +/* When the options and notifications menu are opened */ +.roomListItem:has(.hoverMenu > button[data-state="open"]) { + background-color: var(--cpd-color-bg-action-secondary-hovered); + + .hoverMenu { + display: flex; + } + + /* When the menu is visible, hide the notification decoration to avoid clutter */ + .notificationDecoration { + display: none; + } + + /** + * The figma uses 16px padding (--cpd-space-4x) but due to https://github.com/element-hq/compound-web/issues/331 + * the icon size of the menu is 18px instead of 20px with a different internal padding + * We need to use 18px to align the icon with the others icons + * 18px is not available in compound spacing + */ + .content { + padding-right: 18px; + } +} + +.content { + height: 100%; + flex: 1; + /* The border is only under the room name and the future hover menu */ + border-bottom: var(--cpd-border-width-0-5) solid var(--cpd-color-bg-subtle-secondary); + box-sizing: border-box; + min-width: 0; + padding-right: var(--cpd-space-5x); +} + +.text { + min-width: 0; +} + +.roomName { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.messagePreview { + font: var(--cpd-font-body-sm-regular); + color: var(--cpd-color-text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.selected { + background-color: var(--cpd-color-bg-action-secondary-pressed); +} + +.bold .roomName { + font: var(--cpd-font-body-md-semibold); +} + +/* Set icon color for hover menu buttons */ +.hoverMenu svg { + fill: var(--cpd-color-icon-primary); +} diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItem.stories.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.stories.tsx new file mode 100644 index 0000000000..fcc4017fb1 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.stories.tsx @@ -0,0 +1,213 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import type { Room } from "./RoomListItem"; +import { RoomListItemView, type RoomListItemSnapshot, type RoomListItemActions } from "./RoomListItem"; +import { useMockedViewModel } from "../../viewmodel"; +import { defaultSnapshot } from "./default-snapshot"; +import { renderAvatar } from "../story-mocks"; + +type RoomListItemProps = RoomListItemSnapshot & + RoomListItemActions & { + isSelected: boolean; + isFocused: boolean; + onFocus: (room: Room, e: React.FocusEvent) => void; + roomIndex: number; + roomCount: number; + renderAvatar: (room: Room) => React.ReactElement; + }; + +// Wrapper component that creates a mocked ViewModel +const RoomListItemWrapper = ({ + onOpenRoom, + onMarkAsRead, + onMarkAsUnread, + onToggleFavorite, + onToggleLowPriority, + onInvite, + onCopyRoomLink, + onLeaveRoom, + onSetRoomNotifState, + isSelected, + isFocused, + onFocus, + roomIndex, + roomCount, + renderAvatar: renderAvatarProp, + ...rest +}: RoomListItemProps): JSX.Element => { + const vm = useMockedViewModel(rest, { + onOpenRoom, + onMarkAsRead, + onMarkAsUnread, + onToggleFavorite, + onToggleLowPriority, + onInvite, + onCopyRoomLink, + onLeaveRoom, + onSetRoomNotifState, + }); + return ( + + ); +}; + +const meta = { + title: "Room List/RoomListItem", + component: RoomListItemWrapper, + tags: ["autodocs"], + decorators: [ + (Story) => ( +
+
+ +
+
+ ), + ], + args: { + ...defaultSnapshot, + isSelected: false, + isFocused: false, + roomIndex: 0, + roomCount: 10, + onOpenRoom: fn(), + onMarkAsRead: fn(), + onMarkAsUnread: fn(), + onToggleFavorite: fn(), + onToggleLowPriority: fn(), + onInvite: fn(), + onCopyRoomLink: fn(), + onLeaveRoom: fn(), + onSetRoomNotifState: fn(), + onFocus: fn(), + renderAvatar, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=101-13062", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Selected: Story = { + args: { + isSelected: true, + }, +}; + +export const Bold: Story = { + args: { + isBold: true, + name: "Team Updates", + }, +}; + +export const WithNotification: Story = { + args: { + isBold: true, + notification: { + hasAnyNotificationOrActivity: true, + isUnsentMessage: false, + invited: false, + isMention: false, + isActivityNotification: false, + isNotification: true, + hasUnreadCount: true, + count: 3, + muted: false, + }, + }, +}; + +export const WithMention: Story = { + args: { + isBold: true, + notification: { + hasAnyNotificationOrActivity: true, + isUnsentMessage: false, + invited: false, + isMention: true, + isActivityNotification: false, + isNotification: true, + hasUnreadCount: true, + count: 1, + muted: false, + }, + }, +}; + +export const Invitation: Story = { + args: { + name: "Secret Project", + messagePreview: "Bob invited you", + notification: { + hasAnyNotificationOrActivity: true, + isUnsentMessage: false, + invited: true, + isMention: false, + isActivityNotification: false, + isNotification: false, + hasUnreadCount: false, + count: 0, + muted: false, + }, + }, +}; + +export const UnsentMessage: Story = { + args: { + messagePreview: "Failed to send message", + notification: { + hasAnyNotificationOrActivity: true, + isUnsentMessage: true, + invited: false, + isMention: false, + isActivityNotification: false, + isNotification: false, + hasUnreadCount: false, + count: 0, + muted: false, + }, + }, +}; + +export const NoMessagePreview: Story = { + args: { + messagePreview: undefined, + }, +}; + +export const WithHoverMenu: Story = { + args: { + showMoreOptionsMenu: true, + }, +}; + +export const WithoutHoverMenu: Story = { + args: { + showMoreOptionsMenu: false, + }, +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItem.test.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.test.tsx new file mode 100644 index 0000000000..788c9f317f --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.test.tsx @@ -0,0 +1,123 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen } from "@test-utils"; +import userEvent from "@testing-library/user-event"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect } from "vitest"; + +import * as stories from "./RoomListItem.stories"; + +const { + Default, + Selected, + Bold, + WithNotification, + WithMention, + Invitation, + UnsentMessage, + NoMessagePreview, + WithHoverMenu, + WithoutHoverMenu, +} = composeStories(stories); + +describe("", () => { + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Selected story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Bold story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders WithNotification story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders WithMention story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Invitation story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders UnsentMessage story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders NoMessagePreview story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders WithHoverMenu story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("should call onOpenRoom when clicked", async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole("option")); + expect(Default.args.onOpenRoom).toHaveBeenCalled(); + }); + + it("should have aria-selected true when selected", () => { + render(); + expect(screen.getByRole("option")).toHaveAttribute("aria-selected", "true"); + }); + + it("should have aria-selected false when not selected", () => { + render(); + expect(screen.getByRole("option")).toHaveAttribute("aria-selected", "false"); + }); + + it("should have tabIndex -1 when not focused", () => { + render(); + expect(screen.getByRole("option")).toHaveAttribute("tabIndex", "-1"); + }); + + it("should call onFocus when focused", () => { + render(); + screen.getByRole("option").focus(); + expect(Default.args.onFocus).toHaveBeenCalled(); + }); + + it("should display notification decoration when present", () => { + render(); + expect(screen.getByTestId("notification-decoration")).toBeInTheDocument(); + }); + + it("should hide notification decoration when not present", () => { + render(); + expect(screen.queryByTestId("notification-decoration")).toBeNull(); + }); + + it("should show hover menu when showMoreOptionsMenu is true", () => { + const { container } = render(); + expect(container.querySelector('[aria-label="More Options"]')).not.toBeNull(); + }); + + it("should hide hover menu when showMoreOptionsMenu is false", () => { + const { container } = render(); + expect(container.querySelector('[aria-label="More Options"]')).toBeNull(); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItem.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.tsx new file mode 100644 index 0000000000..bc16d15cd3 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItem.tsx @@ -0,0 +1,207 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, memo, useEffect, useRef, type ReactNode } from "react"; +import classNames from "classnames"; + +import { Flex } from "../../utils/Flex"; +import { NotificationDecoration, type NotificationDecorationData } from "./NotificationDecoration"; +import { RoomListItemHoverMenu } from "./RoomListItemHoverMenu"; +import { RoomListItemContextMenu } from "./RoomListItemContextMenu"; +import { type RoomNotifState } from "./RoomNotifs"; +import styles from "./RoomListItem.module.css"; +import { useViewModel, type ViewModel } from "../../viewmodel"; +import { _t } from "../../utils/i18n"; + +/** + * Opaque type representing a Room object from the parent application + */ +export type Room = unknown; + +/** + * Generate an accessible label for a room based on its notification state. + */ +function getA11yLabel(roomName: string, notification: NotificationDecorationData): string { + if (notification.isUnsentMessage) { + return _t("room_list|a11y|unsent_message", { roomName }); + } else if (notification.invited) { + return _t("room_list|a11y|invitation", { roomName }); + } else if (notification.isMention && notification.count) { + return _t("room_list|a11y|mention", { roomName, count: notification.count }); + } else if (notification.hasUnreadCount && notification.count) { + return _t("room_list|a11y|unread", { roomName, count: notification.count }); + } else { + return _t("room_list|a11y|default", { roomName }); + } +} + +/** + * Snapshot for a room list item. + * Contains all the data needed to render a room in the list. + */ +export interface RoomListItemSnapshot { + /** Unique identifier for the room (used for list keying) */ + id: string; + /** The opaque Room object from the client (e.g., matrix-js-sdk Room) */ + room: Room; + /** The name of the room */ + name: string; + /** Whether the room name should be bolded (has unread/activity) */ + isBold: boolean; + /** Optional message preview text */ + messagePreview?: string; + /** Notification decoration data */ + notification: NotificationDecorationData; + /** Whether the more options menu should be shown */ + showMoreOptionsMenu: boolean; + /** Whether the notification menu should be shown */ + showNotificationMenu: boolean; + /** Whether the room is a favourite room */ + isFavourite: boolean; + /** Whether the room is a low priority room */ + isLowPriority: boolean; + /** Can invite other users in the room */ + canInvite: boolean; + /** Can copy the room link */ + canCopyRoomLink: boolean; + /** Can mark the room as read */ + canMarkAsRead: boolean; + /** Can mark the room as unread */ + canMarkAsUnread: boolean; + /** The room's notification state */ + roomNotifState: RoomNotifState; +} + +/** + * Actions interface for room list item operations. + * Implemented by the room item view model. + */ +export interface RoomListItemActions { + /** Called when the room should be opened */ + onOpenRoom: () => void; + /** Called when the room should be marked as read */ + onMarkAsRead: () => void; + /** Called when the room should be marked as unread */ + onMarkAsUnread: () => void; + /** Called when the room's favorite status should be toggled */ + onToggleFavorite: () => void; + /** Called when the room's low priority status should be toggled */ + onToggleLowPriority: () => void; + /** Called when inviting users to the room */ + onInvite: () => void; + /** Called when copying the room link */ + onCopyRoomLink: () => void; + /** Called when leaving the room */ + onLeaveRoom: () => void; + /** Called when setting the room notification state */ + onSetRoomNotifState: (state: RoomNotifState) => void; +} + +/** + * The view model type for a room list item + */ +export type RoomItemViewModel = ViewModel & RoomListItemActions; + +/** + * Props for RoomListItemView component + */ +export interface RoomListItemViewProps extends Omit, "onFocus"> { + /** The room item view model */ + vm: RoomItemViewModel; + /** Whether the room is selected */ + isSelected: boolean; + /** Whether the room should be focused */ + isFocused: boolean; + /** Callback when item receives focus */ + onFocus: (roomId: string, e: React.FocusEvent) => void; + /** Index of this room in the list (for accessibility) */ + roomIndex: number; + /** Total number of rooms in the list (for accessibility) */ + roomCount: number; + /** Function to render the room avatar */ + renderAvatar: (room: Room) => ReactNode; +} + +/** + * A presentational room list item component. + * Displays room name, avatar, message preview, and notifications. + */ +export const RoomListItemView = memo(function RoomListItemView({ + vm, + isSelected, + isFocused, + onFocus, + roomIndex, + roomCount, + renderAvatar, + ...props +}: RoomListItemViewProps): JSX.Element { + const ref = useRef(null); + const item = useViewModel(vm); + + useEffect(() => { + if (isFocused) { + ref.current?.focus({ preventScroll: true, focusVisible: true } as FocusOptions); + } + }, [isFocused]); + + // Generate a11y label from notification state and room name + const a11yLabel = getA11yLabel(item.name, item.notification); + + const content = ( + ) => onFocus(item.id, e)} + tabIndex={isFocused ? 0 : -1} + {...props} + > + {renderAvatar(item.room)} + + {/* We truncate the room name when too long. Title here is to show the full name on hover */} +
+
+ {item.name} +
+ {item.messagePreview && ( +
+ {item.messagePreview} +
+ )} +
+ {(item.showMoreOptionsMenu || item.showNotificationMenu) && ( + + )} + + {/* aria-hidden because we summarise the unread count/notification status in a11yLabel */} +
+ +
+
+
+ ); + + return {content}; +}); diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemContextMenu.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemContextMenu.tsx new file mode 100644 index 0000000000..0d202474f8 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemContextMenu.tsx @@ -0,0 +1,40 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, type PropsWithChildren } from "react"; +import { ContextMenu } from "@vector-im/compound-web"; + +import { _t } from "../../utils/i18n"; +import { MoreOptionContent, type RoomItemViewModel } from "./RoomListItemMoreOptionsMenu"; + +/** + * Props for RoomListItemContextMenu component + */ +export interface RoomListItemContextMenuProps { + /** The room item view model */ + vm: RoomItemViewModel; +} + +/** + * The context menu for room list items. + * Wraps the trigger element with a right-click context menu displaying room options. + */ +export const RoomListItemContextMenu: React.FC> = ({ + vm, + children, +}): JSX.Element => { + return ( + + + + ); +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemHoverMenu.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemHoverMenu.tsx new file mode 100644 index 0000000000..9a453b2014 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemHoverMenu.tsx @@ -0,0 +1,42 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; + +import { Flex } from "../../utils/Flex"; +import { RoomListItemMoreOptionsMenu, type RoomItemViewModel } from "./RoomListItemMoreOptionsMenu"; +import { RoomListItemNotificationMenu } from "./RoomListItemNotificationMenu"; +import styles from "./RoomListItem.module.css"; + +/** + * Props for RoomListItemHoverMenu component + */ +export interface RoomListItemHoverMenuProps { + /** Whether the more options menu should be shown */ + showMoreOptionsMenu: boolean; + /** Whether the notification menu should be shown */ + showNotificationMenu: boolean; + /** The room item view model */ + vm: RoomItemViewModel; +} + +/** + * The hover menu for room list items. + * Displays more options and notification settings menus. + */ +export const RoomListItemHoverMenu: React.FC = ({ + showMoreOptionsMenu, + showNotificationMenu, + vm, +}): JSX.Element => { + return ( + + {showMoreOptionsMenu && } + {showNotificationMenu && } + + ); +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.test.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.test.tsx new file mode 100644 index 0000000000..40b9917c5b --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.test.tsx @@ -0,0 +1,227 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { render, screen } from "@test-utils"; +import userEvent from "@testing-library/user-event"; +import { describe, it, expect, vi } from "vitest"; + +import { RoomListItemMoreOptionsMenu } from "./RoomListItemMoreOptionsMenu"; +import { useMockedViewModel } from "../../viewmodel"; +import type { RoomListItemSnapshot } from "./RoomListItem"; +import { defaultSnapshot } from "./default-snapshot"; + +describe("", () => { + const mockCallbacks = { + onOpenRoom: vi.fn(), + onMarkAsRead: vi.fn(), + onMarkAsUnread: vi.fn(), + onToggleFavorite: vi.fn(), + onToggleLowPriority: vi.fn(), + onInvite: vi.fn(), + onCopyRoomLink: vi.fn(), + onLeaveRoom: vi.fn(), + onSetRoomNotifState: vi.fn(), + }; + + const renderMenu = (overrides: Partial = {}): ReturnType => { + const TestComponent = (): JSX.Element => { + const vm = useMockedViewModel( + { + ...defaultSnapshot, + showMoreOptionsMenu: true, + showNotificationMenu: false, + ...overrides, + } as RoomListItemSnapshot, + mockCallbacks, + ); + return ; + }; + return render(); + }; + + it("should render the more options button", () => { + renderMenu(); + expect(screen.getByRole("button", { name: "More Options" })).toBeInTheDocument(); + }); + + it("should open menu when clicked", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menu")).toBeInTheDocument(); + }); + + it("should show mark as read option when canMarkAsRead is true", async () => { + const user = userEvent.setup(); + renderMenu({ canMarkAsRead: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menuitem", { name: "Mark as read" })).toBeInTheDocument(); + }); + + it("should not show mark as read option when canMarkAsRead is false", async () => { + const user = userEvent.setup(); + renderMenu({ canMarkAsRead: false }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.queryByRole("menuitem", { name: "Mark as read" })).not.toBeInTheDocument(); + }); + + it("should call onMarkAsRead when mark as read clicked", async () => { + const user = userEvent.setup(); + renderMenu({ canMarkAsRead: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const markAsReadOption = screen.getByRole("menuitem", { name: "Mark as read" }); + await user.click(markAsReadOption); + + expect(mockCallbacks.onMarkAsRead).toHaveBeenCalled(); + }); + + it("should show mark as unread option when canMarkAsUnread is true", async () => { + const user = userEvent.setup(); + renderMenu({ canMarkAsUnread: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menuitem", { name: "Mark as unread" })).toBeInTheDocument(); + }); + + it("should call onMarkAsUnread when mark as unread clicked", async () => { + const user = userEvent.setup(); + renderMenu({ canMarkAsUnread: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const markAsUnreadOption = screen.getByRole("menuitem", { name: "Mark as unread" }); + await user.click(markAsUnreadOption); + + expect(mockCallbacks.onMarkAsUnread).toHaveBeenCalled(); + }); + + it("should show favorite option and call onToggleFavorite", async () => { + const user = userEvent.setup(); + renderMenu({ isFavourite: false }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const favoriteOption = screen.getByRole("menuitemcheckbox", { name: "Favourited" }); + expect(favoriteOption).toBeInTheDocument(); + expect(favoriteOption).toHaveAttribute("aria-checked", "false"); + + await user.click(favoriteOption); + expect(mockCallbacks.onToggleFavorite).toHaveBeenCalled(); + }); + + it("should show favorite as checked when isFavourite is true", async () => { + const user = userEvent.setup(); + renderMenu({ isFavourite: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const favoriteOption = screen.getByRole("menuitemcheckbox", { name: "Favourited" }); + expect(favoriteOption).toHaveAttribute("aria-checked", "true"); + }); + + it("should show low priority option and call onToggleLowPriority", async () => { + const user = userEvent.setup(); + renderMenu({ isLowPriority: false }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const lowPriorityOption = screen.getByRole("menuitemcheckbox", { name: "Low priority" }); + expect(lowPriorityOption).toBeInTheDocument(); + expect(lowPriorityOption).toHaveAttribute("aria-checked", "false"); + + await user.click(lowPriorityOption); + expect(mockCallbacks.onToggleLowPriority).toHaveBeenCalled(); + }); + + it("should show invite option when canInvite is true", async () => { + const user = userEvent.setup(); + renderMenu({ canInvite: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menuitem", { name: "Invite" })).toBeInTheDocument(); + }); + + it("should call onInvite when invite clicked", async () => { + const user = userEvent.setup(); + renderMenu({ canInvite: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const inviteOption = screen.getByRole("menuitem", { name: "Invite" }); + await user.click(inviteOption); + + expect(mockCallbacks.onInvite).toHaveBeenCalled(); + }); + + it("should show copy link option when canCopyRoomLink is true", async () => { + const user = userEvent.setup(); + renderMenu({ canCopyRoomLink: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menuitem", { name: "Copy room link" })).toBeInTheDocument(); + }); + + it("should call onCopyRoomLink when copy link clicked", async () => { + const user = userEvent.setup(); + renderMenu({ canCopyRoomLink: true }); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const copyLinkOption = screen.getByRole("menuitem", { name: "Copy room link" }); + await user.click(copyLinkOption); + + expect(mockCallbacks.onCopyRoomLink).toHaveBeenCalled(); + }); + + it("should show leave room option", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + expect(screen.getByRole("menuitem", { name: "Leave room" })).toBeInTheDocument(); + }); + + it("should call onLeaveRoom when leave room clicked", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "More Options" }); + await user.click(button); + + const leaveRoomOption = screen.getByRole("menuitem", { name: "Leave room" }); + await user.click(leaveRoomOption); + + expect(mockCallbacks.onLeaveRoom).toHaveBeenCalled(); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.tsx new file mode 100644 index 0000000000..d10b5c32ec --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemMoreOptionsMenu.tsx @@ -0,0 +1,137 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { useState, type JSX } from "react"; +import { IconButton, Menu, MenuItem, Separator, ToggleMenuItem } from "@vector-im/compound-web"; +import { + MarkAsReadIcon, + MarkAsUnreadIcon, + FavouriteIcon, + ArrowDownIcon, + UserAddIcon, + LinkIcon, + LeaveIcon, + OverflowHorizontalIcon, +} from "@vector-im/compound-design-tokens/assets/web/icons"; + +import { _t } from "../../utils/i18n"; +import { useViewModel, type ViewModel } from "../../viewmodel"; +import type { RoomListItemSnapshot, RoomListItemActions } from "./RoomListItem"; + +/** + * View model type for room list item + */ +export type RoomItemViewModel = ViewModel & RoomListItemActions; + +/** + * Props for RoomListItemMoreOptionsMenu component + */ +export interface RoomListItemMoreOptionsMenuProps { + /** The room item view model */ + vm: RoomItemViewModel; +} + +/** + * The more options menu for room list items. + * Displays additional room actions like mark as read/unread, favorite, invite, etc. + */ +export function RoomListItemMoreOptionsMenu({ vm }: RoomListItemMoreOptionsMenuProps): JSX.Element { + const [open, setOpen] = useState(false); + + return ( + + + + } + > + + + ); +} + +interface MoreOptionContentProps { + vm: RoomItemViewModel; +} + +export function MoreOptionContent({ vm }: MoreOptionContentProps): JSX.Element { + const snapshot = useViewModel(vm); + return ( + // eslint-disable-next-line jsx-a11y/no-static-element-interactions +
e.stopPropagation()}> + {snapshot.canMarkAsRead && ( + evt.stopPropagation()} + hideChevron={true} + /> + )} + {snapshot.canMarkAsUnread && ( + evt.stopPropagation()} + hideChevron={true} + /> + )} + evt.stopPropagation()} + /> + evt.stopPropagation()} + /> + {snapshot.canInvite && ( + evt.stopPropagation()} + hideChevron={true} + /> + )} + {snapshot.canCopyRoomLink && ( + evt.stopPropagation()} + hideChevron={true} + /> + )} + + evt.stopPropagation()} + hideChevron={true} + /> +
+ ); +} diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.test.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.test.tsx new file mode 100644 index 0000000000..3f88e2f8a1 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.test.tsx @@ -0,0 +1,164 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { render, screen } from "@test-utils"; +import userEvent from "@testing-library/user-event"; +import { describe, it, expect, vi } from "vitest"; + +import { RoomListItemNotificationMenu } from "./RoomListItemNotificationMenu"; +import { RoomNotifState } from "./RoomNotifs"; +import { useMockedViewModel } from "../../viewmodel"; +import type { RoomListItemSnapshot } from "./RoomListItem"; +import { defaultSnapshot } from "./default-snapshot"; + +describe("", () => { + const mockCallbacks = { + onOpenRoom: vi.fn(), + onMarkAsRead: vi.fn(), + onMarkAsUnread: vi.fn(), + onToggleFavorite: vi.fn(), + onToggleLowPriority: vi.fn(), + onInvite: vi.fn(), + onCopyRoomLink: vi.fn(), + onLeaveRoom: vi.fn(), + onSetRoomNotifState: vi.fn(), + }; + + const renderMenu = (roomNotifState: RoomNotifState = RoomNotifState.AllMessages): ReturnType => { + const TestComponent = (): JSX.Element => { + const vm = useMockedViewModel( + { + ...defaultSnapshot, + showMoreOptionsMenu: false, + showNotificationMenu: true, + roomNotifState, + } as RoomListItemSnapshot, + mockCallbacks, + ); + return ; + }; + return render(); + }; + + it("should render the notification menu button", () => { + renderMenu(); + expect(screen.getByRole("button", { name: "Notification options" })).toBeInTheDocument(); + }); + + it("should show muted icon when notifications are muted", () => { + renderMenu(RoomNotifState.Mute); + const button = screen.getByRole("button", { name: "Notification options" }); + expect(button.querySelector("svg")).toBeInTheDocument(); + }); + + it("should open menu when clicked", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + expect(screen.getByRole("menu")).toBeInTheDocument(); + }); + + it("should call onSetRoomNotifState with AllMessages when default settings selected", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const defaultOption = screen.getByRole("menuitem", { name: "Match default settings" }); + await user.click(defaultOption); + + expect(mockCallbacks.onSetRoomNotifState).toHaveBeenCalledWith(RoomNotifState.AllMessages); + }); + + it("should call onSetRoomNotifState with AllMessagesLoud when all messages selected", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const allMessagesOption = screen.getByRole("menuitem", { name: "All messages" }); + await user.click(allMessagesOption); + + expect(mockCallbacks.onSetRoomNotifState).toHaveBeenCalledWith(RoomNotifState.AllMessagesLoud); + }); + + it("should call onSetRoomNotifState with MentionsOnly when mentions and keywords selected", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const mentionsOption = screen.getByRole("menuitem", { name: "Mentions and keywords" }); + await user.click(mentionsOption); + + expect(mockCallbacks.onSetRoomNotifState).toHaveBeenCalledWith(RoomNotifState.MentionsOnly); + }); + + it("should call onSetRoomNotifState with Mute when mute selected", async () => { + const user = userEvent.setup(); + renderMenu(); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const muteOption = screen.getByRole("menuitem", { name: "Mute room" }); + await user.click(muteOption); + + expect(mockCallbacks.onSetRoomNotifState).toHaveBeenCalledWith(RoomNotifState.Mute); + }); + + it("should show check mark next to selected option - AllMessage", async () => { + const user = userEvent.setup(); + renderMenu(RoomNotifState.AllMessages); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const defaultOption = screen.getByRole("menuitem", { name: "Match default settings" }); + expect(defaultOption).toHaveAttribute("aria-selected", "true"); + }); + + it("should show check mark next to selected option - AllMessagesLoud", async () => { + const user = userEvent.setup(); + renderMenu(RoomNotifState.AllMessagesLoud); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const allMessagesOption = screen.getByRole("menuitem", { name: "All messages" }); + expect(allMessagesOption).toHaveAttribute("aria-selected", "true"); + }); + + it("should show check mark next to selected option - MentionsOnly", async () => { + const user = userEvent.setup(); + renderMenu(RoomNotifState.MentionsOnly); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const mentionsOption = screen.getByRole("menuitem", { name: "Mentions and keywords" }); + expect(mentionsOption).toHaveAttribute("aria-selected", "true"); + }); + + it("should show check mark next to selected option - Mute", async () => { + const user = userEvent.setup(); + renderMenu(RoomNotifState.Mute); + + const button = screen.getByRole("button", { name: "Notification options" }); + await user.click(button); + + const muteOption = screen.getByRole("menuitem", { name: "Mute room" }); + expect(muteOption).toHaveAttribute("aria-selected", "true"); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.tsx b/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.tsx new file mode 100644 index 0000000000..e4038fae6c --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomListItemNotificationMenu.tsx @@ -0,0 +1,105 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { useState, type JSX } from "react"; +import { IconButton, Menu, MenuItem } from "@vector-im/compound-web"; +import { + NotificationsSolidIcon, + NotificationsOffSolidIcon, + CheckIcon, +} from "@vector-im/compound-design-tokens/assets/web/icons"; + +import { _t } from "../../utils/i18n"; +import { RoomNotifState } from "./RoomNotifs"; +import { useViewModel, type ViewModel } from "../../viewmodel"; +import type { RoomListItemSnapshot, RoomListItemActions } from "./RoomListItem"; + +/** + * View model type for room list item + */ +export type RoomItemViewModel = ViewModel & RoomListItemActions; + +/** + * Props for RoomListItemNotificationMenu component + */ +export interface RoomListItemNotificationMenuProps { + /** The room item view model */ + vm: RoomItemViewModel; +} + +/** + * The notification settings menu for room list items. + * Displays options to change notification settings. + */ +export function RoomListItemNotificationMenu({ vm }: RoomListItemNotificationMenuProps): JSX.Element { + const snapshot = useViewModel(vm); + const [open, setOpen] = useState(false); + const isMuted = snapshot.roomNotifState === RoomNotifState.Mute; + const checkComponent = ; + + return ( + + {isMuted ? : } + + } + > + {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */} +
e.stopPropagation()} + > + vm.onSetRoomNotifState(RoomNotifState.AllMessages)} + onClick={(evt) => evt.stopPropagation()} + > + {snapshot.roomNotifState === RoomNotifState.AllMessages && checkComponent} + + vm.onSetRoomNotifState(RoomNotifState.AllMessagesLoud)} + onClick={(evt) => evt.stopPropagation()} + > + {snapshot.roomNotifState === RoomNotifState.AllMessagesLoud && checkComponent} + + vm.onSetRoomNotifState(RoomNotifState.MentionsOnly)} + onClick={(evt) => evt.stopPropagation()} + > + {snapshot.roomNotifState === RoomNotifState.MentionsOnly && checkComponent} + + vm.onSetRoomNotifState(RoomNotifState.Mute)} + onClick={(evt) => evt.stopPropagation()} + > + {snapshot.roomNotifState === RoomNotifState.Mute && checkComponent} + +
+
+ ); +} diff --git a/packages/shared-components/src/room-list/RoomListItem/RoomNotifs.ts b/packages/shared-components/src/room-list/RoomListItem/RoomNotifs.ts new file mode 100644 index 0000000000..06fc0fc23d --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/RoomNotifs.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +/** + * Notification state for a room. + */ +export enum RoomNotifState { + /** All messages (default) */ + AllMessages = "all_messages", + /** All messages with sound */ + AllMessagesLoud = "all_messages_loud", + /** Only mentions and keywords */ + MentionsOnly = "mentions_only", + /** Muted */ + Mute = "mute", +} diff --git a/packages/shared-components/src/room-list/RoomListItem/__snapshots__/RoomListItem.test.tsx.snap b/packages/shared-components/src/room-list/RoomListItem/__snapshots__/RoomListItem.test.tsx.snap new file mode 100644 index 0000000000..ff1ccad613 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/__snapshots__/RoomListItem.test.tsx.snap @@ -0,0 +1,1236 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Bold story 1`] = ` +
+
+
+ + +
+ + +
+
+
+`; + +exports[` > renders Default story 1`] = ` +
+
+
+ + +
+ + +
+
+
+`; + +exports[` > renders Invitation story 1`] = ` +
+
+
+ + +
+ +
+ +
+
+ +`; + +exports[` > renders NoMessagePreview story 1`] = ` +
+
+
+ + +
+ + +
+
+ +`; + +exports[` > renders Selected story 1`] = ` +
+
+
+ + +
+ + +
+
+ +`; + +exports[` > renders UnsentMessage story 1`] = ` +
+
+
+ + +
+ +
+ +
+ + +`; + +exports[` > renders WithHoverMenu story 1`] = ` +
+
+
+ + +
+ + +
+
+ +`; + +exports[` > renders WithMention story 1`] = ` +
+
+
+ + +
+ +
+ +
+ + +`; + +exports[` > renders WithNotification story 1`] = ` +
+
+
+ + +
+ +
+ +
+ + +`; diff --git a/packages/shared-components/src/room-list/RoomListItem/default-snapshot.ts b/packages/shared-components/src/room-list/RoomListItem/default-snapshot.ts new file mode 100644 index 0000000000..b5e263567f --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/default-snapshot.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type RoomListItemSnapshot } from "./RoomListItem"; +import { RoomNotifState } from "./RoomNotifs"; + +export const mockRoom = { name: "General" }; + +export const defaultSnapshot: RoomListItemSnapshot = { + id: "!room:server", + room: mockRoom, + name: "General", + isBold: false, + messagePreview: "Alice: Hey everyone!", + notification: { + hasAnyNotificationOrActivity: false, + isUnsentMessage: false, + invited: false, + isMention: false, + isActivityNotification: false, + isNotification: false, + hasUnreadCount: false, + count: 0, + muted: false, + }, + showMoreOptionsMenu: true, + showNotificationMenu: true, + isFavourite: false, + isLowPriority: false, + canInvite: true, + canCopyRoomLink: true, + canMarkAsRead: false, + canMarkAsUnread: true, + roomNotifState: RoomNotifState.AllMessages, +}; diff --git a/packages/shared-components/src/room-list/RoomListItem/index.ts b/packages/shared-components/src/room-list/RoomListItem/index.ts new file mode 100644 index 0000000000..edf17066b8 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListItem/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { RoomListItemView } from "./RoomListItem"; +export type { + Room, + RoomListItemSnapshot, + RoomItemViewModel, + RoomListItemActions, + RoomListItemViewProps, +} from "./RoomListItem"; +export { RoomListItemNotificationMenu } from "./RoomListItemNotificationMenu"; +export type { RoomListItemNotificationMenuProps } from "./RoomListItemNotificationMenu"; +export { RoomListItemMoreOptionsMenu, MoreOptionContent } from "./RoomListItemMoreOptionsMenu"; +export type { RoomListItemMoreOptionsMenuProps } from "./RoomListItemMoreOptionsMenu"; +export { RoomListItemHoverMenu } from "./RoomListItemHoverMenu"; +export type { RoomListItemHoverMenuProps } from "./RoomListItemHoverMenu"; +export { RoomListItemContextMenu } from "./RoomListItemContextMenu"; +export type { RoomListItemContextMenuProps } from "./RoomListItemContextMenu"; +export { NotificationDecoration } from "./NotificationDecoration"; +export type { NotificationDecorationProps, NotificationDecorationData } from "./NotificationDecoration"; +export { RoomNotifState } from "./RoomNotifs"; diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css new file mode 100644 index 0000000000..29db6d1bd6 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.roomListPrimaryFilters { + padding: var(--cpd-space-2x) var(--cpd-space-4x) var(--cpd-space-2x) var(--cpd-space-3x); +} + +/* Hide filters that are wrapping when collapsed */ +.roomListPrimaryFilters :global(.wrapping) { + display: none; +} + +.list { + /** + * The InteractionObserver needs the height to be set to work properly. + */ + height: 100%; + flex: 1; +} + +/* IconButton styles for chevron */ +.iconButton svg { + transition: transform 0.1s linear; +} + +.iconButton[aria-expanded="true"] svg { + transform: rotate(180deg); +} diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx new file mode 100644 index 0000000000..a1a80334b9 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx @@ -0,0 +1,91 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { RoomListPrimaryFilters } from "./RoomListPrimaryFilters"; +import type { FilterId } from "./useVisibleFilters"; + +const meta: Meta = { + title: "Room List/RoomListPrimaryFilters", + component: RoomListPrimaryFilters, + tags: ["autodocs"], + args: { + onToggleFilter: fn(), + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel-2025?node-id=98-1979&t=vafb4zoYMNLRuAbh-4", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +// All available filter IDs +const allFilterIds: FilterId[] = ["unread", "people", "rooms", "favourite", "mentions", "invites", "low_priority"]; + +// Subset of filters for narrow container tests +const fewFilterIds: FilterId[] = ["people", "rooms", "unread"]; + +export const Default: Story = { + args: { + filterIds: allFilterIds, + }, +}; + +export const PeopleSelected: Story = { + args: { + filterIds: allFilterIds, + activeFilterId: "people", + }, +}; + +export const NoFilters: Story = { + args: { + filterIds: [], + }, +}; + +/** + * Narrow container that causes filters to wrap. + * The chevron button should appear to expand/collapse the filter list. + */ +export const NarrowContainer: Story = { + args: { + filterIds: fewFilterIds, + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; + +/** + * Narrow container with active filter that would wrap. + * When collapsed, the active filter should move to the front. + */ +export const NarrowWithActiveWrappingFilter: Story = { + args: { + filterIds: fewFilterIds, + activeFilterId: "unread", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.test.tsx b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.test.tsx new file mode 100644 index 0000000000..a86181da15 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { act } from "react"; +import { render, screen } from "@test-utils"; +import userEvent from "@testing-library/user-event"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect, vi, beforeEach } from "vitest"; + +import * as stories from "./RoomListPrimaryFilters.stories"; + +const { Default, PeopleSelected, NoFilters, NarrowContainer, NarrowWithActiveWrappingFilter } = composeStories(stories); + +describe(" stories", () => { + describe("snapshots", () => { + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders PeopleSelected story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders NoFilters story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders NarrowContainer story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders NarrowWithActiveWrappingFilter story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + }); + + describe("behavior", () => { + it("should call onToggleFilter when a filter is clicked", async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole("option", { name: "People" })); + + expect(Default.args.onToggleFilter).toHaveBeenCalled(); + }); + }); + + describe("resize behavior", () => { + let resizeCallback: ResizeObserverCallback; + + beforeEach(() => { + globalThis.ResizeObserver = class MockResizeObserver { + public constructor(callback: ResizeObserverCallback) { + resizeCallback = callback; + } + public observe = vi.fn(); + public unobserve = vi.fn(); + public disconnect = vi.fn(); + } as unknown as typeof ResizeObserver; + }); + + function mockFiltersNotWrapping(): void { + vi.spyOn(screen.getByText("People"), "offsetLeft", "get").mockReturnValue(0); + vi.spyOn(screen.getByText("Rooms"), "offsetLeft", "get").mockReturnValue(30); + vi.spyOn(screen.getByText("Unreads"), "offsetLeft", "get").mockReturnValue(60); + + const listbox = screen.getByRole("listbox", { name: "Room list filters" }); + act(() => resizeCallback([{ target: listbox } as any], {} as ResizeObserver)); + } + + function mockUnreadWrapping(): void { + vi.spyOn(screen.getByText("People"), "offsetLeft", "get").mockReturnValue(0); + vi.spyOn(screen.getByText("Rooms"), "offsetLeft", "get").mockReturnValue(30); + vi.spyOn(screen.getByText("Unreads"), "offsetLeft", "get").mockReturnValue(0); + + const listbox = screen.getByRole("listbox", { name: "Room list filters" }); + act(() => resizeCallback([{ target: listbox } as any], {} as ResizeObserver)); + } + + it("should hide wrapping filters and show chevron", () => { + render(); + mockUnreadWrapping(); + + expect(screen.queryByRole("option", { name: "Unreads" })).toBeNull(); + expect(screen.getByRole("button", { name: "Expand filter list" })).toBeInTheDocument(); + }); + + it("should expand and collapse filter list with chevron button", async () => { + const user = userEvent.setup(); + render(); + mockUnreadWrapping(); + + expect(screen.queryByRole("option", { name: "Unreads" })).toBeNull(); + + await user.click(screen.getByRole("button", { name: "Expand filter list" })); + expect(screen.getByRole("option", { name: "Unreads" })).toBeVisible(); + + await user.click(screen.getByRole("button", { name: "Collapse filter list" })); + expect(screen.queryByRole("option", { name: "Unreads" })).toBeNull(); + }); + + it("should move active filter to front when collapsed and wrapping", () => { + render(); + mockUnreadWrapping(); + + const listbox = screen.getByRole("listbox", { name: "Room list filters" }); + expect(listbox.children[0]).toBe(screen.getByRole("option", { name: "Unreads" })); + }); + + it("should restore original filter order when expanded", async () => { + const user = userEvent.setup(); + render(); + mockUnreadWrapping(); + + await user.click(screen.getByRole("button", { name: "Expand filter list" })); + + const listbox = screen.getByRole("listbox", { name: "Room list filters" }); + expect(listbox.children[0]).toBe(screen.getByRole("option", { name: "People" })); + }); + + it("should handle resize from non-wrapping to wrapping", () => { + render(); + mockFiltersNotWrapping(); + + expect(screen.queryByRole("button", { name: "Expand filter list" })).toBeNull(); + + mockUnreadWrapping(); + expect(screen.getByRole("button", { name: "Expand filter list" })).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.tsx b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.tsx new file mode 100644 index 0000000000..561544a3a5 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.tsx @@ -0,0 +1,116 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, useId, useState } from "react"; +import { ChatFilter, IconButton } from "@vector-im/compound-web"; +import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down"; + +import { Flex } from "../../utils/Flex"; +import { _t } from "../../utils/i18n"; +import { useCollapseFilters } from "./useCollapseFilters"; +import { useVisibleFilters, type FilterId } from "./useVisibleFilters"; +import styles from "./RoomListPrimaryFilters.module.css"; + +/** + * Maps filter IDs to translated labels + */ +const filterIdToLabel = (filterId: FilterId): string => { + switch (filterId) { + case "unread": + return _t("room_list|filters|unread"); + case "people": + return _t("room_list|filters|people"); + case "rooms": + return _t("room_list|filters|rooms"); + case "favourite": + return _t("room_list|filters|favourite"); + case "mentions": + return _t("room_list|filters|mentions"); + case "invites": + return _t("room_list|filters|invites"); + case "low_priority": + return _t("room_list|filters|low_priority"); + } +}; + +/** + * Props for RoomListPrimaryFilters component + */ +export interface RoomListPrimaryFiltersProps { + /** Array of filter IDs to display */ + filterIds: FilterId[]; + /** Currently active filter ID (if any) */ + activeFilterId?: FilterId; + /** Callback when a filter is toggled */ + onToggleFilter: (filterId: FilterId) => void; +} + +/** + * The primary filters component for the room list. + * Displays a collapsible list of filters with expand/collapse functionality. + */ +export const RoomListPrimaryFilters: React.FC = ({ + filterIds, + activeFilterId, + onToggleFilter, +}): JSX.Element | null => { + const id = useId(); + const [isExpanded, setIsExpanded] = useState(false); + + const { + ref, + isWrapping: displayChevron, + wrappingIndex, + } = useCollapseFilters(isExpanded, "wrapping"); + const visibleFilterIds = useVisibleFilters(filterIds, activeFilterId, wrappingIndex); + + return ( + + {displayChevron && ( + setIsExpanded((expanded) => !expanded)} + > + + + )} + + {visibleFilterIds.map((filterId, index) => ( + onToggleFilter(filterId)} + > + {filterIdToLabel(filterId)} + + ))} + + + ); +}; diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/__snapshots__/RoomListPrimaryFilters.test.tsx.snap b/packages/shared-components/src/room-list/RoomListPrimaryFilters/__snapshots__/RoomListPrimaryFilters.test.tsx.snap new file mode 100644 index 0000000000..74c281bde5 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/__snapshots__/RoomListPrimaryFilters.test.tsx.snap @@ -0,0 +1,388 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` stories > snapshots > renders Default story 1`] = ` +
+
+ +
+ + + + + + + +
+
+
+`; + +exports[` stories > snapshots > renders NarrowContainer story 1`] = ` +
+
+
+ +
+ + + +
+
+
+
+`; + +exports[` stories > snapshots > renders NarrowWithActiveWrappingFilter story 1`] = ` +
+
+
+ +
+ + + +
+
+
+
+`; + +exports[` stories > snapshots > renders NoFilters story 1`] = ` +
+
+
+
+
+`; + +exports[` stories > snapshots > renders PeopleSelected story 1`] = ` +
+
+ +
+ + + + + + + +
+
+
+`; diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/index.tsx b/packages/shared-components/src/room-list/RoomListPrimaryFilters/index.tsx new file mode 100644 index 0000000000..7697d4829c --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/index.tsx @@ -0,0 +1,12 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { RoomListPrimaryFilters } from "./RoomListPrimaryFilters"; +export type { RoomListPrimaryFiltersProps } from "./RoomListPrimaryFilters"; +export { useCollapseFilters } from "./useCollapseFilters"; +export { useVisibleFilters } from "./useVisibleFilters"; +export type { FilterId } from "./useVisibleFilters"; diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/useCollapseFilters.ts b/packages/shared-components/src/room-list/RoomListPrimaryFilters/useCollapseFilters.ts new file mode 100644 index 0000000000..e3fbf74e54 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/useCollapseFilters.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { useEffect, useRef, useState, type RefObject } from "react"; + +/** + * A hook to manage the wrapping of filters in the room list. + * It observes the filter list and hides filters that are wrapping when the list is not expanded. + * @param isExpanded + * @param wrappingClassName - the CSS class to apply to wrapping filters + * @returns an object containing: + * - `ref`: a ref to put on the filter list element + * - `isWrapping`: a boolean indicating if the filters are wrapping + * - `wrappingIndex`: the index of the first filter that is wrapping + */ +export function useCollapseFilters( + isExpanded: boolean, + wrappingClassName: string, +): { + ref: RefObject; + isWrapping: boolean; + wrappingIndex: number; +} { + const ref = useRef(null); + const [isWrapping, setIsWrapping] = useState(false); + const [wrappingIndex, setWrappingIndex] = useState(-1); + + useEffect(() => { + if (!ref.current) return; + + const hideFilters = (list: Element): void => { + let isWrapping = false; + Array.from(list.children).forEach((node, i): void => { + const child = node as HTMLElement; + child.setAttribute("aria-hidden", "false"); + child.classList.remove(wrappingClassName); + + // If the filter list is expanded, all filters are visible + if (isExpanded) return; + + // If the previous element is on the left element of the current one, it means that the filter is wrapping + const previousSibling = child.previousElementSibling as HTMLElement | null; + if (previousSibling && child.offsetLeft <= previousSibling.offsetLeft) { + if (!isWrapping) setWrappingIndex(i); + isWrapping = true; + } + + // If the filter is wrapping, we hide it + child.classList.toggle(wrappingClassName, isWrapping); + child.setAttribute("aria-hidden", isWrapping.toString()); + }); + + if (!isWrapping) setWrappingIndex(-1); + setIsWrapping(isExpanded || isWrapping); + }; + + hideFilters(ref.current); + const observer = new ResizeObserver((entries) => entries.forEach((entry) => hideFilters(entry.target))); + + observer.observe(ref.current); + return () => { + observer.disconnect(); + }; + }, [isExpanded, wrappingClassName]); + + return { ref, isWrapping, wrappingIndex }; +} diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/useVisibleFilters.ts b/packages/shared-components/src/room-list/RoomListPrimaryFilters/useVisibleFilters.ts new file mode 100644 index 0000000000..73a580b4d9 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/useVisibleFilters.ts @@ -0,0 +1,55 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { useEffect, useState } from "react"; + +/** + * Standard filter identifiers that can be used across implementations. + * These are stable keys - the view layer maps them to translated labels. + */ +export type FilterId = "unread" | "people" | "rooms" | "favourite" | "mentions" | "invites" | "low_priority"; + +/** + * A hook to sort the filter IDs by active state. + * The list is sorted if the active filter index is greater than or equal to the wrapping index. + * If the wrapping index is -1, the filters are not sorted. + * + * @param filterIds - the list of filter IDs to sort. + * @param activeFilterId - the currently active filter ID (if any). + * @param wrappingIndex - the index of the first filter that is wrapping. + */ +export function useVisibleFilters( + filterIds: FilterId[], + activeFilterId: FilterId | undefined, + wrappingIndex: number, +): FilterId[] { + // By default, the filters are not sorted + const [sortedFilterIds, setSortedFilterIds] = useState(filterIds); + + useEffect(() => { + const activeIndex = activeFilterId ? filterIds.indexOf(activeFilterId) : -1; + const isActiveFilterWrapping = activeIndex >= wrappingIndex; + // If the active filter is not wrapping, we don't need to sort the filters + if (!isActiveFilterWrapping || wrappingIndex === -1) { + setSortedFilterIds(filterIds); + return; + } + + // Sort the filters with the active filter at first position + setSortedFilterIds( + filterIds.slice().sort((filterA, filterB) => { + // If the filter is active, it should be at the top of the list + if (filterA === activeFilterId && filterB !== activeFilterId) return -1; + if (filterA !== activeFilterId && filterB === activeFilterId) return 1; + // If both filters are active or not, keep their original order + return 0; + }), + ); + }, [filterIds, activeFilterId, wrappingIndex]); + + return sortedFilterIds; +} diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.module.css b/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.module.css new file mode 100644 index 0000000000..204e7615a4 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.module.css @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.genericPlaceholder { + align-self: center; + /** It should take 2/3 of the width **/ + width: 66%; + /** It should be positioned at 1/3 of the height **/ + padding-top: 33%; +} + +.title { + font: var(--cpd-font-body-lg-semibold); + text-align: center; +} + +.description { + font: var(--cpd-font-body-sm-regular); + color: var(--cpd-color-text-secondary); + text-align: center; +} + +.defaultPlaceholder { + margin-top: var(--cpd-space-4x); +} + +.genericPlaceholder button { + width: 100%; +} diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.tsx new file mode 100644 index 0000000000..12d26517b3 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListEmptyStateView.tsx @@ -0,0 +1,182 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, type PropsWithChildren, type ReactNode } from "react"; +import { Button } from "@vector-im/compound-web"; +import ChatIcon from "@vector-im/compound-design-tokens/assets/web/icons/chat"; +import RoomIcon from "@vector-im/compound-design-tokens/assets/web/icons/room"; + +import { Flex } from "../../utils/Flex"; +import { _t } from "../../utils/i18n"; +import { useViewModel } from "../../viewmodel"; +import type { RoomListViewModel } from "./RoomListView"; +import styles from "./RoomListEmptyStateView.module.css"; + +/** + * Props for RoomListEmptyStateView component + */ +export interface RoomListEmptyStateViewProps { + /** The view model containing all data and callbacks */ + vm: RoomListViewModel; +} + +/** + * Empty state component for the room list. + * Displays appropriate message and actions based on the active filter. + */ +export const RoomListEmptyStateView: React.FC = ({ vm }): JSX.Element => { + const snapshot = useViewModel(vm); + + // If there is no active filter, show the default empty state + if (!snapshot.activeFilterId) { + return ( + + + + {snapshot.canCreateRoom && ( + + )} + + + ); + } + + // Handle different filter cases based on filter ID + switch (snapshot.activeFilterId) { + case "favourite": + return ( + + ); + case "people": + return ( + + ); + case "rooms": + return ( + + ); + case "unread": + return ( + vm.onToggleFilter(snapshot.activeFilterId!)} + /> + ); + case "invites": + return ( + vm.onToggleFilter(snapshot.activeFilterId!)} + /> + ); + case "mentions": + return ( + vm.onToggleFilter(snapshot.activeFilterId!)} + /> + ); + case "low_priority": + return ( + vm.onToggleFilter(snapshot.activeFilterId!)} + /> + ); + default: + return ( + + ); + } +}; + +interface GenericPlaceholderProps { + /** The title of the placeholder */ + title: string; + /** The description of the placeholder */ + description?: string; + /** Optional children (e.g., action buttons) */ + children?: ReactNode; +} + +/** + * A generic placeholder for the room list + */ +function GenericPlaceholder({ title, description, children }: PropsWithChildren): JSX.Element { + return ( + + {title} + {description && {description}} + {children} + + ); +} + +interface ActionPlaceholderProps { + /** The title to display */ + title: string; + /** The action button text */ + action: string; + /** Callback when the action button is clicked */ + onAction?: () => void; +} + +/** + * A placeholder for the room list when a filter is active + * The user can take action to toggle the filter + */ +function ActionPlaceholder({ title, action, onAction }: ActionPlaceholderProps): JSX.Element { + return ( + + {onAction && ( + + )} + + ); +} diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.module.css b/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.module.css new file mode 100644 index 0000000000..2f65f7969d --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.module.css @@ -0,0 +1,24 @@ +/* + * Copyright 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.skeleton { + position: relative; + margin-left: 4px; + height: 100%; + flex: 1; +} + +.skeleton::before { + background-color: var(--cpd-color-bg-subtle-secondary); + width: 100%; + height: 100%; + content: ""; + position: absolute; + mask-repeat: repeat-y; + mask-size: auto 96px; + mask-image: url("./assets/skeleton.svg"); +} diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.tsx new file mode 100644 index 0000000000..6ab8b80de3 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListLoadingSkeleton.tsx @@ -0,0 +1,18 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; + +import styles from "./RoomListLoadingSkeleton.module.css"; + +/** + * Loading skeleton component for the room list. + * Displays a repeating skeleton pattern while rooms are being fetched. + */ +export const RoomListLoadingSkeleton: React.FC = (): JSX.Element => { + return
; +}; diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx new file mode 100644 index 0000000000..206307262e --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx @@ -0,0 +1,221 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import type { Room } from "../RoomListItem/RoomListItem"; +import type { FilterId } from "../RoomListPrimaryFilters"; +import { RoomListView, type RoomListSnapshot, type RoomListViewActions } from "./RoomListView"; +import { useMockedViewModel } from "../../viewmodel"; +import { + renderAvatar, + createGetRoomItemViewModel, + mockRoomIds, + smallListRoomIds, + largeListRoomIds, +} from "../story-mocks"; + +type RoomListViewProps = RoomListSnapshot & RoomListViewActions & { renderAvatar: (room: Room) => React.ReactElement }; + +const mockFilterIds: FilterId[] = ["unread", "people", "rooms", "favourite"]; + +// Wrapper component that creates a mocked ViewModel +const RoomListViewWrapper = ({ + onToggleFilter, + createChatRoom, + createRoom, + getRoomItemViewModel, + updateVisibleRooms, + renderAvatar: renderAvatarProp, + ...rest +}: RoomListViewProps): JSX.Element => { + const vm = useMockedViewModel(rest, { + onToggleFilter, + createChatRoom, + createRoom, + getRoomItemViewModel, + updateVisibleRooms, + }); + return ; +}; + +const meta = { + title: "Room List/RoomListView", + component: RoomListViewWrapper, + tags: ["autodocs"], + decorators: [ + (Story) => ( +
+ +
+ ), + ], + args: { + // Snapshot properties (state) + isLoadingRooms: false, + isRoomListEmpty: false, + filterIds: mockFilterIds, + activeFilterId: undefined, + roomListState: { + activeRoomIndex: undefined, + spaceId: "!space:server", + filterKeys: undefined, + }, + roomIds: mockRoomIds, + canCreateRoom: true, + // Action properties (callbacks) + onToggleFilter: fn(), + createChatRoom: fn(), + createRoom: fn(), + getRoomItemViewModel: createGetRoomItemViewModel(mockRoomIds), + updateVisibleRooms: fn(), + renderAvatar, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=2925-19126", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Loading: Story = { + args: { + isLoadingRooms: true, + }, +}; + +export const Empty: Story = { + args: { + isRoomListEmpty: true, + }, +}; + +export const EmptyWithoutCreatePermission: Story = { + args: { + isRoomListEmpty: true, + canCreateRoom: false, + }, +}; + +export const WithActiveFilter: Story = { + args: { + filterIds: ["unread", "people", "rooms", "favourite"], + activeFilterId: "favourite", + roomListState: { + activeRoomIndex: undefined, + spaceId: "!space:server", + filterKeys: ["favourites"], + }, + }, +}; + +export const WithSelection: Story = { + args: { + roomListState: { + activeRoomIndex: 0, + spaceId: "!space:server", + filterKeys: undefined, + }, + }, +}; + +export const EmptyFavouriteFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["favourite", "people"], + activeFilterId: "favourite", + }, +}; + +export const EmptyPeopleFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["people", "rooms"], + activeFilterId: "people", + }, +}; + +export const EmptyRoomsFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["rooms", "people"], + activeFilterId: "rooms", + }, +}; + +export const EmptyUnreadFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["unread", "people"], + activeFilterId: "unread", + }, +}; + +export const EmptyInvitesFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["invites", "people"], + activeFilterId: "invites", + }, +}; + +export const EmptyMentionsFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["mentions", "people"], + activeFilterId: "mentions", + }, +}; + +export const EmptyLowPriorityFilter: Story = { + args: { + isRoomListEmpty: true, + roomIds: [], + filterIds: ["low_priority", "people"], + activeFilterId: "low_priority", + }, +}; + +export const SmallList: Story = { + args: { + roomIds: smallListRoomIds, + getRoomItemViewModel: createGetRoomItemViewModel(smallListRoomIds), + }, +}; + +export const LargeList: Story = { + args: { + roomIds: largeListRoomIds, + getRoomItemViewModel: createGetRoomItemViewModel(largeListRoomIds), + }, +}; diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx new file mode 100644 index 0000000000..15237eed7e --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx @@ -0,0 +1,177 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen } from "@test-utils"; +import userEvent from "@testing-library/user-event"; +import { VirtuosoMockContext } from "react-virtuoso"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect } from "vitest"; + +import * as stories from "./RoomListView.stories"; + +const { + Default, + Loading, + Empty, + EmptyWithoutCreatePermission, + WithActiveFilter, + SmallList, + LargeList, + EmptyFavouriteFilter, + EmptyPeopleFilter, + EmptyRoomsFilter, + EmptyUnreadFilter, + EmptyInvitesFilter, + EmptyMentionsFilter, + EmptyLowPriorityFilter, +} = composeStories(stories); + +const renderWithMockContext = (component: React.ReactElement): ReturnType => { + return render(component, { + wrapper: ({ children }) => ( + + {children} + + ), + }); +}; + +describe("", () => { + it("renders Default story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders Loading story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders Empty story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyWithoutCreatePermission story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders WithActiveFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders SmallList story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders LargeList story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyFavouriteFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyPeopleFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyRoomsFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyUnreadFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyInvitesFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyMentionsFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("renders EmptyLowPriorityFilter story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("should call onToggleFilter when filter is clicked", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("option", { name: "People" })); + + expect(Default.args.onToggleFilter).toHaveBeenCalled(); + }); + + it("should call createRoom when New room button is clicked", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "New room" })); + + expect(Empty.args.createRoom).toHaveBeenCalled(); + }); + + it("should call createChatRoom when Start chat button is clicked", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "Start chat" })); + + expect(Empty.args.createChatRoom).toHaveBeenCalled(); + }); + + it("should call onToggleFilter when Show all chats is clicked in unread empty state", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "Show all chats" })); + + expect(EmptyUnreadFilter.args.onToggleFilter).toHaveBeenCalled(); + }); + + it("should call onToggleFilter when See all activity is clicked in invites empty state", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "See all activity" })); + + expect(EmptyInvitesFilter.args.onToggleFilter).toHaveBeenCalled(); + }); + + it("should call onToggleFilter when See all activity is clicked in mentions empty state", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "See all activity" })); + + expect(EmptyMentionsFilter.args.onToggleFilter).toHaveBeenCalled(); + }); + + it("should call onToggleFilter when See all activity is clicked in low priority empty state", async () => { + const user = userEvent.setup(); + renderWithMockContext(); + + await user.click(screen.getByRole("button", { name: "See all activity" })); + + expect(EmptyLowPriorityFilter.args.onToggleFilter).toHaveBeenCalled(); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx new file mode 100644 index 0000000000..491c28d7d1 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx @@ -0,0 +1,101 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, type ReactNode } from "react"; + +import { useViewModel, type ViewModel } from "../../viewmodel"; +import { RoomListPrimaryFilters, type FilterId } from "../RoomListPrimaryFilters"; +import { RoomListLoadingSkeleton } from "./RoomListLoadingSkeleton"; +import { RoomListEmptyStateView } from "./RoomListEmptyStateView"; +import { VirtualizedRoomListView, type RoomListViewState } from "../VirtualizedRoomListView"; +import { type Room } from "../RoomListItem"; + +/** + * Snapshot for the room list view + */ +export type RoomListSnapshot = { + /** Whether the rooms are currently loading */ + isLoadingRooms: boolean; + /** Whether the room list is empty */ + isRoomListEmpty: boolean; + /** Array of filter IDs */ + filterIds: FilterId[]; + /** Currently active filter ID (if any) */ + activeFilterId?: FilterId; + /** Room list state */ + roomListState: RoomListViewState; + /** Array of room IDs for virtualization */ + roomIds: string[]; + /** Optional description for the empty state */ + emptyStateDescription?: string; + /** Optional action element for the empty state */ + emptyStateAction?: ReactNode; + /** Whether the user can create rooms */ + canCreateRoom?: boolean; +}; + +/** + * Actions interface for room list operations + */ +export interface RoomListViewActions { + /** Called when a filter is toggled */ + onToggleFilter: (filterId: FilterId) => void; + /** Called to create a new chat room */ + createChatRoom: () => void; + /** Called to create a new room */ + createRoom: () => void; + /** Get view model for a specific room (virtualization API) */ + getRoomItemViewModel: (roomId: string) => any; + /** Called when the visible range changes (virtualization API) */ + updateVisibleRooms: (startIndex: number, endIndex: number) => void; +} + +/** + * The view model type for the room list view + */ +export type RoomListViewModel = ViewModel & RoomListViewActions; + +/** + * Props for RoomListView component + */ +export interface RoomListViewProps { + /** The view model containing all data and callbacks */ + vm: RoomListViewModel; + /** Render function for room avatar */ + renderAvatar: (room: Room) => ReactNode; + /** Optional callback for keyboard events on the room list */ + onKeyDown?: (e: React.KeyboardEvent) => void; +} + +/** + * Room list view component that manages filters, loading states, empty states, and the room list. + */ +export const RoomListView: React.FC = ({ vm, renderAvatar, onKeyDown }): JSX.Element => { + const snapshot = useViewModel(vm); + let listBody: ReactNode; + + if (snapshot.isLoadingRooms) { + listBody = ; + } else if (snapshot.isRoomListEmpty) { + listBody = ; + } else { + listBody = ; + } + + return ( + <> +
+ +
+ {listBody} + + ); +}; diff --git a/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap b/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap new file mode 100644 index 0000000000..c518632039 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap @@ -0,0 +1,11387 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Default story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ +
+ +
+
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + + + + +`; + +exports[` > renders Empty story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+ + No chats yet + + + Get started by messaging someone or by creating a room + +
+ + +
+
+
+
+`; + +exports[` > renders EmptyFavouriteFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You don't have favourite chats yet + + + You can add a chat to your favourites in the chat settings + +
+
+
+`; + +exports[` > renders EmptyInvitesFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You don't have any unread invites + + +
+
+
+`; + +exports[` > renders EmptyLowPriorityFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You don't have any low priority rooms + + +
+
+
+`; + +exports[` > renders EmptyMentionsFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You don't have any unread mentions + + +
+
+
+`; + +exports[` > renders EmptyPeopleFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You don’t have direct chats with anyone yet + + + You can deselect filters in order to see your other chats + +
+
+
+`; + +exports[` > renders EmptyRoomsFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + You’re not in any room yet + + + You can deselect filters in order to see your other chats + +
+
+
+`; + +exports[` > renders EmptyUnreadFilter story 1`] = ` +
+
+
+
+
+ + +
+
+
+
+ + Congrats! You don’t have any unread messages + + +
+
+
+`; + +exports[` > renders EmptyWithoutCreatePermission story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+ + No chats yet + + + Get started by messaging someone + +
+ +
+
+
+
+`; + +exports[` > renders LargeList story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + + + + + + +`; + +exports[` > renders Loading story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+
+
+`; + +exports[` > renders SmallList story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + + + +`; + +exports[` > renders WithActiveFilter story 1`] = ` +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + + + + +`; diff --git a/packages/shared-components/src/room-list/RoomListView/assets/skeleton.svg b/packages/shared-components/src/room-list/RoomListView/assets/skeleton.svg new file mode 100644 index 0000000000..adf56e4ed8 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/assets/skeleton.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/shared-components/src/room-list/RoomListView/index.tsx b/packages/shared-components/src/room-list/RoomListView/index.tsx new file mode 100644 index 0000000000..405b94bf2f --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListView/index.tsx @@ -0,0 +1,12 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { RoomListView } from "./RoomListView"; +export type { RoomListViewProps, RoomListViewModel, RoomListSnapshot, RoomListViewActions } from "./RoomListView"; +export { RoomListLoadingSkeleton } from "./RoomListLoadingSkeleton"; +export { RoomListEmptyStateView } from "./RoomListEmptyStateView"; +export type { RoomListEmptyStateViewProps } from "./RoomListEmptyStateView"; diff --git a/res/css/views/rooms/RoomListPanel/_RoomList.pcss b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.module.css similarity index 63% rename from res/css/views/rooms/RoomListPanel/_RoomList.pcss rename to packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.module.css index 54798f1ea9..c444c8c1cd 100644 --- a/res/css/views/rooms/RoomListPanel/_RoomList.pcss +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.module.css @@ -1,10 +1,14 @@ /* - * Copyright 2025 New Vector Ltd. + * Copyright 2025 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -.mx_RoomList { +/** + * Room list container styles + */ +.roomList { height: 100%; + width: 100%; } diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx new file mode 100644 index 0000000000..3ea908cb55 --- /dev/null +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx @@ -0,0 +1,94 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import type { Room } from "../RoomListItem/RoomListItem"; +import { VirtualizedRoomListView, type RoomListViewState } from "./VirtualizedRoomListView"; +import type { RoomListSnapshot, RoomListViewActions } from "../RoomListView"; +import { useMockedViewModel } from "../../viewmodel"; +import type { FilterId } from "../RoomListPrimaryFilters"; +import { renderAvatar, createGetRoomItemViewModel, mockRoomIds } from "../story-mocks"; + +type RoomListStoryProps = RoomListSnapshot & RoomListViewActions & { renderAvatar: (room: Room) => React.ReactElement }; + +// Use first 10 room IDs for this story +const storyRoomIds = mockRoomIds.slice(0, 10); + +// Wrapper component that creates a mocked ViewModel +const RoomListWrapper = ({ + onToggleFilter, + createChatRoom, + createRoom, + getRoomItemViewModel, + updateVisibleRooms, + renderAvatar: renderAvatarProp, + ...rest +}: RoomListStoryProps): JSX.Element => { + const vm = useMockedViewModel(rest, { + onToggleFilter, + createChatRoom, + createRoom, + getRoomItemViewModel, + updateVisibleRooms, + }); + + return ( +
+ +
+ ); +}; + +const mockFilterIds: FilterId[] = ["unread", "people"]; + +const defaultRoomListState: RoomListViewState = { + activeRoomIndex: 0, + spaceId: "!space:server", + filterKeys: undefined, +}; + +const meta: Meta = { + title: "Room List/VirtualizedRoomListView", + component: RoomListWrapper, + tags: ["autodocs"], + args: { + isLoadingRooms: false, + isRoomListEmpty: false, + filterIds: mockFilterIds, + activeFilterId: undefined, + roomIds: storyRoomIds, + roomListState: defaultRoomListState, + canCreateRoom: true, + onToggleFilter: fn(), + createChatRoom: fn(), + createRoom: fn(), + getRoomItemViewModel: createGetRoomItemViewModel(storyRoomIds), + updateVisibleRooms: fn(), + renderAvatar, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel-2025?node-id=98-1979&t=vafb4zoYMNLRuAbh-4", + }, + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx new file mode 100644 index 0000000000..23f384554d --- /dev/null +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx @@ -0,0 +1,67 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen, fireEvent } from "@test-utils"; +import { VirtuosoMockContext } from "react-virtuoso"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect } from "vitest"; + +import * as stories from "./VirtualizedRoomListView.stories"; + +const { Default } = composeStories(stories); + +const renderWithMockContext = (component: React.ReactElement): ReturnType => { + return render(component, { + wrapper: ({ children }) => ( + + {children} + + ), + }); +}; + +describe("", () => { + it("renders Default story", () => { + const { container } = renderWithMockContext(); + expect(container).toMatchSnapshot(); + }); + + it("should render the room list listbox", () => { + renderWithMockContext(); + expect(screen.getByRole("listbox", { name: "Room list" })).toBeInTheDocument(); + }); + + it("should render room items", () => { + renderWithMockContext(); + const items = screen.getAllByRole("option"); + expect(items.length).toBeGreaterThan(0); + }); + + it("should mark selected room with aria-selected true", () => { + renderWithMockContext(); + const items = screen.getAllByRole("option"); + // The first item (index 0) should be selected based on Default story (activeRoomIndex: 0) + expect(items[0]).toHaveAttribute("aria-selected", "true"); + }); + + it("should handle focus state correctly", () => { + renderWithMockContext(); + + const listbox = screen.getByRole("listbox", { name: "Room list" }); + fireEvent.focus(listbox); + + const items = screen.getAllByRole("option"); + // First item should have tabIndex 0 (focusable) when list is focused + expect(items[0]).toHaveAttribute("tabIndex", "0"); + }); + + it("should call updateVisibleRooms on render", () => { + renderWithMockContext(); + expect(Default.args.updateVisibleRooms).toHaveBeenCalled(); + }); +}); diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx new file mode 100644 index 0000000000..7b27df0f28 --- /dev/null +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx @@ -0,0 +1,198 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { useCallback, useMemo, useRef, type JSX, type ReactNode } from "react"; +import { type ScrollIntoViewLocation } from "react-virtuoso"; +import { isEqual } from "lodash"; + +import type { Room } from "../RoomListItem/RoomListItem"; +import { useViewModel } from "../../viewmodel"; +import { _t } from "../../utils/i18n"; +import { VirtualizedList, type VirtualizedListContext } from "../../utils/VirtualizedList"; +import { RoomListItemView } from "../RoomListItem"; +import type { RoomListViewModel } from "../RoomListView"; + +/** + * Filter key type - opaque string type for filter identifiers + */ +export type FilterKey = string; + +/** + * State for the room list data (nested within RoomListSnapshot) + */ +export interface RoomListViewState { + /** Optional active room index for keyboard navigation */ + activeRoomIndex?: number; + /** Space ID for context tracking */ + spaceId?: string; + /** Active filter keys for context tracking */ + filterKeys?: FilterKey[]; +} + +/** + * Props for the VirtualizedRoomListView component + */ +export interface VirtualizedRoomListViewProps { + /** + * The view model containing all room list data and callbacks + */ + vm: RoomListViewModel; + + /** + * Render function for room avatar + * @param room - The opaque Room object from the client + */ + renderAvatar: (room: Room) => ReactNode; + + /** + * Optional callback for keyboard key down events + */ + onKeyDown?: (e: React.KeyboardEvent) => void; +} + +/** Height of a single room list item in pixels */ +const ROOM_LIST_ITEM_HEIGHT = 48; + +/** + * Type for context used in ListView + */ +type Context = { spaceId: string; filterKeys: FilterKey[] | undefined }; + +/** + * Amount to extend the top and bottom of the viewport by. + * From manual testing and user feedback 25 items is reported to be enough to avoid blank space + * when using the mouse wheel, and the trackpad scrolling at a slow to moderate speed where you + * can still see/read the content. Using the trackpad to sling through a large percentage of the + * list quickly will still show blank space. We would likely need to simplify the item content to + * improve this case. + */ +const EXTENDED_VIEWPORT_HEIGHT = 25 * ROOM_LIST_ITEM_HEIGHT; + +/** + * A virtualized list of rooms. + * This component provides efficient rendering of large room lists using virtualization, + * and renders RoomListItemView components for each room. + * + * @example + * ```tsx + * } /> + * ``` + */ +export function VirtualizedRoomListView({ vm, renderAvatar, onKeyDown }: VirtualizedRoomListViewProps): JSX.Element { + const snapshot = useViewModel(vm); + const { roomListState, roomIds } = snapshot; + const activeRoomIndex = roomListState.activeRoomIndex; + const lastSpaceId = useRef(undefined); + const lastFilterKeys = useRef(undefined); + const roomCount = roomIds.length; + + /** + * Callback when the visible range changes + * Notifies the view model which rooms are visible + */ + const rangeChanged = useCallback( + (range: { startIndex: number; endIndex: number }) => { + vm.updateVisibleRooms(range.startIndex, range.endIndex); + }, + [vm], + ); + + /** + * Get the item component for a specific index + * Gets the room's view model and passes it to RoomListItemView + */ + const getItemComponent = useCallback( + ( + index: number, + roomId: string, + context: VirtualizedListContext, + onFocus: (item: string, e: React.FocusEvent) => void, + ): JSX.Element => { + const isSelected = activeRoomIndex === index; + const roomItemVM = vm.getRoomItemViewModel(roomId); + + // Item is focused when the list has focus AND this item's key matches tabIndexKey + // This matches the old RoomList implementation's roving tabindex pattern + const isFocused = context.focused && context.tabIndexKey === roomId; + + return ( + + ); + }, + [activeRoomIndex, roomCount, renderAvatar, vm], + ); + + /** + * Get the key for a room item + * Since we're using virtualization, items are always room ID strings + */ + const getItemKey = useCallback((item: string): string => { + return item; + }, []); + + const context = useMemo( + () => ({ spaceId: roomListState.spaceId || "", filterKeys: roomListState.filterKeys }), + [roomListState.spaceId, roomListState.filterKeys], + ); + + /** + * Determine if we should scroll the active index into view + * This happens when the space or filters change + */ + const scrollIntoViewOnChange = useCallback( + (params: { + context: VirtualizedListContext<{ spaceId: string; filterKeys: FilterKey[] | undefined }>; + }): ScrollIntoViewLocation | null | undefined | false => { + const { spaceId, filterKeys } = params.context.context; + const shouldScrollIndexIntoView = + lastSpaceId.current !== spaceId || !isEqual(lastFilterKeys.current, filterKeys); + lastFilterKeys.current = filterKeys; + lastSpaceId.current = spaceId; + + if (shouldScrollIndexIntoView) { + return { + align: "start", + index: activeRoomIndex || 0, + behavior: "auto", + }; + } + return false; + }, + [activeRoomIndex], + ); + + return ( + true} + rangeChanged={rangeChanged} + onKeyDown={onKeyDown} + increaseViewportBy={{ + bottom: EXTENDED_VIEWPORT_HEIGHT, + top: EXTENDED_VIEWPORT_HEIGHT, + }} + /> + ); +} diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/__snapshots__/VirtualizedRoomListView.test.tsx.snap b/packages/shared-components/src/room-list/VirtualizedRoomListView/__snapshots__/VirtualizedRoomListView.test.tsx.snap new file mode 100644 index 0000000000..85cd5f6d08 --- /dev/null +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/__snapshots__/VirtualizedRoomListView.test.tsx.snap @@ -0,0 +1,1277 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Default story 1`] = ` +
+
+
+
+
+
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + + + + + +`; diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/index.ts b/packages/shared-components/src/room-list/VirtualizedRoomListView/index.ts new file mode 100644 index 0000000000..da5840ada5 --- /dev/null +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { VirtualizedRoomListView } from "./VirtualizedRoomListView"; +export type { VirtualizedRoomListViewProps, RoomListViewState, FilterKey } from "./VirtualizedRoomListView"; diff --git a/packages/shared-components/src/room-list/story-mocks.tsx b/packages/shared-components/src/room-list/story-mocks.tsx new file mode 100644 index 0000000000..83a8eb1b94 --- /dev/null +++ b/packages/shared-components/src/room-list/story-mocks.tsx @@ -0,0 +1,138 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { fn } from "storybook/test"; + +import type { Room } from "./RoomListItem/RoomListItem"; +import type { RoomListItemSnapshot } from "./RoomListItem"; +import { RoomNotifState } from "./RoomListItem/RoomNotifs"; + +/** + * Mock avatar component for stories + */ +export const mockAvatar = (name: string): React.ReactElement => ( +
+ {name.substring(0, 2).toUpperCase()} +
+); + +/** + * Render avatar function for stories + */ +export const renderAvatar = (room: Room): React.ReactElement => { + // Cast to any to access properties - in real usage, the room object from the SDK will have these + return mockAvatar((room as any)?.name || "Room"); +}; + +/** + * Room names used for mock data + */ +const roomNames = [ + "General", + "Random", + "Engineering", + "Design", + "Product", + "Marketing", + "Sales", + "Support", + "Announcements", + "Off-topic", + "Team Alpha", + "Team Beta", + "Project X", + "Project Y", + "Water Cooler", + "Feedback", + "Ideas", + "Bugs", + "Features", + "Releases", +]; + +/** + * Create a mock room item snapshot for stories + */ +export const createMockRoomSnapshot = (id: string, name: string, index: number): RoomListItemSnapshot => ({ + id, + room: { name }, + name, + isBold: index % 3 === 0, + messagePreview: index % 2 === 0 ? `Last message in ${name}` : undefined, + notification: { + hasAnyNotificationOrActivity: index % 5 === 0, + isUnsentMessage: false, + invited: false, + isMention: index % 5 === 0, + isActivityNotification: false, + isNotification: index % 5 === 0, + hasUnreadCount: index % 5 === 0, + count: index % 5 === 0 ? index : 0, + muted: false, + }, + showMoreOptionsMenu: true, + showNotificationMenu: true, + isFavourite: false, + isLowPriority: false, + canInvite: true, + canCopyRoomLink: true, + canMarkAsRead: false, + canMarkAsUnread: true, + roomNotifState: RoomNotifState.AllMessages, +}); + +/** + * Create a mock getRoomItemViewModel function for stories + */ +export const createGetRoomItemViewModel = (roomIds: string[]): ((roomId: string) => any) => { + const viewModels = new Map(); + roomIds.forEach((roomId, index) => { + const name = roomNames[index % roomNames.length]; + const snapshot = createMockRoomSnapshot(roomId, name, index); + + const mockViewModel = { + getSnapshot: () => snapshot, + subscribe: fn(), + unsubscribe: fn(), + onOpenRoom: fn(), + onMarkAsRead: fn(), + onMarkAsUnread: fn(), + onToggleFavorite: fn(), + onToggleLowPriority: fn(), + onInvite: fn(), + onCopyRoomLink: fn(), + onLeaveRoom: fn(), + onSetRoomNotifState: fn(), + }; + viewModels.set(roomId, mockViewModel); + }); + + return (roomId: string) => viewModels.get(roomId); +}; + +/** + * Mock room IDs for different list sizes + */ +export const mockRoomIds = Array.from({ length: 20 }, (_, i) => `!room${i}:server`); +export const smallListRoomIds = mockRoomIds.slice(0, 5); +export const largeListRoomIds = Array.from({ length: 100 }, (_, i) => `!room${i}:server`); diff --git a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx index 20e191ba38..adea593d07 100644 --- a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx +++ b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx @@ -1,9 +1,9 @@ /* -Copyright 2025 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ import React, { useRef, type JSX, useCallback, useEffect, useState, useMemo } from "react"; import { type VirtuosoHandle, type ListRange, Virtuoso, type VirtuosoProps } from "react-virtuoso"; @@ -95,6 +95,19 @@ export interface IVirtualizedListProps extends Omit< * @returns */ onKeyDown?: (e: React.KeyboardEvent) => void; + + /** + * Optional total count of items (for virtualization with partial data loading). + * If provided, this will be used instead of items.length for the total count. + */ + totalCount?: number; + + /** + * Optional callback when the visible range of items changes. + * Useful for loading data on-demand as the user scrolls. + * @param range - The new visible range with startIndex and endIndex + */ + rangeChanged?: (range: ListRange) => void; } /** @@ -113,7 +126,17 @@ export type ScrollIntoViewOnChange = NonNullable< */ export function VirtualizedList(props: IVirtualizedListProps): React.ReactElement { // Extract our custom props to avoid conflicts with Virtuoso props - const { items, getItemComponent, isItemFocusable, getItemKey, context, onKeyDown, ...virtuosoProps } = props; + const { + items, + getItemComponent, + isItemFocusable, + getItemKey, + context, + onKeyDown, + totalCount, + rangeChanged, + ...virtuosoProps + } = props; /** Reference to the Virtuoso component for programmatic scrolling */ const virtuosoHandleRef = useRef(null); /** Reference to the DOM element containing the virtualized list */ @@ -324,6 +347,15 @@ export function VirtualizedList(props: IVirtualizedListProp [tabIndexKey, isFocused, props.context], ); + // Combine internal range tracking with optional external callback + const handleRangeChanged = useCallback( + (range: ListRange) => { + setVisibleRange(range); + rangeChanged?.(range); + }, + [rangeChanged], + ); + return ( (props: IVirtualizedListProp scrollerRef={scrollerRef} onKeyDown={keyDownCallback} context={listContext} - rangeChanged={setVisibleRange} + rangeChanged={handleRangeChanged} // virtuoso errors internally if you pass undefined. overscan={props.overscan || 0} data={props.items} + totalCount={totalCount} onFocus={onFocus} onBlur={onBlur} itemContent={getItemComponentInternal} diff --git a/packages/shared-components/src/viewmodel/index.ts b/packages/shared-components/src/viewmodel/index.ts index 7936e535a2..25e5ec60b8 100644 --- a/packages/shared-components/src/viewmodel/index.ts +++ b/packages/shared-components/src/viewmodel/index.ts @@ -12,5 +12,5 @@ export * from "./ViewModelSubscriptions"; export type * from "./ViewModel"; export * from "./MockViewModel"; export * from "./useCreateAutoDisposedViewModel"; -export * from "./useViewModel"; export * from "./useMockedViewModel"; +export * from "./useViewModel"; diff --git a/playwright/e2e/read-receipts/room-list-order.spec.ts b/playwright/e2e/read-receipts/room-list-order.spec.ts index 405cdf22ed..c13730107c 100644 --- a/playwright/e2e/read-receipts/room-list-order.spec.ts +++ b/playwright/e2e/read-receipts/room-list-order.spec.ts @@ -18,19 +18,28 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => { util, msg, page, + app, + bot, }) => { + // Create a third room to navigate to + const room3Id = await app.client.createRoom({ name: "Room Gamma", invite: [bot.credentials.userId] }); + await bot.awaitRoomMembership(room3Id); + const room3 = { name: "Room Gamma", roomId: room3Id }; + await util.goTo(room2); // Display the unread first room + await util.receiveMessages(room2, ["Msg2"]); await util.receiveMessages(room1, ["Msg1"]); await page.reload(); - // switch rooms so they can re-order in the list - await util.goTo(room1); + // Switch to room3 so neither room1 nor room2 is selected/sticky + // This allows them to reorder based on activity + await util.goTo(room3); // Room 1 has an unread message and should be displayed first // (as the default is to sort by activity) - await util.assertRoomListOrder([room1, room2]); + await util.assertRoomListOrder([room1, room2, room3]); }); test("Rooms with unread threads appear at the top of room list with default 'activity' order", async ({ @@ -38,18 +47,29 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => { roomBeta: room2, util, msg, + app, + bot, }) => { + // Create a third room to navigate to + const room3Id = await app.client.createRoom({ name: "Room Gamma", invite: [bot.credentials.userId] }); + await bot.awaitRoomMembership(room3Id); + const room3 = { name: "Room Gamma", roomId: room3Id }; + await util.goTo(room2); await util.receiveMessages(room1, ["Msg1"]); + await util.receiveMessages(room2, ["Msg2"]); await util.markAsRead(room1); await util.assertRead(room1); - // Display the unread first room + // Display the unread first room (room1 moves above room2 as it has an unread thread) await util.receiveMessages(room1, [msg.threadedOff("Msg1", "Resp1")]); await util.saveAndReload(); + // Switch to room3 so neither room1 nor room2 is selected/sticky + await util.goTo(room3); + // Room 1 has an unread message and should be displayed first - await util.assertRoomListOrder([room1, room2]); + await util.assertRoomListOrder([room1, room2, room3]); }); }); }); diff --git a/playwright/e2e/sliding-sync/sliding-sync.spec.ts b/playwright/e2e/sliding-sync/sliding-sync.spec.ts index b31deadace..38aff5928d 100644 --- a/playwright/e2e/sliding-sync/sliding-sync.spec.ts +++ b/playwright/e2e/sliding-sync/sliding-sync.spec.ts @@ -38,7 +38,7 @@ const test = base.extend<{ test.describe("Sliding Sync", () => { const checkOrder = async (wantOrder: string[], page: Page) => { - await expect(page.getByTestId("room-list").locator(".mx_RoomListItemView_text")).toHaveText(wantOrder); + await expect(page.getByTestId("room-list").getByTestId("room-name")).toHaveText(wantOrder); }; const bumpRoom = async (roomId: string, app: ElementAppPage) => { diff --git a/res/css/_components.pcss b/res/css/_components.pcss index 28458c899f..53f99f8a35 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -263,14 +263,7 @@ @import "./views/right_panel/_VerificationPanel.pcss"; @import "./views/right_panel/_WidgetCard.pcss"; @import "./views/room_settings/_AliasSettings.pcss"; -@import "./views/rooms/RoomListPanel/_EmptyRoomList.pcss"; -@import "./views/rooms/RoomListPanel/_RoomList.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListItemMenuView.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListItemView.pcss"; @import "./views/rooms/RoomListPanel/_RoomListPanel.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListSkeleton.pcss"; @import "./views/rooms/_AppsDrawer.pcss"; @import "./views/rooms/_Autocomplete.pcss"; @import "./views/rooms/_AuxPanel.pcss"; diff --git a/res/css/views/rooms/RoomListPanel/_EmptyRoomList.pcss b/res/css/views/rooms/RoomListPanel/_EmptyRoomList.pcss deleted file mode 100644 index a0fbfdaea7..0000000000 --- a/res/css/views/rooms/RoomListPanel/_EmptyRoomList.pcss +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_EmptyRoomList_GenericPlaceholder { - align-self: center; - /** It should take 2/3 of the width **/ - width: 66%; - /** It should be positioned at 1/3 of the height **/ - padding-top: 33%; - - .mx_EmptyRoomList_GenericPlaceholder_title { - font: var(--cpd-font-body-lg-semibold); - text-align: center; - } - - .mx_EmptyRoomList_GenericPlaceholder_description { - font: var(--cpd-font-body-sm-regular); - color: var(--cpd-color-text-secondary); - text-align: center; - } - - .mx_EmptyRoomList_DefaultPlaceholder { - margin-top: var(--cpd-space-4x); - } - - button { - width: 100%; - } -} diff --git a/res/css/views/rooms/RoomListPanel/_RoomListItemMenuView.pcss b/res/css/views/rooms/RoomListPanel/_RoomListItemMenuView.pcss deleted file mode 100644 index cabd9b2d20..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListItemMenuView.pcss +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_RoomListItemMenuView { - svg { - fill: var(--cpd-color-icon-primary); - } -} diff --git a/res/css/views/rooms/RoomListPanel/_RoomListItemView.pcss b/res/css/views/rooms/RoomListPanel/_RoomListItemView.pcss deleted file mode 100644 index 4a7eb23b18..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListItemView.pcss +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -/** - * The RoomListItemView has the following structure: - * button--------------------------------------------------| - * | <-12px-> container------------------------------------| - * | | room avatar <-8px-> content----------------| - * | | | room_name <- 20px ->| - * | | | --------------------| <-- border - * |-------------------------------------------------------| - */ -.mx_RoomListItemView { - /* Remove button default style */ - color: inherit; - background: unset; - border: none; - padding: 0; - text-align: unset; - - cursor: pointer; - height: 48px; - width: 100%; - - padding-left: var(--cpd-space-3x); - font: var(--cpd-font-body-md-regular); - - /* Hide the menu by default */ - .mx_RoomListItemView_menu { - display: none; - } - - &:hover, - &:focus-visible, - /* When the context menu is opened */ - &[data-state="open"], - /* When the options and notifications menu are opened */ - &:has(.mx_RoomListItemMenuView > button[data-state="open"]) { - background-color: var(--cpd-color-bg-action-secondary-hovered); - - .mx_RoomListItemView_menu { - display: flex; - } - - &.mx_RoomListItemView_has_menu { - /** - * The figma uses 16px padding (--cpd-space-4x) but due to https://github.com/element-hq/compound-web/issues/331 - * the icon size of the menu is 18px instead of 20px with a different internal padding - * We need to use 18px to align the icon with the others icons - * 18px is not available in compound spacing - */ - .mx_RoomListItemView_content { - padding-right: 18px; - } - - /* When the menu is visible, hide the notification decoration to avoid clutter */ - .mx_RoomListItemView_notificationDecoration { - display: none; - } - } - } - - .mx_RoomListItemView_content { - height: 100%; - flex: 1; - /* The border is only under the room name and the future hover menu */ - border-bottom: var(--cpd-border-width-0-5) solid var(--cpd-color-bg-subtle-secondary); - box-sizing: border-box; - min-width: 0; - padding-right: var(--cpd-space-5x); - - .mx_RoomListItemView_text { - min-width: 0; - } - - .mx_RoomListItemView_roomName { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .mx_RoomListItemView_messagePreview { - font: var(--cpd-font-body-sm-regular); - color: var(--cpd-color-text-secondary); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } -} - -.mx_RoomListItemView_selected { - background-color: var(--cpd-color-bg-action-secondary-pressed); -} - -.mx_RoomListItemView_bold .mx_RoomListItemView_roomName { - font: var(--cpd-font-body-md-semibold); -} diff --git a/res/css/views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss b/res/css/views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss deleted file mode 100644 index 378f2e75da..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_RoomListPrimaryFilters { - padding: var(--cpd-space-2x) var(--cpd-space-4x) var(--cpd-space-2x) var(--cpd-space-3x); - - .mx_RoomListPrimaryFilters_wrapping { - display: none; - } - - .mx_RoomListPrimaryFilters_list { - /** - * The InteractionObserver needs the height to be set to work properly. - */ - height: 100%; - flex: 1; - } - - .mx_RoomListPrimaryFilters_IconButton { - svg { - transition: transform 0.1s linear; - } - } - - .mx_RoomListPrimaryFilters_IconButton[aria-expanded="true"] { - svg { - transform: rotate(180deg); - } - } -} diff --git a/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss b/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss deleted file mode 100644 index 0fa8dc12ae..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_RoomListSecondaryFilters { - font: var(--cpd-font-body-md-medium); - margin: var(--cpd-space-2x); - margin-left: var(--cpd-space-1x); -} diff --git a/res/css/views/rooms/RoomListPanel/_RoomListSkeleton.pcss b/res/css/views/rooms/RoomListPanel/_RoomListSkeleton.pcss deleted file mode 100644 index 248f260262..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListSkeleton.pcss +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_RoomListSkeleton { - position: relative; - margin-left: 4px; - height: 100%; - - &::before { - background-color: var(--cpd-color-bg-subtle-secondary); - width: 100%; - height: 100%; - - content: ""; - position: absolute; - mask-repeat: repeat-y; - mask-size: auto 96px; - mask-image: url("/res/img/element-icons/roomlist/room-list-item-skeleton.svg"); - } -} diff --git a/src/components/viewmodels/roomlist/MessagePreviewViewModel.tsx b/src/components/viewmodels/roomlist/MessagePreviewViewModel.tsx deleted file mode 100644 index 9e141c1379..0000000000 --- a/src/components/viewmodels/roomlist/MessagePreviewViewModel.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { useCallback, useEffect, useState } from "react"; - -import type { Room } from "matrix-js-sdk/src/matrix"; -import { type MessagePreview, MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore"; -import { useEventEmitter } from "../../../hooks/useEventEmitter"; - -interface MessagePreviewViewState { - /** - * A string representation of the message preview if available. - */ - message?: string; -} - -/** - * View model for rendering a message preview for a given room list item. - * @param room The room for which we're rendering the message preview. - * @see {@link MessagePreviewViewState} for what this view model returns. - */ -export function useMessagePreviewViewModel(room: Room): MessagePreviewViewState { - const [messagePreview, setMessagePreview] = useState(null); - - const updatePreview = useCallback(async (): Promise => { - /** - * The second argument to getPreviewForRoom is a tag id which doesn't really make - * much sense within the context of the new room list. We can pass an empty string - * to match all tags for now but we should remember to actually change the implementation - * in the store once we remove the legacy room list. - */ - const newPreview = await MessagePreviewStore.instance.getPreviewForRoom(room, ""); - setMessagePreview(newPreview); - }, [room]); - - /** - * Update when the message preview has changed for this room. - */ - useEventEmitter(MessagePreviewStore.instance, MessagePreviewStore.getPreviewChangedEventName(room), () => { - updatePreview(); - }); - - /** - * Do an initial fetch of the message preview. - */ - useEffect(() => { - updatePreview(); - }, [updatePreview]); - - return { - message: messagePreview?.text, - }; -} diff --git a/src/components/viewmodels/roomlist/RoomListItemMenuViewModel.tsx b/src/components/viewmodels/roomlist/RoomListItemMenuViewModel.tsx deleted file mode 100644 index 738a05b8c3..0000000000 --- a/src/components/viewmodels/roomlist/RoomListItemMenuViewModel.tsx +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { useCallback } from "react"; -import { type Room, RoomEvent } from "matrix-js-sdk/src/matrix"; - -import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; -import { useEventEmitterState } from "../../../hooks/useEventEmitter"; -import { useUnreadNotifications } from "../../../hooks/useUnreadNotifications"; -import { hasAccessToNotificationMenu, hasAccessToOptionsMenu } from "./utils"; -import DMRoomMap from "../../../utils/DMRoomMap"; -import { DefaultTagID } from "../../../stores/room-list/models"; -import { NotificationLevel } from "../../../stores/notifications/NotificationLevel"; -import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; -import { UIComponent } from "../../../settings/UIFeature"; -import dispatcher from "../../../dispatcher/dispatcher"; -import { clearRoomNotification, setMarkedUnreadState } from "../../../utils/notifications"; -import PosthogTrackers from "../../../PosthogTrackers"; -import { tagRoom } from "../../../utils/room/tagRoom"; -import { RoomNotifState } from "../../../RoomNotifs"; -import { useNotificationState } from "../../../hooks/useRoomNotificationState"; - -export interface RoomListItemMenuViewState { - /** - * Whether the more options menu should be shown. - */ - showMoreOptionsMenu: boolean; - /** - * Whether the notification menu should be shown. - */ - showNotificationMenu: boolean; - /** - * Whether the room is a favourite room. - */ - isFavourite: boolean; - /** - * Whether the room is a low priority room. - */ - isLowPriority: boolean; - /** - * Can invite other user's in the room. - */ - canInvite: boolean; - /** - * Can copy the room link. - */ - canCopyRoomLink: boolean; - /** - * Can mark the room as read. - */ - canMarkAsRead: boolean; - /** - * Can mark the room as unread. - */ - canMarkAsUnread: boolean; - /** - * Whether the notification is set to all messages. - */ - isNotificationAllMessage: boolean; - /** - * Whether the notification is set to all messages loud. - */ - isNotificationAllMessageLoud: boolean; - /** - * Whether the notification is set to mentions and keywords only. - */ - isNotificationMentionOnly: boolean; - /** - * Whether the notification is muted. - */ - isNotificationMute: boolean; - /** - * Mark the room as read. - * @param evt - */ - markAsRead: (evt: Event) => void; - /** - * Mark the room as unread. - * @param evt - */ - markAsUnread: (evt: Event) => void; - /** - * Toggle the room as favourite. - * @param evt - */ - toggleFavorite: (evt: Event) => void; - /** - * Toggle the room as low priority. - */ - toggleLowPriority: () => void; - /** - * Invite other users in the room. - * @param evt - */ - invite: (evt: Event) => void; - /** - * Copy the room link in the clipboard. - * @param evt - */ - copyRoomLink: (evt: Event) => void; - /** - * Leave the room. - * @param evt - */ - leaveRoom: (evt: Event) => void; - /** - * Set the room notification state. - * @param state - */ - setRoomNotifState: (state: RoomNotifState) => void; -} - -export function useRoomListItemMenuViewModel(room: Room): RoomListItemMenuViewState { - const matrixClient = useMatrixClientContext(); - const roomTags = useEventEmitterState(room, RoomEvent.Tags, () => room.tags); - const { level: notificationLevel } = useUnreadNotifications(room); - - const isDm = Boolean(DMRoomMap.shared().getUserIdForRoomId(room.roomId)); - const isFavourite = Boolean(roomTags[DefaultTagID.Favourite]); - const isLowPriority = Boolean(roomTags[DefaultTagID.LowPriority]); - const isArchived = Boolean(roomTags[DefaultTagID.Archived]); - - const showMoreOptionsMenu = hasAccessToOptionsMenu(room); - const showNotificationMenu = hasAccessToNotificationMenu(room, matrixClient.isGuest(), isArchived); - - const canMarkAsRead = notificationLevel > NotificationLevel.None; - const canMarkAsUnread = !canMarkAsRead && !isArchived; - - const canInvite = - room.canInvite(matrixClient.getUserId()!) && !isDm && shouldShowComponent(UIComponent.InviteUsers); - const canCopyRoomLink = !isDm; - - const [roomNotifState, setRoomNotifState] = useNotificationState(room); - const isNotificationAllMessage = roomNotifState === RoomNotifState.AllMessages; - const isNotificationAllMessageLoud = roomNotifState === RoomNotifState.AllMessagesLoud; - const isNotificationMentionOnly = roomNotifState === RoomNotifState.MentionsOnly; - const isNotificationMute = roomNotifState === RoomNotifState.Mute; - - // Actions - - const markAsRead = useCallback( - async (evt: Event): Promise => { - await clearRoomNotification(room, matrixClient); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuMarkRead", evt); - }, - [room, matrixClient], - ); - - const markAsUnread = useCallback( - async (evt: Event): Promise => { - await setMarkedUnreadState(room, matrixClient, true); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuMarkUnread", evt); - }, - [room, matrixClient], - ); - - const toggleFavorite = useCallback( - (evt: Event): void => { - tagRoom(room, DefaultTagID.Favourite); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuFavouriteToggle", evt); - }, - [room], - ); - - const toggleLowPriority = useCallback((): void => tagRoom(room, DefaultTagID.LowPriority), [room]); - - const invite = useCallback( - (evt: Event): void => { - dispatcher.dispatch({ - action: "view_invite", - roomId: room.roomId, - }); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuInviteItem", evt); - }, - [room], - ); - - const copyRoomLink = useCallback( - (evt: Event): void => { - dispatcher.dispatch({ - action: "copy_room", - room_id: room.roomId, - }); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuFavouriteToggle", evt); - }, - [room], - ); - - const leaveRoom = useCallback( - (evt: Event): void => { - dispatcher.dispatch({ - action: isArchived ? "forget_room" : "leave_room", - room_id: room.roomId, - }); - PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuLeaveItem", evt); - }, - [room, isArchived], - ); - - return { - showMoreOptionsMenu, - showNotificationMenu, - isFavourite, - isLowPriority, - canInvite, - canCopyRoomLink, - canMarkAsRead, - canMarkAsUnread, - isNotificationAllMessage, - isNotificationAllMessageLoud, - isNotificationMentionOnly, - isNotificationMute, - markAsRead, - markAsUnread, - toggleFavorite, - toggleLowPriority, - invite, - copyRoomLink, - leaveRoom, - setRoomNotifState, - }; -} diff --git a/src/components/viewmodels/roomlist/RoomListItemViewModel.tsx b/src/components/viewmodels/roomlist/RoomListItemViewModel.tsx deleted file mode 100644 index 30576e2dc2..0000000000 --- a/src/components/viewmodels/roomlist/RoomListItemViewModel.tsx +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { useCallback, useEffect, useMemo, useState } from "react"; -import { type Room, RoomEvent } from "matrix-js-sdk/src/matrix"; -import { CallType } from "matrix-js-sdk/src/webrtc/call"; - -import dispatcher from "../../../dispatcher/dispatcher"; -import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; -import { Action } from "../../../dispatcher/actions"; -import { hasAccessToNotificationMenu, hasAccessToOptionsMenu } from "./utils"; -import { _t } from "../../../languageHandler"; -import { type RoomNotificationState } from "../../../stores/notifications/RoomNotificationState"; -import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore"; -import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; -import { useEventEmitter, useEventEmitterState, useTypedEventEmitter } from "../../../hooks/useEventEmitter"; -import { DefaultTagID } from "../../../stores/room-list/models"; -import { useCall, useConnectionState, useParticipantCount } from "../../../hooks/useCall"; -import { CallEvent, type ConnectionState } from "../../../models/Call"; -import { NotificationStateEvents } from "../../../stores/notifications/NotificationState"; -import DMRoomMap from "../../../utils/DMRoomMap"; -import { MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore"; -import { useMessagePreviewToggle } from "./useMessagePreviewToggle"; - -export interface RoomListItemViewState { - /** - * The name of the room. - */ - name: string; - /** - * Whether the context menu should be shown. - */ - showContextMenu: boolean; - /** - * Whether the hover menu should be shown. - */ - showHoverMenu: boolean; - /** - * Open the room having given roomId. - */ - openRoom: () => void; - /** - * The a11y label for the room list item. - */ - a11yLabel: string; - /** - * The notification state of the room. - */ - notificationState: RoomNotificationState; - /** - * Whether the room should be bolded. - */ - isBold: boolean; - /** - * Whether the room is a video room - */ - isVideoRoom: boolean; - /** - * The connection state of the call. - * `null` if there is no call in the room. - */ - callConnectionState: ConnectionState | null; - /** - * Whether there are participants in the call. - */ - hasParticipantInCall: boolean; - /** - * Whether the call is a voice or video call. - */ - callType: CallType | undefined; - /** - * Pre-rendered and translated preview for the latest message in the room, or undefined - * if no preview should be shown. - */ - messagePreview: string | undefined; - /** - * Whether the notification decoration should be shown. - */ - showNotificationDecoration: boolean; -} - -/** - * View model for the room list item - * @see {@link RoomListItemViewState} for more information about what this view model returns. - */ -export function useRoomListItemViewModel(room: Room): RoomListItemViewState { - const matrixClient = useMatrixClientContext(); - const roomTags = useEventEmitterState(room, RoomEvent.Tags, () => room.tags); - const isArchived = Boolean(roomTags[DefaultTagID.Archived]); - const name = useEventEmitterState(room, RoomEvent.Name, () => room.name); - - const notificationState = useMemo(() => RoomNotificationStateStore.instance.getRoomState(room), [room]); - - const [a11yLabel, setA11yLabel] = useState(getA11yLabel(name, notificationState)); - const [{ isBold, invited, hasVisibleNotification }, setNotificationValues] = useState( - getNotificationValues(notificationState), - ); - useEffect(() => { - setA11yLabel(getA11yLabel(name, notificationState)); - }, [name, notificationState]); - - // Listen to changes in the notification state and update the values - useTypedEventEmitter(notificationState, NotificationStateEvents.Update, () => { - setA11yLabel(getA11yLabel(name, notificationState)); - setNotificationValues(getNotificationValues(notificationState)); - }); - - // If the notification reference change due to room change, update the values - useEffect(() => { - setNotificationValues(getNotificationValues(notificationState)); - }, [notificationState]); - - // We don't want to show the menus if - // - there is an invitation for this room - // - the user doesn't have access to notification and more options menus - const showContextMenu = !invited && hasAccessToOptionsMenu(room); - const showHoverMenu = - !invited && (showContextMenu || hasAccessToNotificationMenu(room, matrixClient.isGuest(), isArchived)); - - const messagePreview = useRoomMessagePreview(room); - - // Video room - const isVideoRoom = room.isElementVideoRoom() || room.isCallRoom(); - // EC video call or video room - const call = useCall(room.roomId); - const connectionState = useConnectionState(call); - const participantCount = useParticipantCount(call); - const callConnectionState = call ? connectionState : null; - - const showNotificationDecoration = hasVisibleNotification || participantCount > 0; - - // Actions - - const openRoom = useCallback((): void => { - dispatcher.dispatch({ - action: Action.ViewRoom, - room_id: room.roomId, - metricsTrigger: "RoomList", - }); - }, [room]); - - const [callType, setCallType] = useState(CallType.Video); - useTypedEventEmitter(call ?? undefined, CallEvent.CallTypeChanged, setCallType); - - return { - name, - notificationState, - showContextMenu, - showHoverMenu, - openRoom, - a11yLabel, - isBold, - isVideoRoom, - callConnectionState, - hasParticipantInCall: participantCount > 0, - messagePreview, - showNotificationDecoration, - callType: call ? callType : undefined, - }; -} - -/** - * Calculate the values from the notification state - * @param notificationState - */ -function getNotificationValues(notificationState: RoomNotificationState): { - computeA11yLabel: (name: string) => string; - isBold: boolean; - invited: boolean; - hasVisibleNotification: boolean; -} { - const invited = notificationState.invited; - const computeA11yLabel = (name: string): string => getA11yLabel(name, notificationState); - const isBold = notificationState.hasAnyNotificationOrActivity; - - const hasVisibleNotification = notificationState.hasAnyNotificationOrActivity || notificationState.muted; - - return { - computeA11yLabel, - isBold, - invited, - hasVisibleNotification, - }; -} - -/** - * Get the a11y label for the room list item - * @param roomName - * @param notificationState - */ -function getA11yLabel(roomName: string, notificationState: RoomNotificationState): string { - if (notificationState.isUnsentMessage) { - return _t("a11y|room_messsage_not_sent", { - roomName, - }); - } else if (notificationState.invited) { - return _t("a11y|room_n_unread_invite", { - roomName, - }); - } else if (notificationState.isMention) { - return _t("a11y|room_n_unread_messages_mentions", { - roomName, - count: notificationState.count, - }); - } else if (notificationState.hasUnreadCount) { - return _t("a11y|room_n_unread_messages", { - roomName, - count: notificationState.count, - }); - } else { - return _t("room_list|room|open_room", { roomName }); - } -} - -function useRoomMessagePreview(room: Room): string | undefined { - const { shouldShowMessagePreview } = useMessagePreviewToggle(); - const [previewText, setPreviewText] = useState(undefined); - - const updatePreview = useCallback(async () => { - if (!shouldShowMessagePreview) { - setPreviewText(undefined); - return; - } - - const roomIsDM = Boolean(DMRoomMap.shared().getUserIdForRoomId(room.roomId)); - // For the tag, we only care about whether the room is a DM or not as we don't show - // display names in previewsd for DMs, so anything else we just say is 'untagged' - // (even though it could actually be have other tags: we don't care about them). - const messagePreview = await MessagePreviewStore.instance.getPreviewForRoom( - room, - roomIsDM ? DefaultTagID.DM : DefaultTagID.Untagged, - ); - setPreviewText(messagePreview?.text); - }, [room, shouldShowMessagePreview]); - - // MessagePreviewStore and the other AsyncStores need to be converted to TypedEventEmitter - useEventEmitter(MessagePreviewStore.instance, MessagePreviewStore.getPreviewChangedEventName(room), () => { - updatePreview(); - }); - - useEffect(() => { - updatePreview(); - }, [updatePreview]); - - return previewText; -} diff --git a/src/components/viewmodels/roomlist/RoomListViewModel.tsx b/src/components/viewmodels/roomlist/RoomListViewModel.tsx deleted file mode 100644 index a48d973b23..0000000000 --- a/src/components/viewmodels/roomlist/RoomListViewModel.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* -Copyright 2025 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import { useCallback } from "react"; - -import type { Room } from "matrix-js-sdk/src/matrix"; -import { type PrimaryFilter, useFilteredRooms } from "./useFilteredRooms"; -import { createRoom as createRoomFunc, hasCreateRoomRights } from "./utils"; -import { useEventEmitterState } from "../../../hooks/useEventEmitter"; -import { UPDATE_SELECTED_SPACE } from "../../../stores/spaces"; -import SpaceStore from "../../../stores/spaces/SpaceStore"; -import dispatcher from "../../../dispatcher/dispatcher"; -import { Action } from "../../../dispatcher/actions"; -import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; -import { useStickyRoomList } from "./useStickyRoomList"; -import { useRoomListNavigation } from "./useRoomListNavigation"; -import { type RoomsResult } from "../../../stores/room-list-v3/RoomListStoreV3"; - -export interface RoomListViewState { - /** - * Whether the list of rooms is being loaded. - */ - isLoadingRooms: boolean; - - /** - * The room results to be displayed (along with the spaceId and filter keys at the time of query) - */ - roomsResult: RoomsResult; - - /** - * Create a chat room - * @param e - The click event - */ - createChatRoom: () => void; - - /** - * Whether the user can create a room in the current space - */ - canCreateRoom: boolean; - - /** - * Create a room - * @param e - The click event - */ - createRoom: () => void; - - /** - * A list of objects that provide the view enough information - * to render primary room filters. - */ - primaryFilters: PrimaryFilter[]; - - /** - * The currently active primary filter. - * If no primary filter is active, this will be undefined. - */ - activePrimaryFilter?: PrimaryFilter; - - /** - * The index of the active room in the room list. - */ - activeIndex: number | undefined; -} - -/** - * View model for the new room list - * @see {@link RoomListViewState} for more information about what this view model returns. - */ -export function useRoomListViewModel(): RoomListViewState { - const matrixClient = useMatrixClientContext(); - const { isLoadingRooms, primaryFilters, activePrimaryFilter, roomsResult: filteredRooms } = useFilteredRooms(); - const { activeIndex, roomsResult } = useStickyRoomList(filteredRooms); - - useRoomListNavigation(roomsResult.rooms); - - const currentSpace = useEventEmitterState( - SpaceStore.instance, - UPDATE_SELECTED_SPACE, - () => SpaceStore.instance.activeSpaceRoom, - ); - const canCreateRoom = hasCreateRoomRights(matrixClient, currentSpace); - - const createChatRoom = useCallback(() => dispatcher.fire(Action.CreateChat), []); - const createRoom = useCallback(() => createRoomFunc(currentSpace), [currentSpace]); - - return { - isLoadingRooms, - roomsResult, - canCreateRoom, - createRoom, - createChatRoom, - primaryFilters, - activePrimaryFilter, - activeIndex, - }; -} diff --git a/src/components/viewmodels/roomlist/useFilteredRooms.tsx b/src/components/viewmodels/roomlist/useFilteredRooms.tsx deleted file mode 100644 index a0e36dc668..0000000000 --- a/src/components/viewmodels/roomlist/useFilteredRooms.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright 2025 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import { useCallback, useEffect, useMemo, useState } from "react"; - -import { FilterKey } from "../../../stores/room-list-v3/skip-list/filters"; -import { _t, _td } from "../../../languageHandler"; -import RoomListStoreV3, { - LISTS_LOADED_EVENT, - LISTS_UPDATE_EVENT, - type RoomsResult, -} from "../../../stores/room-list-v3/RoomListStoreV3"; -import { useEventEmitter } from "../../../hooks/useEventEmitter"; - -/** - * Provides information about a primary filter. - * A primary filter is a commonly used filter that is given - * more precedence in the UI. For eg, primary filters may be - * rendered as pills above the room list. - */ -export interface PrimaryFilter { - // A function to toggle this filter on and off. - toggle: () => void; - // Whether this filter is currently applied - active: boolean; - // Text that can be used in the UI to represent this filter. - name: string; - // The key of the filter - key: FilterKey; -} - -interface FilteredRooms { - primaryFilters: PrimaryFilter[]; - isLoadingRooms: boolean; - roomsResult: RoomsResult; - /** - * The currently active primary filter. - * If no primary filter is active, this will be undefined. - */ - activePrimaryFilter?: PrimaryFilter; -} - -const filterKeyToNameMap: Map = new Map([ - [FilterKey.UnreadFilter, _td("room_list|filters|unread")], - [FilterKey.PeopleFilter, _td("room_list|filters|people")], - [FilterKey.RoomsFilter, _td("room_list|filters|rooms")], - [FilterKey.FavouriteFilter, _td("room_list|filters|favourite")], - [FilterKey.MentionsFilter, _td("room_list|filters|mentions")], - [FilterKey.InvitesFilter, _td("room_list|filters|invites")], - [FilterKey.LowPriorityFilter, _td("room_list|filters|low_priority")], -]); - -/** - * Track available filters and provide a filtered list of rooms. - */ -export function useFilteredRooms(): FilteredRooms { - /** - * Primary filter refers to the pill based filters - * rendered above the room list. - */ - const [primaryFilter, setPrimaryFilter] = useState(); - - const [roomsResult, setRoomsResult] = useState(() => RoomListStoreV3.instance.getSortedRoomsInActiveSpace()); - const [isLoadingRooms, setIsLoadingRooms] = useState(() => RoomListStoreV3.instance.isLoadingRooms); - - const updateRoomsFromStore = useCallback((filters: FilterKey[] = []): void => { - const newRooms = RoomListStoreV3.instance.getSortedRoomsInActiveSpace(filters); - setRoomsResult(newRooms); - }, []); - - const filterUndefined = (array: (FilterKey | undefined)[]): FilterKey[] => - array.filter((f) => f !== undefined) as FilterKey[]; - - const getAppliedFilters = useCallback((): FilterKey[] => { - return filterUndefined([primaryFilter]); - }, [primaryFilter]); - - useEffect(() => { - // Update the rooms state when the primary filter changes - const filters = getAppliedFilters(); - updateRoomsFromStore(filters); - }, [getAppliedFilters, updateRoomsFromStore]); - - useEventEmitter(RoomListStoreV3.instance, LISTS_UPDATE_EVENT, () => { - const filters = getAppliedFilters(); - updateRoomsFromStore(filters); - }); - - useEventEmitter(RoomListStoreV3.instance, LISTS_LOADED_EVENT, () => { - setIsLoadingRooms(false); - }); - - /** - * This tells the view which primary filters are available, how to toggle them - * and whether a given primary filter is active. @see {@link PrimaryFilter} - */ - const primaryFilters = useMemo(() => { - const createPrimaryFilter = (key: FilterKey, name: string): PrimaryFilter => { - return { - toggle: () => { - setPrimaryFilter((currentFilter) => { - const filter = currentFilter === key ? undefined : key; - updateRoomsFromStore(filterUndefined([filter])); - return filter; - }); - }, - active: primaryFilter === key, - name, - key, - }; - }; - const filters: PrimaryFilter[] = []; - for (const [key, name] of filterKeyToNameMap.entries()) { - filters.push(createPrimaryFilter(key, _t(name))); - } - return filters; - }, [primaryFilter, updateRoomsFromStore]); - - const activePrimaryFilter = useMemo(() => primaryFilters.find((filter) => filter.active), [primaryFilters]); - - return { - isLoadingRooms, - primaryFilters, - activePrimaryFilter, - roomsResult, - }; -} diff --git a/src/components/viewmodels/roomlist/useMessagePreviewToggle.tsx b/src/components/viewmodels/roomlist/useMessagePreviewToggle.tsx deleted file mode 100644 index efb58b3e04..0000000000 --- a/src/components/viewmodels/roomlist/useMessagePreviewToggle.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ -import { useCallback } from "react"; - -import SettingsStore from "../../../settings/SettingsStore"; -import { SettingLevel } from "../../../settings/SettingLevel"; -import { useSettingValue } from "../../../hooks/useSettings"; - -interface MessagePreviewToggleState { - shouldShowMessagePreview: boolean; - toggleMessagePreview: () => void; -} - -/** - * This hook: - * - Provides a state that tracks whether message previews are turned on or off. - * - Provides a function to toggle message previews. - */ -export function useMessagePreviewToggle(): MessagePreviewToggleState { - const shouldShowMessagePreview = useSettingValue("RoomList.showMessagePreview"); - - const toggleMessagePreview = useCallback((): void => { - const toggled = !shouldShowMessagePreview; - SettingsStore.setValue("RoomList.showMessagePreview", null, SettingLevel.DEVICE, toggled); - }, [shouldShowMessagePreview]); - - return { toggleMessagePreview, shouldShowMessagePreview }; -} diff --git a/src/components/viewmodels/roomlist/useRoomListNavigation.ts b/src/components/viewmodels/roomlist/useRoomListNavigation.ts deleted file mode 100644 index 5ef979e79c..0000000000 --- a/src/components/viewmodels/roomlist/useRoomListNavigation.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { type Room } from "matrix-js-sdk/src/matrix"; - -import dispatcher from "../../../dispatcher/dispatcher"; -import { useDispatcher } from "../../../hooks/useDispatcher"; -import { Action } from "../../../dispatcher/actions"; -import { type ViewRoomDeltaPayload } from "../../../dispatcher/payloads/ViewRoomDeltaPayload"; -import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; -import { SdkContextClass } from "../../../contexts/SDKContext"; -import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore"; - -/** - * Hook to navigate the room list using keyboard shortcuts. - * It listens to the ViewRoomDelta action and updates the room list accordingly. - * @param rooms - */ -export function useRoomListNavigation(rooms: Room[]): void { - useDispatcher(dispatcher, (payload) => { - if (payload.action !== Action.ViewRoomDelta) return; - const roomId = SdkContextClass.instance.roomViewStore.getRoomId(); - if (!roomId) return; - - const { delta, unread } = payload as ViewRoomDeltaPayload; - const filteredRooms = unread - ? // Filter the rooms to only include unread ones and the active room - rooms.filter((room) => { - const state = RoomNotificationStateStore.instance.getRoomState(room); - return room.roomId === roomId || state.isUnread; - }) - : rooms; - - const currentIndex = filteredRooms.findIndex((room) => room.roomId === roomId); - if (currentIndex === -1) return; - - // Get the next/previous new room according to the delta - // Use slice to loop on the list - // If delta is -1 at the start of the list, it will go to the end - // If delta is 1 at the end of the list, it will go to the start - const [newRoom] = filteredRooms.slice((currentIndex + delta) % filteredRooms.length); - if (!newRoom) return; - - dispatcher.dispatch({ - action: Action.ViewRoom, - room_id: newRoom.roomId, - show_room_tile: true, // to make sure the room gets scrolled into view - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }); - }); -} diff --git a/src/components/viewmodels/roomlist/useStickyRoomList.tsx b/src/components/viewmodels/roomlist/useStickyRoomList.tsx deleted file mode 100644 index 355e09a292..0000000000 --- a/src/components/viewmodels/roomlist/useStickyRoomList.tsx +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { useCallback, useEffect, useRef, useState } from "react"; - -import { SdkContextClass } from "../../../contexts/SDKContext"; -import { useDispatcher } from "../../../hooks/useDispatcher"; -import dispatcher from "../../../dispatcher/dispatcher"; -import { Action } from "../../../dispatcher/actions"; -import type { Room } from "matrix-js-sdk/src/matrix"; -import SpaceStore from "../../../stores/spaces/SpaceStore"; -import { type RoomsResult } from "../../../stores/room-list-v3/RoomListStoreV3"; - -function getIndexByRoomId(rooms: Room[], roomId: string): number | undefined { - const index = rooms.findIndex((room) => room.roomId === roomId); - return index === -1 ? undefined : index; -} - -function getRoomsWithStickyRoom( - rooms: Room[], - oldIndex: number | undefined, - newIndex: number | undefined, - isRoomChange: boolean, -): { newRooms: Room[]; newIndex: number | undefined } { - const updated = { newIndex, newRooms: rooms }; - if (isRoomChange) { - /* - * When opening another room, the index should obviously change. - */ - return updated; - } - if (newIndex === undefined || oldIndex === undefined) { - /* - * If oldIndex is undefined, then there was no active room before. - * So nothing to do in regards to sticky room. - * Similarly, if newIndex is undefined, there's no active room anymore. - */ - return updated; - } - if (newIndex === oldIndex) { - /* - * If the index hasn't changed, we have nothing to do. - */ - return updated; - } - if (oldIndex > rooms.length - 1) { - /* - * If the old index falls out of the bounds of the rooms array - * (usually because rooms were removed), we can no longer place - * the active room in the same old index. - */ - return updated; - } - - /* - * Making the active room sticky is as simple as removing it from - * its new index and placing it in the old index. - */ - const newRooms = [...rooms]; - const [newRoom] = newRooms.splice(newIndex, 1); - newRooms.splice(oldIndex, 0, newRoom); - - return { newIndex: oldIndex, newRooms }; -} - -export interface StickyRoomListResult { - /** - * The rooms result with the active sticky room applied - */ - roomsResult: RoomsResult; - /** - * Index of the active room in the room list. - */ - activeIndex: number | undefined; -} - -/** - * - Provides a list of rooms such that the active room is sticky i.e the active room is kept - * in the same index even when the order of rooms in the list changes. - * - Provides the index of the active room. - * @param rooms list of rooms - * @see {@link StickyRoomListResult} details what this hook returns.. - */ -export function useStickyRoomList(roomsResult: RoomsResult): StickyRoomListResult { - const [listState, setListState] = useState({ - activeIndex: getIndexByRoomId(roomsResult.rooms, SdkContextClass.instance.roomViewStore.getRoomId()!), - roomsResult: roomsResult, - }); - - const currentSpaceRef = useRef(SpaceStore.instance.activeSpace); - - const updateRoomsAndIndex = useCallback( - (newRoomId: string | null, isRoomChange: boolean = false) => { - setListState((current) => { - const activeRoomId = newRoomId ?? SdkContextClass.instance.roomViewStore.getRoomId(); - const newActiveIndex = getIndexByRoomId(roomsResult.rooms, activeRoomId!); - const oldIndex = current.activeIndex; - const { newIndex, newRooms } = getRoomsWithStickyRoom( - roomsResult.rooms, - oldIndex, - newActiveIndex, - isRoomChange, - ); - return { activeIndex: newIndex, roomsResult: { ...roomsResult, rooms: newRooms } }; - }); - }, - [roomsResult], - ); - - // Re-calculate the index when the active room has changed. - useDispatcher(dispatcher, (payload) => { - if (payload.action === Action.ActiveRoomChanged) updateRoomsAndIndex(payload.newRoomId, true); - }); - - // Re-calculate the index when the list of rooms has changed. - useEffect(() => { - let newRoomId: string | null = null; - let isRoomChange = false; - if (currentSpaceRef.current !== roomsResult.spaceId) { - /* - If the space has changed, we check if we can immediately set the active - index to the last opened room in that space. Otherwise, we might see a - flicker because of the delay between the space change event and - active room change dispatch. - */ - newRoomId = SpaceStore.instance.getLastSelectedRoomIdForSpace(roomsResult.spaceId); - isRoomChange = true; - currentSpaceRef.current = roomsResult.spaceId; - } - updateRoomsAndIndex(newRoomId, isRoomChange); - }, [roomsResult, updateRoomsAndIndex]); - - return listState; -} diff --git a/src/components/views/rooms/RoomListPanel/EmptyRoomList.tsx b/src/components/views/rooms/RoomListPanel/EmptyRoomList.tsx deleted file mode 100644 index 8c1d04b8c5..0000000000 --- a/src/components/views/rooms/RoomListPanel/EmptyRoomList.tsx +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { type JSX, type PropsWithChildren } from "react"; -import { Button } from "@vector-im/compound-web"; -import ChatIcon from "@vector-im/compound-design-tokens/assets/web/icons/chat"; -import RoomIcon from "@vector-im/compound-design-tokens/assets/web/icons/room"; -import { Flex } from "@element-hq/web-shared-components"; - -import type { RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; -import { _t } from "../../../../languageHandler"; -import { FilterKey } from "../../../../stores/room-list-v3/skip-list/filters"; -import { type PrimaryFilter } from "../../../viewmodels/roomlist/useFilteredRooms"; - -interface EmptyRoomListProps { - /** - * The view model for the room list - */ - vm: RoomListViewState; -} - -/** - * The empty state for the room list - */ -export function EmptyRoomList({ vm }: EmptyRoomListProps): JSX.Element | undefined { - // If there is no active primary filter, show the default empty state - if (!vm.activePrimaryFilter) return ; - - switch (vm.activePrimaryFilter.key) { - case FilterKey.FavouriteFilter: - return ( - - ); - case FilterKey.PeopleFilter: - return ( - - ); - case FilterKey.RoomsFilter: - return ( - - ); - case FilterKey.UnreadFilter: - return ( - - ); - case FilterKey.InvitesFilter: - return ( - - ); - case FilterKey.MentionsFilter: - return ( - - ); - case FilterKey.LowPriorityFilter: - return ( - - ); - default: - return undefined; - } -} - -interface GenericPlaceholderProps { - /** - * The title of the placeholder - */ - title: string; - /** - * The description of the placeholder - */ - description?: string; -} - -/** - * A generic placeholder for the room list - */ -function GenericPlaceholder({ title, description, children }: PropsWithChildren): JSX.Element { - return ( - - {title} - {description && {description}} - {children} - - ); -} - -interface DefaultPlaceholderProps { - /** - * The view model for the room list - */ - vm: RoomListViewState; -} - -/** - * The default empty state for the room list when no primary filter is active - * The user can create chat or room (if they have the permission) - */ -function DefaultPlaceholder({ vm }: DefaultPlaceholderProps): JSX.Element { - return ( - - - - {vm.canCreateRoom && ( - - )} - - - ); -} - -interface ActionPlaceholderProps { - filter: PrimaryFilter; - title: string; - action: string; -} - -/** - * A placeholder for the room list when a filter is active - * The user can take action to toggle the filter - */ -function ActionPlaceholder({ filter, title, action }: ActionPlaceholderProps): JSX.Element { - return ( - - - - ); -} diff --git a/src/components/views/rooms/RoomListPanel/RoomList.tsx b/src/components/views/rooms/RoomListPanel/RoomList.tsx deleted file mode 100644 index c946695b39..0000000000 --- a/src/components/views/rooms/RoomListPanel/RoomList.tsx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { useCallback, useRef, type JSX, useMemo } from "react"; -import { type Room } from "matrix-js-sdk/src/matrix"; -import { isEqual } from "lodash"; -import { - type VirtualizedListContext, - VirtualizedList, - type ScrollIntoViewOnChange, -} from "@element-hq/web-shared-components"; - -import { type RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; -import { _t } from "../../../../languageHandler"; -import { RoomListItemView } from "./RoomListItemView"; -import { type FilterKey } from "../../../../stores/room-list-v3/skip-list/filters"; -import { getKeyBindingsManager } from "../../../../KeyBindingsManager"; -import { KeyBindingAction } from "../../../../accessibility/KeyboardShortcuts"; -import { Landmark, LandmarkNavigation } from "../../../../accessibility/LandmarkNavigation"; - -interface RoomListProps { - /** - * The view model state for the room list. - */ - vm: RoomListViewState; -} - -type Context = { - spaceId: string; - filterKeys: FilterKey[] | undefined; -}; - -/** - * Height of a single room list item - */ -const ROOM_LIST_ITEM_HEIGHT = 48; -/** - * Amount to extend the top and bottom of the viewport by. - * From manual testing and user feedback 25 items is reported to be enough to avoid blank space when using the mouse wheel, - * and the trackpad scrolling at a slow to moderate speed where you can still see/read the content. - * Using the trackpad to sling through a large percentage of the list quickly will still show blank space. - * We would likely need to simplify the item content to improve this case. - */ -const EXTENDED_VIEWPORT_HEIGHT = 25 * ROOM_LIST_ITEM_HEIGHT; -/** - * A virtualized list of rooms. - */ -export function RoomList({ vm: { roomsResult, activeIndex } }: RoomListProps): JSX.Element { - const lastSpaceId = useRef(undefined); - const lastFilterKeys = useRef(undefined); - const roomCount = roomsResult.rooms.length; - const getItemComponent = useCallback( - ( - index: number, - item: Room, - context: VirtualizedListContext, - onFocus: (item: Room, e: React.FocusEvent) => void, - ): JSX.Element => { - const itemKey = item.roomId; - const isRovingItem = itemKey === context.tabIndexKey; - const isFocused = isRovingItem && context.focused; - const isSelected = activeIndex === index; - return ( - - ); - }, - [activeIndex, roomCount], - ); - - const getItemKey = useCallback((item: Room): string => { - return item.roomId; - }, []); - - const scrollIntoViewOnChange = useCallback>( - (params) => { - const { spaceId, filterKeys } = params.context.context; - const shouldScrollIndexIntoView = - lastSpaceId.current !== spaceId || !isEqual(lastFilterKeys.current, filterKeys); - lastFilterKeys.current = filterKeys; - lastSpaceId.current = spaceId; - - if (shouldScrollIndexIntoView) { - return { - align: `start`, - index: activeIndex || 0, - behavior: "auto", - }; - } - return false; - }, - [activeIndex], - ); - - const keyDownCallback = useCallback((ev: React.KeyboardEvent) => { - const navAction = getKeyBindingsManager().getNavigationAction(ev); - if (navAction === KeyBindingAction.NextLandmark || navAction === KeyBindingAction.PreviousLandmark) { - LandmarkNavigation.findAndFocusNextLandmark( - Landmark.ROOM_LIST, - navAction === KeyBindingAction.PreviousLandmark, - ); - ev.stopPropagation(); - ev.preventDefault(); - return; - } - }, []); - const context = useMemo( - () => ({ spaceId: roomsResult.spaceId, filterKeys: roomsResult.filterKeys }), - [roomsResult.spaceId, roomsResult.filterKeys], - ); - - return ( - true} - onKeyDown={keyDownCallback} - increaseViewportBy={{ - bottom: EXTENDED_VIEWPORT_HEIGHT, - top: EXTENDED_VIEWPORT_HEIGHT, - }} - /> - ); -} diff --git a/src/components/views/rooms/RoomListPanel/RoomListItemContextMenuView.tsx b/src/components/views/rooms/RoomListPanel/RoomListItemContextMenuView.tsx deleted file mode 100644 index f3ba4167e7..0000000000 --- a/src/components/views/rooms/RoomListPanel/RoomListItemContextMenuView.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { type Room } from "matrix-js-sdk/src/matrix"; -import { type JSX, type PropsWithChildren } from "react"; -import { ContextMenu } from "@vector-im/compound-web"; -import React from "react"; - -import { _t } from "../../../../languageHandler"; -import { MoreOptionContent } from "./RoomListItemMenuView"; -import { useRoomListItemMenuViewModel } from "../../../viewmodels/roomlist/RoomListItemMenuViewModel"; - -interface RoomListItemContextMenuViewProps { - /** - * The room to display the menu for. - */ - room: Room; -} - -/** - * A view for the room list item context menu. - */ -export function RoomListItemContextMenuView({ - room, - children, -}: PropsWithChildren): JSX.Element { - const vm = useRoomListItemMenuViewModel(room); - - return ( - - - - ); -} diff --git a/src/components/views/rooms/RoomListPanel/RoomListItemMenuView.tsx b/src/components/views/rooms/RoomListPanel/RoomListItemMenuView.tsx deleted file mode 100644 index 7c5dd5ba1a..0000000000 --- a/src/components/views/rooms/RoomListPanel/RoomListItemMenuView.tsx +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { type JSX, useState } from "react"; -import { IconButton, Menu, MenuItem, Separator, ToggleMenuItem } from "@vector-im/compound-web"; -import { - MarkAsReadIcon, - MarkAsUnreadIcon, - FavouriteIcon, - ArrowDownIcon, - UserAddIcon, - LinkIcon, - LeaveIcon, - OverflowHorizontalIcon, - NotificationsSolidIcon, - NotificationsOffSolidIcon, - CheckIcon, -} from "@vector-im/compound-design-tokens/assets/web/icons"; -import { type Room } from "matrix-js-sdk/src/matrix"; -import { Flex } from "@element-hq/web-shared-components"; -import classNames from "classnames"; - -import { _t } from "../../../../languageHandler"; -import { - type RoomListItemMenuViewState, - useRoomListItemMenuViewModel, -} from "../../../viewmodels/roomlist/RoomListItemMenuViewModel"; -import { RoomNotifState } from "../../../../RoomNotifs"; - -interface RoomListItemMenuViewProps { - /** - * Additional class name for the root element. - */ - className?: string; - - /** - * The room to display the menu for. - */ - room: Room; -} - -/** - * A view for the room list item menu. - */ -export function RoomListItemMenuView({ room, className }: RoomListItemMenuViewProps): JSX.Element { - const vm = useRoomListItemMenuViewModel(room); - - return ( - - {vm.showMoreOptionsMenu && } - {vm.showNotificationMenu && } - - ); -} - -interface MoreOptionsMenuProps { - /** - * The view model state for the menu. - */ - vm: RoomListItemMenuViewState; -} - -/** - * The more options menu for the room list item. - */ -function MoreOptionsMenu({ vm }: MoreOptionsMenuProps): JSX.Element { - const [open, setOpen] = useState(false); - - return ( - - - - } - > - - - ); -} - -interface MoreOptionContentProps { - /** - * The view model state for the menu. - */ - vm: RoomListItemMenuViewState; -} - -export function MoreOptionContent({ vm }: MoreOptionContentProps): JSX.Element { - return ( -
e.stopPropagation()} - > - {vm.canMarkAsRead && ( - evt.stopPropagation()} - hideChevron={true} - /> - )} - {vm.canMarkAsUnread && ( - evt.stopPropagation()} - hideChevron={true} - /> - )} - evt.stopPropagation()} - /> - evt.stopPropagation()} - /> - {vm.canInvite && ( - evt.stopPropagation()} - hideChevron={true} - /> - )} - {vm.canCopyRoomLink && ( - evt.stopPropagation()} - hideChevron={true} - /> - )} - - evt.stopPropagation()} - hideChevron={true} - /> -
- ); -} - -interface NotificationMenuProps { - /** - * The view model state for the menu. - */ - vm: RoomListItemMenuViewState; -} - -function NotificationMenu({ vm }: NotificationMenuProps): JSX.Element { - const [open, setOpen] = useState(false); - const checkComponent = ; - - return ( - - {vm.isNotificationMute ? : } - - } - > -
e.stopPropagation()} - > - vm.setRoomNotifState(RoomNotifState.AllMessages)} - onClick={(evt) => evt.stopPropagation()} - > - {vm.isNotificationAllMessage && checkComponent} - - vm.setRoomNotifState(RoomNotifState.AllMessagesLoud)} - onClick={(evt) => evt.stopPropagation()} - > - {vm.isNotificationAllMessageLoud && checkComponent} - - vm.setRoomNotifState(RoomNotifState.MentionsOnly)} - onClick={(evt) => evt.stopPropagation()} - > - {vm.isNotificationMentionOnly && checkComponent} - - vm.setRoomNotifState(RoomNotifState.Mute)} - onClick={(evt) => evt.stopPropagation()} - > - {vm.isNotificationMute && checkComponent} - -
-
- ); -} diff --git a/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx b/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx deleted file mode 100644 index d87da9c034..0000000000 --- a/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { type JSX, memo, useEffect, useRef } from "react"; -import { type Room } from "matrix-js-sdk/src/matrix"; -import classNames from "classnames"; -import { Flex } from "@element-hq/web-shared-components"; - -import { useRoomListItemViewModel } from "../../../viewmodels/roomlist/RoomListItemViewModel"; -import { RoomListItemMenuView } from "./RoomListItemMenuView"; -import { NotificationDecoration } from "../NotificationDecoration"; -import { RoomAvatarView } from "../../avatars/RoomAvatarView"; -import { RoomListItemContextMenuView } from "./RoomListItemContextMenuView"; - -interface RoomListItemViewProps extends Omit, "onFocus"> { - /** - * The room to display - */ - room: Room; - /** - * Whether the room is selected - */ - isSelected: boolean; - /** - * Whether the room is focused - */ - isFocused: boolean; - /** - * A callback that indicates the item has received focus - */ - onFocus: (room: Room, e: React.FocusEvent) => void; - /** - * The index of the room in the list - */ - roomIndex: number; - /** - * The total number of rooms in the list - */ - roomCount: number; -} - -/** - * An item in the room list - */ -export const RoomListItemView = memo(function RoomListItemView({ - room, - isSelected, - isFocused, - onFocus, - roomIndex: index, - roomCount: count, - ...props -}: RoomListItemViewProps): JSX.Element { - const ref = useRef(null); - const vm = useRoomListItemViewModel(room); - - useEffect(() => { - if (isFocused) { - ref.current?.focus({ preventScroll: true, focusVisible: true }); - } - }, [isFocused]); - - const content = ( - vm.openRoom()} - onFocus={(e: React.FocusEvent) => onFocus(room, e)} - tabIndex={isFocused ? 0 : -1} - {...props} - > - - - {/* We truncate the room name when too long. Title here is to show the full name on hover */} -
-
- {vm.name} -
- {vm.messagePreview && ( -
- {vm.messagePreview} -
- )} -
- {vm.showHoverMenu && } - - {/* aria-hidden because we summarise the unread count/notification status in a11yLabel variable */} - {vm.showNotificationDecoration && ( - - )} -
-
- ); - - if (!vm.showContextMenu) return content; - return {content}; -}); diff --git a/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx b/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx deleted file mode 100644 index 44f19a86da..0000000000 --- a/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { type JSX, useEffect, useId, useRef, useState, type RefObject } from "react"; -import { ChatFilter, IconButton } from "@vector-im/compound-web"; -import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down"; -import { Flex } from "@element-hq/web-shared-components"; - -import type { RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; -import { _t } from "../../../../languageHandler"; - -interface RoomListPrimaryFiltersProps { - /** - * The view model for the room list - */ - vm: RoomListViewState; -} - -/** - * The primary filters for the room list - */ -export function RoomListPrimaryFilters({ vm }: RoomListPrimaryFiltersProps): JSX.Element { - const id = useId(); - const [isExpanded, setIsExpanded] = useState(false); - - const { ref, isWrapping: displayChevron, wrappingIndex } = useCollapseFilters(isExpanded); - const filters = useVisibleFilters(vm.primaryFilters, wrappingIndex); - - return ( - - {displayChevron && ( - setIsExpanded((_expanded) => !_expanded)} - > - - - )} - - {filters.map((filter, i) => ( - filter.toggle()}> - {filter.name} - - ))} - - - ); -} - -/** - * A hook to manage the wrapping of filters in the room list. - * It observes the filter list and hides filters that are wrapping when the list is not expanded. - * @param isExpanded - * @returns an object containing: - * - `ref`: a ref to put on the filter list element - * - `isWrapping`: a boolean indicating if the filters are wrapping - * - `wrappingIndex`: the index of the first filter that is wrapping - */ -function useCollapseFilters( - isExpanded: boolean, -): { ref: RefObject; isWrapping: boolean; wrappingIndex: number } { - const ref = useRef(null); - const [isWrapping, setIsWrapping] = useState(false); - const [wrappingIndex, setWrappingIndex] = useState(-1); - - useEffect(() => { - if (!ref.current) return; - - const hideFilters = (list: Element): void => { - let isWrapping = false; - Array.from(list.children).forEach((node, i): void => { - const child = node as HTMLElement; - const wrappingClass = "mx_RoomListPrimaryFilters_wrapping"; - child.setAttribute("aria-hidden", "false"); - child.classList.remove(wrappingClass); - - // If the filter list is expanded, all filters are visible - if (isExpanded) return; - - // If the previous element is on the left element of the current one, it means that the filter is wrapping - const previousSibling = child.previousElementSibling as HTMLElement | null; - if (previousSibling && child.offsetLeft <= previousSibling.offsetLeft) { - if (!isWrapping) setWrappingIndex(i); - isWrapping = true; - } - - // If the filter is wrapping, we hide it - child.classList.toggle(wrappingClass, isWrapping); - child.setAttribute("aria-hidden", isWrapping.toString()); - }); - - if (!isWrapping) setWrappingIndex(-1); - setIsWrapping(isExpanded || isWrapping); - }; - - hideFilters(ref.current); - const observer = new ResizeObserver((entries) => entries.forEach((entry) => hideFilters(entry.target))); - - observer.observe(ref.current); - return () => { - observer.disconnect(); - }; - }, [isExpanded]); - - return { ref, isWrapping, wrappingIndex }; -} - -/** - * A hook to sort the filters by active state. - * The list is sorted if the current filter index is greater than or equal to the wrapping index. - * If the wrapping index is -1, the filters are not sorted. - * - * @param filters - the list of filters to sort. - * @param wrappingIndex - the index of the first filter that is wrapping. - */ -export function useVisibleFilters( - filters: RoomListViewState["primaryFilters"], - wrappingIndex: number, -): RoomListViewState["primaryFilters"] { - // By default, the filters are not sorted - const [sortedFilters, setSortedFilters] = useState(filters); - - useEffect(() => { - const isActiveFilterWrapping = filters.findIndex((f) => f.active) >= wrappingIndex; - // If the active filter is not wrapping, we don't need to sort the filters - if (!isActiveFilterWrapping || wrappingIndex === -1) { - setSortedFilters(filters); - return; - } - - // Sort the filters with the current filter at first position - setSortedFilters( - filters.slice().sort((filterA, filterB) => { - // If the filter is active, it should be at the top of the list - if (filterA.active && !filterB.active) return -1; - if (!filterA.active && filterB.active) return 1; - // If both filters are active or not, keep their original order - return 0; - }), - ); - }, [filters, wrappingIndex]); - - return sortedFilters; -} diff --git a/src/components/views/rooms/RoomListPanel/RoomListView.tsx b/src/components/views/rooms/RoomListPanel/RoomListView.tsx index b29affc0be..50dd83e505 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListView.tsx @@ -5,33 +5,47 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; +import React, { useCallback, type JSX, type ReactNode } from "react"; +import { + RoomListView as SharedRoomListView, + useCreateAutoDisposedViewModel, + type Room as SharedRoom, +} from "@element-hq/web-shared-components"; +import { type Room } from "matrix-js-sdk/src/matrix"; -import { useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewModel"; -import { RoomList } from "./RoomList"; -import { EmptyRoomList } from "./EmptyRoomList"; -import { RoomListPrimaryFilters } from "./RoomListPrimaryFilters"; +import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext"; +import { RoomAvatarView } from "../../avatars/RoomAvatarView"; +import { getKeyBindingsManager } from "../../../../KeyBindingsManager"; +import { KeyBindingAction } from "../../../../accessibility/KeyboardShortcuts"; +import { Landmark, LandmarkNavigation } from "../../../../accessibility/LandmarkNavigation"; +import { RoomListViewViewModel } from "../../../../viewmodels/room-list/RoomListViewViewModel"; /** - * Host the room list and the (future) room filters + * RoomListView component using shared components with proper MVVM pattern. */ export function RoomListView(): JSX.Element { - const vm = useRoomListViewModel(); - const isRoomListEmpty = vm.roomsResult.rooms.length === 0; - let listBody; - if (vm.isLoadingRooms) { - listBody =
; - } else if (isRoomListEmpty) { - listBody = ; - } else { - listBody = ; - } - return ( - <> -
- -
- {listBody} - - ); + const matrixClient = useMatrixClientContext(); + + // Create and auto-dispose ViewModel instance + const vm = useCreateAutoDisposedViewModel(() => new RoomListViewViewModel({ client: matrixClient })); + + // Render avatar for each room - memoized to prevent re-renders + const renderAvatar = useCallback((room: SharedRoom): ReactNode => { + return ; + }, []); + + // Handle keyboard navigation for landmarks + const onKeyDown = useCallback((ev: React.KeyboardEvent) => { + const navAction = getKeyBindingsManager().getNavigationAction(ev); + if (navAction === KeyBindingAction.NextLandmark || navAction === KeyBindingAction.PreviousLandmark) { + LandmarkNavigation.findAndFocusNextLandmark( + Landmark.ROOM_LIST, + navAction === KeyBindingAction.PreviousLandmark, + ); + ev.stopPropagation(); + ev.preventDefault(); + } + }, []); + + return ; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4f6fe35959..b498e20d72 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -12,16 +12,6 @@ "other": "%(count)s unread messages including mentions." }, "recent_rooms": "Recent rooms", - "room_messsage_not_sent": "Open room %(roomName)s with an unsent message.", - "room_n_unread_invite": "Open room %(roomName)s invitation.", - "room_n_unread_messages": { - "one": "Open room %(roomName)s with 1 unread message.", - "other": "Open room %(roomName)s with %(count)s unread messages." - }, - "room_n_unread_messages_mentions": { - "one": "Open room %(roomName)s with 1 unread mention.", - "other": "Open room %(roomName)s with %(count)s unread messages including mentions." - }, "room_name": "Room %(name)s", "room_status_bar": "Room status bar", "seek_bar_label": "Audio seek bar", @@ -1717,7 +1707,6 @@ "class_global": "Global", "class_other": "Other", "default": "Default", - "default_settings": "Match default settings", "email_pusher_app_display_name": "Email Notifications", "enable_prompt_toast_description": "Enable desktop notifications", "enable_prompt_toast_title": "Notifications", @@ -1736,8 +1725,7 @@ "mentions_and_keywords_description": "Get notified only with mentions and keywords as set up in your
settings", "mentions_keywords": "Mentions and keywords", "message_didnt_send": "Message didn't send. Click for info.", - "mute_description": "You won't get any notifications", - "mute_room": "Mute room" + "mute_description": "You won't get any notifications" }, "notifier": { "m.key.verification.request": "%(name)s is requesting verification" @@ -2154,37 +2142,9 @@ "add_space_label": "Add space", "breadcrumbs_empty": "No recently visited rooms", "breadcrumbs_label": "Recently visited rooms", - "collapse_filters": "Collapse filter list", - "empty": { - "no_chats": "No chats yet", - "no_chats_description": "Get started by messaging someone or by creating a room", - "no_chats_description_no_room_rights": "Get started by messaging someone", - "no_favourites": "You don't have favourite chats yet", - "no_favourites_description": "You can add a chat to your favourites in the chat settings", - "no_invites": "You don't have any unread invites", - "no_lowpriority": "You don't have any low priority rooms", - "no_mentions": "You don't have any unread mentions", - "no_people": "You don’t have direct chats with anyone yet", - "no_people_description": "You can deselect filters in order to see your other chats", - "no_rooms": "You’re not in any room yet", - "no_rooms_description": "You can deselect filters in order to see your other chats", - "no_unread": "Congrats! You don’t have any unread messages", - "show_activity": "See all activity", - "show_chats": "Show all chats" - }, - "expand_filters": "Expand filter list", "failed_add_tag": "Failed to add tag %(tagName)s to room", "failed_remove_tag": "Failed to remove tag %(tagName)s from room", "failed_set_dm_tag": "Failed to set direct message tag", - "filters": { - "favourite": "Favourites", - "invites": "Invites", - "low_priority": "Low priority", - "mentions": "Mentions", - "people": "People", - "rooms": "Rooms", - "unread": "Unreads" - }, "home_menu_label": "Home options", "join_public_room_label": "Join public room", "joining_rooms_status": { @@ -2193,23 +2153,13 @@ }, "list_title": "Room list", "more_options": { - "copy_link": "Copy room link", - "favourited": "Favourited", - "leave_room": "Leave room", - "low_priority": "Low priority", - "mark_read": "Mark as read", - "mark_unread": "Mark as unread" + "leave_room": "Leave room" }, "notification_options": "Notification options", - "primary_filters": "Room list filters", "redacting_messages_status": { "one": "Currently removing messages in %(count)s room", "other": "Currently removing messages in %(count)s rooms" }, - "room": { - "more_options": "More Options", - "open_room": "Open room %(roomName)s" - }, "show_less": "Show less", "show_n_more": { "one": "Show %(count)s more", diff --git a/src/viewmodels/room-list/RoomListHeaderViewModel.ts b/src/viewmodels/room-list/RoomListHeaderViewModel.ts index fee0c954c3..e99268190c 100644 --- a/src/viewmodels/room-list/RoomListHeaderViewModel.ts +++ b/src/viewmodels/room-list/RoomListHeaderViewModel.ts @@ -26,11 +26,11 @@ import { showSpaceSettings, } from "../../utils/space"; import type { ViewRoomPayload } from "../../dispatcher/payloads/ViewRoomPayload"; -import { createRoom, hasCreateRoomRights } from "../../components/viewmodels/roomlist/utils"; import SettingsStore from "../../settings/SettingsStore"; import RoomListStoreV3 from "../../stores/room-list-v3/RoomListStoreV3"; import { SortingAlgorithm } from "../../stores/room-list-v3/skip-list/sorters"; import { SettingLevel } from "../../settings/SettingLevel"; +import { createRoom, hasCreateRoomRights } from "./utils"; export interface Props { /** diff --git a/src/viewmodels/room-list/RoomListItemViewModel.ts b/src/viewmodels/room-list/RoomListItemViewModel.ts new file mode 100644 index 0000000000..d7ce4e6e7f --- /dev/null +++ b/src/viewmodels/room-list/RoomListItemViewModel.ts @@ -0,0 +1,327 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { + BaseViewModel, + RoomNotifState, + type RoomListItemSnapshot, + type RoomListItemActions, +} from "@element-hq/web-shared-components"; +import { RoomEvent } from "matrix-js-sdk/src/matrix"; +import { CallType } from "matrix-js-sdk/src/webrtc/call"; + +import type { Room, MatrixClient } from "matrix-js-sdk/src/matrix"; +import type { RoomNotificationState } from "../../stores/notifications/RoomNotificationState"; +import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; +import { NotificationStateEvents } from "../../stores/notifications/NotificationState"; +import { MessagePreviewStore } from "../../stores/room-list/MessagePreviewStore"; +import { UPDATE_EVENT } from "../../stores/AsyncStore"; +import { DefaultTagID } from "../../stores/room-list/models"; +import DMRoomMap from "../../utils/DMRoomMap"; +import SettingsStore from "../../settings/SettingsStore"; +import { NotificationLevel } from "../../stores/notifications/NotificationLevel"; +import { hasAccessToNotificationMenu, hasAccessToOptionsMenu } from "./utils"; +import { EchoChamber } from "../../stores/local-echo/EchoChamber"; +import { RoomNotifState as ElementRoomNotifState } from "../../RoomNotifs"; +import { shouldShowComponent } from "../../customisations/helpers/UIComponents"; +import { UIComponent } from "../../settings/UIFeature"; +import { CallStore, CallStoreEvent } from "../../stores/CallStore"; +import { clearRoomNotification, setMarkedUnreadState } from "../../utils/notifications"; +import { tagRoom } from "../../utils/room/tagRoom"; +import dispatcher from "../../dispatcher/dispatcher"; +import { Action } from "../../dispatcher/actions"; +import type { ViewRoomPayload } from "../../dispatcher/payloads/ViewRoomPayload"; +import PosthogTrackers from "../../PosthogTrackers"; + +interface RoomItemProps { + room: Room; + client: MatrixClient; +} + +/** + * View model for an individual room list item. + * Manages per-room subscriptions and updates only when this specific room's data changes. + * Implements RoomListItemActions to provide interaction callbacks. + */ +export class RoomListItemViewModel + extends BaseViewModel + implements RoomListItemActions +{ + private notifState: RoomNotificationState; + + public constructor(props: RoomItemProps) { + // Get notification state first so we can generate a complete initial snapshot + const notifState = RoomNotificationStateStore.instance.getRoomState(props.room); + const initialItem = RoomListItemViewModel.generateItemSync(props.room, props.client, notifState); + super(props, initialItem); + + this.notifState = notifState; + + // Subscribe to notification state changes for this room + this.disposables.trackListener(this.notifState, NotificationStateEvents.Update, this.onNotificationChanged); + + // Subscribe to message preview changes (will filter to this room) + this.disposables.trackListener(MessagePreviewStore.instance, UPDATE_EVENT, this.onMessagePreviewChanged); + + // Subscribe to settings changes for message preview toggle + const settingsWatchRef = SettingsStore.watchSetting( + "RoomList.showMessagePreview", + null, + this.onMessagePreviewSettingChanged, + ); + this.disposables.track(() => { + SettingsStore.unwatchSetting(settingsWatchRef); + }); + + // Subscribe to call state changes + this.disposables.trackListener(CallStore.instance, CallStoreEvent.ConnectedCalls, this.onCallStateChanged); + + // Subscribe to room-specific events + this.disposables.trackListener(props.room, RoomEvent.Name, this.onRoomChanged); + this.disposables.trackListener(props.room, RoomEvent.Tags, this.onRoomChanged); + + // Load message preview asynchronously (sync data is already complete) + void this.loadAndSetMessagePreview(); + } + + private onNotificationChanged = (): void => { + this.updateItem(); + }; + + private onMessagePreviewChanged = (): void => { + void this.loadAndSetMessagePreview(); + }; + + private onMessagePreviewSettingChanged = (): void => { + void this.loadAndSetMessagePreview(); + }; + + private onCallStateChanged = (): void => { + // Only update if call state for this room actually changed + const call = CallStore.instance.getCall(this.props.room.roomId); + const currentCallType = this.snapshot.current.notification.callType; + const newCallType = + call && call.participants.size > 0 ? (call.callType === CallType.Voice ? "voice" : "video") : undefined; + + if (currentCallType !== newCallType) { + this.updateItem(); + } + }; + + private onRoomChanged = (): void => { + this.updateItem(); + }; + + /** + * Update the item snapshot with current sync data. + * Preserves the message preview which is managed separately. + */ + private updateItem(): void { + const newItem = RoomListItemViewModel.generateItemSync(this.props.room, this.props.client, this.notifState); + // Preserve message preview - it's managed separately by loadAndSetMessagePreview + this.snapshot.set({ ...newItem, messagePreview: this.snapshot.current.messagePreview }); + } + + private getMessagePreviewTag(): string { + const isDm = Boolean(DMRoomMap.shared().getUserIdForRoomId(this.props.room.roomId)); + return isDm ? DefaultTagID.DM : DefaultTagID.Untagged; + } + + /** + * Load the message preview for this room if enabled. + * Returns undefined if previews are disabled or couldn't be loaded. + */ + private async loadMessagePreview(): Promise { + const shouldShowMessagePreview = SettingsStore.getValue("RoomList.showMessagePreview"); + if (!shouldShowMessagePreview) { + return undefined; + } + + const messagePreviewTag = this.getMessagePreviewTag(); + const preview = await MessagePreviewStore.instance.getPreviewForRoom(this.props.room, messagePreviewTag); + return preview?.text; + } + + /** + * Load and set the message preview if it differs from current. + */ + private async loadAndSetMessagePreview(): Promise { + const messagePreview = await this.loadMessagePreview(); + if (messagePreview !== this.snapshot.current.messagePreview) { + this.snapshot.merge({ messagePreview }); + } + } + + /** + * Generate a complete RoomListItem with all synchronous data. + * Message preview is loaded separately to avoid blocking initial render. + */ + private static generateItemSync( + room: Room, + client: MatrixClient, + notifState: RoomNotificationState, + ): RoomListItemSnapshot { + // Get room tags for menu state + const roomTags = room.tags; + const isDm = Boolean(DMRoomMap.shared().getUserIdForRoomId(room.roomId)); + + // Message preview will be loaded asynchronously and updated separately + const messagePreview = undefined; + + const isFavourite = Boolean(roomTags[DefaultTagID.Favourite]); + const isLowPriority = Boolean(roomTags[DefaultTagID.LowPriority]); + const isArchived = Boolean(roomTags[DefaultTagID.Archived]); + + // More options menu state + const showMoreOptionsMenu = hasAccessToOptionsMenu(room); + const showNotificationMenu = hasAccessToNotificationMenu(room, client.isGuest(), isArchived); + + // Notification levels + const canMarkAsRead = notifState.level > NotificationLevel.None; + const canMarkAsUnread = !canMarkAsRead && !isArchived; + + const canInvite = room.canInvite(client.getUserId()!) && !isDm && shouldShowComponent(UIComponent.InviteUsers); + const canCopyRoomLink = !isDm; + + // Get the current room notification state from EchoChamber + const echoChamber = EchoChamber.forRoom(room); + const elementRoomNotifState = echoChamber.notificationVolume; + + // Convert element-web RoomNotifState to shared-components RoomNotifState + let roomNotifState: RoomNotifState; + switch (elementRoomNotifState) { + case ElementRoomNotifState.AllMessages: + roomNotifState = RoomNotifState.AllMessages; + break; + case ElementRoomNotifState.AllMessagesLoud: + roomNotifState = RoomNotifState.AllMessagesLoud; + break; + case ElementRoomNotifState.MentionsOnly: + roomNotifState = RoomNotifState.MentionsOnly; + break; + case ElementRoomNotifState.Mute: + roomNotifState = RoomNotifState.Mute; + break; + default: + roomNotifState = RoomNotifState.AllMessages; + } + + const isNotificationMute = elementRoomNotifState === ElementRoomNotifState.Mute; + + // Video room and call state tracking + const call = CallStore.instance.getCall(room.roomId); + const participantCount = call?.participants.size ?? 0; + const hasParticipantsInCall = participantCount > 0; + const callType = + call?.callType === CallType.Voice ? "voice" : call?.callType === CallType.Video ? "video" : undefined; + + return { + id: room.roomId, + room, + name: room.name, + isBold: notifState.hasAnyNotificationOrActivity, + messagePreview, + notification: { + hasAnyNotificationOrActivity: notifState.hasAnyNotificationOrActivity || hasParticipantsInCall, + isUnsentMessage: notifState.isUnsentMessage, + invited: notifState.invited, + isMention: notifState.isMention, + isActivityNotification: notifState.isActivityNotification, + isNotification: notifState.isNotification, + hasUnreadCount: notifState.hasUnreadCount, + count: notifState.count, + muted: isNotificationMute, + callType: hasParticipantsInCall ? callType : undefined, + }, + showMoreOptionsMenu, + showNotificationMenu, + isFavourite, + isLowPriority, + canInvite, + canCopyRoomLink, + canMarkAsRead, + canMarkAsUnread, + roomNotifState, + }; + } + + public onOpenRoom = (): void => { + dispatcher.dispatch({ + action: Action.ViewRoom, + room_id: this.props.room.roomId, + metricsTrigger: "RoomList", + }); + }; + + public onMarkAsRead = async (): Promise => { + await clearRoomNotification(this.props.room, this.props.client); + PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuMarkRead"); + }; + + public onMarkAsUnread = async (): Promise => { + await setMarkedUnreadState(this.props.room, this.props.client, true); + PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuMarkUnread"); + }; + + public onToggleFavorite = (): void => { + tagRoom(this.props.room, DefaultTagID.Favourite); + PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuFavouriteToggle"); + }; + + public onToggleLowPriority = (): void => { + tagRoom(this.props.room, DefaultTagID.LowPriority); + }; + + public onInvite = (): void => { + dispatcher.dispatch({ + action: "view_invite", + roomId: this.props.room.roomId, + }); + PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuInviteItem"); + }; + + public onCopyRoomLink = (): void => { + dispatcher.dispatch({ + action: "copy_room", + room_id: this.props.room.roomId, + }); + }; + + public onLeaveRoom = (): void => { + const isArchived = Boolean(this.props.room.tags[DefaultTagID.Archived]); + dispatcher.dispatch({ + action: isArchived ? "forget_room" : "leave_room", + room_id: this.props.room.roomId, + }); + PosthogTrackers.trackInteraction("WebRoomListRoomTileContextMenuLeaveItem"); + }; + + public onSetRoomNotifState = (notifState: RoomNotifState): void => { + // Convert shared-components RoomNotifState to element-web RoomNotifState + let elementNotifState: ElementRoomNotifState; + switch (notifState) { + case "all_messages": + elementNotifState = ElementRoomNotifState.AllMessages; + break; + case "all_messages_loud": + elementNotifState = ElementRoomNotifState.AllMessagesLoud; + break; + case "mentions_only": + elementNotifState = ElementRoomNotifState.MentionsOnly; + break; + case "mute": + elementNotifState = ElementRoomNotifState.Mute; + break; + default: + elementNotifState = ElementRoomNotifState.AllMessages; + } + + // Set the notification state using EchoChamber + const echoChamber = EchoChamber.forRoom(this.props.room); + echoChamber.notificationVolume = elementNotifState; + }; +} diff --git a/src/viewmodels/room-list/RoomListViewViewModel.ts b/src/viewmodels/room-list/RoomListViewViewModel.ts new file mode 100644 index 0000000000..a3618b93af --- /dev/null +++ b/src/viewmodels/room-list/RoomListViewViewModel.ts @@ -0,0 +1,450 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { + BaseViewModel, + type RoomListSnapshot, + type FilterId, + type RoomListViewActions, + type RoomListViewState, +} from "@element-hq/web-shared-components"; +import { type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; + +import { Action } from "../../dispatcher/actions"; +import dispatcher from "../../dispatcher/dispatcher"; +import { type ViewRoomDeltaPayload } from "../../dispatcher/payloads/ViewRoomDeltaPayload"; +import { type ViewRoomPayload } from "../../dispatcher/payloads/ViewRoomPayload"; +import SpaceStore from "../../stores/spaces/SpaceStore"; +import RoomListStoreV3, { RoomListStoreV3Event, type RoomsResult } from "../../stores/room-list-v3/RoomListStoreV3"; +import { FilterKey } from "../../stores/room-list-v3/skip-list/filters"; +import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; +import { RoomListItemViewModel } from "./RoomListItemViewModel"; +import { SdkContextClass } from "../../contexts/SDKContext"; +import { hasCreateRoomRights } from "./utils"; + +interface RoomListViewViewModelProps { + client: MatrixClient; +} + +const filterKeyToIdMap: Map = new Map([ + [FilterKey.UnreadFilter, "unread"], + [FilterKey.PeopleFilter, "people"], + [FilterKey.RoomsFilter, "rooms"], + [FilterKey.FavouriteFilter, "favourite"], + [FilterKey.MentionsFilter, "mentions"], + [FilterKey.InvitesFilter, "invites"], + [FilterKey.LowPriorityFilter, "low_priority"], +]); + +export class RoomListViewViewModel + extends BaseViewModel + implements RoomListViewActions +{ + // State tracking + private activeFilter: FilterKey | undefined = undefined; + private roomsResult: RoomsResult; + private lastActiveRoomIndex: number | undefined = undefined; + + // Child view model management + private roomItemViewModels = new Map(); + private roomsMap = new Map(); + + public constructor(props: RoomListViewViewModelProps) { + const activeSpace = SpaceStore.instance.activeSpaceRoom; + + // Get initial rooms + const roomsResult = RoomListStoreV3.instance.getSortedRoomsInActiveSpace(undefined); + const canCreateRoom = hasCreateRoomRights(props.client, activeSpace); + const filterIds = [...filterKeyToIdMap.values()]; + + super(props, { + // Initial view state - start with empty, will populate in async init + isLoadingRooms: RoomListStoreV3.instance.isLoadingRooms, + isRoomListEmpty: roomsResult.rooms.length === 0, + filterIds, + activeFilterId: undefined, + roomListState: { + activeRoomIndex: undefined, + spaceId: roomsResult.spaceId, + filterKeys: undefined, + }, + roomIds: roomsResult.rooms.map((room) => room.roomId), + canCreateRoom, + }); + + this.roomsResult = roomsResult; + + // Build initial roomsMap from roomsResult + this.updateRoomsMap(roomsResult); + + // Subscribe to room list updates + this.disposables.trackListener( + RoomListStoreV3.instance, + RoomListStoreV3Event.ListsUpdate as any, + this.onListsUpdate, + ); + + // Subscribe to room list loaded + this.disposables.trackListener( + RoomListStoreV3.instance, + RoomListStoreV3Event.ListsLoaded as any, + this.onListsLoaded, + ); + + // Subscribe to active room changes to update selected room + const dispatcherRef = dispatcher.register(this.onDispatch); + this.disposables.track(() => { + dispatcher.unregister(dispatcherRef); + }); + + // Track cleanup of all child view models + this.disposables.track(() => { + for (const viewModel of this.roomItemViewModels.values()) { + viewModel.dispose(); + } + this.roomItemViewModels.clear(); + }); + } + + public onToggleFilter = (filterId: FilterId): void => { + // Find the FilterKey by matching the filter ID + let filterKey: FilterKey | undefined = undefined; + for (const [key, id] of filterKeyToIdMap.entries()) { + if (id === filterId) { + filterKey = key; + break; + } + } + + if (filterKey === undefined) return; + + // Toggle the filter - if it's already active, deactivate it + const newFilter = this.activeFilter === filterKey ? undefined : filterKey; + this.activeFilter = newFilter; + + // Update rooms result with new filter + const filterKeys = this.activeFilter !== undefined ? [this.activeFilter] : undefined; + this.roomsResult = RoomListStoreV3.instance.getSortedRoomsInActiveSpace(filterKeys); + + // Update roomsMap immediately before clearing VMs + this.updateRoomsMap(this.roomsResult); + + // Clear view models since room list changed + this.clearViewModels(); + + this.updateRoomListData(); + }; + + /** + * Rebuild roomsMap when roomsResult changes. + * This maintains a quick lookup for room objects. + */ + private updateRoomsMap(roomsResult: RoomsResult): void { + this.roomsMap.clear(); + for (const room of roomsResult.rooms) { + this.roomsMap.set(room.roomId, room); + } + } + + /** + * Clear all child view models. + * Called when the room list structure changes (space change, filter change, etc.) + */ + private clearViewModels(): void { + for (const viewModel of this.roomItemViewModels.values()) { + viewModel.dispose(); + } + this.roomItemViewModels.clear(); + } + + /** + * Get the ordered list of room IDs. + */ + public get roomIds(): string[] { + return this.roomsResult.rooms.map((room) => room.roomId); + } + + /** + * Get a RoomListItemViewModel for a specific room. + * Creates a RoomListItemViewModel if needed, which manages per-room subscriptions. + * The view should call this only for visible rooms from the roomIds list. + * @throws Error if room is not found in roomsMap (indicates a programming error) + */ + public getRoomItemViewModel(roomId: string): RoomListItemViewModel { + // Check if we have a view model for this room + let viewModel = this.roomItemViewModels.get(roomId); + + if (!viewModel) { + const room = this.roomsMap.get(roomId); + if (!room) { + throw new Error(`Room ${roomId} not found in roomsMap`); + } + + // Create new view model + viewModel = new RoomListItemViewModel({ + room, + client: this.props.client, + }); + + this.roomItemViewModels.set(roomId, viewModel); + } + + // Return the view model - the view will call useViewModel() on it + return viewModel; + } + + /** + * Update which rooms are currently visible. + * Called by the view when scroll position changes. + * Disposes of view models for rooms no longer visible. + */ + public updateVisibleRooms(startIndex: number, endIndex: number): void { + const allRoomIds = this.roomIds; + const newVisibleIds = allRoomIds.slice(startIndex, Math.min(endIndex, allRoomIds.length)); + + const newVisibleSet = new Set(newVisibleIds); + + // Dispose view models for rooms no longer visible + for (const [roomId, viewModel] of this.roomItemViewModels.entries()) { + if (!newVisibleSet.has(roomId)) { + viewModel.dispose(); + this.roomItemViewModels.delete(roomId); + } + } + } + + private onDispatch = (payload: any): void => { + if (payload.action === Action.ActiveRoomChanged) { + // When the active room changes, update the room list data to reflect the new selected room + // Pass isRoomChange=true so sticky logic doesn't prevent the index from updating + this.updateRoomListData(true); + } else if (payload.action === Action.ViewRoomDelta) { + // Handle keyboard navigation shortcuts (Alt+ArrowUp/Down) + // This was previously handled by useRoomListNavigation hook + this.handleViewRoomDelta(payload as ViewRoomDeltaPayload); + } + }; + + /** + * Handle keyboard navigation shortcuts (Alt+ArrowUp/Down) to move between rooms. + * Supports both regular navigation and unread-only navigation. + * Migrated from useRoomListNavigation hook. + */ + private handleViewRoomDelta(payload: ViewRoomDeltaPayload): void { + const currentRoomId = SdkContextClass.instance.roomViewStore.getRoomId(); + if (!currentRoomId) return; + + const { delta, unread } = payload; + const rooms = this.roomsResult.rooms; + + const filteredRooms = unread + ? // Filter the rooms to only include unread ones and the active room + rooms.filter((room) => { + const state = RoomNotificationStateStore.instance.getRoomState(room); + return room.roomId === currentRoomId || state.isUnread; + }) + : rooms; + + const currentIndex = filteredRooms.findIndex((room) => room.roomId === currentRoomId); + if (currentIndex === -1) return; + + // Get the next/previous new room according to the delta + // Use slice to loop on the list + // If delta is -1 at the start of the list, it will go to the end + // If delta is 1 at the end of the list, it will go to the start + const [newRoom] = filteredRooms.slice((currentIndex + delta) % filteredRooms.length); + if (!newRoom) return; + + dispatcher.dispatch({ + action: Action.ViewRoom, + room_id: newRoom.roomId, + show_room_tile: true, // to make sure the room gets scrolled into view + metricsTrigger: "WebKeyboardShortcut", + metricsViaKeyboard: true, + }); + } + + /** + * Handle room list updates from RoomListStoreV3. + * + * This event fires when: + * - Room order changes (new messages, manual reordering) + * - Active space changes + * - Filters are applied + * - Rooms are added/removed + * + * Space changes are detected by comparing old vs new spaceId. + * This matches the old hook pattern where space changes were handled + * indirectly through room list updates. + */ + private onListsUpdate = (): void => { + const filterKeys = this.activeFilter !== undefined ? [this.activeFilter] : undefined; + const oldSpaceId = this.roomsResult.spaceId; + + // Refresh room data from store + this.roomsResult = RoomListStoreV3.instance.getSortedRoomsInActiveSpace(filterKeys); + this.updateRoomsMap(this.roomsResult); + + const newSpaceId = this.roomsResult.spaceId; + + // Clear view models since room list structure changed + this.clearViewModels(); + + // Detect space change + if (oldSpaceId !== newSpaceId) { + // Space changed - get the last selected room for the new space to prevent flicker + const lastSelectedRoom = SpaceStore.instance.getLastSelectedRoomIdForSpace(newSpaceId); + + this.updateRoomListData(true, lastSelectedRoom); + return; + } + + // Normal room list update (not a space change) + this.updateRoomListData(); + }; + + private onListsLoaded = (): void => { + // Room lists have finished loading + this.snapshot.merge({ + isLoadingRooms: false, + }); + }; + + /** + * Calculate the active room index based on the currently viewed room. + * Returns undefined if no room is selected or if the selected room is not in the current list. + * + * @param roomId - The room ID to find the index for (can be null/undefined) + */ + private getActiveRoomIndex(roomId: string | null | undefined): number | undefined { + if (!roomId) { + return undefined; + } + + const index = this.roomsResult.rooms.findIndex((room) => room.roomId === roomId); + return index >= 0 ? index : undefined; + } + + /** + * Apply sticky room logic to keep the active room at the same index position. + * When the room list updates, this prevents the selected room from jumping around in the UI. + * + * @param isRoomChange - Whether this update is due to a room change (not a list update) + * @param roomId - The room ID to apply sticky logic for (can be null/undefined) + * @returns The modified rooms array with sticky positioning applied + */ + private applyStickyRoom(isRoomChange: boolean, roomId: string | null | undefined): Room[] { + const rooms = this.roomsResult.rooms; + + if (!roomId) { + return rooms; + } + + const newIndex = rooms.findIndex((room) => room.roomId === roomId); + const oldIndex = this.lastActiveRoomIndex; + + // When opening another room, the index should obviously change + if (isRoomChange) { + return rooms; + } + + // If oldIndex is undefined, then there was no active room before + // Similarly, if newIndex is -1, the active room is not in the current list + if (newIndex === -1 || oldIndex === undefined) { + return rooms; + } + + // If the index hasn't changed, we have nothing to do + if (newIndex === oldIndex) { + return rooms; + } + + // If the old index falls out of the bounds of the rooms array + // (usually because rooms were removed), we can no longer place + // the active room in the same old index + if (oldIndex > rooms.length - 1) { + return rooms; + } + + // Making the active room sticky is as simple as removing it from + // its new index and placing it in the old index + const newRooms = [...rooms]; + const [stickyRoom] = newRooms.splice(newIndex, 1); + newRooms.splice(oldIndex, 0, stickyRoom); + + return newRooms; + } + + private async updateRoomListData( + isRoomChange: boolean = false, + roomIdOverride: string | null = null, + ): Promise { + // Determine the room ID to use for calculations + // Use override if provided (e.g., during space changes), otherwise fall back to RoomViewStore + const roomId = roomIdOverride ?? SdkContextClass.instance.roomViewStore.getRoomId(); + + // Apply sticky room logic to keep selected room at same position + const stickyRooms = this.applyStickyRoom(isRoomChange, roomId); + + // Update roomsResult with sticky rooms + this.roomsResult = { + ...this.roomsResult, + rooms: stickyRooms, + }; + + // Rebuild roomsMap with the reordered rooms + this.updateRoomsMap(this.roomsResult); + + // Calculate the active room index after applying sticky logic + const activeRoomIndex = this.getActiveRoomIndex(roomId); + + // Track the current active room index for future sticky calculations + this.lastActiveRoomIndex = activeRoomIndex; + + // Build the complete state atomically to ensure consistency + // roomIds and roomListState must always be in sync + const roomIds = this.roomIds; + const roomListState: RoomListViewState = { + activeRoomIndex, + spaceId: this.roomsResult.spaceId, + filterKeys: this.roomsResult.filterKeys?.map((k) => String(k)), + }; + + const filterIds = [...filterKeyToIdMap.values()]; + const activeFilterId = this.activeFilter !== undefined ? filterKeyToIdMap.get(this.activeFilter) : undefined; + const isRoomListEmpty = roomIds.length === 0; + const isLoadingRooms = RoomListStoreV3.instance.isLoadingRooms; + + // Single atomic snapshot update + this.snapshot.merge({ + isLoadingRooms, + isRoomListEmpty, + filterIds, + activeFilterId, + roomListState, + roomIds, + }); + } + + public createChatRoom = (): void => { + dispatcher.fire(Action.CreateChat); + }; + + public createRoom = (): void => { + const activeSpace = SpaceStore.instance.activeSpaceRoom; + if (activeSpace) { + dispatcher.dispatch({ + action: Action.CreateRoom, + parent_space: activeSpace, + }); + } else { + dispatcher.dispatch({ + action: Action.CreateRoom, + }); + } + }; +} diff --git a/src/components/viewmodels/roomlist/utils.ts b/src/viewmodels/room-list/utils.ts similarity index 83% rename from src/components/viewmodels/roomlist/utils.ts rename to src/viewmodels/room-list/utils.ts index dfa20e0d1c..5cd2f58678 100644 --- a/src/components/viewmodels/roomlist/utils.ts +++ b/src/viewmodels/room-list/utils.ts @@ -7,12 +7,12 @@ import { type Room, KnownMembership, EventTimeline, EventType, type MatrixClient } from "matrix-js-sdk/src/matrix"; -import { isKnockDenied } from "../../../utils/membership"; -import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; -import { UIComponent } from "../../../settings/UIFeature"; -import { showCreateNewRoom } from "../../../utils/space"; -import dispatcher from "../../../dispatcher/dispatcher"; -import { Action } from "../../../dispatcher/actions"; +import { isKnockDenied } from "../../utils/membership"; +import { shouldShowComponent } from "../../customisations/helpers/UIComponents"; +import { UIComponent } from "../../settings/UIFeature"; +import { showCreateNewRoom } from "../../utils/space"; +import dispatcher from "../../dispatcher/dispatcher"; +import { Action } from "../../dispatcher/actions"; /** * Check if the user has access to the options menu. diff --git a/test/unit-tests/components/viewmodels/roomlist/MessagePreviewViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/MessagePreviewViewModel-test.tsx deleted file mode 100644 index 6c5b121022..0000000000 --- a/test/unit-tests/components/viewmodels/roomlist/MessagePreviewViewModel-test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { renderHook, waitFor } from "jest-matrix-react"; -import { type Room } from "matrix-js-sdk/src/matrix"; - -import { createTestClient, mkStubRoom } from "../../../../test-utils"; -import { type MessagePreview, MessagePreviewStore } from "../../../../../src/stores/room-list/MessagePreviewStore"; -import { useMessagePreviewViewModel } from "../../../../../src/components/viewmodels/roomlist/MessagePreviewViewModel"; - -describe("MessagePreviewViewModel", () => { - let room: Room; - - beforeEach(() => { - const matrixClient = createTestClient(); - room = mkStubRoom("roomId", "roomName", matrixClient); - }); - - it("should do an initial fetch of the message preview", async () => { - // Mock the store to return some text. - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockImplementation(async (room) => { - return { text: "Hello world!" } as MessagePreview; - }); - - const { result: vm } = renderHook(() => useMessagePreviewViewModel(room)); - - // Eventually, vm.message should have the text from the store. - await waitFor(() => { - expect(vm.current.message).toEqual("Hello world!"); - }); - }); - - it("should fetch message preview again on update from store", async () => { - // Mock the store to return the text in variable message. - let message = "Hello World!"; - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockImplementation(async (room) => { - return { text: message } as MessagePreview; - }); - jest.spyOn(MessagePreviewStore, "getPreviewChangedEventName").mockImplementation((room) => { - return "UPDATE"; - }); - - const { result: vm } = renderHook(() => useMessagePreviewViewModel(room)); - - // Let's assume the message changed. - message = "New message!"; - MessagePreviewStore.instance.emit("UPDATE"); - - /// vm.message should be the updated message. - await waitFor(() => { - expect(vm.current.message).toEqual(message); - }); - }); -}); diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListItemMenuViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListItemMenuViewModel-test.tsx deleted file mode 100644 index d017084db5..0000000000 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListItemMenuViewModel-test.tsx +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { renderHook } from "jest-matrix-react"; -import { mocked } from "jest-mock"; -import { type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; - -import { mkStubRoom, stubClient, withClientContextRenderOptions } from "../../../../test-utils"; -import { useRoomListItemMenuViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListItemMenuViewModel"; -import { - hasAccessToNotificationMenu, - hasAccessToOptionsMenu, -} from "../../../../../src/components/viewmodels/roomlist/utils"; -import DMRoomMap from "../../../../../src/utils/DMRoomMap"; -import { DefaultTagID } from "../../../../../src/stores/room-list/models"; -import { useUnreadNotifications } from "../../../../../src/hooks/useUnreadNotifications"; -import { NotificationLevel } from "../../../../../src/stores/notifications/NotificationLevel"; -import { clearRoomNotification, setMarkedUnreadState } from "../../../../../src/utils/notifications"; -import { tagRoom } from "../../../../../src/utils/room/tagRoom"; -import dispatcher from "../../../../../src/dispatcher/dispatcher"; -import { useNotificationState } from "../../../../../src/hooks/useRoomNotificationState"; -import { RoomNotifState } from "../../../../../src/RoomNotifs"; - -jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ - hasAccessToOptionsMenu: jest.fn().mockReturnValue(false), - hasAccessToNotificationMenu: jest.fn().mockReturnValue(false), -})); - -jest.mock("../../../../../src/hooks/useUnreadNotifications", () => ({ - useUnreadNotifications: jest.fn(), -})); - -jest.mock("../../../../../src/hooks/useRoomNotificationState", () => ({ - useNotificationState: jest.fn(), -})); - -jest.mock("../../../../../src/utils/notifications", () => ({ - clearRoomNotification: jest.fn(), - setMarkedUnreadState: jest.fn(), -})); - -jest.mock("../../../../../src/utils/room/tagRoom", () => ({ - tagRoom: jest.fn(), -})); - -describe("RoomListItemMenuViewModel", () => { - let matrixClient: MatrixClient; - let room: Room; - - beforeEach(() => { - matrixClient = stubClient(); - room = mkStubRoom("roomId", "roomName", matrixClient); - - DMRoomMap.makeShared(matrixClient); - jest.spyOn(DMRoomMap.shared(), "getUserIdForRoomId").mockReturnValue(undefined); - - mocked(useUnreadNotifications).mockReturnValue({ symbol: null, count: 0, level: NotificationLevel.None }); - mocked(useNotificationState).mockReturnValue([RoomNotifState.AllMessages, jest.fn()]); - jest.spyOn(dispatcher, "dispatch"); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - function render() { - return renderHook(() => useRoomListItemMenuViewModel(room), withClientContextRenderOptions(matrixClient)); - } - - it("default", () => { - const { result } = render(); - expect(result.current.showMoreOptionsMenu).toBe(false); - expect(result.current.canInvite).toBe(false); - expect(result.current.isFavourite).toBe(false); - expect(result.current.canCopyRoomLink).toBe(true); - expect(result.current.canMarkAsRead).toBe(false); - expect(result.current.canMarkAsUnread).toBe(true); - }); - - it("should has showMoreOptionsMenu to be true", () => { - mocked(hasAccessToOptionsMenu).mockReturnValue(true); - const { result } = render(); - expect(result.current.showMoreOptionsMenu).toBe(true); - }); - - it("should has showNotificationMenu to be true", () => { - mocked(hasAccessToNotificationMenu).mockReturnValue(true); - const { result } = render(); - expect(result.current.showNotificationMenu).toBe(true); - }); - - it("should be able to invite", () => { - jest.spyOn(room, "canInvite").mockReturnValue(true); - const { result } = render(); - expect(result.current.canInvite).toBe(true); - }); - - it("should be a favourite", () => { - room.tags = { [DefaultTagID.Favourite]: { order: 0 } }; - const { result } = render(); - expect(result.current.isFavourite).toBe(true); - }); - - it("should not be able to copy the room link", () => { - jest.spyOn(DMRoomMap.shared(), "getUserIdForRoomId").mockReturnValue("userId"); - const { result } = render(); - expect(result.current.canCopyRoomLink).toBe(false); - }); - - it("should be able to mark as read", () => { - // Add a notification - mocked(useUnreadNotifications).mockReturnValue({ - symbol: null, - count: 1, - level: NotificationLevel.Notification, - }); - const { result } = render(); - expect(result.current.canMarkAsRead).toBe(true); - expect(result.current.canMarkAsUnread).toBe(false); - }); - - it("should has isNotificationAllMessage to be true", () => { - const { result } = render(); - expect(result.current.isNotificationAllMessage).toBe(true); - }); - - it("should has isNotificationAllMessageLoud to be true", () => { - mocked(useNotificationState).mockReturnValue([RoomNotifState.AllMessagesLoud, jest.fn()]); - const { result } = render(); - expect(result.current.isNotificationAllMessageLoud).toBe(true); - }); - - it("should has isNotificationMentionOnly to be true", () => { - mocked(useNotificationState).mockReturnValue([RoomNotifState.MentionsOnly, jest.fn()]); - const { result } = render(); - expect(result.current.isNotificationMentionOnly).toBe(true); - }); - - it("should has isNotificationMute to be true", () => { - mocked(useNotificationState).mockReturnValue([RoomNotifState.Mute, jest.fn()]); - const { result } = render(); - expect(result.current.isNotificationMute).toBe(true); - }); - - // Actions - - it("should mark as read", () => { - const { result } = render(); - result.current.markAsRead(new Event("click")); - expect(mocked(clearRoomNotification)).toHaveBeenCalledWith(room, matrixClient); - }); - - it("should mark as unread", () => { - const { result } = render(); - result.current.markAsUnread(new Event("click")); - expect(mocked(setMarkedUnreadState)).toHaveBeenCalledWith(room, matrixClient, true); - }); - - it("should tag a room as favourite", () => { - const { result } = render(); - result.current.toggleFavorite(new Event("click")); - expect(mocked(tagRoom)).toHaveBeenCalledWith(room, DefaultTagID.Favourite); - }); - - it("should tag a room as low priority", () => { - const { result } = render(); - result.current.toggleLowPriority(); - expect(mocked(tagRoom)).toHaveBeenCalledWith(room, DefaultTagID.LowPriority); - }); - - it("should dispatch invite action", () => { - const { result } = render(); - result.current.invite(new Event("click")); - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: "view_invite", - roomId: room.roomId, - }); - }); - - it("should dispatch a copy room action", () => { - const { result } = render(); - result.current.copyRoomLink(new Event("click")); - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: "copy_room", - room_id: room.roomId, - }); - }); - - it("should dispatch forget room action", () => { - // forget room is only available for archived rooms - room.tags = { [DefaultTagID.Archived]: { order: 0 } }; - - const { result } = render(); - result.current.leaveRoom(new Event("click")); - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: "forget_room", - room_id: room.roomId, - }); - }); - - it("should dispatch leave room action", () => { - const { result } = render(); - result.current.leaveRoom(new Event("click")); - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: "leave_room", - room_id: room.roomId, - }); - }); - - it("should call setRoomNotifState", () => { - const setRoomNotifState = jest.fn(); - mocked(useNotificationState).mockReturnValue([RoomNotifState.AllMessages, setRoomNotifState]); - const { result } = render(); - result.current.setRoomNotifState(RoomNotifState.Mute); - expect(setRoomNotifState).toHaveBeenCalledWith(RoomNotifState.Mute); - }); -}); diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListItemViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListItemViewModel-test.tsx deleted file mode 100644 index 96bc53016e..0000000000 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListItemViewModel-test.tsx +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { renderHook, waitFor } from "jest-matrix-react"; -import { type Room } from "matrix-js-sdk/src/matrix"; -import { mocked } from "jest-mock"; - -import dispatcher from "../../../../../src/dispatcher/dispatcher"; -import { Action } from "../../../../../src/dispatcher/actions"; -import { useRoomListItemViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListItemViewModel"; -import { createTestClient, mkStubRoom, withClientContextRenderOptions } from "../../../../test-utils"; -import { - hasAccessToNotificationMenu, - hasAccessToOptionsMenu, -} from "../../../../../src/components/viewmodels/roomlist/utils"; -import { RoomNotificationState } from "../../../../../src/stores/notifications/RoomNotificationState"; -import { RoomNotificationStateStore } from "../../../../../src/stores/notifications/RoomNotificationStateStore"; -import * as UseCallModule from "../../../../../src/hooks/useCall"; -import { type MessagePreview, MessagePreviewStore } from "../../../../../src/stores/room-list/MessagePreviewStore"; -import DMRoomMap from "../../../../../src/utils/DMRoomMap"; -import { useMessagePreviewToggle } from "../../../../../src/components/viewmodels/roomlist/useMessagePreviewToggle"; - -jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ - hasAccessToOptionsMenu: jest.fn().mockReturnValue(false), - hasAccessToNotificationMenu: jest.fn().mockReturnValue(false), -})); - -jest.mock("../../../../../src/components/viewmodels/roomlist/useMessagePreviewToggle", () => ({ - useMessagePreviewToggle: jest.fn().mockReturnValue({ shouldShowMessagePreview: true }), -})); - -describe("RoomListItemViewModel", () => { - let room: Room; - - beforeEach(() => { - const matrixClient = createTestClient(); - room = mkStubRoom("roomId", "roomName", matrixClient); - - const dmRoomMap = { - getUserIdForRoomId: jest.fn(), - getDMRoomsForUserId: jest.fn(), - } as unknown as DMRoomMap; - DMRoomMap.setShared(dmRoomMap); - - mocked(useMessagePreviewToggle).mockReturnValue({ - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), - }); - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - it("should dispatch view room action on openRoom", async () => { - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - - const fn = jest.spyOn(dispatcher, "dispatch"); - vm.current.openRoom(); - expect(fn).toHaveBeenCalledWith( - expect.objectContaining({ - action: Action.ViewRoom, - room_id: room.roomId, - metricsTrigger: "RoomList", - }), - ); - }); - - it("should show context menu if user has access to options menu", async () => { - mocked(hasAccessToOptionsMenu).mockReturnValue(true); - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showContextMenu).toBe(true); - }); - - it("should show hover menu if user has access to options menu", async () => { - mocked(hasAccessToOptionsMenu).mockReturnValue(true); - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showHoverMenu).toBe(true); - }); - - it("should show hover menu if user has access to notification menu", async () => { - mocked(hasAccessToNotificationMenu).mockReturnValue(true); - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showHoverMenu).toBe(true); - }); - - it("should not show hover menu if user has an invitation notification", async () => { - mocked(hasAccessToOptionsMenu).mockReturnValue(true); - - const notificationState = new RoomNotificationState(room, false); - jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockReturnValue(notificationState); - jest.spyOn(notificationState, "invited", "get").mockReturnValue(false); - - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showHoverMenu).toBe(true); - }); - - it("should return a message preview if one is available and they are enabled", async () => { - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ - text: "Message look like this", - } as MessagePreview); - mocked(useMessagePreviewToggle).mockReturnValue({ - shouldShowMessagePreview: true, - toggleMessagePreview: jest.fn(), - }); - - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - await waitFor(() => expect(vm.current.messagePreview).toBe("Message look like this")); - }); - - it("should hide message previews when disabled", async () => { - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ - text: "Message look like this", - } as MessagePreview); - - const { result: vm, rerender } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - - // This doesn't seem to test that the hook actually triggers an update, - // but I can't see how to test that. - rerender(); - - expect(vm.current.messagePreview).toBe(undefined); - }); - - it("should check message preview when room change", async () => { - const otherRoom = mkStubRoom("roomId2", "roomName2", room.client); - - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ - text: "Message look like this", - } as MessagePreview); - mocked(useMessagePreviewToggle).mockReturnValue({ - shouldShowMessagePreview: true, - toggleMessagePreview: jest.fn(), - }); - - const { result: vm, rerender } = renderHook((props) => useRoomListItemViewModel(props), { - initialProps: room, - ...withClientContextRenderOptions(room.client), - }); - await waitFor(() => expect(vm.current.messagePreview).toBe("Message look like this")); - - jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue(null); - rerender(otherRoom); - await waitFor(() => expect(vm.current.messagePreview).toBe(undefined)); - }); - - describe("notification", () => { - let notificationState: RoomNotificationState; - beforeEach(() => { - notificationState = new RoomNotificationState(room, false); - jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockReturnValue(notificationState); - }); - - it("should show notification decoration if there is call has participant", () => { - jest.spyOn(UseCallModule, "useParticipantCount").mockReturnValue(1); - - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showNotificationDecoration).toBe(true); - }); - - it.each([ - { - label: "hasAnyNotificationOrActivity", - mock: () => jest.spyOn(notificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true), - }, - { label: "muted", mock: () => jest.spyOn(notificationState, "muted", "get").mockReturnValue(true) }, - ])("should show notification decoration if $label=true", ({ mock }) => { - mock(); - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.showNotificationDecoration).toBe(true); - }); - - it("should be bold if there is a notification", () => { - jest.spyOn(notificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true); - - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.isBold).toBe(true); - }); - - it("should recompute notification state when room changes", () => { - const newRoom = mkStubRoom("room2", "Room 2", room.client); - const newNotificationState = new RoomNotificationState(newRoom, false); - - const { result, rerender } = renderHook((room) => useRoomListItemViewModel(room), { - ...withClientContextRenderOptions(room.client), - initialProps: room, - }); - - expect(result.current.showNotificationDecoration).toBe(false); - - jest.spyOn(newNotificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true); - jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockReturnValue(newNotificationState); - rerender(newRoom); - - expect(result.current.showNotificationDecoration).toBe(true); - }); - }); - - describe("a11yLabel", () => { - let notificationState: RoomNotificationState; - beforeEach(() => { - notificationState = new RoomNotificationState(room, false); - jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockReturnValue(notificationState); - }); - - it.each([ - { - label: "unsent message", - mock: () => jest.spyOn(notificationState, "isUnsentMessage", "get").mockReturnValue(true), - expected: "Open room roomName with an unsent message.", - }, - { - label: "invitation", - mock: () => jest.spyOn(notificationState, "invited", "get").mockReturnValue(true), - expected: "Open room roomName invitation.", - }, - { - label: "mention", - mock: () => { - jest.spyOn(notificationState, "isMention", "get").mockReturnValue(true); - jest.spyOn(notificationState, "count", "get").mockReturnValue(3); - }, - expected: "Open room roomName with 3 unread messages including mentions.", - }, - { - label: "unread", - mock: () => { - jest.spyOn(notificationState, "hasUnreadCount", "get").mockReturnValue(true); - jest.spyOn(notificationState, "count", "get").mockReturnValue(3); - }, - expected: "Open room roomName with 3 unread messages.", - }, - { - label: "default", - expected: "Open room roomName", - }, - ])("should return the $label label", ({ mock, expected }) => { - mock?.(); - const { result: vm } = renderHook( - () => useRoomListItemViewModel(room), - withClientContextRenderOptions(room.client), - ); - expect(vm.current.a11yLabel).toBe(expected); - }); - }); -}); diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx deleted file mode 100644 index c8ede64320..0000000000 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx +++ /dev/null @@ -1,341 +0,0 @@ -/* -Copyright 2025 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import { range } from "lodash"; -import { act, renderHook, waitFor } from "jest-matrix-react"; -import { mocked } from "jest-mock"; - -import RoomListStoreV3, { LISTS_UPDATE_EVENT } from "../../../../../src/stores/room-list-v3/RoomListStoreV3"; -import { mkStubRoom } from "../../../../test-utils"; -import { useRoomListViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { FilterKey } from "../../../../../src/stores/room-list-v3/skip-list/filters"; -import { hasCreateRoomRights, createRoom } from "../../../../../src/components/viewmodels/roomlist/utils"; -import dispatcher from "../../../../../src/dispatcher/dispatcher"; -import { Action } from "../../../../../src/dispatcher/actions"; -import { SdkContextClass } from "../../../../../src/contexts/SDKContext"; -import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; -import { UPDATE_SELECTED_SPACE } from "../../../../../src/stores/spaces"; - -jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ - hasCreateRoomRights: jest.fn().mockReturnValue(false), - createRoom: jest.fn(), -})); - -describe("RoomListViewModel", () => { - function mockAndCreateRooms() { - const rooms = range(10).map((i) => mkStubRoom(`foo${i}:matrix.org`, `Foo ${i}`, undefined)); - const fn = jest - .spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace") - .mockImplementation(() => ({ spaceId: "home", rooms: [...rooms] })); - return { rooms, fn }; - } - - afterEach(() => { - jest.restoreAllMocks(); - }); - - it("should return a list of rooms", async () => { - const { rooms } = mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - - expect(vm.current.roomsResult.rooms).toHaveLength(10); - for (const room of rooms) { - expect(vm.current.roomsResult.rooms).toContain(room); - } - }); - - it("should update list of rooms on event from room list store", async () => { - const { rooms } = mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - - const newRoom = mkStubRoom("bar:matrix.org", "Bar", undefined); - rooms.push(newRoom); - await act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - - await waitFor(() => { - expect(vm.current.roomsResult.rooms).toContain(newRoom); - }); - }); - - describe("Filters", () => { - it("should provide list of available filters", () => { - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - // should have 6 filters - expect(vm.current.primaryFilters).toHaveLength(7); - // check the order - for (const [i, name] of [ - "Unreads", - "People", - "Rooms", - "Favourites", - "Mentions", - "Invites", - "Low priority", - ].entries()) { - expect(vm.current.primaryFilters[i].name).toEqual(name); - expect(vm.current.primaryFilters[i].active).toEqual(false); - } - }); - - it("should get filtered rooms from RLS on toggle", () => { - const { fn } = mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - // Let's say we toggle the People toggle - const i = vm.current.primaryFilters.findIndex((f) => f.name === "People"); - act(() => { - vm.current.primaryFilters[i].toggle(); - }); - expect(fn).toHaveBeenCalledWith([FilterKey.PeopleFilter]); - expect(vm.current.primaryFilters[i].active).toEqual(true); - }); - - it("should change active property on toggle", () => { - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - // Let's say we toggle the People filter - const i = vm.current.primaryFilters.findIndex((f) => f.name === "People"); - expect(vm.current.primaryFilters[i].active).toEqual(false); - act(() => { - vm.current.primaryFilters[i].toggle(); - }); - expect(vm.current.primaryFilters[i].active).toEqual(true); - - // Let's say that we toggle the Favourite filter - const j = vm.current.primaryFilters.findIndex((f) => f.name === "Favourites"); - act(() => { - vm.current.primaryFilters[j].toggle(); - }); - expect(vm.current.primaryFilters[i].active).toEqual(false); - expect(vm.current.primaryFilters[j].active).toEqual(true); - }); - - it("should return the current active primary filter", async () => { - // Let's say that the user's preferred sorting is alphabetic - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - // Toggle people filter - const i = vm.current.primaryFilters.findIndex((f) => f.name === "People"); - expect(vm.current.primaryFilters[i].active).toEqual(false); - act(() => vm.current.primaryFilters[i].toggle()); - - // The active primary filter should be the People filter - expect(vm.current.activePrimaryFilter).toEqual(vm.current.primaryFilters[i]); - }); - - it("should not remove all filters when active space is changed", async () => { - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - - // Let's first toggle the People filter - const i = vm.current.primaryFilters.findIndex((f) => f.name === "People"); - act(() => { - vm.current.primaryFilters[i].toggle(); - }); - expect(vm.current.primaryFilters[i].active).toEqual(true); - - // Simulate a space change - await act(() => SpaceStore.instance.emit(UPDATE_SELECTED_SPACE)); - - // Primary filter should remain unchanged - expect(vm.current.activePrimaryFilter?.name).toEqual("People"); - }); - }); - - describe("Create room and chat", () => { - it("should be canCreateRoom=false if hasCreateRoomRights=false", () => { - mocked(hasCreateRoomRights).mockReturnValue(false); - const { result } = renderHook(() => useRoomListViewModel()); - expect(result.current.canCreateRoom).toBe(false); - }); - - it("should be canCreateRoom=true if hasCreateRoomRights=true", () => { - mocked(hasCreateRoomRights).mockReturnValue(true); - const { result } = renderHook(() => useRoomListViewModel()); - expect(result.current.canCreateRoom).toBe(true); - }); - - it("should call createRoom", () => { - const { result } = renderHook(() => useRoomListViewModel()); - result.current.createRoom(); - expect(mocked(createRoom)).toHaveBeenCalled(); - }); - - it("should dispatch Action.CreateChat", () => { - const spy = jest.spyOn(dispatcher, "fire"); - const { result } = renderHook(() => useRoomListViewModel()); - result.current.createChatRoom(); - expect(spy).toHaveBeenCalledWith(Action.CreateChat); - }); - }); - - describe("Sticky room and active index", () => { - function expectActiveRoom(vm: ReturnType, i: number, roomId: string) { - expect(vm.activeIndex).toEqual(i); - expect(vm.roomsResult.rooms[i].roomId).toEqual(roomId); - } - - it("active index is calculated with the last opened room in a space", () => { - // Let's say there's two spaces: !space1:matrix.org and !space2:matrix.org - // Let's also say that the current active space is !space1:matrix.org - let currentSpace = "!space1:matrix.org"; - jest.spyOn(SpaceStore.instance, "activeSpace", "get").mockImplementation(() => currentSpace); - - const rooms = range(10).map((i) => mkStubRoom(`foo${i}:matrix.org`, `Foo ${i}`, undefined)); - // Let's say all the rooms are in space1 - const roomsInSpace1 = { spaceId: currentSpace, rooms: [...rooms] }; - // Let's say all rooms with even index are in space 2 - const roomsInSpace2 = { spaceId: "!space2:matrix.org", rooms: [...rooms].filter((_, i) => i % 2 === 0) }; - jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockImplementation(() => - currentSpace === "!space1:matrix.org" ? roomsInSpace1 : roomsInSpace2, - ); - - // Let's say that the room at index 4 is currently active - const roomId = rooms[4].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.activeIndex).toEqual(4); - - // Let's say that space is changed to "!space2:matrix.org" - currentSpace = "!space2:matrix.org"; - // Let's say that room[6] is active in space 2 - const activeRoomIdInSpace2 = rooms[6].roomId; - jest.spyOn(SpaceStore.instance, "getLastSelectedRoomIdForSpace").mockImplementation( - () => activeRoomIdInSpace2, - ); - act(() => { - RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT); - }); - - // Active index should be 3 even without the room change event. - expectActiveRoom(vm.current, 3, activeRoomIdInSpace2); - }); - - it("active room and active index are retained on order change", () => { - const { rooms } = mockAndCreateRooms(); - - // Let's say that the room at index 5 is active - const roomId = rooms[5].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.activeIndex).toEqual(5); - - // Let's say that room at index 9 moves to index 5 - const room9 = rooms[9]; - rooms.splice(9, 1); - rooms.splice(5, 0, room9); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - - // Active room index should still be 5 - expectActiveRoom(vm.current, 5, roomId); - - // Let's add 2 new rooms from index 0 - const newRoom1 = mkStubRoom("bar1:matrix.org", "Bar 1", undefined); - const newRoom2 = mkStubRoom("bar2:matrix.org", "Bar 2", undefined); - rooms.unshift(newRoom1, newRoom2); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - - // Active room index should still be 5 - expectActiveRoom(vm.current, 5, roomId); - }); - - it("active room and active index are updated when another room is opened", () => { - const { rooms } = mockAndCreateRooms(); - const roomId = rooms[5].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expectActiveRoom(vm.current, 5, roomId); - - // Let's say that room at index 9 becomes active - const room = rooms[9]; - act(() => { - dispatcher.dispatch( - { - action: Action.ActiveRoomChanged, - oldRoomId: null, - newRoomId: room.roomId, - }, - true, - ); - }); - - // Active room index should change to reflect new room - expectActiveRoom(vm.current, 9, room.roomId); - }); - - it("active room and active index are updated when active index spills out of rooms array bounds", () => { - const { rooms } = mockAndCreateRooms(); - // Let's say that the room at index 5 is active - const roomId = rooms[5].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expectActiveRoom(vm.current, 5, roomId); - - // Let's say that we remove rooms from the start of the array - for (let i = 0; i < 4; ++i) { - // We should be able to do 4 deletions before we run out of rooms - rooms.splice(0, 1); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - expectActiveRoom(vm.current, 5, roomId); - } - - // If we remove one more room from the start, there's not going to be enough rooms - // to maintain the active index. - rooms.splice(0, 1); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - expectActiveRoom(vm.current, 0, roomId); - }); - - it("active room and active index are retained when rooms that appear after the active room are deleted", () => { - const { rooms } = mockAndCreateRooms(); - // Let's say that the room at index 5 is active - const roomId = rooms[5].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expectActiveRoom(vm.current, 5, roomId); - - // Let's say that we remove rooms from the start of the array - for (let i = 0; i < 4; ++i) { - // Deleting rooms after index 5 (active) should not update the active index - rooms.splice(6, 1); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - expectActiveRoom(vm.current, 5, roomId); - } - }); - - it("active room index becomes undefined when active room is deleted", () => { - const { rooms } = mockAndCreateRooms(); - // Let's say that the room at index 5 is active - let roomId: string | null = rooms[5].roomId; - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => roomId); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expectActiveRoom(vm.current, 5, roomId); - - // Let's remove the active room (i.e room at index 5) - rooms.splice(5, 1); - roomId = null; - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); - expect(vm.current.activeIndex).toBeUndefined(); - }); - - it("active room index is initially undefined", () => { - mockAndCreateRooms(); - - // Let's say that there's no active room currently - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockImplementation(() => null); - - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.activeIndex).toEqual(undefined); - }); - }); -}); diff --git a/test/unit-tests/components/viewmodels/roomlist/useRoomListNavigation-test.ts b/test/unit-tests/components/viewmodels/roomlist/useRoomListNavigation-test.ts deleted file mode 100644 index 1ae8606697..0000000000 --- a/test/unit-tests/components/viewmodels/roomlist/useRoomListNavigation-test.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { renderHook } from "jest-matrix-react"; -import { type Room } from "matrix-js-sdk/src/matrix"; -import { waitFor } from "@testing-library/dom"; - -import { SdkContextClass } from "../../../../../src/contexts/SDKContext"; -import dispatcher from "../../../../../src/dispatcher/dispatcher"; -import { mkStubRoom, stubClient } from "../../../../test-utils"; -import { useRoomListNavigation } from "../../../../../src/components/viewmodels/roomlist/useRoomListNavigation"; -import { Action } from "../../../../../src/dispatcher/actions"; -import DMRoomMap from "../../../../../src/utils/DMRoomMap"; -import { RoomNotificationStateStore } from "../../../../../src/stores/notifications/RoomNotificationStateStore"; -import { type RoomNotificationState } from "../../../../../src/stores/notifications/RoomNotificationState"; - -describe("useRoomListNavigation", () => { - let rooms: Room[]; - - beforeEach(() => { - const matrixClient = stubClient(); - rooms = [ - mkStubRoom("room1", "Room 1", matrixClient), - mkStubRoom("room2", "Room 2", matrixClient), - mkStubRoom("room3", "Room 3", matrixClient), - ]; - - DMRoomMap.makeShared(matrixClient); - jest.spyOn(DMRoomMap.shared(), "getUserIdForRoomId").mockReturnValue(undefined); - jest.spyOn(dispatcher, "dispatch"); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it("should navigate to the next room based on delta", async () => { - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("room1"); - - renderHook(() => useRoomListNavigation(rooms)); - dispatcher.dispatch({ - action: Action.ViewRoomDelta, - delta: 1, - unread: false, - }); - - await waitFor(() => - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: Action.ViewRoom, - room_id: "room2", - show_room_tile: true, - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }), - ); - }); - - it("should navigate to the previous room based on delta", async () => { - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("room2"); - - renderHook(() => useRoomListNavigation(rooms)); - dispatcher.dispatch({ - action: Action.ViewRoomDelta, - delta: -1, - unread: false, - }); - - await waitFor(() => - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: Action.ViewRoom, - room_id: "room1", - show_room_tile: true, - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }), - ); - }); - - it("should wrap around to the first room when navigating past the last room", async () => { - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("room3"); - - renderHook(() => useRoomListNavigation(rooms)); - dispatcher.dispatch({ - action: Action.ViewRoomDelta, - delta: 1, - unread: false, - }); - - await waitFor(() => - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: Action.ViewRoom, - room_id: "room1", - show_room_tile: true, - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }), - ); - }); - - it("should wrap around to the last room when navigating before the first room", async () => { - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("room1"); - - renderHook(() => useRoomListNavigation(rooms)); - dispatcher.dispatch({ - action: Action.ViewRoomDelta, - delta: -1, - unread: false, - }); - - await waitFor(() => - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: Action.ViewRoom, - room_id: "room3", - show_room_tile: true, - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }), - ); - }); - - it("should filter rooms to only unread when unread=true", async () => { - jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("room1"); - jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockImplementation( - (room) => - ({ - isUnread: room.roomId !== "room1", - }) as RoomNotificationState, - ); - - renderHook(() => useRoomListNavigation(rooms)); - - dispatcher.dispatch({ - action: Action.ViewRoomDelta, - delta: 1, - unread: true, - }); - - await waitFor(() => - expect(dispatcher.dispatch).toHaveBeenCalledWith({ - action: Action.ViewRoom, - room_id: "room2", - show_room_tile: true, - metricsTrigger: "WebKeyboardShortcut", - metricsViaKeyboard: true, - }), - ); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx deleted file mode 100644 index 92466f685c..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React from "react"; -import { render, screen } from "jest-matrix-react"; -import userEvent from "@testing-library/user-event"; - -import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { EmptyRoomList } from "../../../../../../src/components/views/rooms/RoomListPanel/EmptyRoomList"; -import { FilterKey } from "../../../../../../src/stores/room-list-v3/skip-list/filters"; - -describe("", () => { - let vm: RoomListViewState; - - beforeEach(() => { - vm = { - isLoadingRooms: false, - roomsResult: { spaceId: "home", rooms: [] }, - primaryFilters: [], - createRoom: jest.fn(), - createChatRoom: jest.fn(), - canCreateRoom: true, - activeIndex: undefined, - }; - }); - - test("should render the default placeholder when there is no filter", async () => { - const user = userEvent.setup(); - - const { asFragment } = render(); - expect(screen.getByText("No chats yet")).toBeInTheDocument(); - expect(asFragment()).toMatchSnapshot(); - - await user.click(screen.getByRole("button", { name: "Start chat" })); - expect(vm.createChatRoom).toHaveBeenCalled(); - - await user.click(screen.getByRole("button", { name: "New room" })); - expect(vm.createRoom).toHaveBeenCalled(); - }); - - test("should not render the new room button if the user doesn't have the rights to create a room", async () => { - const newState = { ...vm, canCreateRoom: false }; - - const { asFragment } = render(); - expect(screen.queryByRole("button", { name: "New room" })).toBeNull(); - expect(asFragment()).toMatchSnapshot(); - }); - - it.each([ - { key: FilterKey.UnreadFilter, name: "unread", action: "Show all chats" }, - { key: FilterKey.MentionsFilter, name: "mention", action: "See all activity" }, - { key: FilterKey.InvitesFilter, name: "invite", action: "See all activity" }, - { key: FilterKey.LowPriorityFilter, name: "low priority", action: "See all activity" }, - ])("should display the empty state for the $name filter", async ({ key, name, action }) => { - const user = userEvent.setup(); - const activePrimaryFilter = { - toggle: jest.fn(), - active: true, - name, - key, - }; - const newState = { - ...vm, - activePrimaryFilter, - }; - - const { asFragment } = render(); - await user.click(screen.getByRole("button", { name: action })); - expect(activePrimaryFilter.toggle).toHaveBeenCalled(); - expect(asFragment()).toMatchSnapshot(); - }); - - it.each([ - { key: FilterKey.FavouriteFilter, name: "favourite" }, - { key: FilterKey.PeopleFilter, name: "people" }, - { key: FilterKey.RoomsFilter, name: "rooms" }, - ])("should display empty state for filter $name", ({ name, key }) => { - const activePrimaryFilter = { - toggle: jest.fn(), - active: true, - name, - key, - }; - const newState = { ...vm, activePrimaryFilter }; - const { asFragment } = render(); - expect(asFragment()).toMatchSnapshot(); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx deleted file mode 100644 index fa7b351bea..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React from "react"; -import { type MatrixClient } from "matrix-js-sdk/src/matrix"; -import { render } from "jest-matrix-react"; -import { fireEvent } from "@testing-library/dom"; -import { VirtuosoMockContext } from "@element-hq/web-shared-components"; - -import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { RoomList } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomList"; -import DMRoomMap from "../../../../../../src/utils/DMRoomMap"; -import MatrixClientContext from "../../../../../../src/contexts/MatrixClientContext"; -import { Landmark, LandmarkNavigation } from "../../../../../../src/accessibility/LandmarkNavigation"; -import { mkRoom, stubClient } from "../../../../../test-utils"; - -describe("", () => { - let matrixClient: MatrixClient; - let vm: RoomListViewState; - - beforeEach(() => { - matrixClient = stubClient(); - const rooms = Array.from({ length: 10 }, (_, i) => mkRoom(matrixClient, `room${i}`)); - vm = { - isLoadingRooms: false, - roomsResult: { spaceId: "home", rooms }, - primaryFilters: [], - createRoom: jest.fn(), - createChatRoom: jest.fn(), - canCreateRoom: true, - activeIndex: undefined, - }; - - // Needed to render a room list cell - DMRoomMap.makeShared(matrixClient); - jest.spyOn(DMRoomMap.shared(), "getUserIdForRoomId").mockReturnValue(undefined); - }); - - it("should render a room list", () => { - const { asFragment } = render(, { - wrapper: ({ children }) => ( - - - <>{children} - - - ), - }); - // At the moment the context prop on Virtuoso gets rendered in the dom as "[object Object]". - // This is a general issue with the react-virtuoso library. - // TODO: Update the snapshot when the following issue is resolved: https://github.com/petyosi/react-virtuoso/issues/1281 - expect(asFragment()).toMatchSnapshot(); - }); - - it.each([ - { shortcut: { key: "F6", ctrlKey: true, shiftKey: true }, isPreviousLandmark: true, label: "PreviousLandmark" }, - { shortcut: { key: "F6", ctrlKey: true }, isPreviousLandmark: false, label: "NextLandmark" }, - ])("should navigate to the landmark on NextLandmark.$label action", ({ shortcut, isPreviousLandmark }) => { - const spyFindLandmark = jest.spyOn(LandmarkNavigation, "findAndFocusNextLandmark").mockReturnValue(); - const { getByTestId } = render(, { - wrapper: ({ children }) => ( - - - <>{children} - - - ), - }); - const roomList = getByTestId("room-list"); - fireEvent.keyDown(roomList, shortcut); - - expect(spyFindLandmark).toHaveBeenCalledWith(Landmark.ROOM_LIST, isPreviousLandmark); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemMenuView-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemMenuView-test.tsx deleted file mode 100644 index 58ab0c672b..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemMenuView-test.tsx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React from "react"; -import { mocked } from "jest-mock"; -import { render, screen } from "jest-matrix-react"; -import userEvent from "@testing-library/user-event"; - -import { - type RoomListItemMenuViewState, - useRoomListItemMenuViewModel, -} from "../../../../../../src/components/viewmodels/roomlist/RoomListItemMenuViewModel"; -import type { MatrixClient, Room } from "matrix-js-sdk/src/matrix"; -import { mkRoom, stubClient } from "../../../../../test-utils"; -import { RoomListItemMenuView } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListItemMenuView"; -import { RoomNotifState } from "../../../../../../src/RoomNotifs"; - -jest.mock("../../../../../../src/components/viewmodels/roomlist/RoomListItemMenuViewModel", () => ({ - useRoomListItemMenuViewModel: jest.fn(), -})); - -describe("", () => { - const defaultValue: RoomListItemMenuViewState = { - showMoreOptionsMenu: true, - showNotificationMenu: true, - isFavourite: true, - isLowPriority: true, - canInvite: true, - canMarkAsUnread: true, - canMarkAsRead: true, - canCopyRoomLink: true, - isNotificationAllMessage: true, - isNotificationMentionOnly: true, - isNotificationAllMessageLoud: true, - isNotificationMute: true, - copyRoomLink: jest.fn(), - markAsUnread: jest.fn(), - markAsRead: jest.fn(), - leaveRoom: jest.fn(), - toggleLowPriority: jest.fn(), - toggleFavorite: jest.fn(), - invite: jest.fn(), - setRoomNotifState: jest.fn(), - }; - - let matrixClient: MatrixClient; - let room: Room; - - beforeEach(() => { - mocked(useRoomListItemMenuViewModel).mockReturnValue(defaultValue); - matrixClient = stubClient(); - room = mkRoom(matrixClient, "room1"); - }); - - function renderMenu() { - return render(); - } - - it("should render the more options menu", () => { - const { asFragment } = renderMenu(); - expect(screen.getByRole("button", { name: "More Options" })).toBeInTheDocument(); - expect(asFragment()).toMatchSnapshot(); - }); - - it("should render the notification options menu", () => { - const { asFragment } = renderMenu(); - expect(screen.getByRole("button", { name: "Notification options" })).toBeInTheDocument(); - expect(asFragment()).toMatchSnapshot(); - }); - - it("should not render the more options menu when showMoreOptionsMenu is false", () => { - mocked(useRoomListItemMenuViewModel).mockReturnValue({ ...defaultValue, showMoreOptionsMenu: false }); - renderMenu(); - expect(screen.queryByRole("button", { name: "More Options" })).toBeNull(); - }); - - it("should not render the notification options menu when showNotificationMenu is false", () => { - mocked(useRoomListItemMenuViewModel).mockReturnValue({ ...defaultValue, showNotificationMenu: false }); - renderMenu(); - expect(screen.queryByRole("button", { name: "Notification options" })).toBeNull(); - }); - - it("should display all the buttons and have the actions linked for the more options menu", async () => { - const user = userEvent.setup(); - renderMenu(); - - const openMenu = screen.getByRole("button", { name: "More Options" }); - await user.click(openMenu); - - await user.click(screen.getByRole("menuitem", { name: "Mark as read" })); - expect(defaultValue.markAsRead).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Mark as unread" })); - expect(defaultValue.markAsUnread).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitemcheckbox", { name: "Favourited" })); - expect(defaultValue.toggleFavorite).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitemcheckbox", { name: "Low priority" })); - expect(defaultValue.toggleLowPriority).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Invite" })); - expect(defaultValue.invite).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Copy room link" })); - expect(defaultValue.copyRoomLink).toHaveBeenCalled(); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Leave room" })); - expect(defaultValue.leaveRoom).toHaveBeenCalled(); - }); - - it("should display all the buttons and have the actions linked for the notification options menu", async () => { - const user = userEvent.setup(); - renderMenu(); - - const openMenu = screen.getByRole("button", { name: "Notification options" }); - await user.click(openMenu); - - await user.click(screen.getByRole("menuitem", { name: "Match default settings" })); - expect(defaultValue.setRoomNotifState).toHaveBeenCalledWith(RoomNotifState.AllMessages); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "All messages" })); - expect(defaultValue.setRoomNotifState).toHaveBeenCalledWith(RoomNotifState.AllMessagesLoud); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Mentions and keywords" })); - expect(defaultValue.setRoomNotifState).toHaveBeenCalledWith(RoomNotifState.MentionsOnly); - - await user.click(openMenu); - await user.click(screen.getByRole("menuitem", { name: "Mute room" })); - expect(defaultValue.setRoomNotifState).toHaveBeenCalledWith(RoomNotifState.Mute); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemView-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemView-test.tsx deleted file mode 100644 index b6127e1189..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListItemView-test.tsx +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React from "react"; -import { type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; -import { render, screen, waitFor } from "jest-matrix-react"; -import userEvent from "@testing-library/user-event"; -import { mocked } from "jest-mock"; -import { CallType } from "matrix-js-sdk/src/webrtc/call"; - -import { mkRoom, stubClient, withClientContextRenderOptions } from "../../../../../test-utils"; -import { RoomListItemView } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListItemView"; -import DMRoomMap from "../../../../../../src/utils/DMRoomMap"; -import { - type RoomListItemViewState, - useRoomListItemViewModel, -} from "../../../../../../src/components/viewmodels/roomlist/RoomListItemViewModel"; -import { RoomNotificationState } from "../../../../../../src/stores/notifications/RoomNotificationState"; - -jest.mock("../../../../../../src/components/viewmodels/roomlist/RoomListItemViewModel", () => ({ - useRoomListItemViewModel: jest.fn(), -})); - -describe("", () => { - let defaultValue: RoomListItemViewState; - let matrixClient: MatrixClient; - let room: Room; - - const renderRoomListItem = (props: Partial> = {}) => { - const defaultProps = { - room, - isSelected: false, - isFocused: false, - onFocus: jest.fn(), - roomIndex: 0, - roomCount: 1, - listIsScrolling: false, - }; - - return render(, withClientContextRenderOptions(matrixClient)); - }; - - beforeEach(() => { - matrixClient = stubClient(); - room = mkRoom(matrixClient, "room1"); - - DMRoomMap.makeShared(matrixClient); - jest.spyOn(DMRoomMap.shared(), "getUserIdForRoomId").mockReturnValue(undefined); - - const notificationState = new RoomNotificationState(room, false); - jest.spyOn(notificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true); - jest.spyOn(notificationState, "isNotification", "get").mockReturnValue(true); - jest.spyOn(notificationState, "count", "get").mockReturnValue(1); - - defaultValue = { - openRoom: jest.fn(), - showContextMenu: false, - showHoverMenu: false, - notificationState, - a11yLabel: "Open room room1", - isBold: false, - isVideoRoom: false, - callConnectionState: null, - callType: CallType.Video, - hasParticipantInCall: false, - name: room.name, - showNotificationDecoration: false, - messagePreview: undefined, - }; - - mocked(useRoomListItemViewModel).mockReturnValue(defaultValue); - }); - - test("should render a room item", () => { - const onClick = jest.fn(); - const { asFragment } = renderRoomListItem({ - onClick, - roomCount: 0, - }); - expect(asFragment()).toMatchSnapshot(); - }); - - test("should render a room item with a message preview", () => { - defaultValue.messagePreview = "The message looks like this"; - - const onClick = jest.fn(); - const { asFragment } = renderRoomListItem({ - onClick, - }); - expect(asFragment()).toMatchSnapshot(); - }); - - test("should call openRoom when clicked", async () => { - const user = userEvent.setup(); - renderRoomListItem(); - - await user.click(screen.getByRole("option", { name: `Open room ${room.name}` })); - expect(defaultValue.openRoom).toHaveBeenCalled(); - }); - - test("should be selected if isSelected=true", async () => { - const { asFragment } = renderRoomListItem({ - isSelected: true, - }); - - expect(screen.queryByRole("option", { name: `Open room ${room.name}` })).toHaveAttribute( - "aria-selected", - "true", - ); - expect(asFragment()).toMatchSnapshot(); - }); - - test("should display notification decoration", async () => { - mocked(useRoomListItemViewModel).mockReturnValue({ - ...defaultValue, - showNotificationDecoration: true, - }); - - const { asFragment } = renderRoomListItem(); - - expect(screen.getByTestId("notification-decoration")).toBeInTheDocument(); - expect(asFragment()).toMatchSnapshot(); - }); - - test("should not display notification decoration when hovered", async () => { - const user = userEvent.setup(); - - mocked(useRoomListItemViewModel).mockReturnValue({ - ...defaultValue, - showNotificationDecoration: true, - }); - - renderRoomListItem(); - - const listItem = screen.getByRole("option", { name: `Open room ${room.name}` }); - await user.hover(listItem); - - expect(screen.queryByRole("notification-decoration")).toBeNull(); - }); - - test("should render the context menu", async () => { - const user = userEvent.setup(); - - mocked(useRoomListItemViewModel).mockReturnValue({ - ...defaultValue, - showContextMenu: true, - }); - - renderRoomListItem(); - - const button = screen.getByRole("option", { name: `Open room ${room.name}` }); - await user.pointer([{ target: button }, { keys: "[MouseRight]", target: button }]); - await waitFor(() => expect(screen.getByRole("menu")).toBeInTheDocument()); - // Menu should close - await user.keyboard("{Escape}"); - expect(screen.queryByRole("menu")).toBeNull(); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx deleted file mode 100644 index 8276c7340f..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import React, { act } from "react"; -import { render, screen } from "jest-matrix-react"; -import userEvent from "@testing-library/user-event"; - -import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { RoomListPrimaryFilters } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters"; -import { FilterKey } from "../../../../../../src/stores/room-list-v3/skip-list/filters"; - -describe("", () => { - let vm: RoomListViewState; - const filterToggleMocks = [jest.fn(), jest.fn(), jest.fn()]; - - let resizeCallback: ResizeObserverCallback; - - beforeEach(() => { - // Reset mocks between tests - filterToggleMocks.forEach((mock) => mock.mockClear()); - - // Mock ResizeObserver - global.ResizeObserver = jest.fn().mockImplementation((callback) => { - resizeCallback = callback; - return { - observe: jest.fn(), - unobserve: jest.fn(), - disconnect: jest.fn(), - }; - }); - - vm = { - primaryFilters: [ - { name: "People", active: true, toggle: filterToggleMocks[0], key: FilterKey.PeopleFilter }, - { name: "Rooms", active: false, toggle: filterToggleMocks[1], key: FilterKey.RoomsFilter }, - { name: "Unreads", active: false, toggle: filterToggleMocks[2], key: FilterKey.UnreadFilter }, - ], - } as unknown as RoomListViewState; - }); - - function mockFiltersOffsetLeft() { - // Use `getByText` instead of `getByRole` to bypass the aria-hidden - jest.spyOn(screen.getByText("People"), "offsetLeft", "get").mockReturnValue(0); - jest.spyOn(screen.getByText("Rooms"), "offsetLeft", "get").mockReturnValue(30); - jest.spyOn(screen.getByText("Unreads"), "offsetLeft", "get").mockReturnValue(60); - - // @ts-ignore - act(() => resizeCallback([{ target: screen.getByRole("listbox", { name: "Room list filters" }) }])); - } - - it("should renders all filters correctly", () => { - const { asFragment } = render(); - mockFiltersOffsetLeft(); - - // Check that all filters are rendered - expect(screen.getByRole("option", { name: "People" })).toBeInTheDocument(); - expect(screen.getByRole("option", { name: "Rooms" })).toBeInTheDocument(); - expect(screen.getByRole("option", { name: "Unreads" })).toBeInTheDocument(); - - // Check that the active filter is marked as selected - expect(screen.getByRole("option", { name: "People" })).toHaveAttribute("aria-selected", "true"); - expect(screen.getByRole("option", { name: "Rooms" })).toHaveAttribute("aria-selected", "false"); - expect(screen.getByRole("option", { name: "Unreads" })).toHaveAttribute("aria-selected", "false"); - - expect(asFragment()).toMatchSnapshot(); - }); - - it("should call toggle function when a filter is clicked", async () => { - const user = userEvent.setup(); - render(); - mockFiltersOffsetLeft(); - - // Click on an inactive filter - await user.click(screen.getByRole("option", { name: "People" })); - - // Check that the toggle function was called - expect(filterToggleMocks[0]).toHaveBeenCalledTimes(1); - }); - - function makeUnreadWrapping() { - // Use `getByText` instead of `getByRole` to bypass the aria-hidden - jest.spyOn(screen.getByText("People"), "offsetLeft", "get").mockReturnValue(0); - jest.spyOn(screen.getByText("Rooms"), "offsetLeft", "get").mockReturnValue(30); - // Unreads is wrapping - jest.spyOn(screen.getByText("Unreads"), "offsetLeft", "get").mockReturnValue(0); - - // @ts-ignore - act(() => resizeCallback([{ target: screen.getByRole("listbox", { name: "Room list filters" }) }])); - } - - it("should hide or display filters if they are wrapping", async () => { - const user = userEvent.setup(); - render(); - mockFiltersOffsetLeft(); - - // No filter is wrapping, so chevron shouldn't be visible - expect(screen.queryByRole("button", { name: "Expand filter list" })).toBeNull(); - expect(screen.queryByRole("option", { name: "Unreads" })).toBeVisible(); - - makeUnreadWrapping(); - - // The Unreads filter is wrapping, it should not be visible - expect(screen.queryByRole("option", { name: "Unreads" })).toBeNull(); - // Now filters are wrapping, so chevron should be visible - await user.click(screen.getByRole("button", { name: "Expand filter list" })); - // The list is expanded, so Unreads should be visible - expect(screen.getByRole("option", { name: "Unreads" })).toBeVisible(); - }); - - it("should move the active filter if the list is collapsed and the filter is wrapping", async () => { - vm = { - primaryFilters: [ - { name: "People", active: false, toggle: filterToggleMocks[0], key: FilterKey.PeopleFilter }, - { name: "Rooms", active: false, toggle: filterToggleMocks[1], key: FilterKey.RoomsFilter }, - { name: "Unreads", active: true, toggle: filterToggleMocks[2], key: FilterKey.UnreadFilter }, - ], - } as unknown as RoomListViewState; - - const user = userEvent.setup(); - render(); - makeUnreadWrapping(); - - // Unread filter should be moved to the first position - expect(screen.getByRole("listbox", { name: "Room list filters" }).children[0]).toBe( - screen.getByRole("option", { name: "Unreads" }), - ); - - // When the list is expanded, the Unreads filter should move to its original position - await user.click(screen.getByRole("button", { name: "Expand filter list" })); - expect(screen.getByRole("listbox", { name: "Room list filters" }).children[0]).not.toEqual( - screen.getByRole("option", { name: "Unreads" }), - ); - }); - - it("should hide the filter is the previous is on the same vertical position", async () => { - render(); - mockFiltersOffsetLeft(); - - jest.spyOn(screen.getByRole("option", { name: "People" }), "offsetLeft", "get").mockReturnValue(0); - // Rooms is wrapping - jest.spyOn(screen.getByRole("option", { name: "Rooms" }), "offsetLeft", "get").mockReturnValue(0); - - // @ts-ignore - act(() => resizeCallback([{ target: screen.getByRole("listbox", { name: "Room list filters" }) }])); - - // The Unreads filter is wrapping, it should not be visible - expect(screen.queryByRole("option", { name: "Rooms" })).toBeNull(); - // Now filters are wrapping, so chevron should be visible - expect(screen.getByRole("button", { name: "Expand filter list" })).toBeVisible(); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx deleted file mode 100644 index 0081c6f350..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -import { mocked } from "jest-mock"; -import { render, screen } from "jest-matrix-react"; -import React from "react"; - -import { - type RoomListViewState, - useRoomListViewModel, -} from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { RoomListView } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListView"; -import { mkRoom, stubClient } from "../../../../../test-utils"; - -jest.mock("../../../../../../src/components/viewmodels/roomlist/RoomListViewModel", () => ({ - useRoomListViewModel: jest.fn(), -})); - -describe("", () => { - const defaultValue: RoomListViewState = { - isLoadingRooms: false, - roomsResult: { spaceId: "home", rooms: [] }, - primaryFilters: [], - createRoom: jest.fn(), - createChatRoom: jest.fn(), - canCreateRoom: true, - activeIndex: undefined, - }; - const matrixClient = stubClient(); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it("should render the loading room list", () => { - mocked(useRoomListViewModel).mockReturnValue({ - ...defaultValue, - isLoadingRooms: true, - }); - - const roomList = render(); - expect(roomList.container.querySelector(".mx_RoomListSkeleton")).not.toBeNull(); - }); - - it("should render an empty room list", () => { - mocked(useRoomListViewModel).mockReturnValue(defaultValue); - - render(); - expect(screen.getByText("No chats yet")).toBeInTheDocument(); - }); - - it("should render a room list", () => { - mocked(useRoomListViewModel).mockReturnValue({ - ...defaultValue, - roomsResult: { spaceId: "home", rooms: [mkRoom(matrixClient, "testing room")] }, - }); - - render(); - expect(screen.getByRole("listbox", { name: "Room list" })).toBeInTheDocument(); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/EmptyRoomList-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/EmptyRoomList-test.tsx.snap deleted file mode 100644 index 140e1f366b..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/EmptyRoomList-test.tsx.snap +++ /dev/null @@ -1,279 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[` should display empty state for filter favourite 1`] = ` - -
- - You don't have favourite chats yet - - - You can add a chat to your favourites in the chat settings - -
-
-`; - -exports[` should display empty state for filter people 1`] = ` - -
- - You don’t have direct chats with anyone yet - - - You can deselect filters in order to see your other chats - -
-
-`; - -exports[` should display empty state for filter rooms 1`] = ` - -
- - You’re not in any room yet - - - You can deselect filters in order to see your other chats - -
-
-`; - -exports[` should display the empty state for the invite filter 1`] = ` - -
- - You don't have any unread invites - - -
-
-`; - -exports[` should display the empty state for the low priority filter 1`] = ` - -
- - You don't have any low priority rooms - - -
-
-`; - -exports[` should display the empty state for the mention filter 1`] = ` - -
- - You don't have any unread mentions - - -
-
-`; - -exports[` should display the empty state for the unread filter 1`] = ` - -
- - Congrats! You don’t have any unread messages - - -
-
-`; - -exports[` should not render the new room button if the user doesn't have the rights to create a room 1`] = ` - -
- - No chats yet - - - Get started by messaging someone - -
- -
-
-
-`; - -exports[` should render the default placeholder when there is no filter 1`] = ` - -
- - No chats yet - - - Get started by messaging someone or by creating a room - -
- - -
-
-
-`; diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomList-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomList-test.tsx.snap deleted file mode 100644 index eb833e64fa..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomList-test.tsx.snap +++ /dev/null @@ -1,1255 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[` should render a room list 1`] = ` - -
-
-
-
- - - -
-
-
-
- - - -
-
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
-`; diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemMenuView-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemMenuView-test.tsx.snap deleted file mode 100644 index 8842b91e6f..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemMenuView-test.tsx.snap +++ /dev/null @@ -1,155 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[` should render the more options menu 1`] = ` - -
- - -
-
-`; - -exports[` should render the notification options menu 1`] = ` - -
- - -
-
-`; diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemView-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemView-test.tsx.snap deleted file mode 100644 index f46588370f..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListItemView-test.tsx.snap +++ /dev/null @@ -1,234 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[` should be selected if isSelected=true 1`] = ` - - - -`; - -exports[` should display notification decoration 1`] = ` - - - -`; - -exports[` should render a room item 1`] = ` - - - -`; - -exports[` should render a room item with a message preview 1`] = ` - - - -`; diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPrimaryFilters-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPrimaryFilters-test.tsx.snap deleted file mode 100644 index ec71f70c95..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPrimaryFilters-test.tsx.snap +++ /dev/null @@ -1,47 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[` should renders all filters correctly 1`] = ` - -
-
- - - -
-
-
-`; diff --git a/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts b/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts index 5c73e6c8ef..7025abe7c1 100644 --- a/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts +++ b/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts @@ -23,8 +23,8 @@ import { showSpacePreferences, showSpaceSettings, } from "../../../src/utils/space"; -import { createRoom, hasCreateRoomRights } from "../../../src/components/viewmodels/roomlist/utils"; import { createTestClient, mkSpace } from "../../test-utils"; +import { createRoom, hasCreateRoomRights } from "../../../src/viewmodels/room-list/utils"; jest.mock("../../../src/PosthogTrackers", () => ({ trackInteraction: jest.fn(), @@ -38,7 +38,7 @@ jest.mock("../../../src/utils/space", () => ({ showSpaceSettings: jest.fn(), })); -jest.mock("../../../src/components/viewmodels/roomlist/utils", () => ({ +jest.mock("../../../src/viewmodels/room-list/utils", () => ({ createRoom: jest.fn(), hasCreateRoomRights: jest.fn(), })); diff --git a/test/viewmodels/room-list/RoomListItemViewModel-test.tsx b/test/viewmodels/room-list/RoomListItemViewModel-test.tsx new file mode 100644 index 0000000000..873f786d1b --- /dev/null +++ b/test/viewmodels/room-list/RoomListItemViewModel-test.tsx @@ -0,0 +1,439 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type MatrixClient, type MatrixEvent, Room, RoomEvent, PendingEventOrdering } from "matrix-js-sdk/src/matrix"; +import { CallType } from "matrix-js-sdk/src/webrtc/call"; + +import { createTestClient, flushPromises } from "../../test-utils"; +import { RoomNotificationState } from "../../../src/stores/notifications/RoomNotificationState"; +import { RoomNotificationStateStore } from "../../../src/stores/notifications/RoomNotificationStateStore"; +import { NotificationStateEvents } from "../../../src/stores/notifications/NotificationState"; +import { type MessagePreview, MessagePreviewStore } from "../../../src/stores/room-list/MessagePreviewStore"; +import { UPDATE_EVENT } from "../../../src/stores/AsyncStore"; +import SettingsStore from "../../../src/settings/SettingsStore"; +import DMRoomMap from "../../../src/utils/DMRoomMap"; +import { DefaultTagID } from "../../../src/stores/room-list/models"; +import dispatcher from "../../../src/dispatcher/dispatcher"; +import { Action } from "../../../src/dispatcher/actions"; +import { CallStore } from "../../../src/stores/CallStore"; +import type { Call } from "../../../src/models/Call"; +import { RoomListItemViewModel } from "../../../src/viewmodels/room-list/RoomListItemViewModel"; + +jest.mock("../../../src/viewmodels/room-list/utils", () => ({ + hasAccessToOptionsMenu: jest.fn().mockReturnValue(true), + hasAccessToNotificationMenu: jest.fn().mockReturnValue(true), +})); + +jest.mock("../../../src/stores/CallStore", () => ({ + __esModule: true, + CallStore: { + instance: { + getCall: jest.fn(), + on: jest.fn(), + off: jest.fn(), + emit: jest.fn(), + }, + }, + CallStoreEvent: { + ConnectedCalls: "connected_calls", + }, +})); + +describe("RoomListItemViewModel", () => { + let matrixClient: MatrixClient; + let room: Room; + let notificationState: RoomNotificationState; + let viewModel: RoomListItemViewModel; + + beforeEach(() => { + matrixClient = createTestClient(); + room = new Room("!room:server", matrixClient, matrixClient.getSafeUserId(), { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + // Set room name + room.name = "Test Room"; + + notificationState = new RoomNotificationState(room, false); + jest.spyOn(RoomNotificationStateStore.instance, "getRoomState").mockReturnValue(notificationState); + + const dmRoomMap = { + getUserIdForRoomId: jest.fn().mockReturnValue(undefined), + } as unknown as DMRoomMap; + DMRoomMap.setShared(dmRoomMap); + + jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => { + if (setting === "RoomList.showMessagePreview") return false; + return false; + }); + jest.spyOn(SettingsStore, "watchSetting").mockImplementation(() => "watcher-id"); + + jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue(null); + jest.spyOn(CallStore.instance, "getCall").mockReturnValue(null); + }); + + afterEach(() => { + viewModel?.dispose(); + jest.restoreAllMocks(); + }); + + describe("Initialization", () => { + it("should initialize with room data", async () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + // Wait for async initialization + await flushPromises(); + + const snapshot = viewModel.getSnapshot(); + expect(snapshot.id).toBe("!room:server"); + expect(snapshot.name).toBe("Test Room"); + }); + + it("should load message preview when enabled", async () => { + jest.spyOn(SettingsStore, "getValue").mockReturnValue(true); + jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ + text: "Hello world!", + } as MessagePreview); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + // Wait for async message preview load + await flushPromises(); + + expect(viewModel.getSnapshot().messagePreview).toBe("Hello world!"); + }); + + it("should not load message preview when disabled", async () => { + jest.spyOn(SettingsStore, "getValue").mockReturnValue(false); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().messagePreview).toBeUndefined(); + }); + }); + + describe("Notification state", () => { + it("should reflect notification state", async () => { + jest.spyOn(notificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true); + jest.spyOn(notificationState, "count", "get").mockReturnValue(5); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + const snapshot = viewModel.getSnapshot(); + expect(snapshot.notification.hasAnyNotificationOrActivity).toBe(true); + expect(snapshot.notification.count).toBe(5); + }); + + it("should update when notification state changes", async () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + expect(viewModel.getSnapshot().notification.count).toBe(0); + + jest.spyOn(notificationState, "count", "get").mockReturnValue(3); + notificationState.emit(NotificationStateEvents.Update); + + await flushPromises(); + expect(viewModel.getSnapshot().notification.count).toBe(3); + }); + + it("should show bold text when has notifications", async () => { + jest.spyOn(notificationState, "hasAnyNotificationOrActivity", "get").mockReturnValue(true); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().isBold).toBe(true); + }); + + it("should show mention badge", async () => { + jest.spyOn(notificationState, "isMention", "get").mockReturnValue(true); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().notification.isMention).toBe(true); + }); + + it("should show invitation state", async () => { + jest.spyOn(notificationState, "invited", "get").mockReturnValue(true); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().notification.invited).toBe(true); + }); + }); + + describe("Message preview", () => { + it("should update message preview when store emits update", async () => { + jest.spyOn(SettingsStore, "getValue").mockReturnValue(true); + jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ + text: "Initial message", + } as MessagePreview); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + expect(viewModel.getSnapshot().messagePreview).toBe("Initial message"); + + // Update preview + jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ + text: "Updated message", + } as MessagePreview); + + MessagePreviewStore.instance.emit(UPDATE_EVENT); + + await flushPromises(); + expect(viewModel.getSnapshot().messagePreview).toBe("Updated message"); + }); + + it("should show/hide preview when setting changes", async () => { + let showPreview = false; + let watchCallback: any; + + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => showPreview); + jest.spyOn(SettingsStore, "watchSetting").mockImplementation((_setting, _room, callback) => { + watchCallback = callback; + return "watcher-id"; + }); + jest.spyOn(MessagePreviewStore.instance, "getPreviewForRoom").mockResolvedValue({ + text: "Test message", + } as MessagePreview); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + expect(viewModel.getSnapshot().messagePreview).toBeUndefined(); + + // Enable previews + showPreview = true; + watchCallback(null, "device", true); + + await flushPromises(); + expect(viewModel.getSnapshot().messagePreview).toBe("Test message"); + }); + }); + + describe("Room tags", () => { + it("should reflect favorite tag", async () => { + room.tags = { [DefaultTagID.Favourite]: { order: 0 } }; + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().isFavourite).toBe(true); + }); + + it("should reflect low priority tag", async () => { + room.tags = { [DefaultTagID.LowPriority]: { order: 0 } }; + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().isLowPriority).toBe(true); + }); + + it("should update when room tags change", async () => { + room.tags = {}; + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + expect(viewModel.getSnapshot().isFavourite).toBe(false); + + room.tags = { [DefaultTagID.Favourite]: { order: 0 } }; + const tagEvent = { + getContent: () => ({ tags: { [DefaultTagID.Favourite]: { order: 0 } } }), + } as MatrixEvent; + room.emit(RoomEvent.Tags, tagEvent, room); + + await flushPromises(); + expect(viewModel.getSnapshot().isFavourite).toBe(true); + }); + }); + + describe("Call state", () => { + it("should show voice call indicator", async () => { + const mockCall = { + callType: CallType.Voice, + participants: new Map([[matrixClient.getUserId()!, {}]]), + } as unknown as Call; + + jest.spyOn(CallStore.instance, "getCall").mockReturnValue(mockCall); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().notification.callType).toBe("voice"); + }); + + it("should show video call indicator", async () => { + const mockCall = { + callType: CallType.Video, + participants: new Map([[matrixClient.getUserId()!, {}]]), + } as unknown as Call; + + jest.spyOn(CallStore.instance, "getCall").mockReturnValue(mockCall); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().notification.callType).toBe("video"); + }); + + it("should not show call indicator when no participants", async () => { + const mockCall = { + callType: CallType.Voice, + participants: new Map(), + } as unknown as Call; + + jest.spyOn(CallStore.instance, "getCall").mockReturnValue(mockCall); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().notification.callType).toBeUndefined(); + }); + }); + + describe("Room name updates", () => { + it("should update when room name changes", async () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + expect(viewModel.getSnapshot().name).toBe("Test Room"); + + room.name = "Updated Room"; + room.emit(RoomEvent.Name, room); + + await flushPromises(); + expect(viewModel.getSnapshot().name).toBe("Updated Room"); + }); + }); + + describe("DM detection", () => { + it("should detect DM rooms", async () => { + const dmRoomMap = DMRoomMap.shared(); + jest.spyOn(dmRoomMap, "getUserIdForRoomId").mockReturnValue("@user:server"); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + // DM rooms should not show copy room link option + expect(viewModel.getSnapshot().canCopyRoomLink).toBe(false); + }); + + it("should detect non-DM rooms", async () => { + const dmRoomMap = DMRoomMap.shared(); + jest.spyOn(dmRoomMap, "getUserIdForRoomId").mockReturnValue(undefined); + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + await flushPromises(); + + expect(viewModel.getSnapshot().canCopyRoomLink).toBe(true); + }); + }); + + describe("Actions", () => { + it("should dispatch view room action on openRoom", () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.onOpenRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.ViewRoom, + room_id: "!room:server", + metricsTrigger: "RoomList", + }); + }); + + it("should return room object", () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + expect(viewModel.getSnapshot().room).toBe(room); + }); + + it("should dispatch view_invite action when onInvite is called", () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.onInvite(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: "view_invite", + roomId: "!room:server", + }); + }); + + it("should dispatch copy_room action when onCopyRoomLink is called", () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.onCopyRoomLink(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: "copy_room", + room_id: "!room:server", + }); + }); + + it("should dispatch leave_room action when onLeaveRoom is called for normal room", () => { + room.tags = {}; + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.onLeaveRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: "leave_room", + room_id: "!room:server", + }); + }); + + it("should dispatch forget_room action when onLeaveRoom is called for archived room", () => { + room.tags = { [DefaultTagID.Archived]: { order: 0 } }; + + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.onLeaveRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: "forget_room", + room_id: "!room:server", + }); + }); + }); + + describe("Cleanup", () => { + it("should unsubscribe from all events on dispose", () => { + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + + const offSpy = jest.spyOn(notificationState, "off"); + + viewModel.dispose(); + + expect(offSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/test/viewmodels/room-list/RoomListViewViewModel-test.tsx b/test/viewmodels/room-list/RoomListViewViewModel-test.tsx new file mode 100644 index 0000000000..c896d3111d --- /dev/null +++ b/test/viewmodels/room-list/RoomListViewViewModel-test.tsx @@ -0,0 +1,546 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; +import { mocked } from "jest-mock"; + +import { createTestClient, flushPromises, mkStubRoom, stubClient } from "../../test-utils"; +import RoomListStoreV3, { RoomListStoreV3Event } from "../../../src/stores/room-list-v3/RoomListStoreV3"; +import SpaceStore from "../../../src/stores/spaces/SpaceStore"; +import { FilterKey } from "../../../src/stores/room-list-v3/skip-list/filters"; +import dispatcher from "../../../src/dispatcher/dispatcher"; +import { Action } from "../../../src/dispatcher/actions"; +import { SdkContextClass } from "../../../src/contexts/SDKContext"; +import DMRoomMap from "../../../src/utils/DMRoomMap"; +import { RoomListViewViewModel } from "../../../src/viewmodels/room-list/RoomListViewViewModel"; +import { hasCreateRoomRights } from "../../../src/viewmodels/room-list/utils"; + +jest.mock("../../../src/viewmodels/room-list/utils", () => ({ + hasCreateRoomRights: jest.fn().mockReturnValue(false), + hasAccessToOptionsMenu: jest.fn().mockReturnValue(true), + hasAccessToNotificationMenu: jest.fn().mockReturnValue(true), +})); + +describe("RoomListViewViewModel", () => { + let matrixClient: MatrixClient; + let room1: Room; + let room2: Room; + let room3: Room; + let viewModel: RoomListViewViewModel; + + beforeEach(() => { + matrixClient = createTestClient(); + room1 = mkStubRoom("!room1:server", "Room 1", matrixClient); + room2 = mkStubRoom("!room2:server", "Room 2", matrixClient); + room3 = mkStubRoom("!room3:server", "Room 3", matrixClient); + + // Setup DMRoomMap + const dmRoomMap = { + getUserIdForRoomId: jest.fn().mockReturnValue(null), + } as unknown as DMRoomMap; + DMRoomMap.setShared(dmRoomMap); + + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room1, room2, room3], + }); + + jest.spyOn(RoomListStoreV3.instance, "isLoadingRooms", "get").mockReturnValue(false); + jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(null); + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue(null); + + mocked(hasCreateRoomRights).mockReturnValue(false); + }); + + afterEach(() => { + viewModel?.dispose(); + jest.restoreAllMocks(); + }); + + describe("Initialization", () => { + it("should initialize with correct snapshot", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const snapshot = viewModel.getSnapshot(); + expect(snapshot.roomIds).toEqual(["!room1:server", "!room2:server", "!room3:server"]); + expect(snapshot.isRoomListEmpty).toBe(false); + expect(snapshot.isLoadingRooms).toBe(false); + expect(snapshot.roomListState.spaceId).toBe("home"); + expect(snapshot.filterIds.length).toBeGreaterThan(0); + expect(snapshot.activeFilterId).toBeUndefined(); + }); + + it("should initialize with empty room list", () => { + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [], + }); + + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + expect(viewModel.getSnapshot().roomIds).toEqual([]); + expect(viewModel.getSnapshot().isRoomListEmpty).toBe(true); + }); + + it("should set canCreateRoom based on user rights", () => { + mocked(hasCreateRoomRights).mockReturnValue(true); + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + expect(viewModel.getSnapshot().canCreateRoom).toBe(true); + }); + }); + + describe("Room list updates", () => { + it("should update room list when ListsUpdate event fires", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const newRoom = mkStubRoom("!room4:server", "Room 4", matrixClient); + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room1, room2, room3, newRoom], + }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.ListsUpdate); + + expect(viewModel.getSnapshot().roomIds).toEqual([ + "!room1:server", + "!room2:server", + "!room3:server", + "!room4:server", + ]); + }); + + it("should update loading state when ListsLoaded event fires", () => { + jest.spyOn(RoomListStoreV3.instance, "isLoadingRooms", "get").mockReturnValue(true); + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + expect(viewModel.getSnapshot().isLoadingRooms).toBe(true); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.ListsLoaded); + + expect(viewModel.getSnapshot().isLoadingRooms).toBe(false); + }); + }); + + describe("Space switching", () => { + it("should update room list when space changes", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const spaceRoomList = [room1, room2]; + + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "!space:server", + rooms: spaceRoomList, + }); + + jest.spyOn(SpaceStore.instance, "getLastSelectedRoomIdForSpace").mockReturnValue("!room1:server"); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.ListsUpdate); + + expect(viewModel.getSnapshot().roomListState.spaceId).toBe("!space:server"); + expect(viewModel.getSnapshot().roomIds).toEqual(["!room1:server", "!room2:server"]); + }); + + it("should clear view models when space changes", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + // Get view models for visible rooms + const vm1 = viewModel.getRoomItemViewModel("!room1:server"); + const vm2 = viewModel.getRoomItemViewModel("!room2:server"); + + const disposeSpy1 = jest.spyOn(vm1, "dispose"); + const disposeSpy2 = jest.spyOn(vm2, "dispose"); + + // Change space + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "!space:server", + rooms: [room3], + }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.ListsUpdate); + + expect(disposeSpy1).toHaveBeenCalled(); + expect(disposeSpy2).toHaveBeenCalled(); + }); + }); + + describe("Active room tracking", () => { + it("should update active room index when room is selected", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room2:server"); + + dispatcher.dispatch({ + action: Action.ActiveRoomChanged, + oldRoomId: "!room1:server", + newRoomId: "!room2:server", + }); + + // Use setTimeout to allow the dispatcher callback to run + await flushPromises(); + expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBe(1); + }); + + it("should return undefined active room index when no room is selected", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue(null); + + dispatcher.dispatch({ + action: Action.ActiveRoomChanged, + oldRoomId: "!room1:server", + newRoomId: null, + }); + + // Use setTimeout to allow the dispatcher callback to run + await flushPromises(); + expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBeUndefined(); + }); + }); + + describe("Sticky room behavior", () => { + it("should keep selected room at same index when room list updates", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + // Select room at index 1 + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room2:server"); + dispatcher.dispatch({ + action: Action.ActiveRoomChanged, + newRoomId: "!room2:server", + }); + + await flushPromises(); + expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBe(1); + + // Simulate room list update that would move room2 to front + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room2, room1, room3], // room2 moved to front + }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.ListsUpdate); + + // Active room should still be at index 1 (sticky behavior) + expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBe(1); + expect(viewModel.getSnapshot().roomIds[1]).toBe("!room2:server"); + }); + + it("should not apply sticky behavior when user changes rooms", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + // Select room at index 1 + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room2:server"); + dispatcher.dispatch({ + action: Action.ActiveRoomChanged, + newRoomId: "!room2:server", + }); + + await flushPromises(); + + // User switches to room3 + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room3:server"); + dispatcher.dispatch({ + action: Action.ActiveRoomChanged, + oldRoomId: "!room2:server", + newRoomId: "!room3:server", + }); + + await flushPromises(); + expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBe(2); + }); + }); + + describe("Filters", () => { + it("should toggle filter on", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + expect(viewModel.getSnapshot().activeFilterId).toBeUndefined(); + + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room1], + filterKeys: [FilterKey.UnreadFilter], + }); + + viewModel.onToggleFilter("unread"); + + expect(viewModel.getSnapshot().activeFilterId).toBe("unread"); + expect(viewModel.getSnapshot().roomIds).toEqual(["!room1:server"]); + }); + + it("should toggle filter off", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + // Turn filter on + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room1], + filterKeys: [FilterKey.UnreadFilter], + }); + viewModel.onToggleFilter("unread"); + + expect(viewModel.getSnapshot().activeFilterId).toBe("unread"); + + // Turn filter off + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room1, room2, room3], + }); + viewModel.onToggleFilter("unread"); + + expect(viewModel.getSnapshot().activeFilterId).toBeUndefined(); + expect(viewModel.getSnapshot().roomIds).toEqual(["!room1:server", "!room2:server", "!room3:server"]); + }); + + it("should clear view models when filter changes", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + // Get view models + const vm1 = viewModel.getRoomItemViewModel("!room1:server"); + const disposeSpy = jest.spyOn(vm1, "dispose"); + + jest.spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace").mockReturnValue({ + spaceId: "home", + rooms: [room2], + filterKeys: [FilterKey.UnreadFilter], + }); + + viewModel.onToggleFilter("unread"); + + expect(disposeSpy).toHaveBeenCalled(); + }); + }); + + describe("Room item view models", () => { + it("should create room item view model on demand", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const itemViewModel = viewModel.getRoomItemViewModel("!room1:server"); + + expect(itemViewModel).toBeDefined(); + expect(itemViewModel.getSnapshot().room).toBe(room1); + }); + + it("should reuse existing room item view model", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const itemViewModel1 = viewModel.getRoomItemViewModel("!room1:server"); + const itemViewModel2 = viewModel.getRoomItemViewModel("!room1:server"); + + expect(itemViewModel1).toBe(itemViewModel2); + }); + + it("should throw error when requesting view model for non-existent room", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + expect(() => { + viewModel.getRoomItemViewModel("!nonexistent:server"); + }).toThrow(); + }); + + it("should dispose view models for rooms no longer visible", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const vm1 = viewModel.getRoomItemViewModel("!room1:server"); + const vm2 = viewModel.getRoomItemViewModel("!room2:server"); + const vm3 = viewModel.getRoomItemViewModel("!room3:server"); + + const disposeSpy1 = jest.spyOn(vm1, "dispose"); + const disposeSpy3 = jest.spyOn(vm3, "dispose"); + + // Update to show only middle room (index 1) + viewModel.updateVisibleRooms(1, 2); + + expect(disposeSpy1).toHaveBeenCalled(); + expect(disposeSpy3).toHaveBeenCalled(); + + // vm2 should still exist + const vm2Again = viewModel.getRoomItemViewModel("!room2:server"); + expect(vm2Again).toBe(vm2); + }); + }); + + describe("Room creation", () => { + it("should dispatch CreateChat action when createChatRoom is called", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const dispatchSpy = jest.spyOn(dispatcher, "fire"); + + viewModel.createChatRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith(Action.CreateChat); + }); + + it("should dispatch CreateRoom action without parent space", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.createRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.CreateRoom, + }); + }); + + it("should dispatch CreateRoom action with parent space", () => { + const spaceRoom = mkStubRoom("!space:server", "Space", matrixClient); + jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(spaceRoom); + + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + viewModel.createRoom(); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.CreateRoom, + parent_space: spaceRoom, + }); + }); + }); + + describe("Keyboard navigation (ViewRoomDelta)", () => { + beforeEach(() => { + // stubClient sets up MatrixClientPeg which is needed when ViewRoom action is dispatched + stubClient(); + }); + + it("should navigate to next room when delta is 1", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room1:server"); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + dispatcher.dispatch({ + action: Action.ViewRoomDelta, + delta: 1, + unread: false, + }); + + await flushPromises(); + + expect(dispatchSpy).toHaveBeenCalledWith( + expect.objectContaining({ + action: Action.ViewRoom, + room_id: "!room2:server", + }), + ); + }); + + it("should navigate to previous room when delta is -1", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room2:server"); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + dispatcher.dispatch({ + action: Action.ViewRoomDelta, + delta: -1, + unread: false, + }); + + await flushPromises(); + + expect(dispatchSpy).toHaveBeenCalledWith( + expect.objectContaining({ + action: Action.ViewRoom, + room_id: "!room1:server", + }), + ); + }); + + it("should wrap around to last room when navigating backwards from first room", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!room1:server"); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + + dispatcher.dispatch({ + action: Action.ViewRoomDelta, + delta: -1, + unread: false, + }); + + await flushPromises(); + + expect(dispatchSpy).toHaveBeenCalledWith( + expect.objectContaining({ + action: Action.ViewRoom, + room_id: "!room3:server", + }), + ); + }); + + it("should not navigate when current room is not found", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue("!unknown:server"); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + dispatchSpy.mockClear(); + + dispatcher.dispatch({ + action: Action.ViewRoomDelta, + delta: 1, + unread: false, + }); + + await flushPromises(); + + // Should not dispatch ViewRoom since current room wasn't found + expect(dispatchSpy).not.toHaveBeenCalledWith( + expect.objectContaining({ + action: Action.ViewRoom, + }), + ); + }); + + it("should not navigate when no room is selected", async () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + jest.spyOn(SdkContextClass.instance.roomViewStore, "getRoomId").mockReturnValue(null); + + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + dispatchSpy.mockClear(); + + dispatcher.dispatch({ + action: Action.ViewRoomDelta, + delta: 1, + unread: false, + }); + + await flushPromises(); + + expect(dispatchSpy).not.toHaveBeenCalledWith( + expect.objectContaining({ + action: Action.ViewRoom, + }), + ); + }); + }); + + describe("Cleanup", () => { + it("should dispose all room item view models on dispose", () => { + viewModel = new RoomListViewViewModel({ client: matrixClient }); + + const vm1 = viewModel.getRoomItemViewModel("!room1:server"); + const vm2 = viewModel.getRoomItemViewModel("!room2:server"); + + const disposeSpy1 = jest.spyOn(vm1, "dispose"); + const disposeSpy2 = jest.spyOn(vm2, "dispose"); + + viewModel.dispose(); + + expect(disposeSpy1).toHaveBeenCalled(); + expect(disposeSpy2).toHaveBeenCalled(); + }); + }); +}); diff --git a/test/unit-tests/components/viewmodels/roomlist/utils-test.ts b/test/viewmodels/room-list/utils-test.ts similarity index 79% rename from test/unit-tests/components/viewmodels/roomlist/utils-test.ts rename to test/viewmodels/room-list/utils-test.ts index 322d2a5cc6..e7e303aed5 100644 --- a/test/unit-tests/components/viewmodels/roomlist/utils-test.ts +++ b/test/viewmodels/room-list/utils-test.ts @@ -8,22 +8,18 @@ import { mocked } from "jest-mock"; import type { MatrixClient, Room, RoomState } from "matrix-js-sdk/src/matrix"; -import { createTestClient, mkStubRoom } from "../../../../test-utils"; -import { shouldShowComponent } from "../../../../../src/customisations/helpers/UIComponents"; -import { - hasCreateRoomRights, - createRoom, - hasAccessToNotificationMenu, -} from "../../../../../src/components/viewmodels/roomlist/utils"; -import defaultDispatcher from "../../../../../src/dispatcher/dispatcher"; -import { Action } from "../../../../../src/dispatcher/actions"; -import { showCreateNewRoom } from "../../../../../src/utils/space"; +import { createTestClient, mkStubRoom } from "../../test-utils"; +import { shouldShowComponent } from "../../../src/customisations/helpers/UIComponents"; +import defaultDispatcher from "../../../src/dispatcher/dispatcher"; +import { Action } from "../../../src/dispatcher/actions"; +import { showCreateNewRoom } from "../../../src/utils/space"; +import { hasCreateRoomRights, createRoom, hasAccessToNotificationMenu } from "../../../src/viewmodels/room-list/utils"; -jest.mock("../../../../../src/customisations/helpers/UIComponents", () => ({ +jest.mock("../../../src/customisations/helpers/UIComponents", () => ({ shouldShowComponent: jest.fn(), })); -jest.mock("../../../../../src/utils/space", () => ({ +jest.mock("../../../src/utils/space", () => ({ showCreateNewRoom: jest.fn(), }));

RP@gJdrz0Z7SgH^nxe(Yt||}LDZrG-mocr^Y5>)8cz-I zc7x%4j+h#zgH^yAWuij)+nrP6G+t4_+YLk7wV_KbEC6pe z>~!DKsWqyHtK18?dViP23*}Ecr&+bt$sc04v_7nN($&L3krc)OBirNV8bt?u|rAH`mmrgKeDDjn_}i8xk55T&vT%2d`f!n1zhJ8pJ3U&tijC*p*TBJrRcw_yTsZ z9{{51Te&P>F*bUsPIW1;{;ps5OjMK;iD9VIa|+Jws^XEPvne6ZY8F$7(vP(OqVXlC zGyko+jPJlJaDj#L@txDRY5Sr5Ki44!i8`7eNzn-MuzCs~7lUdj&c3%}w*FsXkc=53 z=AMBKt{l7FZIHR7>gT1u3V`*Owdb>tgpxGhynhLI@9ZPjvsgdAS$d&SE5{{do7J37 zdf^hUP79=k<#aYC%Ql4r^hDjSfmtM{lQbZV(GO2FK?6iI>_vgfgI7^Xq3%|yghYqV zOYOyDaF>xiUFVtMX&4xv3k)ITdF!{xBrv$BBi z8>@53Z)q}apG_ywWP1#dF_k$K;I`c&tnxego2vXWfLq1)hmJ#r46kSaH=XW};6ElL z831m&&j2mWF#_C#QD}o|dYJ180=TI%Qz~<6ruPo;95*nqzxfi}GcJs{XCd4^Q&Zb> TfBd@?BiwYWZQ7xC9F_kA_LE1- literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..a654ab1e94d461df67db9a8c8438867cdefd0cd2 GIT binary patch literal 27112 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff8fed3ea66c6a362318f1a6afd695256c1c18a GIT binary patch literal 30127 zcmZ5Ic_5VC*NBK-DniyuQ3}bvPpMSaQpq}nNcQZ@80wYER{66 zwlItt!VHG--Le0^{?d8w+~=Hg&prEj-sotl{lmz`NJT~U&#jx+?ov@5sHUQ#X=6AD zAW*jx`BYR#sBT@ma?hO_i=z9$bHD%Ku>G+Yv_i7fG(ULR+0k{VmtwiaWo05b@Gpx= zrSRe0$sfEg1W!FBSB7ic6qIPVsqR9|3;2r5Ds{oTCB)=SmVd$BPD|33gU``Lq92(J zw?cTyCuB*Vtq-C-Hj-Yhhf-0~&@vo33Gsy}F*rwO4AkZ{Tg-H0EQWe2D>n{jRP;X| zfp0CKten1{s9T}Yr5JP6;q~q>!5=PXPEz%@o5oDPrcpi$Hrsxt1EryHfMpgTk3D6Z zyS)R2B;sgkhf58gvkF2^zM$SifRUkksd#!q!xsW$ic;E!Cu-5XW%pHCo~tRwOc z*O`M%W^6exWai$uSUG-tLx{f}< z`>1{8!j*Dzk5@Y>*zI;<#R`tTomitiwvfGA$D*GkJ_xg^hVah+z|xK1$WlaiEV8{+V?<}tfjRkcnqT%0ADWE73m=d@PRUsKy4&RasS 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 Jn%KZ7PgC?L`b(%oJ9Gmuz)q-2Rz36+xWP=S>$ zX$e`nyB660xm&F7hxZ%I-h0mUnVB+gET>vwPqC8s9H}M(I zBTIR!BRj_*_|0(t4^Mf7KI}SLRh!Q;&W670I^iYaPXR~w(^v57SgUgyR>;7qmgMDu zMOu|ML?BZ9&3565%#8j@`NMp7{1LQ!$l!o~4$xPa=(#xYA<)0!rmCdn&wWO;!{>v9 zOIacf9WzTBUOgXg?Z>mc4IiRcal)eMI&w$5LXXL3+*N_M9I+2zkT% zs9o8%LCO5$)IwLAaOE|mf_gTFxvA_}Q|YqKL9eO4_4$uX3spbgh`ozc+0V$MW=iA4 zPhy2Y^Av1rXCHTE&y+2r!ULCvF5@O2?Drty5d79y|1s(17WaiJcB{o>n?IYagBgTN zBsrYIH9LP=9+Tht_$6)Fi~ArlInGPUzzaLGz7-@q#G$?xBxT0U$Z+IciYc;i?~&l0 zwmY0>6n$CkG_I~K35Op3p@|9$h1iLnhK~}dzb)9D0^2IS)cDFILjM$(_xPXn>FlNt ziM$^cg|o(LlM)jX7mMyAYaeLi--N_kKA7yS!yGq@WiH*G>%Kj|^>F>=1N$;5;{cDb zm*4i7g&a?w<5pLex_(Ex=B$|49ntOt(I3uj)zjGxCzqP!Bsp*?wVLD3BO5`&Wz#b` zF(e#>9&SPcRdWsC+BaCbCdK3H^u1=GhClvarNb=hhdxJOkqV-#-E$ROn#=84hE=6U z#+M)NJZ5ce}hrbLyq4n5TOy-!_%9aQiJ<eKL7L08SKxG zp@G8XTaNV;8$O#`OHJ7Mc<$~*^iGG&oMQR;q?Z;+aTm&&zi5cpob@pt^nW*0rS(Fy ze?xKCQV?Ts9maJXv@VVN!1j?>N94EWr?N2~F8zgO)%tGzN44x;5E} zQQSHOU5YYB1_@+r>P9xjSZwZyPWpWudU~OMp{VYu)lDjlGHEqr;t-L0>^FZd zrRDec|2dT5yH=cS6zd}KQmjKq*mb~XPIB_6VdZk0szSg2ig(+++&`{NI{L^|vYGs)Qy z*b9R*M|6$AwthP`VKCfoa?Wx)m2VeDQFhhdOO4Eef`SgyEsE7P`M;0l|91AV&Y$Vf z<`fjPnNwJe`ZyH!R`q2$er0ieOh3O`MP`;!OW(ob_cC(IC_G&2RhbX2S~Pqoy=1Gk zU}+U)JXgBoB9gsv{zrZX;uwiP`H+kXxyiI!Q9dX zZV3~u=MsJ1LDRMNo4i*%6H+RzGO~SBi~FCyvHcm|!?jXpj72{^5@eI#D|%nsC8S^_ zueWV>fomeYXX3WgwGbWvg?m>>Cnd3B*(p4>CopN1&gfznY6+@=dfYxwOwjEcG>)4F;4wujAQM2%EKZEQfsa%w^7St@%FF>C4=^zZ6(ACjPvRX$rMkoaC<*VVd+Y2^=rr*1 zaoyS&GkjUD`5ng_zHJucqLQ$*xjexffB(Dd=BM?-u^6Uu$)QN>A^WjdeCpPdN0nVW zjgm{#wZe@3Co+_$P#Sam;R`wgUVKFF3dtTAeIwnbbN^%KAVqF3=jEWoc|ZfKOEwps zy0K4|nu4Alk&>0)vUk5≀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 X<(0m#iYAT6h%RU9!wB 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 F{4dTpsZam_ literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..980c20f8f5c6980ed9f6e1fea5ae303efc7a0f2f GIT binary patch literal 62678 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 z†+D2@3H|lPckk^J6cP8@mGEKW~WU&}kWYqRyxW;;+idQ3j0fqiVF^B6+AvSP` ztvETonW4t$* zW93QXYC-!&W;2_Gmqs_6M|rd6nCQfB{OsluEUN_+C?$S0TISs-E8}8idM9YBVB8rc zb?vD=y_icAJv@a#H&;+Iv0wMi)h*OkVY_p?g~NYo zqL;!JFI(!_Z`6_+m(MgV+aXpXmCS-Vn|6jBf|aB+og)to94my|Yok{Ah6O2IxD(-Y zSmWjpA!O@D(q-pD$3DjOyt>?NF6gAkMSY{mHeSRkC78X;wzjqXUN(1D%xPzgy~UK? z_!Y~V9zpw2GlLs;To9r3PIx0Dc+`>9-kgBCvq4h5LSCIBhY-Tp)Hl)5tq4{rCC#yf zU6#@~wt_FwSghw2-}!cPC572`Nz5T+&?O7W@NgWWt($8zdP%I|0_xOH@=6gI z)h(k~yThN76}G^Qro@*ZLgk!q)lP{>Zp&G!2YLn9Vi|JQHnTxhqgV|BUCwDmZE<5H zIA)O~L72(QT5B9#XA%1YEp!)_6PS;!SQ|#HEp|OEffYiOwnz3^keBBP%mDMCXd;8tt{s)2E3dhw3|_6!JAV zcK=S3m?E0JJzCd06SXg#kX0`~tRUOF4eH{iOFKeYLvLY%;pv@MKUg^gGTx^|xM~zO zl{g_MEzD~tJaA{w^Q6(8w_*|G+lr`F@=hl?hUG{?7Y(V;HYT=8%>-qCG_UbaaVeO|!BU2kAUCj3}bej0)dAhLH`Y@@HA|@oQ72cW| z97DNv`E9G-+L%wI@#Sfk4lG%*#NJBHf1BtoD_=Rdq61UldG+ zil(-XAVVzSu;(Ru57|LcN;?><`kmG-Cab`S?k|T48Pi=?P|8EK0IYo#MrrI`<<;Au z1T!hxZIWea%uH z9aTeBWX)T2FpMORiVy=Ws^SE@Y=bwVaKR%H>)mKUT$2Gm|FOTy17SR|p^nU{F(brQ z6^eevsD$0&hFHfpZjo6NBWPtfeBE4{9a45KNKj?wHX1HFlZ09ATZ~xDLb0DX?%YPK z{V-{mGHzw5n)JAK?=_$)H%U-aBNv$%_Gc8|;%s;@V|#yLE6Y7_U)bt*pQu(=K&Omt zNw<4In1^Vigpfg{mj)R-{gxlMS0|kQB84>o7;f~Q8e9jnZQF2id!5#kDyO{H=-erM z&4eD8Lo)8|K*%^%&HR@gnmV7woTH8|(Mu$SV!b!x$$uo1&Z6h(81@KxL(qx+fH$K? zE5C8EG`E%YDu*0A(;6-1$EM%{fjqCx}|`UPAg%LSy(wqHXui6g11{+fgb&H!7PH6wjqr7@c4^x~P!Y!XEtD)y^ON%yaj)^q}bgGeJ zy!DtfXzX+oKRoOrZ85yG$A<0v)esZAABY?~i9U1ogglyhf3cbp1M8PIe>6udEO3@A zMh=fll{YgznY(#{f!cZ#h?|P8SsNR(=0E0zWmNj;P|^|Ghr@@qXj$9$$w#kG8K;EL-_280Du|#i zHr%J3D0dd$%(ues#G)r$F6D^4pk?@X=`m4xY?gEbO*?Bns|&%dUkszH?+nvWta5fa5lS0_ zSz!+1#F&*Z3V(x~J$;MRFlEKgVvo)TB}iy4%Q-T}DQWzQ8ter2gl>w%+Uw2DnmnCJ znjVmGgG(YsjdY(V7{BdC_JLRo=!^8>1e$0gTR*QGY zxYEvw6Kj$ebf}Ysw_g>T^4Mwf3VCHXxM94=14Bvos-59QO}}@`3he(qFJmW1DWZML z>GK|5$VcLxH*%=Xal?TyIM+JqvoS+(^j*FrY`m65YY6ZcFTwb3{q9kmHFp*~%@`i$ z5-&UWz+x7gK~D(X*h6!hfDZ?Fh?g#GzLxZ^8!rY21EoO9!zu?POW3)f)L? zK{g`8M`LVN6`YN4MIdL&F@DCoAZ3h*iN;Z6L%nIx)sx!w#JB+nDr()K) zk`}Qp9pOPD`_L0{v2ihKK!q$El_Va!j?-UH9$GM6i?1y3VXTja;%kFQt$O-!>%H>RY&|Ks1c1DIGrNzwO{^(tsM)}i7*N< zN&!C}$5!c)e%;NJ;3JG?t}C4E`L$BeM0;2c$bJNFsn44bGL6i_?xZPGP1b%=i|f~V zZ#2@$;4Piaw#OiC*sKYX zAtX6e_Rc5<)nZ3~3-@1^k$Tab;jy400Zg$~!czaxqR#wF8R5oX!>MF5P@yC<4T*h> z(dPG-<$Gh{%b8DcNn+1FA;gD6w;jYX!Yn;KFu`5i95aUAnQ-gUqod~gS47m|n%(2e z*DNeTG)yu_$F9qDmKiy%{sLB8BMwE{X60r1O?<-vn?METN-e+?GYL%osbIH{zUZsP z8Ao%}5b)p-=Y>L*${ODlMM?iuA9CROt?8P+*@!kIHENgH*d%g|NGI?yBM4X%_(*8j zW!$UFncx13QpIj#!VDH;wCz)~w##BOvpn(bMrM0cltw~4LWFQ8(Y5(j@B_xrN^}SY zs_Wa4eR4Y!!0DfL#k)Zd9uJtkudwSZC+I{lwjI&?c`}S0zf}Np4%JT3D>#Aor&VPrW!kguZIcmzbT5Sji zwanyM7jZ#zMVZeu4fM?Ne@jSbqC4c3U~7xNe|%z?qcJBM27Tc=5eY%R{q=wcda!rb zQ3yJ|*Byc${g%!3e?K^PDm&KVDv9!<_imc&-83r2Bn@OzPk)-}$GR^F^F*Fo^~ZkI zRbO$HQQB92AA(%3+E2yYSzsjhAfF7qoK&_iV`W?H7Nmn8bTz)HAB&`4&#R*JB5|~_Zs|=X7@4I z1L0xv`Ve%}>4+pT$@c58v^Ad~^raUjLY$m9*&6A$E6Edr2JB=iONZLscuAwL2qJ(8 znTESpmu;$s=LKVMk(FO$&cxN%bn_9ku_(1@CG{T)=^lqZs+jMB%DwLBo0nzdutma! zR|#0|8Y3f33D>(n-6vWd2WQr{BWLVs=L%=@9aFteK#s*~*U-r}EmR@{ul!v}_fXfmMH$s&kMzncvc`vo)u?9ayaYL!TGP`OM69V&_d?yB5 zg8S|rZhv_2dd;AHU6gBnR{WBW!b2X&b@Y)MaWL-QfiT~L%`NBx_X&P_QJIc)SU?m} zKv>6a{q5U6&!}rm)dlMVLUlH(fcR|SwILS{1%@&2xcyK)v#@=)W?SMSCf1}WZt3Fv zWqU5@QImKMTIK{x>cE(LePWPBBdrH;dMvUV!O)ch!?`j@@@eP zU=P9nbi^3IR~*rw7&EyBs#R&xS2`gmRku4HHWuQAJm?_s-PuN{AisFlg|d~MsO0@M z*?eJD9)doVc=}(Ku+wcK+9ba} zFGF~;WR3yPP5H@N4!#^4=Y+opl1Og~VsT47=O4{jmb)Kr8G@jWwCWbYnc;bc(Wt_= zfV`o_b^PY0rMRga_^ABxe%q)3sXR==QOmxuTk!BJ0F0JTVMOOO2}R>~`Nb*8p@9yZ zGerTi%OngtF$opJ#7svJTB|r0K3MRq!dSh+-DAcIaX~kaf{e_u(SFeRwoxtiJUFGt zJ3!z3PDp*NcK~>G!|S5HQkI;{g(3HspxGbHz;8)U^Lbsc5}J48{WsKWJ2At152p`C zOV3k+x^0s02UVuLn$Bv_-S{CJs2&K0;ko14w9s1)b|sfd?`KywE!TiAj;^uHNt6z| zqJi=GvnT9u>XJ`WpIrnipK#F_ovS&(MUwf7FY;Wg~P(3&?mu znO$1=lZS~jC-JiR5yX!)t9(D?=~n7d!(YNJkath2ASQEfW$+IHTuhq{*w3c^hr3Pg51 z&fs<_e<1V_<=&7vhwz_wtp-Hk^R(OG`(uGyI8{}Gz(oMn(3~7~(`Qdw%u;?QR6O=ixZcdqcSTE~THt4;?3(vcoWw^Z_QG+0js|uf?|9{&4 zo8Uj?JdmiT%!!r!pJ1?~-yFsa%tGRR~ zET3dLIwV*Si~_?Vul@ja=lswy7}fAin)V3FQ@3PR_&KFmtbXfNmEBE(j=5x*+9xRCJAT?wC0txOrp z=`5~p^&M;&xLod8Z1Jv3hY#wgP2|#T|4V4SQt#6R-F2Y}DalEn)b~I$N{6|CCKk^1 zFT#HUT;SaB3iSAA5s&P0&llXyf~`rs$om245nff^8@2@bCX-!ZMc|gfWtlHYZg$%4 z{MIP@)P-AAER zq)flQn|!|UT=TVqFm}<~M5T_Z?<+UwyG1Uj=q!1TJc+X`7cpe?RNpq%m~-vE42nN8 zJ;rCz3*2j_anI-K#k|P{|NTfQMLzi^(TZmOJ`FCmJYS>e<_8 zd@)%=-J^Gqn2NN~VP5Fw;ird)@j4z=Y3-GFY-*L=yl;Z<{#Kpt871N;!WJo26=Vzt z1%WB+YWPhtkUsC)E1^XwGvJ?Z$HeV{pf$_kt4O5KNLv{5Ykyw4Q1|e?!|H0>(9N}r zaIZ(>HIvr@&Yp^O(Jaib%}|EzJL<{3qA9x^Fc8!^r{fv&)Oo; zLJ41{3YMQlSncH;=w1uZx3cJ?r7+LeENp27Fnq*OT6@oq+&kRa6aoX2QIu4DEVB;F zYDrn#gy;?c*OZ~Yjt37Cm#RV$M|u* zq?pDzv&othlzbSZmnOq%drScHp9Iy;obRXS`&k#UiN_$wG^d+ugq9+&?KyY33J#v@ z%`L$3j|CE}*5l2QF0GL}uP;^zYXvg@c*R%jFes0kLGOj2ZQ?Tjba+zTce>7?M|_}sjN45? zU)(u&Fj|z~mI8Y@IHA#>cB#dvvmy>#)Te--`stCv4}W4@;t_!qP}OH=LoaJ4p7%_RnR@;36o(H2dSlvsy9Z{@P1Yn| zQ-q-Mn}r{j?CWZh%tdVz_<^hvFYxG5bx8H_UhIh~a+R?^04m2fE);{?y+sVy4iW;7 z{r(d;ICxA%UfvQ`E54`_O=$sGud|Q^li6VGu+_U6zr$9YZxMTA`V8}ad8u+#Z!S{Q z1&pwcpmT83l%XPJ2eTNUm+_Jgv6WpvR0-wAnIW7Gc_Z2Rn66M>#{)sUanXnW70Cb7 z3hzIV|DO&99VFsTf1vpo&#GQ2SM8)Po#03b!~1gCz;gh@aAd1y^p_M2S)M2sJ*W-{ z>6D_s!MXKN{7ilG{qKI_iZ*EC>Azx-fCtKDk7wiRkso`8d}iw@@j%vQ_7=G&f|e{4 zhiAv)?v?fw&`M`FKX`fX|0A?`#1#C{$vfl2r~dTM8%ijmT7a%$ybuNjI}VgzUJuOD zqRfFp!h^tH65Mb?HC<+y;JJ(n$KL!^xM^ICqOjy@dD$&nB$SG~^x`W$HDuK~q@ zM=SvsbW{QL`&#{$U_hSfveLh20m)bVva2Z}E5DV*FO+OQn7a7~4S6ZV_+|-+Hm1NO z@-@gb+B}h-fHUDC6F1nN)=gYcN3{soNL#Cx1w~`UbG+`J+LHF;*k))_9|Z>PqycrHxdfuGR(j7+y?K*tPC^>P;U|M}rmkVn-B? z0){JuIq1BJtHq+qRPLr7UT1zDju1Ldz@2cu6!Nw*q?qGba;)4xCzDgiGcY=DP$oc^ zifiGCF1o+=&vXSsxn)oKHsGbdN`Z55o3~UMOja-vo0=0802WR>I4NHFg5ntBcyjI= z%utsZ5QiO)2Htx$j66*yJMx`OY; zOt%R7>Qw2(De_EyQi!#%uwswN8#`Mt4Pww^8G!TUX5fWD%H+e zIg`@?kE}gJejqbK_3l|)Jb5y*r1rmEYV4qYwQOR3t)uO1Um)j9Q*rrhyq~yQm|nl1 zL2xK%3Pgcwmyd)xS_l;|q_uWK5ALdJWrs2STw>!TXV!SYDW;9xT)K&r<=KXA&Z`;` zE^IjFCExv=Yx~?GD3|;wB3rJS&q4EZ7U(37)L9H?(68Bfx{9Gb#|~X`v#A^$bhLbn z-dg)*lGHoc3*>M6BQWP42j0gXcSy;{Q|$(6*tcR+w(*9jIWVZ1Lx87CwAz-p zZG5P)EUl_Ya~ZS`oA;xDC5e4RodF*AO3hjQ`lpZ3j$ z*5uHL{WfV+NcE4R91)}UIY-kM;}S%IpkMl>MDW}H9}&wx!kDIKyF#t^1WGCzXXf4o zen6_>9S2Y!=644?nqu8lK4pL)!G>?kc&o3xRUQJI$Arcv3&w*Q%G~SInz<>sX;`0Bfl-~)}9A=dO2g5q6m0ghkld@M+ zpm>}4?Wz)O${A)ew`n0+tOi~OZ7c8s~a1)WID@gEEBcpvXC;( zkY`nvUu$@1>&rgIu=ew?fR{Mu{WVag^7Fa*5F>@)&uUGd0@?*S@hv#shH6<&z-6`!vj>v3kkzt< zd(C?f698j|d93b>?_b$o(T=#y`cm8jrf$pAif>4imr+>KB(ncrsJ}FjrplK3@Rh=m zdnbopxXd(VU>}0-78&;{6ESSNv}5$`hib3?(BKSs+DAm{dONGqulY~w;Dye7mJ2%# z#K(Z0ufgP`W`N8hgV!$0OY5S4fz3d#0Q6u`bfo&&GitI?cXPHx^5my{5L+EC7CySU za@cco!mJS>d;7b3?6)_sa1REb9)TW28gl)|p0xkM&{2TE17EC$M(z%>`CCJ2e{$NT zWdUZpDK{wbzsMe&)VXVmY3DT+@Xi)}7FY%RkL*P1r42a(2fCLyqQauYX^nTXmPRA? z;hZ;Se)|?sV57=Eejjx475nj+fQ7X!8SlflYJ29_wvmI@O}k-cs~GBE-B=s0Kc0XbtMl;cWhwe^}dQv%HY8dN*D5+sn{ zohw)dvEYO8e@BbObDv6OKw1e-nSpC%%bnA49D!?rSHA=Fq!5zMy}7UY2iUF$>}aX* z>TdWO`Pj8`V2e0XC$j{lckfB(TvNiDPu;WvUR`?#|HrC1St|VQ3$1i5u<7CmSSr>n zEiSTpN4p-l87?1&wOVbmFX(Pdz@C&a*T|pI(&@EI%W{x@mN+O5 zD;%Y~Ff9rynDLL|c!B_#nDbK?yB?O==*Q|KRLN#*Sv5f_9I36*GJS0FB2TIF(KI)n zw;Vp`z6Lwldg*o^{w3Acu;y=-lH24zKV_zO#a$N&c$M3Q#aDU)oQttobJ5DQcpqbq z0DY=0E+jf_K%XDb1dsjmnNe^s=3-%?_5JBv^@M{lFhW)Oyd_7)3Ou&6Pt3*J*sDEZ z{U&Y+%lxaZn-g`UPF;BkMwrS_`>?WuS5;Gh<`EE*Csq6Z2V$1$L0-qsfFLD5c1u|w=YaKi`yX$uQ&iDR)}0~-)l=3;q@NBbM6ca3Zw43$llS^iuM_Jvfo0vK^<0T{_fq3e zPve4=!`{N+-yf3mTGdFF$hQE2ssc(O1cs#FD~ZKhTi>XMG6FG zax!#9ymRl|rZrx0WCjrC-$8p<5DjUeS=f)B-VaoF_w<7W2L6?#deFNe7HqJsWS-eBo{1f%<Y;XYvy>Dy&S#{C zb$iGsET{7UmS@7im7%!q6$Wfc(--D z4%yRB!lU!}c+Qk<^JxFQWEcPW3Vbw>DfTZu_IasAJloIl0bbvf+cMfTud4G;@1F+Q zcRNdksT~U*du1~W^vCl@uMQOmIy_x} z-Q+XA8B{)Unlt{7`96{V5uo{`z_nX?H|}1}4IlVXPSnv;|M(mPdAe%9hUMbtEmIZc zI3da8vtk1~H?U?o_|B{zT<?i!S(2 z3#Z!qrkxM<23E@krsZ<{z{U%XtjMVpB_2!Lj{KS}z_j=FNrY^(?noEdu9X+P7f9@(I$Pi z8->8lw@yDO&c7EcGof6)u+9q#&oQAObZmbXy_-C`4|KqQ6#)D@OXYQ5%L{;y7=SJ{ zYucByGrq`zN3z!c=>A;L%HY?E;7QJ~H*FN*iU{vN6C4&vS;{`Mbot3~Z?AwRx>99rn>dJ|`KjlOpu}mESY!kJrn7BJG2e>7WmHlM~5>&B80`ESS#9 zN3^;E1vLKfqX%9Sw=?s7B#@QM4i#ya{C)H*)kBKcyi)<`Lj`=VdBAv#2F6b6lGs1i zEvxn1C-8QkCX=+8;EynK@K z7bLsfCAQIz?}#ME9L7w9 z^Pe37tKv*QRKp>j9?nPO9#tGZmf8A|niFGDQ9U5&^tWCg=LtyFjWs#&F`xGSy`ux^ zZ>|8yR*1b;PQ85w9*~#vzw;OEA&^E+ezIl10gH*LhJVM5RzU*;iC*5%!6}@jB+(;M zB@3|3FQ}DT5>}B5dZhZF1bQdx!0hI$l5m$@(EhvM^oXLvQNx1n7$yNK9%m)}(&rb0ID T7!9aP2r|B8cCq-v&A%7iegoc{pd1^*#GBUFBN{=3Dk&&HfBqO8f zJ#z~9jkz~NIT_hSGNp(2bbQEHCQk=kmS<|+IO5oz@^{gCc&}-bCqMo6%_sLBp43e8 zxTHgQXGBit&9?Qui2i?d9`#O z#XwvqU6}Ch!OhZ8oM8(g`}O1d&5M`#nRC)M&bXfWbK%choVi6#JM#~tV-2Hmi1hC} z{`x`y_+p*W#V=Cs16kVNJDquvLPq5}a$cNSfsCB$#J`t>x?W}@ztF0g*K>yL;uOU; z%b&-b(I!W5G;*n>_J@XrS2!)O9M(UD4;M~na=?f80u8IZ;zXRrbEJu+zCH^skMEyP zrkyL2CDvMhx$02kv|#2CusLX#w%umH0J1>ZEvqpoo4@^z#X~Eec3i-X`OAgJuna)J z3jzHI?YHQrFNzfwJ2FM%fPWX5>#I=dr;I22Wy9Z!MSRzTvNP5e8Va@< z?7N>+zRFv8eYA9OqIzo#chLB34x`-m2`w?NW7&|%gv6E0in&&sw8!y=KfWTc^7Gy2 zAJgmh-QSD9`@oMG9BUqT2KwUT!x07*k~|r?%NdQ+zxMVi-^KT_Q)|+$8oZ>b{Lgz^ z*mmB>1s~#iFMop?kCs~N8F3jZLph_jmZmwtE$7;o*~Ocw=`~&oHtUu+QZY-ocXkWq zW+O0TgUc@2!oo_Q?urb*Jo{s4QjjyD(^s2*5s7p-GbP(ZwIr? zccu=lO)IIN8+fR|qnsPnp2(H=SVFe5VDaE$fn!AGSgA!!Co>uM{qN5J$6{MKN%qSZ zy+dFBpm3b3RK|$Rz~bB6I;%L5EWsxFV~`C{L{FxbgC%X@k8%dvLt#t{X*WW9tTa&H zy(W9B``qSd4tO%V5OnKHG#W0PQDZSwB z5vrIZ5K@a(!mqRYHWPge|AqC>mz0@_srglo55JZLtnITwNb#-pv=BwAPrg~s z;x?!7sE(s?`%zd?5NQv6bV1BGn$=H7Ig!u1GT>+}#dCQ%Etup6zX4vZ^j&t-5-@sP zh)Po->4+X6a+9R`Rd%G;-?2Czyw)e~AMR`oW-UZIgTvu{y(fUNa}6<-R9+^88>KT3NzZ5Fd0U#y4ZM`7FKX;_Vt=MT<=j&Ls5$osgIy*3PPc^jVqC-=ezd#|J6sewR=NDq zz*9yxkq^wtyt|;0iMuWnpu!-St^P@6W475bO$F7kKMS(z{HU4LT9^35H#qrQGI!Pm zR`FC@ZO(h$2^`wbtukBMw>$3ih|R@6c`A_hj}vNi$J2QEW69ch&xhj9mED(-^ti}H zEhBpLtv}@fNZBw7H{!e(5M;a8r&o+7sOQGhBwZTDyaOJ`AZ?4T7NrjMKE35svbNBz zJx)kjiJCK4PH6A^02!?gXK~IICD!wS&z5qFxes20jDAy~ktqyvskgYWw7mrKgDHy+ z)h?KMVh_r@B|uQji-Lu=N@mOUB&+F$L(IBW;PNsC$U5GAa=` zxYi1S(-?&Uv#Kk3I0yjA+1q|avceL zaeHbX1vjGM)sY$Fph+hw&t>631nSWFO-t>^H5)Dd4YP0e{;k45VCfut+kx504>9?N z4{i5KuP{p4hD@xS z^=4WbPIKwI2Uqhx1{0vh+<6F(LE+n=l+H6oprheqWI^%jHv3V4-qaA zQBfMr)K|90-~x(i&XZWG`F4mhYqY<53txjF;9Aqd+zPvw=X#n@|hsQqfl6vQsHG7=r2Z8dnw)Hj~w2-PWfUJP}oy$^ALXHZ}}M z=Sh1T)vi11J*WfNkOQf5UOC}*MniYhdPr!PXD=i}(q}!LMDi~xuCIhio5OUJ;yv0w zro1}8s(Az?ush(AXU#eVTJqrCQV#9hD2eyqR0<>y1J@2|bh8cY;(4^2l(ZBbe!R}8 zOp!g>?@)T)I@aLfhqZHZrMP6m6dBL zJvE+dAC}@6%D#PjG@i$svNqJN3wMOP(2GaZY=?#Ic5?|8BM0k7E1gm`WoFnHy@#uB zHFV(aZrv=S>!uM}xxo8p&yIKRkrvy{Hrk`B{|MZCoF;-p`6mWjdd7}_QGEMV;;D6Y zsb#lgjQm4|v7Rd4xB~@dxKYlV6k*{W+n^&H+K&LqbE1`c()&buM@8Q=u%?Xq@;8@A z=xE#P*BxI_3#qj!kg^-?t6wcr+k`37yT6wWcK^f4Jn zI`>xcE#soVI_?hL_51D0eSwB3ubloCiv{;;6-}tg*m)bP{rP~e`=T<51}C4bWGlsS zHcf*ARu6okk7`U3$D-W~w{!PGLzm(V8HH=i_crIX{kZm`_%B*~nSY$0s@xjwrsJkh z-O@hzly;^}jn=txj(?#$#XDf`C`dkD*urZ6az)+2Gl4*<4Z0$O5-kDL_Hzkw(7GnU zTcT`dD}`Yizbu;X`u%?Udue|i;Sw2B_vSHCx35y~WCHg;)+RdXM=ub~icJhv4}6lh z!l2ZC%PFCZf*xP3(DKZWmIH$6u0PMeA8_+;@67jG3gUNjG=YL`70UyD);BAg!m#4dnd`MOvea4ZTru8} zh|tJ+a|KsvsH@W0oE+&Q9<-Sa>R=3>jc?hz@j_{{bFCwKZLF%*ET|+;=DMg^trza` zKS6Q-Al$66J%`Zbq##|mSAn_Pa%An=ssUvA0;_cH9jeaFB;%nNR#~ezzU3?4)&{Bv zm`ou3cFfm&=uH|=2TPU>v#KX&`+1{<^E~lG`b!8@!iduVS{FXN$Yb+L6pT?Jcv*u# zi+$|*nsAn0U}PbJjuFkRo!dUBy;CfSx1L6CkFQb5o(MSjssv%3Wgj++0z3X^D=rc! zHf(}7K7C}L``Y#*E-IW+G**eze#);luprL20X+EnX`hn3lx~Z}hg<$$c*%|L7zD|gO76YC1bDjY_Q?V!@b_c@z{$`G8@ygK>m z*ddg9kr8s>^UKKX#apV+D(EUK_G3rNJ}KcvVX3<^X^sQ!oHf>`YSgELYPP1w4TudJ zuv7JtgDsV|ea|W!#>dRea#ie9p)y}sWP=W>um{Fd$tvHDH$w?#p4-DUQRgIL)18c+ zCHSWmZh1T z)!WfGvxS|;VRXtYu~?V5aF!2CF3I+|V&BSb9CClm=6M$a#cf*iLE72+@YMwdTMPdM zoTw9pmAV)&*dG}&y4}_(gDwt)?h|~w#BU9GTA!G!8KK)KR1<3}@)Z$E)h4|2CGEV3 z6B|tteb2-nJaY(EihfjgU*BpmoKH?7Azc(`SFWG}RP z8lK4QFs$5DRBOTy0cRP8SM0TAAA#8?KGeMqe+vxn z#iwZJ!cJTnVE=*9vW1D;%)9d4X|gWCRvP!;pRx$7=INDhP|3beZ?1OcMH@dqs)g8cStL(1I3V0DyKaJcJ)^$-OdD<| zM}D_Tq1Px_I2t*h3Y9eyFI<14Devl(wD3YT)1b!ZJNpTmT+%8)Z!n~cnu6$(bXwa# z+|E32?8UBohpihiU1!QUmHqs#fDG>}dlR%0_ZVi|nWHH4a?NNqYulI)w z$6Ofq)pUwqR(*EX=K~p3Ig*~64Mg-HOe0B27ER@alT}?sFL+?;O}*w|D*oz0NSb*$V@r$NQdX|iOz`&6sG8ymA^ zz>kkt1&)k;-K`Uq_NAivG>8td56g7!7~eGPd5-ata>snLce-%;TVa7O#=Ci%$!dzn ztWYCJJ-odkv?g}zOUM_+n6?QSoZCrqzb1ePsBp(|#`EZXo5HfBKc&6;+ovdBk!iAp z$Wc(VJq}Sd#mq}y=}7qCYrNTB!BpX}Mou)Dt=?MbTGBCBOP0zBJi6{qyB#<-$4;Y* zxWg5<&LR3qZgH&|yx{p&NhccbZo}Ejj=9qQK_f}%eH$*}Fhef>ja9`s1B$tJ#|~v- zy%KBsRFGfF7h9fEGFjn`0^O=t#q2q%+XT&t7{d&n&bwPz(es-YO#*CV#w|swsaR&D zN&2dJmFvCMw`uQ`0z{oA3+Ucz#y_@-=g@AEI}fS)!?cEyU1B>&NqhB?7sYkm9N$ao zOSAHpv1KX#1cy;9-l)dDzO&=?u+x||9b<4%v4?e=N`IN%xEfceSOEY|VI~EcZ(OT0 z@2mCMga%ZnPeJfZ7mlCFJ#vH_m>EjW7|vp*u@gM?h)LF zyFv*v%(Y$PDWeO*Ub%#KAmuf8`F!`ielzHIAu3lqoOki_-dRBbXX6UzGLlir@X|Ct zDp+9BQ%JxTH0L-wQ3*zL(wue|2jMy1R2>B%Yvu>h#iq{_*&+6)k+{Cos2o~UYbNPdkA5T1QPAtHM#?Xa9CtYhlqKFQuh9byh zsNo9lWBRxfkv7;kd97iuLHr%PM=jmg7y+`@oK#n>Q=uge-A*!`rs!^fX87q8YJ^Jh z7?1f|&e1(3z{>xGhOS8|`Qwpn^;oMQbsahbC}=R29EUGbl+-XAd8M!)Vtcz+-k=gX0J@PNWtECS9nB$&4Y50>c1C#y~IZT_QYp? ziZd^slLh`N&p&&>8Fzqm?@$$c4lI}wN!It5p!v!xM{!-??CGCb<+*N1)z1%rbB4a4 zd=x?#`(5nU1Dd$xzW#pWcdvmLyD64@|5tk%`h=EE@7K1|(x1Un`n0}HvG2nw>7q#1 zx-b*nE*6K34LVNFDGS-u$xlzS-dyG_y7549w?sGT&mBHpP9OMrb0um@CyF|o9*lS!ULC(-4^4AdUMut*Y=%R&=F&oZtajF1j*H`Dm~P?xreSV9lgA zU(D!{CF<}QOR+5PH%A`ng!wZqy`k10WtcUs_3k*ZLuZsZ!`z^pYDt9v0h2v$KV4uR zOq@(ERn|gBUl(ramVkZ^J}CJ%Y?`5UMS5iS5}$d)=j+z@ep%@_bvCk6lmmX@Or0%8 zZdUJ-I2J(2XveP=tC_3x7NQdEqQNV@1#}XDtI3rt66w>G&Kf9Io26V$m&N_>2>brh zlM=z-pF?l7n6E6D2kExaa_D5WsFqOI^%LbMO?TA%9oMD;?T71LPO|hK@i9w#sr1N< ze_73oh#Cw%akPjw57tlQPbs(QVet%ZNR(da_Cy_QLig)7VBO+@E8BwuVvz&KlRcCpLHGirqR3ZSI zO?=I#p}Kl_W4ho?suoVq|r>%E1v;O#Et^wPKYS$?aKVwm@isr`0iU=qN! zNOAzkv(tO0V`oWX^hG}5+SxYFRGAmZqc_tqlfK@F{Ey@Gd8 z$a{(sWsN}RTG6^WkJ`4Qoyjf+SDWwv=(4`M&@6aPb*Sc$fBaRo@Yr=pe?rvWlmG1f zu@|hr56K(iGVZ~}8R>IY4{_$9qTU=*UF}E?$ zx*V>xFns{HBKgC%IIft<6=DlqL|lZb)R6kh9m^O1BoZ0C;|D!C-Mp&#O&!KWmDUb- zCgC_^(R@!h*Q{Qv3axT)Mqkj!=!jAb&dqRn}$)wsZksKzK}`{|e? z=Vah}CyNra?#!2TMikvKEVXUxx2hzu2JI?=tUGluosgBF`@HJKlKvR2&7j$@R9(=c zFzcX=_#(p2$+I{v`1(aLFU*I|EV4TyVya*;&f zMoA}M?~(5N%_2KqddZ_ORDaf+H}nFz0;rG0#x6w#@@MInzqrwT;MV5EV@FNXdOq6I z%^d7)*&S5vlv{UA+fU}Eh`3A@>hYz$gEXlY-c>IK;mo~Fh0n9zeSFMV64#>jDjf}n zmR}~)I(!yg$QRb744ODVw$rQ>DCR{C8_Ndr#eI8gCT0!{AvLT{OCgk$>Dd|3gI6MT z?0U~8)wpYBTB+WjAZ*2W>{Nx0`To$zv=Wc_TcF4&N=^c+0fH~3l9|Nib>3{u|2x!< z1;sEXby{jQtVE6C0G>d?haXe2xUovj@1GN$-9$2U5oW69f#MH%6OVE|@bB7@GF(f{}xo6hmVTKNz9Y%XAMySoQ zTCMOe7s&mh|8AFDKZP?_<5{H3<4={09PM`2WqIWl{=r4dgj^ZhL9LUe*2wu*=@Fw= zznG|shaBfB<)Y$!Z|Fstid;Hl8*1o~xYWlZ%Hy4TXCJ$k<7Yui1leQ={^0@`16{zl zHDQA^QCxPjB=R9wJr04$IXNzBCSu|LeOA6m_7m6Wp-GvGeko%9^F`Wp-ruDgD3s1r zRVid^;$C7?)LUXlTe1yqO#U4Ufpo7Hi)l{X29Is~;R(dd4uR=8yOo^Drv zWHP?M{JOeBgo2#c^`O%(Ma*9TeU-=ALP($lrdd~Lq>pOm{Cb{8M>h^$JOC84(Jl0W zG5;#!?ie;;Ax08Ea=*=>XcQ^QpzlUSk-;J7@^5kRJ~^Qt62lUKR09E>!i?Fp%D^l$ zwBmbOy}guO)iciO__LQIgikoqhVAlLL3yQzV6_9&O^58MhleY_n@al5Se{G<0r1*$QNmdIxf$}SdfB~Ki* zmCDYZzxyCbXoF>ejUx26hJ?Nu-)KeGE5eg``+d6(iNH_0Hq2sfol~?<4GS0!UCb~k zpT5rYJu-xkwL&n4`bSSJpFMi6hv#IZU%+|#V?dH|OHTdQ8rM}Cag<`g!@EaZhx7}< z`!r%@M)l5c#JAUHj?*$Ek=*xcOHO~Y`;Y4KCdN> zL~{2Zg%tl(Yxvv&Tt7fJbk`<{z#W6^^jy)x+fw}& z|KzYUl$mlFj^f)*C;0G7Z{%yNI-x+)eAijlBuXy;H(>xNhC2q4d8BMjt8a&jG41Hp zDV*oki3STTnQm3$?<@(jo4%v{9TpeuDYj3OQ^s-wCQ6o3WrWb1ag;G5`D=@Ge39*t z`&qId^It|LCUsc~oIO$*#kV<+bkL`YxoJuJ?SN~C!3*6E*eFB4qUl<{!=ffX@2^Co z(t!AJv_E{tyh9HgMx|Y+YYH12_yJoMM$Utcyr0BS?<~VI4{Hj#Pp{b`!Ua5-hSLk& zTOTFGVO6$ZqHXMBO7U}2e^S>)KZ@-$p+C+7kqhONm@*g-*tNXdqkOg7Ye}_Q#*QuZ z@j}3ng_L60nntb)!w}Nj8+qc$a!ds`iZqu_!)4Q_E*DBv*kkM6(rjD#gL2-EzrIVI z#5z&vTNBeFJ7UCnqx*vhfhp7Cva0Jqz>dD8rw~ksuSpQ|Fu`L$|FTfM9)gjZIUz)>Wlgqf0I2Kv>rBk>=mDGVk>##)TfBj%?Iyk!Fdnse;Bm5d z{3KNT+S#M>Rs!xw(dEK5=S1!S)Lf7u_6inigFJCiG{s-|kf-H0HQuM zwe|Xq ztY;oIktL4r)nxeTN>5kRZ_an|C2qxtJJYUT?P4j#nHuMm<_6y#zy8+S4G=LU2uG$a zO(?{-Cl2+X_@Z>3r%5N;QzY|Bt@qX#bhX*+k9H&I_V=N_m3(yJd!dc2k%{f|?so9F zMcL6=O;5XNEm=~joK1J?&}O`Y$L3(c;--19qgI`(f6hvc&%88K*TFxoN45s8bV@4>{a7bGJL1e>T)V(<@s@h(E=p)hk4V zPO6Hb5U%fSdkVJ~1>T&hr*eO4^bw7@XT1%*d}2dDmK>>W|NFu;ekls!_}Q9v7J!*z zWhw8I{@DW^R$IQbpLQRZr*9F9l{VJ9@+}d~83+McX}xr}S{W@gECmE4S%PIX=8|nN z2>$v~=eJeK^%#J$MJ&U0hd$D9VaI)C#m99&v?+Z;c+-w8fo#SZ1_FGy@_qU~x33KP z5+=l%dhT$IN(Jsm6-`e(H>p%nsx__d&soS&rL6`)J;Y1JAB-X8GfUE;bVu1&a$^hC zZU+4LcDIb7K3Updt>#)iFs=_qh@_+;JHB#*u9u}qtoPiIJmENIT;>&4i5syKxNTUM zFKE?iiv&blmNuDaNzeqK%!}j?{_#zd_~n##{=<@+m|IPxvAF-~G0Dhff3lfX?LWHn ze2Y@`+b(x1$cusAd|?vNZe^+?nw0ovXm>%2(P2Bo+7K-cm8$lSH^L;4{+~H>I`oS) zk8W73Y`oCpPvjluPUIyth>w+kJKO)-8PR2|QjdtVY6T{nP&WYd1jS z{(%)d*j~(CsMrN2kXnac;qU}&u$y%b62A0cN4)H_x7gldPSkd0*_H1#0gpNzVRo%| z1jIli(#fN?bYZjx5CdAVoPa%d2L$MBz=)ELD#U*kR@4_ZtrKZY12L_=ETAV=mtTD5=V8K4))4@m%VD8taZB- zEFZq0roWRO4MirI7MY@yFt|1^E(Tsun1gecNRJ59E$!w4?K~X#+fsiXc$OzSrFQ4r z#J*#97jZ)rGM?Mz6`(w-#ZhiOdCI@tfHCYWJ^#pI{?PlZjU7>JfV*t zPj+AH$``Uu8#~x7=ns8=WyF*G%{Up9t;D-UQRJq!H?Lk_Jl>%rsGDsI*~23RkxNO< zbsyWL#{E0GL`UeAqpwMtc`i>_r|Ay8j3iWAZr$hH+JyOe50!!{G2)Y=Q!F>*$oyzu z`{sHl#<5>u#%IVt_Ft;phj42vKn-?QK^k8aV&bZ!_urJ}eBiaYK-9Ve0@XWz;T(eP z$xa45@Z>XX7;Eue*`EEE^vZB?Z(;wj6ap?AzwawRF zdoCYb@NBOX<64@Ci4oE&plx13$O?KP>V*w}&a^)ezgCLm6>V5!iQaRKRj3m+<7^UD z3cMc;8J(JykF;I?Mk7SXQrD@mbZbuGR?A0G4Yj!;DR2J*T)&$V7V7NVoDz zZ+(ly$qGbJP-&h@tOLQk`p_)84q0t2L--Boo|G8G!p_OKU68NO>_X16pvhX zx_C^-%CS54G-Y;)4fVCW*nm7PRwPmvYB-qCt>Ug|gOV?6;W3!$S8h@XtoN5Gy5N*F zKAvI9pSYT@`ykLPNKL)MA!E3UHNlr338YRzfggUw%Em+~cl6sLT;awj*v7NR6uAuP zRv%;d(S9`b*reR`UWLPu3Ui7dRJ_e~-($(qQIj_=04mlMgs_q14sK8ucwAHY*b1`S zx$!Y_?_QI%_mJ0^okdZn6QIB-gnxUjY#wf}izsyhCd4ZE)j}(QdTcwjAjYfJkU>3e zLK0eoYBI%65U9pwEu7y<`Q^ zcVt}pZulLpR^e%8quWx8TuX9Nn@t<=bmx%eF_sV|A zCQr4_IxdR+uC4%Uf0roytV!yap6oNg6dFH`n}ezC(HtEZ=It?ONBFtXhF+20zt1lurlqUYwo$R}5|U$ao|E$@yJO8zU)nUjDRsi1#tqbebfk zXnl30_J#?}sWX$+V|%+mS<<-}Dm$zLNS!`)#LChyMzpeOMDp6!w+iiw&p7g5# zG#JHoSR>(}Ma{0G?~48bLs;ROJW`Q_6``2r19+Z2fWeLsSq(y?%Ja%TeWf;u$oO0&&j6n0pS zmO1R4zw_Jg0Yf@dYaEBk`pb}Us`Ud^2alD`rH*H}6S+`t@hlAWj=sexPT2{yD_d9I z@DtaEL~WmjC*oBjZ8Bq;k#{}!GIuZ32Cl@&UL75se%AbE)L|;fCZxDwpXZRYOalw< zne@Zq8wfrRUns-Tg?%ZWtG!%wt;=pU7@v_(?+Fu3fyAXThvGhfSsbd?K7F{kj387Q zRyd(GX@s3Ed+GrpvGgR~5I0tDtcjQ2?hV^_$9T+lB47kQKxuy_%uT{| zCZyo`$-nU)noTJN1d|M{t0cKurN43J4JjGV!qRPLcnvE7jh9!3cc^-1c8C_aXH6Z> zGsSm86!kFzw1HBqEuV2rb1aWNf+rN|GSkRKdQR-H{_}`c{aPL%1sq>ih+!Kwxd*S2{JJ|m8cj&J{ImY&zu-57#^U0XLF_GrM-xFKNb zIm{@(D!14m8v;*UjBs$NY@IV^mWcOZazjMyopXf_^TqRe^Xs}<2V}J$ZVw35?2uY` z3~TC&Q6;as(@+;Z9|LNxh$#_J)k1e#8S&@|2o}q#<)*$eW&2q=~6Ai z>CS)cB(n*wsIO#|$^Vk4-d1;a%%r!}NEK*=?-9+fWpW{Eb)$LB^S-^_g-Xw{XXJIK z2q*g1d8`haZ7m$-&v)pLIMA@lWOkd@z>daU><3;68&%EN_)8V&0#abl?UBC4XQydc zO2>USfAnR1DLH?EMIyg$Z*y$x-)i{VceFTXmf>?f59jPEeBLS}ue5@B_Ivlv(r**g z&6gYApz|L$Jrn5*{N(OgvA6QT-@m+Cet+fVmfsI7Qzjy!T2siM-|A7E2<8S73I6dd z!^>%WaR|LX;sEd&8QV((aGio!ui)8i?(TEzzO^GKs0xb<{3;p_HXZ!En%~45m0?_J zO@Z;w6>crD{bqg4M2#nt2ToWQ=d1TW<|CsBE9Pbi3b8VF22{8^^7``Ow1*Uk>o<+R|Ej)HQ zPccbEA0n9JF&`g4m@%gvp*J?Hl-b&_6N;Vij8TYYf!D6qJ)jpb`>+SH9&}Ybump~4 zq<0k!37`g*4a-R0wdLGje&T@R`uwZ$z4-B%$J4*^`e$i>H@t2YU?;4PqCl-Pdg{q*l}#B+)2G5dmeM@v;krKS7eM7W9iYERUUoAdIwPs?%!=`+9UtREq-yT$LpV_W|t%vdFol0QF+zN$B@R%(DahC487wN zK?>8*ir3xBi=-IL9MKReD#Ijo^{;h!8;_go^>Dd2bTj#EV5`o; zRz&rv%s}lo$dxJ50U5K;(|kQo-v`r`K6(N}_UQnXFMnm>r{w9+Xq2Do69Ab2j)ISz zpj{^v_HPIPK68UZ&gSBJ8h}WT3hk)=Rw&@pYre)*^OKK44%<~N{#gI_rJ58Z5<58o zDTez`)<5>Z>^E{D9F40CCRMJQ09|F#6tX5qjXH7Z(!D+X5dUCJjsGwOp<)yV(=ONF z=}hLh{ax?RPie=v`ue5sS~cZ%2KPHd?&6QU_dmZpD?{vf`Q|^Kc19@lwcOd)J{N&Q zl{NpFVgXxlm5rQm_n)C#At90!AO14Ha*aDci_jpNdlGmMn;UueU%BqCJew`ujQ2i` z*868U0>()q{x?TmffHBgq6#cK(NCTKx->>wdV21pI)BC;V9PJYQh5Bkob|*Ib=sNw z))@P}RouP>QNc;vqtPbNj%1+iG+lFJSn%n=={DyzES$%IG~p5(SkFaYX*a3mLI|9U zQ@$N}Y}cP``R^S#xII%r>4U+d2A_@j^9&**AJ-oiI$z(bv5yW^jz5LhN| z`hi?4Ul_TB@<0F_m>)4E)Sh5)_UFkTY`>~aPiloz&%WQ=)k0(Q^Ncd-mu@L8zd9Nk z>`sxq0zM^Hvb?i03O_zZ6i6dwnHbNjKkC!@s*8Y}31C;Jj~g54j~z{}r9kUp%NS>{3?P)5 zGCzp3mn{1dygCt^c_D^q``N08ELd=FU{S(hA|S3mPd%^PZUCk-+OL*bt2mBa)2Q*V z(=Eevi9iBYM~nMFU;5}twU?&x*10}iNhm94lt{BZx<-`&WZkzPo>sf_KAxp?uyLT2Bm>I`~g<=3a_S!#GVZ=)qZpC^1{tbs0#6O@ zxxp&!r(^Ag+>ojU^9GXwO3do4V%Gs>P6Y_LBjV^fT0PM%ygJNUW$ z4g_j+!Amj5*Bqc6lvZL57O3g@vuT?n9a^=cx*il5lu2tS~Kz)ZBds>cy!JNs2P6qWt?R_M(ii)7a5f=^^069`>+(8D=<#5!0_lIRxR4Q+I?XKfhG3@fV?7*QOK`fKwrrm#S{D>g{TyX#7Ssul=*K^POpQ;`b4va|>L|t4` zKm8E(j;u9YMLqM6VI87(NI39r3^%s+^1_z)IGzQDs`^7P-Iei7Tqv2*u~hGa4I93j?W#RZA{u!>qb{+9{H@Em4r; z4m(hAUK@|wG8*JQ3gYZD>P{BN>nyw_Bw+pUYXfcCd4mm;aY`o5cK=&SLwAn>A$oP1 zc^Xd`!R8Sc4c6Y5Bw)}J*+ADa#IhXhO=sL)NWe2@D(IWl@QtjrngFsX7BJdodz zhP)ko7hJ=sb}bL+3D*scxr=r)TB3!3LyBGd?ypV}f|UV{EO!w|qnPW$|2(-d?HDxr zzhzMqD!zL*SOX|nS&44Jq-Pzhl3*h~_|Ra*%On4mq14wl6*~sAPG7-P;TO;7k@df+amb%GaLUb>*oLja_nH0@w^|G$k&_hM>Br-Rqu34X+uMoLCFFml>>pForrSf!>mX^GttvFR~hi4Bj>ovxK<|HdmlR0EFM^>e=Tc=+=%O! z&y83(7k&&n|5tueaC0VzB3anK^n_5`C#C29Q%2?s{3ee+r3M(rPAfc*cc(ZGN49jz zGpGK<HMNE!nR3 z=2+wMEBao1AWQiLc-TCTPfr4rbdug)T2E$IA_o+kh?w;{{4ETqF_md}{!{UgaAATUw(_dHvfbz#{ zZ8Rls{|N)LYk-FNQ$+c4mp9LYq;l(lEw~7ntyDU#Ox5;qf1g5W2C_=7(w%1{rM3i!DJ}G*p@H(@7;F}}Wg6|{ zQWw?Hm(_Y%Sh?0?k7qm~qR(Wf89hCEiq8FUzAQq#Bv{Jol}wTlUyZZ6Md|snKg|y% zg>r~3;GJ^ExnwE{8^(BknA79>qu>G@^t%>^ObzM#%mxb>uhYuAQNL8`4VUN;tdHT=jTs!lrbx(rsNkFCBrjJp9=wz5M7|S>$ z+>vnK&hIQ-MNfCfq`sf@o?(^L_6w|lbr&u@43u2sGBq!HBPdQqz^mPt48%A>4Ez4? z(7ezEbNpWiDudz-68Ni9aOsCrIyeMNhYxj5SVLqf!Qqh(aEzv;`W-J zPezpR{2rpmSb7zM$_6*YAz#HxNFQ9W|F5y@j%u=L_DKvHEEwz!3{4aiL5fI?fC?&2 z1QcmDnlz=OK%%HvK~WKqDn+C!(xeDB6lqeVNVCxdftMnkJDW!EoO{px{&hSAF__VCZ`@C#rj;PPDDRe)DFH>e8CJc}u#x z+lty^IdcvZ%~;iqH$!?Q-2Co4o|oiu+xNd)5B!)C zmw4~SuOzJZB|BKi-lr;7^ZZfiJKP^{bUnW=OE*|)CK3kcy^`?ay;#N8rkiPpQ}RN- zKF$4;`g80+z`^edQ=e~pCfR(Kd}e=TnMn_{$*FpGV`Sv`VAE3%-ug#Ul6Tt2nx4lV zcv^c>^TkZ-+GBcO1l{6p3f~A`Vv_HgpZ`{&WBgZ7UvF=@o^nKN9#o1CO#OYLQ#3i^ z`u$^dfzBzl7@JnlK>Osgk7eu{EG+eJ?2;^s!wqh-2{N|O;~4CyZcqN&JMvWecaP;P zR^B+3@q1@i>S@v5%vT1N7yUA-`+1dbQa`PAUEap>IeyM}7Tnha`yn zp!K)%g44U_;NRQgcWvl9(ZXxecRf+Me9NoJgu485Uk6K5U)|5yR=>6V*MatimSgq> zMFmG}-qsI1J=P%;+@b68EjoW&P9Np?$Z4(NKTl)TE#H4ph@W`>Rn@t>rpx`LR%aw& z;B|i#*U5FOdhHlq6x?x6@^p#S^4~39^KI%o&+f?5HPg+!ckWl|akJ~EE#m6z>SK(g zXW~O0o}@rd##dQ?9_6UJLf1?3hMxZ6$?B@(xG_}TrYq|X zv~+5pJGrAbo#DFBjb(Ql&do0xCK@r`TzkaFtv4|uqQ^SWIDMw1_pi;*{4(jmXS8Ho zP4Db5UiJ4k&mNYSQ2weg;AeXNTX5&GOJ$#eO2@7Ych{c``>GiA)KI_bSnBZMt}3CL z+~Vr)&l#6WZ-m%1xrc3enz=2c`*MezsOps=*Vd$iC+hlYc`d5Nyw1D%E46lgEbg_d zZ9iHEIQR20eU)t?(wPsIqLN@=@te0*bu&hPf6qG!Hr z6$wyIEnSoo{=4dnl7Cai$ush2E{rrCZFZ{b^^6+~be*4b?w#nV=@r|Ib$X4Y_4dWL zSZM8dq+}xJB zt*eju^5}-h`r$;sQpu7{-!8;Ctrsq691%L!74}o1ds5%fAYiTklixQpG$v{HqQpu6 zr(bVg6_(iZu5eCPHHm0gD9Y(rx<8QtZQF+T*%|%XTPvc!JGkn-R^tiNHzPvWAY)IT z$y37{cNl##OwmmiH2vbzCDNK&9eW@#M|qN8@|eA;;7H}vaA56|o!b|_eVEsv+|9aq z(HZDl`5vQ!Jt7X$evAwo`MXQg~7O0&3Gw%9JQT{F6MSy)IB z$BBa)?vCr2h9rWg4;`i8W$!Pbv~v@dVm;?5&_w~5_~|u7EP$ggF;lFLLPY44w5*M? zX8uJqUd50S&WhDh`HA;9`x~H)uxE4&1K|$Xq!~gU%k`5b67;d-bkq@p!wSML9UGvhstTET zWs>_BRiaL5BqD?t=bb(5Hyd~)J>>A?0e|)|Y?r*?N*bFEA!uQv_mUjZ5I0-DIq3OC zO^W+Gqryba{`Wp3*8L8x37>+N*ZvITwvqKtL*+`QW7AH6#cqn^Bg{?9Aw$Xl)jPv* zSsUj8@9HH2rgi$4%nn!V(vx=m>_2|4?2y;1 z1-RzRqipM=k@+BG`SjnZjvxBspMJQz*Rt02y=-!Qx*~5#{Z+1Tg(z@^D)09dL<+|h z#Me%^z7s3tWrZ*pH-geKsHsF{ES`f`k2XSSSaFm|w!3ab%8@5Zg9VjcP8|vbN>*Yd z9frGr=7nWYDctG?INQ6e?Rv%CrDOMmQX`Vb_3V@;Nao^%x4F0)2-Gtf0RO_@1$zYr z32J((C0=%xe)oJVP;DS)FcSe@mPj|56oB_*Lo9(M2O-i?pI1B9*`;UNd&T3x&~-(5 zg{SGK6Ej5)CA}~yxtACt=k}#KAW8srt@H1`b}V~P&qP1EX64zX>40|fa_X#^6=`bW za=(5-!NI0KuY0*ej_hZ~0zwsX-X=e94@L>~PKmZnDkkCGF~uQ@HkL6H`NOwgDz}Q- zbNi3TyIRF-ELZ-obKOEz6!;8ZKO5sEsG|&DPM@jvbghSG!9#zin|bS6pPiJ?A3C93 z7CaT(U6&fK5pnSI^V6T~6wio(1 z?ago>h=2@TuJut@H+q!Xht|eNXz30Awy!Fawy|y;TI>40p;Ri=Nk1h=%Os*J1zPz$ zAC~fn33mO{WUciKsrlog?-o8wh;!O6KL&V6BPtphOn)pD7lNQ5(vNGkb zYrkdo%3FV|iuLThA9NT{+t5zP+g1@ZNUBLp9sZoZWWAO7OqO$h+wOcx^MHJrcAHNR zl4Xj@0(bhqboJUFp_MOnfQS3r^LJHhai1s0ls6yyl4Jw1=qbQ`q5R2Dv6vRQCT->D zWFkoTGz53{eU<6#858k{=DCcNsyiX^|@|G>DZIlG3lKR zPG=2$Y!5W_)?Qw?>V>}j*G$dzGPX6S1BGMY)tV=tr)*j?Z=uFd8-2!)3Tr)j@$11> zlelxgN^H901Esotd~!H1bGqzP!NGIqXS|lwCaB7vZ@#=}b#MHqUx!j2<<$HbvmEY` z)D}$*+?;BX)e?S^u9e86oRuf(vX484N)!^l1{QCf+`VVqMIZ7wo@h0Q*1j?g>C%%UsaHPxT%B$t}_XSwyhbYA2FsP+rDR;BY(k#1M(zdmqC)-V1O`ZYQ= zHzh>Qtvj;8sl799T~^mqk=o&sGY<8G5{3w&&4qwodW6Sddq#wWA;-d>{w>m+qX~K~ zUb~Mt|FUIdOtIq*nKZ&$IC%lJj3s?1?92D z)yIn_bDs@YPWxmj%!o^7KvONN?RhDl(!VBl9<}?@qpKM_d3NYf?iahvQl|>n+LB*B z4Z*EX^;5q*l;}G%GhOdh8m<_+E!X9@%tTIKYfR&xwAuT|ZyE zY;(j+vm=-M-f30S`D{OwV_JAA?yEbTTU4+@bcbfl!d06ip{iTdYux#n3WNwPa%a9} z50u*u>>PKmI+a_&f=NJ4twEVTt>qJb&!UxsGx>t*^1<>B;f_DG8&D6W2CruS=Ex^Tf_S6yK2dqWea0b%xz1&uzz^ z>nvGclhuJr+2X{~Pc9oh7S`}{mzht(#&)kWmiNmB6g;-Bq#=Psvf((A(T&)c(0M)u1q%6Z&_lyLJ;#R{v3mnFr& z3OQBr&csAN(yB={;iV6R>iN=;md| z>+7Lvj-GS3}f!qbw7@-;f~awb7_(SH~>s8vn%mTOp zZge39?8iybz&WPRh82SvQ`>Q;^TGSq)jhcn@j`G_P5&gi-)ixRJpDYiLj}&-3hZ~r zrHt-7Qa{Jt`0rg%)MUT@_8k6Fsut@3enBWPRv?+W97NTJ=@Ssz@c) z3aODqumo&94IiuRLIrs9>wIdGcgl8@KGXp15v_01Qh6X_-9wQhG$Z7qF{Ph%!#=(VT}ON{<*b<*q5XAj_*hB@S!T>9go79nMA>2QbFtM!Lxj;ktI%tfJ^ zx~m!7h=@jYY*6GUWhmofoyh#_POtlfqhc&1w>AM?zWyHr}PP zHGZgH2Sb9SIjq)W@fVR_H^@ETv=>$=%*j(G*L_!RP2<9#E}u&ots=Hg!1 zgVhz0ew+~h?0jh35Ahdeu-@@Aq?KC?`7w*r5gLGC=Nh?UF*p_!u8(gLS zD?TIL4XMJvuVWRR2cIa}On0quiBR0L-Djt&o#jovOa3kTR3+^$s{hr-pY>l4f|t0{ z*e5JRVJOmjyleF_udl8=r!B6fCVM|Vc*wK6W(z9lU)S_iefUpKUHFahmEw>@Uj@xg z6F&-+)$}F1tpF3oWpb>;?B&$$T-1ljORwBELe9%b+wHv8eGxOD)ox56n0;X0f09uu}Y8$U% zP)fxUo7zMdfL>*|`)ZzZ~uclce1(0@a2*HYxu_JzF~ zJrWqSy+0&0_+8kJ(@&vc!mgL)M$m0QBR09{e1@>h*igF zhJuGDQTyaLJ}a&jdJw-J>Mh@55t3` zl2(B~G1*bR?WuHTgbYtpL{Ewt_#wT@8&eCEFWm2ud+#O1H!gIi0a8CYIe*{mC%sT4kX zP0?kvpSui_D{N}Aj|%NykyQ+xdJQLbd6d+29t*y)YD<#W#9#Sqe{|17@YXv$!a~2} z_E%|_M(6Yda55rSB{zy_o%d2C9GASdTuga4C ztG}%5p5O9trK?Y7s8)nh^86(mE0@e9Cd^Fr?L`e2R&)s_n?!i;FAK@4G;!Nm2^_c& zS(+2ZPLO5jT-=-C>{MoCGkEI!eUYPwR&O^>t9AYTWzSXr4f>#5Y9c)Szz_)*{m%|@Wjf&MaahwBvR<_*tH|Qu%L6|;U48q@Coe=r)~yP3I@hS zIUj6P8Zw!XX@7!i&uN+N8>%j?h_@at5$c9E5W4Y0N7DCYSif0U7A~!)ooOB0>N6!V z{_AL8-c;O!ZAYJcethM3(SnVYJDtQ7(;xA9c`kA6mUKxrNjHX;Wuk-eU+l7M-aUUO z!zVMrmMBbb4?~ngpra+ACZ)ALV@Vxx(+$5LOeA@W%mEeg3ai>K2B6&A@K@HiZinsa ztuEI#DfkdSthZ~fJpqkFq715f@$L^Mif7%ow+?QbP=V8{#o%%QbIKV7mKPwI9U zxO%9ncJI`Wd(rhhS@fCA_k7AFcFm0Jhip`*d!h5Eh6ZPyoW-}LB~`h}fa5*QEio`C zUhm*9W}N1*8g;tx^pe!nHa?%un`EpwZd`h+x}*Gk(`mT>7`Gwa;m4+;l6XKuUnlQ% z<55idVW}-@cj}b$n2F;2uFg*aQc-8uFB$8V_sTqX7FEJu)e;InRlGG+INs&~KUK`j#NNx+^EdHh6xDPsA)REG0*>JEn& z+-CV3AffQyLPte5&J`iZ*Eru%W5S|i^ri7}b8W?`+L%vTx5iHvcu9QuTpiz&qq*R( zXvZ0zp{Id_uk+3txZO)$(V_l2mw}9KGA_I&Nkc~MrM?C6gY$aWzh$b){&&Ob7M<4V zH#H7zg#7--uOU084wz&+7WMuX~~JWwgxPF_08F%=bh!exT> z{h6_(>apji^rrsPzhK~VVP(bGbnz(Hg63zCe*e^=?+@?0=7EpJwNqWL-OY~^Gy9ri zBfO_nrze+-j7&>C-iAMPfa1!uDyTXrbwGyakLO?*r_!r4@63}vN< z3baO$B;`G!9^Gra!LVET)J@YrlH~MP6Gcbc&lKM_DS!6)*=r?euAGjGoNDKot)ilkZ86d zZ^jO;*{!jiy^!0ZW!J9N=L<~hzp^n| zUo`+6^){v(p8v~JnY3%rS@XVV?_!(8_NBj}yuDs7&P(ZliQJ2tPZe&uInQHl|C_4q z$$6PuZr9zA{CHi9$-b+P1giv#?u(j6g;zM&==C16g4+F&@rKs&x+S%V-D4@e_qRLP z=REQ$SJ6b@XFF+!nrw~gnxE72J-_9Y@0g$7UYZf)B{y{-!=d(|iF{@i z3er6DH9%FT(>`2{a=i96I#4B;7^euZIB>D&ZVmb-v=lgxNH1I#=0kaubs1~ z7CkU7Wj*xyQgXgbx-rSebgF-_Z`}F4q3ir=!MBjqqYJ>)ri0T5eZ-DNHD)#4vw}jB z)B4m49>31z+}owMNq@89`v(;vLN{)2P!y3&oX7}F3R&BBr~GD50kn&Ps^pgiM*2{2 z7+nzdH!$5~Pw*rBgr{&+n37Xw!RWZWa6;MR?|T+~m4jk1%OAnRWeW0xHtXu2oyjVB zu*F)YHz}z>{FR(dsHFUvMv2}s8Z_EurzMpA@Ko)i(r&@m(8Jh!ebz4f2lk3)dZFbN zpGqIB7I|nUJ?$2@D{1lCDp8*ng%Lvo9$7~np#v*2ibaie_l9QKXBC&(IzaqCNqg*E zZ10$_fyMhQ}ww<2VciS4YovV3HH~E}#Y67dJB--JaLZbX9)3tvOKmS`1CcoVzue0<;`xi)% zI0a?F_k-6S8@ynD)N<4FSwK|bu}z8l^Lt|Y#))+)SwRmwsIMMP<>xnhba$lR+o^3Y zT` z*E9P!7K5nFq6?aXadqvKHkp_uUp=+1SMK(S7fmkx;cbCYCbo( zWaQl;f%mr!o8_{)ip^H3mnX&MY-`A?{Fs;bw8bQ2MHec$c5Zb)@23?e*K5$Dd%09H zKi9SIj>pj&VZB$C8Tuk$zlLcZs?V(;FIlgs)h^R5TJiv*v%5~2(qPkF8mE#&W~$3} z9HUr zhJr*MY(K*_alv}Jf8O|HqC?N8#4qyK?DOT%e3e-*FZsS*$gut05!d&l(f7pcjLxqg zrbL~TYJa0q5-1;}c_sDb^NZ&!DpHCBlq)fo?Ne8}>+0pAdwSU#kyA0tz>HQg1eeNj zg~sphEGw|!hBN|QJ)ivNf^x8G5}+5+D$!&mH<_xZVqQ|&(~m{&Dq1EDhW~lt@tr$= z!scbN9RD=!f|H)Y!U&DLZ*3vTt1 zoFnOV3~<%8eHL6bD8h}ES_hAN{=Hzt(6(sT9Ycq6SJ^aA9tZq- z(a#FeL6ww_moG9Z1l)S-8_U;4D7qQ^ZF0#C@0yGW+nr)Ou<)3}=hqyyDf*Hw&fRwH zf^WL2W7CTt8?+xixjeq1kA|)W727txZF+0zb|ML3tIsVyZus#bRK!%SH_w&7Lrx9~Mhnx2Hc`{&^~GV)Ye6pWavqt? zv4lx`a8cgR>Xx-V)EV1hss9VN$Jyl0A(3zaw^BV@VSe+LBwH5dI#6D<>D;dPS+k7x zuVvio{8+7@`?XjQDZ`{CszJ5DwI!=M{u!Wxf;gwHR88nB?-^(+rIr?oBH_-p*zx3yL5JmP2?z-l_f35%D(pfaiT=H8m9<4#Dxi^M#q# z9a4z5ta%=iC1Dy5i4GOZwio3BAsjus~lu*Hh8n#!r@ z!*UPrd*DsmpWr^q8ODA{z7T3tb$9GqM>n6tId$lohgt~*6kNRnv2Kh-x20fy(FUoQ z!n=N6eaOYCoX}XLgR&n93jl9+TyuJSHWC)_5CfDW9fW%AH>V=IHnG|01B)D2Q2U|r zCs)L?xOg_o04h(JN?QgG62HZzvp=8|`ry80?!j%a7tms_Hv$t*e5GF?=4t}2d9I^J zBzVA@9;%iyb0e7u%?F6hUG1s#Y>`M|i_{{V9O3Nu_5~Gq@RN@+nTq@^!dZ9|aijUm ztI#mz-mFhdCJiAH`rPc|!x0393O!hZsA)vl#Es)|fv^ekYuqCiLiu_ROk%t@#G6LK zx59-Ij6tlgkI@}8vMqLm&L{%w>thVh4ZcZ48_fRoG5SkrwOj08AEOHh*?m#vdDw;? zY(t#Kovm7in1UNxPwig`i*0=t-@!(4-w2E%*BKa)#_K(|`1_k6@sF1fmg}zrW{MSF zr7iWfDp|1b_>M~FIVDI$f*ZA8i}J>6s7skm2ta1{!T~!jRev_O1l1U@39}YF_$Jjj zBprwOI_H4}8X?o>yqbCdm&AThlwqa)>zzE=+T#MXd}E>Q>k%&bu)P?nkmMWRhHilY8(PP&@K^X9Nv>M2WgyuE0aHaDg9|qL> zFh0%&(&$Kx^rua;j8nW7MYQP-J5^_Oq!0X^0;JAd%wF2bNV(93o#`%P){xLRP448Z z6u_S#1Yn8_&Ho{(5O#doF_5Ip1?QQYVn|06pX1T(>XhvQ-xz;jK8LWVuOV*3bpiDV z=Bhxp(fXR;#JS$sBDL`IBG!V@Bhn)f?>8PpZxZ{4Rxy4{-@Y+SUHS^+tZa<$oRe1* zfEnZgDpanHyvm#xmLUt9#z+#mhj4&mGoo&lWC-BQag=yih>apz< zPP;fK@yvIa|JsD(9HId|W$|}!-o?vm@GoSOb|m+{7s*z_g;C-vLs)h?LxQy^yvg+V z;?n(oEZWdTstt+!%+~sa+pwN<(ag8N&fD*bxNuSYWaZh7!u%<)6JzcXZZc_RZ%> zx%%4%#{2R9m^-wyLJIJO`InI&u@v>i-IO)7Q+yX#tkvkpY;Ff6p>88P!}=)4VE^_K zx@=!+gcJ&r7@p{8NWs^eY@w&0Gd4nQ<0Nw9cwsZ=DSLG1$};4%ypx2!92I$+S$m)l zBSORdeYcH_{U@`p~50r+}pW&h19kh-t5$2L9q6iY%M%B9pcNjbnUKR{-jEvM<~G*?eSN&-`V3;MG*} zDw53Xj{X9To1LOppjVU47ZO>GxZ5(Jp7ZNrMpIc*CEgFZ1k#qK0Ma_5cH=qY{X|)u z8oewU%3A~rc`xd2V2U0Ak3B&XvVJ({^-hv(_oTWB)(GjwyF$SItukWlmth9pYBf9& zg(t?lQf8CU;8in=D*16+;7-)S@&?T%%k+xKA_WL7;C4a^+tSdXbu@#$c!}_QrHW zOb+*g6>k+p`nti{m~J9bUU670Wf1%jKagyhVhU4T&2UyOqwi}Ad`MJ_j}*ju|1>dj z31TPp9!mXd3RpM0-V37SURWZ<5JV&YwYm`7a!2=5Jh@Sq8NtGqyD`jw7oEig7-{~t zJ+RU3Cl0Zsh(?+=O>Fmnpfb|j6cd&(WrIN(d7NqLWqkebn8ULcA8ioP4_9;_vmlxz z@sB-?zYK?8XK{5b=_qSA^d$-cXJp4*jl0aSMsuVFe@GAr!>=T^x6lmtVvdsA0{5s^ z0tr6bN9p6RVpp2m(dozD5kZ78Tc`tdfeda_+z?@YsBfeFp@2J*(E%Qm>=~qFAIC5- z*}QFJFUBAs!7_6Pn?p==+g+OyLZ^8Db0AF6?gUm!VgD733vDKMBxnT|a#jXlFN)ZRAb#w~E{P>`rJR7jNH!NPq>|JY&v_SMI-q4X6uwcn`seR0 z%VAOBLed_Flt%U`FxXU3W#{h)mJs_NV20VJfdue1`Zi#FDCT_t=@T6sYA*j^jj3k-(PE9@)`-KrQ8RdIK%u zE6hHYYJLUUa^hCV6*{&2L<^a=`zTmr^%0FPn5jxLoN4rbQX)VorWR{CF;_(4rni~z ze+4U^DYHhgKiaAYZrE|e;+X58E1srRZ)RW?Vo6h8$@S_YzOXic=At@ss}FnM#l(*jiR_eu(G+F;p`F-~eM_y` z3V!JeL^Rp0p6p`{*BqO$kij<=4?%#sjEoj0hd5z(Eu_=xb?XVzw5#!RZ3R06s07&$i~6i?DN%$ZA2b3FmfD<3T$=8;_EhNX8tUEWH+BgLb}G`wi_a--OBj zjGdCC(a!ZEGU@-HAdDTS-$i5*ba(uRsZ?OB$oDEHpLTrIz0f2Z=kc>-M8$+MjkbhE zI)eCyOq^Y7lqk6Z)}jOQIPbKe9~-r(Ix8Zz33y~TW0uU1VpkAkE6&Q$Lge8m4UpE& zp&~%vxRi~8h1i{f___T`NNtO-Gn)W!#=5X8NW{3dDcHi2j(h!UcRM>vK;?A;f^`K~uUsV41Vu%g!po2hG6@dQf+{N_qsTZ) zkZi_~esQ2aW;`qD_pKj=_2Og z)BsJOiolR30;SsZaY-9?g z$_S!q$AxeK&9YH|pA~GwnNUz!0A%mMkn6|!)maiwEnG?30n1zkL(JE1`OX>wM~KMb z$BA-3uw2na{3rp0MHRwUY&54B3~5`pJ$kMfq(e6RP`d|nk|P%qnMM_fD20Yd9>&vV zAiCq!nCHI;48RQs+d3$Zn6ZGzdy?pj$KS=!vg_dxoI=B8%zc?Q1(lDyg7%{#bZ#!3 z+{^q75QS{Bs1n^*#CvGSE?fMpD;VI3djVb^`24sHNdo)8@n;=^m@61Ne&Sm+M8Vy6 zPM+-a%E*j16fXTUAi%OYXzT-%b$2Tlr(@+(K8T3SxiB2}kxp}_$#2tP)ypt`KvOhY zMI^^LdI_l2kBoteBOFFCZ|Cw9e;>|<&XUzd^C8SWyJ8rUhSbbgKVT@8L}oYn@KG>? z$hD3S%z^HOm2xbGlO4gVThNisjiO-zMz|MDdJ^zpYdThP@la{@)~Fd}74wdH2zSgS zk0DgIgT&TnVI|{hXS6XsF7X8nFB6Mi-PImNtux2`P z^q~YBm^+eJ>EhoA%rRPhT8%^|Be`(Q3sAEvo<|^i5?=% zCpUD#=jcgoqS$Vh5>TPT5O;6W2m(&WIwnuIy}8my{@}Af#Bi(Sv>5x>k4Qf`+~>>Q;cKVGSY`!}+zDs#YWWe* zT;YG3wff!zqNy(t4jTx^NYCN>6F7@k8~v&_;`8{(JhR&*_(sAI0+)!13V8IKj)=JQ zV?nk;5$g8rD)eb(hLcEt25Fj{jvu(T(Q`E+LLi>e;ZUF+#@2`A{#JziQWCj?Hrh zMIqhPEpTv#=(vxvgKdy66==I=@eUI;4D~ICEKC29h`cb#H;M8gl(b8C4jFu^N77KH zQ%#FDQa^F9+UtKqSC`gfO*8s7{I(P_fT-h};DN_>YGnKB3yV}c^t!j-$0og z+VI{>Jn@M=EODakYc_Fl!=_&SiR0^HDS!15RpR~}C}bT|7x#&|JE0-z5J==dB@M}EG+ zH+<+sCpe)QW^k2W^q0ThL-D3Bnv5%TW8KySFRUlc=4}Hm%M&Kq1fm2tgkoaZu;~jQ zsj~+c5RNV6RG^*_>@DOXEm+6gGeH_Veu<1s(}(M9=LW%|;L|(bVUl9(@qe64$YK!d zo5$JzYtx2*Ld}HT)U^E+RmaIrMzoMAHDQKT&k zs*CZmyeqg^FDKyBG0zY|2Vft?eXrR={}=TrPXO@P4OGWl%d%MzVC!un=Mei22f4Cy>EiM+l1bpBCHzOfg?g@@5?l zEdD#_kK5XpPr?t${R@e+`ONUiS;0ciLPuI04JvGAi))x@1$}Q&vBRp>VWAa_Be@Fu zo$j)*p%wHM;R`U_G+|;xD;N@wJ4&fX%VZ{Bxne2Z?b#!dA*ss%#b~ZBN(WBnn@A zlVHyJOej-2Q6|7!FWDPpM*>lZoy&q-K#T;rIpE}1a`>?ugedIXtQ)-;U5D8?wJXfS zNNS4%CplDS1?~6{)UYRzvr3z&2`+5c*6Vi}1fE4KDEokuyk~Wp#ndsVsU683O5lx{GuSDRo_QJ+_6q~}TmfSg2cxBMEa#80jy8bw(~3_Sg9IgPBTulc z4sv1evb$_(UUE!0W*dui1VIEW2Rj3?va#V-mI z;ry8Xih)QB?TxeeMVlR5X%06IZDby57JktWTT5H2lYmS=`ZAdK1#kpkzcZzVEigi+ z;};j;Qt6R2np=B<@C(XzI3->Q2N084ihzRfiySw`4YYpPVj^s;hV;_Nd z0cfXiA+}AGFy~#UMhEPz?0Fie{`tEp0!{cg>3ir=UNUyVkkvkf=hOu@68mpsGT5h~ z)WLG|wf0|zfWRSa%4~p*T(}x2S)dcE1wO7m4mM!hqn{b&G2AvgVP&s$tBFh=quJiBG~Wnu3mBpon#nc<6x0m9 z{=alsazv3e3+AIsKp|n&2bl6|7xTL$OkT!ZB$I^-6DoZ|*aCcr%J3z6h!w82;-7oX z6Z;_=leYA1LgR953A?rh)CSQcd3%Nc%UxrvuCN1Wq9hy#Z&lw<8D!(~D8SP78%xj^ zn+bwj3)eCQ7IlDz4RVH9&|dLiVMP!8SM)gmmqLjqPMS1f5SCJF`h;K-e=Ik<`~n?D zca!v&n=23bZ<@ng*kc;Z@qka?;NOy{wtYYnv4 z9!`Qs+2eL@-9JoMUjqB9(TUdt{##oR4n_-`f}6rux$xD<;e5yx>u%$Aa{VJaEL8GUt0 zV2=<^W5;I=G9n2PYzNU7ogd#gOg_sX!y!|_@%=@08o^Y6Eet6mli^@3sBt7B^A6S- z#rlLQK?)IUJ@&L)Y#CRB-~qw zQDa46NSdmuIdcds5Fdfz79f5=LlorR&h7$MQ6xxC!lEEY+dMUQwjsb4M*`ma9t=_5 ztM)IN!-0+1RA}nwPfML(JCVeGfMe4P*ZfHKW%mKmcCmsm3HcJYQB>u6_7P-K8nWTe zDEMuf_2=jd!9N1N6fWV!@)0L-Lr66;P8WQ!75MU2mv0mB#R7X`_Oc=904Xs%YhELM z(EU03I0UL-xtgBw(e87q`Erse<8=fp7((IYy+~J5BzL?YmMUy1q4`PdV* zV~gUvZKO4VDy&0{gVaDIFl|U+ZlC36HfcpNM9V=Vtb-wuYejHuGD+&k`w^(%IbgZs zKJ&A3OwfYi44vTIfo54R{+ewFJj1DyMx$X!frP*b7Dedi`xL=l8mqN;f|hK=5IbN$ z7>Q=c%qc#|FmqUsuwYkhD7>`XIEtHg2h)Cx{zI%s!lJ08wt6e>?d*k(__!U0^sA~- z2rO@o{yLCr!NMZ({cjPPvz2T+D@?ojVTj}4LS;f0yU|(ky|niOb7CfB0lA1UWS6}f8-hcJEOw)_ z@P3od#KePyzPFtH>r0W&M1MOac8=M&nCe{EQcPn1N)59#38N3y}BO8h?V7W%P1(~K-|5c0~ZL4sfK+t+I zzX{{uLShp=^$c`AgpuCMR8fxfIzSfAP~6!0X*;?zN}MAulw(L9yuoSSDC+uqHg_0ldW zr{n6UF*Ba|68{%9H8oAkIX4kowKwyAOfIK~flRlXr?ldu&lTR2+XlzieN^&Uv9sU0 z)#kK61P7VTE)D77IG^o52(#gGI{-VK?KaPokoFh8m6gj^ffe$PLX65%yLgkSQj1+> zz2gT#!dcp#aeDW@Ns}d5XkM^mE3}M3H7zdJ-iTzB#sbX;i z6HMtBD^xb0pBDyU!OqpWwH+y%S*Rklk};s=6`b4UvZ-e;qst;8Sz%GW>9-eFjq=UV z)2Bsx8XGGga>LJzQ9VA&ND}$(f-qh5E3$=2?!v-?pW-Av4H5V4BV^ynxL>!LDQS_QEOKri;x>Yt;sB{`t0Vw!v1~6CVa_1$~ZzAb}{c-4xau(|E z*NdN~0rhueyj5wSd7k5TbW55)=kQ6#)-QxhRwZ=={OyO|;|6kD8o?pYQhjXf$+ZHB zqW4N9Z?7vvzS1xjr%HL};>t94ObG3~^wG&1JUz=BQ~UY`ou>7D9F4^@wdxy?S?M0{ zDt4%~CK6{0rT>QrW#FwoeoMMv4Sii)6vV|AzR#&;?cuCsI>u5aZ5p=m^=@`(9ifGK zd#*Y?Ul5>ndmbev%+{~sA`{8#6D)~lLs^CA=NvZYcXxvj(1?;HZ+zBgGI-9>e#YBJ zL3b0X`)DW5Mv8{u%pWidx0^IL6zj@C^BZ^86u*l_QR6PQ_yqzhApp*u55S!reNjFA z{;p*NMJgT&uP3@cY#Y+2UY7+)Vx6R?4~5SO?l%orL)w<5kV@W}=4r$kD`?zw-5A7L zA1p=Sb{PcEX`P_o;<;E|`HUEiCdIm>?Xz+8e)_qcp80_EM1O9*2MQpX^7+oZ-p84O zn9b)FCL#2CAJnQ`$ClSTn~xkmFHpj_F?`k{3#`*mN_Ya2jQpRld2AFlkW17}4 z>r>uG9%o5B+}@k14nDXOZ!I@_cNAJU_YU1$JWkSgs@zO_J~0W#-(KQ(QUO7b5g8J| znCFTOsURiW#ATE&ORTvB+|TmZTsCzo?#3$`ZhNYOKN;vk z@VAus9$k-GI&3HwKlj@oZ&$6ED%%U_qob?0>8&^1x4~!C_t=lqWFct#CyhN)a+l3$ za08P=8V=Lf0wz&6-FohzMibeDK~H%uG<|Fp$~8#UDjg-DNLOwvCY4XQof!;?D{WL~ z9SMg0Bf+W#oWU2uUmj=9^~10jjtIn6p$ORIA)pfQ-@)858**_+Fr|z6`SyX`h|XiG zs~wlDI(2Nhdz^Wma=8X{D_do;bW~9*Wc$FtA}no<&2#y0O<6pUT=xDjt1)YCiRx_U zbg-yvf4J;7I~6}wX5ih0)AxRAG_cO#ys(iZI>JC=YdFhWnK?cC^~u)A+XND>3RerE zIagSLNt7ws`z-w{s|wn}lVw{EvR-WLOxcCr$cC0yxUyX5W^O66iNqz~ z;kBQqNb@=0Zi6ShZAWciRG+NpjSi+7h)q{m$d*<)9AR&cm<7}ujtXtD67H||sOI(P zjVopb>~dXY&Wn#OuCAtUUJ)Qyo`+vKZ(6@%St~I0$Q9dyDu^%D2|H9OY{-z297QrN zGtXa>xm^XRXPzpWu(&zEMAWFO)LC7auJpPO>b}sLt?@SO88I4eJjBXL#icWtt1Oxu z!P&Wz4n!u{<#EomI~(J*ncLPC!+GDAZ!%t`3rj$NM^Y3=n6JT&5GNV`1mR62Wl#_P zSoYQcsqa$12N!#x8IDS+asFjArv)bg9-G|S#$Z~@f|t|CMO`hF@gSinn#lp|Z0qiH zy8bx;cQ8jYT7;}4N_~THicR2hbi-QY+e@m|-mh7!R>%9U?exm2`E|z&DH!?c^+^Sv z9R9tMiS9%&VPLI`>O#lM2TWbv-NjT=`Q*NO6c#V+xB&Tw^3a7Jp zxt8v)R{dorM)KuO<-IB)7q3_D*stvZa7n8!nI-R5&UwN>u zzHr-E+g(|u;{Be9M75XMy;o=i0Wh$a{NU`zE&lIEV=F^SXKHNl)nD02m#?V^`uh+< z?Q$+H%`cA;ebiDpwL%lQ3bh90kuK9D8*DH0S8&jMg9(IAwMpvjZ@)4ic16+2 z@J&H?a8QAp%WXNH&y%D}#AUkdVK5kU${|1HesVa|`;}SqMDN;87i-;)j0cTqmnd6G z7PTXcqIp2OjikH}`qCgMex`bHWNWO#?hfX&(OmGcd=kII_G}5-NRIr7>+7M0y7ySa z+3HVeOXJiG=xvV4%;@Rc&nD%s$O5GP~A->n=V*ptW0*5fyw*< zxdOge*09?Vhej=6nQDl{k7L)VFvm!k4h1T2FxMqs>>C=24|Z*LbXy&8WF-B zxxM;gRa&Fa@MrRlJ5k6))Y3=$`_g^m@Uiv7eX$&2m!>wa2p<|i7Zmf=fx zrg)9p9n3&!LapBPI3>6k72D-pGNo#)z@)i#5CoKYrSz88GW(xOCtUBJZ=t$ z%L+EggmebbX`fEZwNCHnqK|Vl9oy*&EBuy{1cartbu8MMJInkY^O+{F4*M?ixSWb} zNB@QAKNCMGTz5cbO18a|1F7S8{Y|wwk}~XR*FoFz>qyZ=Ey5R(olMMZiU}}ikFPJ6 zS32TUcfNHVWmv`->}kx%qjOpu${lZvz;adD@h$$~(U^T+9aikLIW)Rf@+RUaA9 zqW;krJxg7Lp^WamjIY?a%CAfM!JPE<6Lo8Rd5YAXbct~Ceeu(Z&|dDwq;OFX=~jsK z-7bpYkaotXL7FZ zh>b#@^QGkF(Iy);W|%>EC|<=SxwaHg{24C`FA9U3yh{?e|8yUB`5 z2I2B9?2gx+%sPCu49FnO9gAUSGVCM2=4l z2*-p$WYXSvU!6V8ygtIAGlY&ij9dWdy>wl!PV zq%*Rv)y1BqCwZ=ab$Zh_d7^L_#6;lZjYC6fwyHCa($FIv|)bH ziPg^BY;jxLQt497+Mc|VT5dW*;Bd6s_^otnAY%`7a;NBX8CHKo(}#>tjTX`;_V1J? z=m2vwkU)g(K%`)rFd~~;{Me6{uTKsX))L+>N z*1O#igx!}N$CK@#v8tEP{%`?wGmhEiS`-7e>p+`wA**@G6mXNjJgO&Vf}rjx>~fPj z#Sn z>^3{C9L=qb{aiXSZsnObQVx!4nq(Yxd&1e#8vXmdc*0FG)1@}4AKkdJMLGk{KY|E> z7IkmF(Mve`rA5uARJ>^9n$HN_F;NXkWBu&25Af*oWdCmNK`F5F(TsWXo2wuC#XZB` z3EcUL;q+$SdC=dH^1My{nC+SsN=9tfC66=7r=b=B#?9>M|Zr zft>XLMypHAT%|fCE}V%X0jRNBJ-nsS$uJcLiP-@mi)Do)u7W2VVt;NHEGpr+*TvBX zzWAeXPLuY8+nYtabJch+m4a(7MddvyLL=P6+@o`g6p}u;VBDMX$&I06lIqH#3<(*l zE4}L{KLYU;i{(S7s&#vd$tT{?sFuBa9gLUMc{{w6{P37St#qC>Jt87L^rV`h#h>)ma{ z3x>;T%ZRl|?I#+txk^REb0y`QCu_~Il}99IE2v7(s&`n7#)iN%Dk{8C)!OMd8pmWO zt38?@k8z6^Z?4WPvuu6S#N(yR2EUUnqe7@c)||mMhs zc6P$KPX^wZnw}d4CP5l@iQ;`C3F(gNUB*VShRi`UVUbbt9eQ$asAQiDUs@Za42D)J zJcJW-5Byu-+=Ja0L^?8j68chY{r2}a#CSL!9UXgxF>}_|pi|i9^5X2j0NU{=ZZ{}v zf5(%zlyee~tDjcy`ee5SVyM!Cxo!S_2kW9(dXqE|8aW|dBFSP zbtHcr>fyM@bUKl8k^#}cq-=xhUG|nU{6E=H_aTZUM$^d` z6H^d<8NFJ)5&qF{YiE)Ri?*pdupvv)=0!oj{Bk-2c$mN{{;=Rm*%9i_RJLk_S2q4Y z*NVd4cLSLe*|yV1E>y8Rz>e@>z}7nZ4X5w!+tb09@`pd{chBK>;cuS@4kPw$>^AGY zhRAUneR{AJF*Qi2Suc>ST{+~$RnI$vUXwJwOq3BNTwm$oinf5%QD3na{ z`P0`Kfm@2CHre5ml7#~j&%}igw^M|JgI2n*pD7QfKKd{lOZh7S%-cOM|A{^?;XJWG z!u}sTx;JDOHvAP0*_1Tf7O3{ZN|5N(s=YoQEb@AC%dTN-jJ@DXP6bFK(r@10SzY|# z9#W0z@y^wuHG1-LG=KQR?!6Nz+Pe=Qe8NR{#EF`wrwJ&62>G*Q$iz+YRYCZ@)F1NqgB|X&X%LLcWOVV)Wjx{%9^r|FMkB*u0xWla~4`%pydpnp% zrMXgtK#kyQ2J7l^3T7AMK9Jis?lL?67>J5Wt9IX+_9#Mc)MW7o-$-YK`N<)NjlZ3JJoDP?znjms9;C+$(+qAz zb$6)}H;&;&QVJFDEQuyt~NLUN-c}%NLb1%pUa#s;g>iYV7$%W)6)||rT#{+Jiw=q zF27R}xrIr*zP_!mbY^WT1V^32p!)b#9ImB~WQNA7?)Efnj$*wA;dG5F;?3nT|E;qF zF*K9a!Z?J}f$6!VF%F$4vk=;Sl2D!KL;uCOXD6%CDWN>{b(&G1(ak1^XLAOLGB^bJ!qL^{Un zOBX}cWPwHjX9-PtY!{s^IjuC75u!q1eBl?Y7HWyk)SqubQ_oW^c<_Zn^)=RUXTI6{ zoyqpBZ*meEL8ZDwj%xLeFciU0TYG9ykd3yIagYWZw{6-(utDG^;TMqV}6A*%D^Rqugcoqs;d-E&GAE*Js!8|uj z+TVvf5^yg8h6N0S81l>-w7t6OAt*x<=HU}6bZVG= zRoV)|97r`p4^=pb%Bx?$hv0a+60aG}R45~_>#b3Xbt>T;{t8Y|TaA_Qeou3A`vz`) znaLDtEQb@SdbM@aw~;Q!M7O6j8tiBSzR3IlZ8E>Il7?6BdIL|ZS}G7}TzR0kvdM09 z8PKU&qk|ioA?}-}THXxM1j{{l2-tKg$(_sSa@8v@6q2MD7TKLnIW=ls1B2qKNbF`k z3k#%iRm)7n=>FS8dNAP3gD@F1hy`KxWi!s!i%lR*Qk%h#R0^Grdb)UpxlfK^s`iw; zX;f|w+H4n=6vueC5ESeem#O5Z0jl9-!%BZP7jd%80K&}7Z13chqVC&U;k@$jH8Oqx zjWSb;O$@5Jjg5C@Wu;;9`xV3QrV|7J><1*2=7Zx6=9EcV)w;*9S7$<>F*_J!rYvSl z^yuMH)_ntTnUlrF;_a`O{WcR2{shVI6#kC9AxPr!16$B_$IgpMW0e4JoS?5YDKE+e z(4d77*wcL9wR&hNd5=oY^umKDpOd#4lC&>P29?z3s@>)?ZBYa9lT}KoC(lJ0Og5iS z*W1Yk9w?q;>Ev%TBHz)F#D%B1Ym%M+uMuUx{cx#}h0W}jOr^{$1Usq#aQ4%zgq`3gB)C!3qg z6Z{h@-yeQ%aQ(KnWtNC+Q&YT@-7^?s^u^vx7mSm22A%fYN+?#?!uaonjt@@ zASFy&pCtSFJa&4*tHjXQ`pau7{ydMcf3_B&^x0zon!~i&*{f;CD{TbURHR9}JNOTA z9Qu}Q6D4}GCd*_>mXFya2{5Uy5oFTDsiLSS$ls)L6B6KM&D-Z;6N^!+rho5bvt~$- ztNdDNczbcAcf1P)Sr{AdFAu19C$NdF9HHAldh6{2C?xm1Ap3(8h!K(E{DX{K(zXls z*0Xi|WE@gV>DAO>uNpUF{{ex(jz@2Sh@-j-6HWR^u+jTaPxZs97M{)8gk2gB7jgr< ziQfkEhZNJ=*H747pHC>o(y5d&BBMXqQhs7x1nh#n=PP>`Qub zKKqF+nG~-e4#`0@mJvhMaRaVc0{4@;T>)+`ovw`D&B+n`R^fj$Z9hE#BDb%5P>y;D z2j*lSSgz>GA7UHGR)r8N%-+&?6s9b_IDyw|Q!E&$Q^z-+s3CH&T$Aa$=>5t?h=@TZ z=W%cvS3OYi4t9L@a2p*XrfG!T2+2B07U1{Hh^A7hJ zYS{JMhyjjCR9WXBm53<@8a|%w4`03^^SrJH0hEdu2t?C@qaCmo+Xpke8FnWl%-?6f zKan)mgw3PymdO~HA5Nhwftv9z|`8I?ev3_AGhoK!6N4pUk9((ab=1Od6 zb6i{}ky~BiRT5);W0Ushm`7p%se}*s0S(Ijrqqhh8mD;Cq&)v)E^JwP13hMl`V1At znKo}nr@m?-Cbyeab3-k@7PR<RwL!FmS~oar$P#lt?B;NKBC6fiB66i-=(vI%)Rvo?hi12_QwmztxdaE8Kkmrf{1Tchf@QguMMj402p~9&fyXm&HPhws`I|h;<;(Ip#U; z49cj$R93iZ&XVf<+H#{WTS)z*Z3_Pk%m?M*!)a5$m$)O>tg{vFC4Em9WY*qAA1TTb z=uaTHe7^I$+nGx36wByI=I%4F8TLzP-pELwx!lX3;vXC}@Rv?DF5u+A>hD*jMb1~Dq4Y38uBcFuQaEyJv zzHx%Wxyfu7FUh*O9C!jUl_gk>;ZK<-fAEA5mW`wEHRk5}&hje;+1r&yj*qD(=B?WJ_r>myDhq(HX!8A|J3O}j*}dM# zIqJj31X-!Q6nT$O5dtV`E8&cvkJ0LU*O{4X4z5c)wJCqfR`D~4YX&csiSL*mLYZ+@ z?z(a=_)zj`_HFDJPBhNlak?MDkHo4qQfCio%Fm+2!!|Og)+9q0GdQ)Gft46%R0{sN zPnxno8A3k;gd7Q&fG*Rhq}eGG4bK+^@rz0^xAwzMoaBn8?)NAvFQNSPRV_rt)H`Tr z?LsTTmG=7#BjOY1{0mW!eVYE4W^bn*w?2{KNM#z_9_ew>PBnF!=Ynzp6hkJI1{AeQJUeZdeB?nU)@3 z$-Jod;<`LX?HQxz^+CKD7Rw*J9TL9jh$`3Q7MKk;;yP~YD!6v->@Aw(Ugoq54d1U! zQ_25Ii5?FbY$+Eic#kz;+zdWB)%$7`(Op?sVqiy;KO@71pTO$+3=8wA@dN^jB~~ak zPnu8VEpMw^0@-aALr4HJqA`gHY*y1h&@}_32+S0mEHJL|!D;ZykRH-1Ln}+pH?ndI ztWp)<;DpxV5&Y7U`8%h(Mr~*7OU!H3rng;5DHMQ?N|B;xy?E?!&E<;sS}NLu5kv2N zp9g9EwUo4al_RWwWC4p~??TZc5O2vYjf3ljHn`dJG1=e+mou~Im+~>|jD>lkif(2S zXxUyL8S{z+kiMsxNZTj_p!7E+c@_my6!4h;xrperNa5kZ459N=Q{$@`5okdYAeKWM7x+k==or zbD&x|0yvy@x0&E~S3($t=ZhA15uO#D(F}~ewod~1JBHxjVr2Iol)(gJ=qAZ#EMlNw3Y2p=}BRd24s2FFWSvSD1bgu!XSvZBgW z9vZX7y3_E{;D|wISa5sR4UWxhuGzb5Y?$uQKdQhP;r#Tb+K|U?;0-c97p|B>zM_pz z#_*o$iVtn|@RMRE$JJ}yk=w=;ifC3n#@7hST8LH55y0=Ov7uRVihV)B48ifRO zlX%W*tMtlwmvQCxSe#s3@-8meMy$roO}a)5j*H0l_V)a9j(}8TnfZ-_jn0|?y!Qo3 z-Y~NKiTDjg7&csjF&nz}i($U^TzB=v4l?96srgwqCER~9)_nu^tcq7;%?zNiyd(-n z$5T~V(j=rsHIQE>%0(n*)Iyt^ znh2Dc^>{bsIu@ks$wSE`wx`M^Gn%*9_N4PH9gug&3fm>t zx~j@7#>WQdU_xL#J+EA`oZjPlN8&)FU#w8)qgeq)r8*`CA zqz5urn6b&9&3XyjpRCf-sn^m88BW(zD>fjtDY`3|t;Gwp$3Uy`3gn02l@cLI4Ew=f zdy#up=4bK*#D)vhC6G?h?&Oa0%6tMg2G6_7%YxES(qtVhjU14C9Sv)oE3LGa%4V{+ zN4Cl{rOV(_&43>f2DA1iK(db4&{&^KNjV%X*I;>qb_@3-OUjRjgg(%z---r%)HrGI zCSF@EK3tU0E%4v`Cy<1mkZD^h=3>1CdO_)t4x*}rYKIGKRV`XPTT+xvnj?M$vkYwVHj=XtdFP2WsCx_n8}NE z#0%bNtEx5w7Pz9gKf7WUL!or-dQ4g6Q zyV>3bBT}X@Lrvn1N@rBE0FRRVPBFLJ!NZNg^w9UuMU8X7_LU)VE5N$s5b8~Qak;wn z+S|WzOyViAmM5tf=i5GJTiRYcd@I<*9ft;e`?b zIzG$K%cAnoEhR=4Bpfen87iC3<-?@Vx|3`$5%R-!r0?I>UcifPEKcF&wt@fI^7oB5 zJ4_g?)<)U;R)QxgWmU00lpP6ND$4bQp>2LR$*$L|@k~Y}Z!l>;zH*a)efd30{w?y0 z7uE)I1m1^ht)(&LjPE8nBh1zTjp!O{!}_)$t0g<76d)!~eO`gBU5bM#}oaz@{#gYD9jio9U z=e8IYgXi5nJuqKC#p`?^Iv+EPp@i9;cFI)wJTRT5&0zWiWJ8MpbhvXx@CMM;8zx;*q}IQ_g+H%DRcU9XIvz;PIkPH6LZ@ zVcTx@BLR42p?DVW^768)Z@fE}oktCWBDT^id2P6ZX?!{4CkMN8gmQ?-oSa;#pGB#> zu$AWO&Uj0|B+7$T=>aQ%Rl(|qRZ7)t$~Rc_0m4%83+sN&Dh*qot{p6s9hRy>Y!8hK zTSQgAnmJOd<071QKYzEv|>D(9R=hRfG=YYv_+4|1YPd=KM&mC6l)majfmH;i=Us zZDnV$Y05X>gu3VJ6!8orWqjz-^x@eN%K^#lp3c~~>))#zkfwlFcUu?a_tZxmUN zz)#oSX|oMCF!1PhnVMx|b}-tUKI_)3!rK^3^@JNb#9n=;O)g-Yv{E_CME04uD2{fO zM#aM|z1MsDax_=v5iWCT1l7CiaE|fXJ%-LGx_r+yHI9-6z$7Gpw)_=IBz0$4#jrZ_ zP_1YwXDpgqk5QpuZq*6@L<)nMDP{fX#oLoU%gq&yCGtK6`X$GcOO$0?-Hl|6n{VSK zcMsD0)IFKk=(E<+$TT&XbQa3T~y1gV)Fr|4SlKY9;f20&C&E@WbxERj(r_ zI>z%IIhjg%m(LS2L&vc^p;6hwktLzFEEb8k^DxrqdS-BHMmWjn%OQ#D7X>QX{u{kz z;yG2D6$KsW)W=MX35^vSVBq{e zDBFlbq=CcM-i<@v;JCl8u=sO+FSOhQzET%ZYDZV-cD|+948a=`biB|^XMc^d;g!Fm znt455lvi3e#Cy3ul7=$*(kyeb>j|MM8{b~O$wGf3dA1x)jz;gw!mdY6r4{eyoA|&{ zZbxe|8!?+M@{<8k{CaNz^%Lj9fHk&`%jck|a;Se`cuN4TKp^cJjO>D^!$?=|rL~do z0<2TAix@(CNuLb8Q1Ns9xlWivz0hT{cg4&!Rz!Dayi^KV?`GD3W^81?hI8*cL zPFA}j)OSATNZKd5i-L2-|3V-DHV#4f2|!oKxXj^?M~U~V z=4zc6*>XM4kl_j!4?|r2ki?qW*Z*a8XpjjHm59UR%Th)bj_pW}GRt6YAQC{+^1pRg z|5wNZ+SP!5;doQ}TWc|~cBBmW)7=0CiLK_fz^-@9cux0p3pyi&-RN&dL|21>Z)l9r zhW`3ZLjlhGr$4;uM_z#ce6T+r{)a2oq-rSo-ISAHXn_crc*@f6+0dWwSO3~Qc+T@|`*&vAe*wo14}8<3AN^AZjJZBdtjlkd z`15YWo)65w0gMnOqF_5nDFc=!MVVp1od=fW8h3wx|3TVac;V0X->=?*2qu%af3+LG-{$_#O=-Mv zNbb#PBox2;k3aJQjPwyNu{d}hO|yP}H71H3peBi&?O_2b?UDO4u=p3*pB(YOR^3Aj z>7xqB`EbMKc(xS&E5(U$XA#$1^HuY3O?INnbX1?6b~?&b^78TIgcZso{X5F?7atZCd+O5nA{b#I(jU}Qe%3p!r zGa0PL`e$+PU!9*0Jr{Hyi68vZDmRlH%vVtU8VW-UYh9IK(dek;NuIS*CdLCy786TT%DrSUL6bHf`z1u zWLN;thsa77iDJBGG@BU-!ME?cSxl$V97aJp%|k;NE>|cYUA#N>xBCf#iMSLlEX}Q~ zWPzR{JFrv!wuwijaA#$OOeo~`Lw9VT;|YF>{=uLjMU_c)PJ;rhV&yg|L(m6V9b;j=ol{C(>&6}!u7uAHL5 z^tm4cGh5qe&sLG+2$S(#5eC$5S3!4Bvpbrx=);NSOJiv?SOk>T2AG>d?W+$pPIp9r z=~4E?{(gwRHUW?o(7`l7+G!F2+T8QqYDM@A^PDTn3go!F!D_yt!W?BZxvtQ*a@Rxl z1M`w8k?9>q_ zWCY1gSKIO688qg_wgnO5yD5BcTX~_lB9oRZ^f0Gyy3+EQZfCg48<>f&z2C@~XKS4@ zI{))hAP5*k3m4KPdH+(S{#J=4(RRBJa(&ALMnz%gS9SsyRt(Qa&EgB#b?nZXy4uX! zWq+{o%==YmP;k52phTPOPwp`{Ag%RzR98c(1$-0d}d~W z?r5G~vS#t>NY$K`SigTl=RTjf^TA+$%;L?2G~^+L%Rw8^oPvdAVk*{ajRL<_NM;CN z(5|bytRRo7Lw$WJUAIHC`MG?@=n{^X;p248G*SH?lQnrl?zq;bGWtMrS!#&orfLfG zoo^Dj)k6qd0`U<5XVO95*};+L(0EYCt5p8- z6{xJF4AGkI=ynE1!|sNFria%2e85D$US)M!W{MhkIqhLqe$e|1= zcI)*|W+R8Ex`{tDZVW**W=?k9Jlhs^flMpO3JhO-3178?o0{c!Ip)o7O0(Z zFu8Uz#$nnbc7qQyoNZmMV;9{1h3S{G6Y>h4@1z}ssbwUz?5 zky=Nu@53d<#Z4dGTHkL)qHLCJ0*-RAvNwa=LZ6p6)jSsix5hH9I0CMnfZk1?JR_ZK z^dAKBD~WqZV=%k|MaE44RP81qdsiyVdYyKJnevu|{})3wscGk<#}+_N{{suuv>vd)2iR}Ih9{o5B zR3O0dzOFFLJ*-DkU4J7ck9gubL2`fb0ab(Oza;*Te)nf9x)UW&!I?2B?y){9crs1j<`@%Xf*I}SUNoXVT_ZCJUfmFEu*+EUx zfC_beA;-5(H=4dwCw-jej< z6(+Tp{_1L|uJs#qW^8h~>|o`Qn1*SZaajgOPKAHq(1M0L#xDV#0q4QnW89f0@X~Fr z|2^z=)6FKyF&X5gxEB6w9W7Vsq2NX{iA{s0ua5mM2}6(&CjTCfHWZ-WgCXWd!J_vm zW`1wjr`|E-+uY#4*eaEW)_9dB+B=rEj`wF`5S2}cPE`R*w?L3c_+OvN@#q|Mzn#a4v5w?^R z#J_aA&utXkeYL$hJ!x}8wEt%A%Tj^GdLiH3DxoT;%25NjA|$?*$!T|1u$fMW z8`G$Lhr2*D4;;i0)_8)%l(?)_2EzzO-EoSKB05`$UfR_(u70 zE#YBTa=fuXc6+JLhNei6;C(^e)7@=;ylzq2Rb|kOmn!}RY&2#ny%aPE?gv8-wSnA9 z37ANqw+{n0gYGqSr7O{}jK!U5yYVs`Qf%5-{{_<5iyK2vjST0CnBPRvA>x+Ew%O`W z%CKxr}*nqKre!0SN)lU&R6cOWHVe`MVp-lnBO=EN)^O?;i@06 zL&`i0Ci7Q)@NuNAdqw0lm=F<&uEz;cawW8M%lD=)HgM-nxg4)pfg>$AkIBUo^O^N} zKeCz4W*(`Qn=Tb>%8xjl7|MTP5&K|6w6B#}3)gKj_1zP|CZRw4-sTx%ZBLX)AxUd4 zmX%dce;3srk)L2ndqnDkm9Ji%pI`E!!?VW0GUv$Mcd_O3Gk`x3^v6coU`_>`uw(Xs zk(!1!B}vfly2;Yj5e_^Zy2>(WD+bx)D_TZ^`nl0C7(W;A}@>04ySzk>;xAW z|4j_g6qGYv)qE5)HFG_^t}J_TP1M_)@P)|+ey%~ywA}S_yK-~#Raxofuw7xhp45ew*~ke z2IT>_ajW%}EFq$6TwI*X5s%v~^8Y+Gk@q9U{70(&tNT_juD&vY&50_^7%4Nwk&CI}3NXE zNAsMnIqn@W`-!#q=65&2dIkbUtA}d)Ra|w zj)K)>(o=@aA3=pj>s@(%oE$N=*%#Bv+=wc94((Rt>`B0$UdmmbT`pd3I7Gx@spA_F z5kbv-qGe#v<36rXm^8JK4V>MC}>yCD9Hd`1`_(@!z<3hxvgB~l6x$5e*iCCJl4QP(GmKf5us~WdKfOqC zSAJ(nTTUev$MgtVZq^zpu_ayP=@K1)fft8O8S=C%idLpvwLq;7PMJyXVW4TV(9>AB ze^+e)?rGk`Oy{$i9NsmXoe?V~G?TTMN#o1Co?e5csbsMQOJMn$q7vff7goqJ#4$f@ zgVmn?=N9|^5b+1@nh38-3H-uxW;B40UUDE^jwZMo@?1t`doEinUaW3F4~9MG06W+T z7T~DI{3HifL;m+&Tx$UfhWRn^?X7VG;rxhV-(~)XqaOc?<#WuGZKGz@E1o$p7e#sv zqKcH&hkFR~;0_#n4_AK^UI2;#0C-u+?SY=BC$vjaH7W_vT0}7D-zKV$D^J0x^z#4A z`2R(#=jvc`xCRe|bQm)a?h(_FdKRwheQfREZNcmcpF5wtv`WaLO3U$B5YDeK^ALI7 zkoE_Y?BhcMP~C?Nq2;5I11FND8&wYbS6~_rdd@4eX_qsVl{x1lnbH_@=klsupc$w_ zwWo~clxU#Q_=9-R4d5!!e}UnKJuG1OK_5(m43!T*ZWtS_QEFM={npL{^9u?VZxDhH z1~$U#k{?8|Ssy=lK3~@vu34i~@w>aZL2H%#wh|MWKdB|BS|35DR_Ej0HG0|eu=J>K z8#+wh5%hbS(jOGk{hYFETfmZ|_0?c3`4sR&FTWg?ZHgYvj9IE@6ZX9XIlkfqw1n8$ z*pqO!>N3#;RfK&@$OOd%fQPtm6#V&m4KhhX2+YNAy40fW3J zI=F)wXMQjO|8^5%yHIj^A*PU1c7$EvnURrUSZuXNa&7j5r_;Q(CJj)Pix0yH=Nl$B zteC#XKUzwE-!j<~GNXTC>ba>p7dx!u@DIWC+w#)%tJk_PyHXKJXi$(8pp6iXfzTde zp+(%P)m0?R#(Xf;V+JH^YH6p#V@Q0xwP0Uw9%G@Mo{~~DsnII3NE|f>!RDA?ajKt7 z8_?j{->ed5%hLrn-c)51)2l`X-1`{_H0v8<%J(dGT1}j7tYo#1w+3LUPYFG@pYM&k zphs+rY4i3;W@>a0NhZWvEFN<_moWC_o|#M%*dnKnj%d`Oa50}V&EBm=2;Sf9QB|vQ zRR26&;U=H&juTV>GU0}v5%AAWPmI{-ePe9^)AD+IxOH29Fdqf)nG&ibyY3jO6uOP` z_9T=5r%wR_$p4|P81G~kJ?e9(-Z3xRy-ci5Nw{ za#CIIzTUFFyh1gU6(%ZW@K$wN;8z zs+xl_Mb-o;8AYZ?sGK9VZ^($tO2i&mFQ7rs5RK~&1kUo)s41oUVxsYyVk>;wdUZ%h?*YMjxc_l8?G zjbd$MBJnhgG$}%|R037QGTZbUMtbd3g(s+N;k^{^M%gSB0?KS3G9m z07XvdiD>!4(q0i~1s?RpzNvPnk{Xm7A5B%woW9&1Ity1udYi0IGJKK4G?;PoD6^%o zm_O>Y=Pjk1samyz>P+jFtma&XWX4fc-q1yTWYeNIQYPU9;HuDGTyJcTX9?S^*N!3o zgi8wlp<6W>tT~|`IWs3m7545XGH$%e>S;Wen;$LoGhgC+9hg7yqQSN5L^!8er#;nF>6il|K zhgao9-%e^aH$?~AcOt~%v}rRYwyR2D0+!3s;{PPwUj?IHgSaN}+)C%&GIGfzc}tRl z%NJ4$OH$SI0tHedjctQj48Qj+r~k*=TSjFSt!<-pN{G^_2r4Z|x2T{r(k&s~A>9Zn z5+Ws%(%s!iNK1DJNK1Epa}kPrzu!6U8RHE9Fnk^sE9RPaTybk)d(dKGN$N`{0E`-D zgC~;*i*D?@|Mc6Qxu9EWL1^7*cCLo z4?XPnxT}6QiB2)Q+`E}@F30P?7}Y*l8^{QH7}%q4<~#_#Ro=CsY8HX>Byg|;&k8TI zhX2J}n%cx?IojLWZwi>H{9>4q%Xdki?sqrHt$m@@V{j1Hjj8*L7TtRcLK24a?}@gu~hkAw3#&vA(|3t`%&YTL0=)s z4BlvN{b6hB^RGTT-XU_&dEn zl^k*ZG5Qm<*%#c^8>$6uqQB@Fk3P=D&)UC=2#B-o4&u8jv_v>q&N9RO$yRWio_qD+ zKQ|U|cjs@Qguo0YYmX@A{8Zi!?FU?Hdyy~nvjUv|?Oeq% zVyD5H&r32IZWD}k%N&c#?M^zCw(0pY*EDmDX9@A$mWb`L&l zMA;*jFrO!JP;XBi>X^})!2nk+Qn81VodV4+NObhB6;nJFN62qCV+HQqocws1C7}qz zU1x^+usH<yiMrRF6Hv_ngbHkx235q(Tnkk8oH?CmQYq*oBAOmz?gY3k3 zTxh@C_?tpsP>|itX~1V+TpoPE`}-NV2}v+|;_hoe@5FKB!v2Nu>Sy<`e;{y7nA2k~ z!ma@XFK4!&3L?OsnEUEapaG>YOQ zs@FXjm&GkIwW3UcU(b#oJVLhxJ$6F3rqkKfWUMadCK{a|ivj#a=;YO92iY~Wf1ca< z#sC_F1gHR}KAG9UHDRM~tV3@S8~+h966ZrY=mG0EP~Ss~b4uFHbkIFW|IhVrpabRVx&egbwlf8-}i1T;&7 z=i(Cr8t2>_XkL`C65juOA4LyJa44}%>H(4M-s69f6b<# zr+oKZg&|(qz*!JBwX%X?|Gwbre%5R zDwq8Zw6(OhTXYHdjG0U)N<9-r!_r-LqjLzoM}C z`7NBo01Y6z$;103z>=@4)Cdc7bcv1+w;O?gcx|m#C_FMUody`m0bdLAjTr;$rGBNp zr4h4OnoArVdmEud>wNtR?BRjpv1(&6qBevswTFm7NH5(wdyXI@V*qbx!-xps<_veBLR+(2+cyTtjBx z3q~q#0(DDW+QAC;Sly$-Am*jGmC0bJ9U-qHSKE0j#o|czc%iqx9==nfLZHHKoua%L zBnE<}&vxvULIF#86E8G0G@MHp4&;{Z!!|?$>hXOUPmF*OT!TgoIiHK{fPqZ1OiVX} z%aPsU=p03PZBfzN-o(tYfKD^hYi_tGSbt8G5S9S~eFPq3gS!j11lH#5=HK(~$m|b} zCh-#9hGFl2Op-UTyd#li>*H+ewlqhVvawBCWnZ$?%0?rp?lB9}Gr0ZD+O{^amAzjB z9RpcPaq7lYF;QFvFP!BvGy_EOCA6D%+JS`dt;5c4R~+Tqq2w11w#AL_J$j2T4o=pl zgrzc=3p^!~d;E|7GCiay(9q2nz=HtycMxGKjVeZ zsQwdxwmJIiGKEW#)a?NRW1y{TIA^Od|PjNEgtHtja#3<2HwM7xXJs2fVl7upYdI$3OgVv z+)N7?uPpm&oB4UZ#|)RS__=g?lH_PZZySZSRmsuQ z)Az+ZEpu9@vt1ocQ}>#Ep;#`Dv7H?Jd!o|)Zouy}e5Gef(@!yEV-V4Qg^4DJM&fPG zb<{O%CjY2Vdf~LUMuvKWT1xjtve>t2AN~{7k2=@(Cj|QX=lTu4YhMY}XQ_n};_cxw z&|}ioE3#Yka~K$~9^;w7SN;Az>m-~Nu9M$c)&@TGnf=s|YkHoW4^4y>a@)bm0O&_Q zjdH-Sn4G-T_L&!XqRLq~H~xvsVFkzE9Ofe4F+uRVVws6t%_)7|$2oq)(-yI0q4!4( zo)dxug(Tb#cZ`jVy9$(OjmL`MogH=s=uLJx{N896U%n)li8c09C^E<~&pyh!!ylcE zv9jOWsU%X#$yIQOVc<&0oX`{p@7SB!j=a12G^~R(u7}X>y1WRow&Q>3%K>O3R26ev4eE8(0y%J+ zrMmXgE1?96WrjHl_grNR45Iqyl@pwD4mE|Kqfb3@JIewu?x!y{TrHZLvwVNGj&6oQ z7a8Y`fN;wf>yVE6*`4UQ^X zkDB;fD4u-T0}g&IuOe?A7r5;^HQgHQEn(T97T%X`C49qf2a-;t{&} z#`$w~_oc!%gw2`IZF+zGhEgHvL>+J`Q*%=J=J#r$IQ%atP4N@m9P#W|u%{5}?!fq) zqkZ|K90NR^3mPiLZ8Rnrf8PnBxhtg9HEu)>!1Tiw1c|nA7o&gAWtfGMgPPUrlPNcS zOW>}v!R%~pz}>*uW5Ldgfo0i5IgD}hJ=9R^_;QgLx%<-B3<>MIqwH6^R9055AD1Ja zeY-9O7JXCy`T@V@7oNY5wI&rDvN#aG=|C#s)poxZU+xw^1Ho4;-T zvjZ*jzuL*OSMvc>1I##To#TjCQaWEIxNB~dZ3?(2)GdU6p6~hd@fCqCh|lHd4p6Vp zMdr;md)kt6O@9wgzO`cpd^y=nhjB7oKtkX##-<3L_hS`jvgGOsfi3?Agj93rog>v! z1|y*#a+rz*CQjfJ=Zg~o$ndhY-=x~a2~*5ngR(~YYKDxxjsW=t+noAm7Bj?cCpGM8 z_oF0`4WL{2ycTGDdn{!+POvpxiX==vA?I4oP8Z&tB<=}(1qE&2R68H~d%q8jJ#{;c zGc5c}z-gF4WC;*;$aGRRT^)VQai{ihclFk3h2t*SHZfQ1s}%jZvv2ZV~2B zwMP~&s$yCmPt_xHHh}*K$`*JDOeHfK4>xAf9rTaYtDJC2xouw9K>W1ZaWG+5)S1|~ zAoeo1i)|f{q6Yqs;nOd9g(?}?^E3kardm=_Yi zJrUaC=#zSm=cW08rw8QgbB&md03La(VZ8D%7g!HusFdTVuw^&BrWc9k(JeD%vfNUf zX^q4u9>^91yOhPxnP(y7gHtu`LW4k=4_Nd53q91@iv@&s8(V~2HpT&?rB;Aw_}!gV z52}aUQD|%4{^>Kh`_h0{+73`$n>n{#X=0C$+S~8Jqxw>5cJP`onO4~w$P#PQ@b-Ch zMzGAq+O5ZfB2ZR5?-Kjvb=-|}*iQ2$WTCd^B3*oCu{nX&g9mH_Dz>^&d(}DN zHI7FajNf@8)Xn1g)#ri$ZSX7m_X_uGCk+p|sm`>$lVk2izk`ute;Z??iOtum6O{fR zKCIe+oNI0UYj7FJPI$Fcn&js!eeoHyoDe?G6d6<>Cq56s$y*}Pr@W-k+%AB*D|xZ{ z2cgXoqSyMXgw?l>a6e9e-EaGWw7;Wa>~*$hU%*6|=2)2pA@D);L5M%#5)G$-{lf3M zLw~ThPKh%_EjzG2eYZvrzgm|cPW!$e@LF|BxdU4iIT8@{+Y9x^-qLDERQX9Xt~|yc zk|V_iiaFKA1_ep!S1VmHd~7x+N$VyDge9VJvx*I=`AVI)zoP|9Iv!dM78s!4aSJKU zRx5@D3CIiW+4f-ck>XXExqW1k= zRce?4tKsN1kdEFele2bZ{2_yJrNe(+)vX7z0>LJPkmp&Gjz+#!Bf3C@z8=XH_9BOz zMY$Zt02(=(INKgwYVx1uGC)-%50ImF{lkxNIioNaUGDYcre_4K)Cb~+uQwMPCo zCc67F)a--h8uS=KGbfITIo2j$h0{47EWq1s&Q^~EdJ-il=H4ExHcPHG6pwt^IP-S; zIHcHUglMGLr0)B)PpiQI<0ESt7WyB;nZ_QQM2Bs^*KvZd)vUVavX zs@N0Dn>S3|H-M2<<&eZ46Y-zN6L1eigK9%t3nWdu5~J+sdIx>(na^AVpqTj<+ui3x z%dWz&5prB==YdC%EL0r7Q>E)7d8fwK(rP=h!RkM*1ElsTknEb@#=)%DZB_@O0t!aEB`i2v)qKKeO zDg1MWra43<_Qtn@#x+kBr=?a*^Dk4RYezl8P6xlupJ&qYn=#}y?~3f0XnJ-bdy^R>$wEzqp81M)0X9OI(itIIj%3OCKU3U z-_9>UBIX*daLUo8R{0kX(AXZWuDUYWcGF!WWWCNZN8bRnv`-5$6c2Iwd}PRvV5y{5&%wt4|7Q&X&7c^WQwLd z5=&1b;b?JWn&WCMWrf2gURaiT*lpI|8X>fk-qW-K>BUx^w*V}l_F*8+0G>`UkLbEZ)2$#? zMpG(=!CYVJMyvdB$*faUk;-UX2)u)}AtEEA*+Qe{!Oz8aCgnR{i;G;=tDUxyT0&_2 z2_9(cPY4rxt|*@0*PDAQa9_@Qh>y7dId~FKb`{mL>GMXY&~g2qM_6i!HE_jshgpC8 zpB2LfoBg&=8P%)&^QhiGm-D>uFK&FNNIan-n(Ny;!W&A=NeVXqp&8csM>CAO1`KKK7eM7BC{-hM@ZWQ)Q^@59qmbZRYrF%GX0l z9i^ADpQk8g-v0S5H;ADxbNCG%(Lm-D_jtxL%9mNkw;!=~TQRX<9T=HpuH5O2;zH_H z5H`_M_HbFC0ZxWa1Y*&@l_!r`nk2W6k>=f3ub=jQBK#8|CSRkQ17GV|`-F;i zBA(L&sp(TG!$*trGU6vL%b`CiGH!CB>NN=_wL@$wW*wv7-2Rk%QOa>$%} z;>YFKXbxwxt14m^6XXBHXZN-K;Ik&Y|8F|t<-C@x`H|P;lbhEp^Ac>=?5lPYr;RxN zfoFNvcE*r<2VXiv6pR`1A!h&4cv41Fl5f7()kbgw;;vDhj(au%wRlL8KAh2TcQr9Qw#Fhw>5!AfewC1u>IqGUceo41NvqnmM>sQuZV}-=1l5P_u3a#pj7)T zySStNe@Ag2**Y7^XZiv^{gzJ@jNZflr6yKT#|sfbpP>g7g-%@VDhCXE&c4O%5ht^+ zJ5f>uQL0^Pqc7vxbT*pqi|7rH6wXD~=- z49=^><3Ro#Mrx;xEeb)~b!d+4Q zCGDYuz6Ng2_a}2j?M`Otp(qA&QMb8ymXsw0i^j=7+1iTLMT&l$W?M5(3oK zhGWGy-=tOg-6|&C{XHySshak@A#ZV36?o_aCkW((teGMGm9N6Zvf!Vw40%++x(Y|H zHxD`8^uBl=A8O4~Z_2gYpuF%0+9|oSqh=rNZ#IXunuT(O*?%~7jO7aRw8;q92QaBa zocy6Yrbxu?2pvj=9lFIt@Tb`oHpB3Bp1Chu?kk& z4`iDINsDr|4l^6Ac;P}rf0(Z|qc(S>9NquwFf5TCZP<48(LoWzT@xi7ar{kUwG7xJ z6A!FJL5P*-&fZ9V>oU7X^8Rls2lb2ubnt-OcCfhhFB*GsV!jWdmQ1?>;Q{)~fIpkf zIS6$-82COmZ<$!q$K9`~`u9>qsDZjy6GXZaCkyQhcvcga_l^5$!h^`Ge>_N%;t^5} zP$Vigs-p@ch;*Sm~#V5 z-`j9;I55?H9wWKRIVwO+JQL20@}a*?urn$h03-6&!(|YQUU+!DQrcz8u8sRO!UPXb zJPKpj`GlX#*am7(X^KUZ{~54N8T~J~7D+kA`#+vtovd4w@O^hph>vH=m~tLC4YN28x17} zr&L-Z0ilLZ3OQSnfX)r`qh&8oEYp_xjLUqqgzr<0QU(c+je)cn3ABA!&A`srog!A|OcC1f8U~VZ9tKZA##_q}dcj z+sv*_U=6PlThlfr!du1u^TWJvqtVH7Bi|{#x+Ut zE_%in>-+!`jR6vTYB9&sD$QOg7?KoNEE3sW4;n2&Ji1)KT5&4*RbtEFR~I3lm<`Vs zsHq1vDP>t*XPL2to5;(jfHx;gX=QbX%O;`^R(8ggNxhX73I|5<@fXfU%M_VHBrrzlS9xo>&VnTgrvr)58~+*rd{4ec z=J>1Ec3T$d1mh4ONhk}K&2P-ZcXCqM?(o#&(eJ8`k$}SIcBtF(q6B9tIs9|^rz0MT zYx|MJNWaHmMuOCWtQJq1c1N$@@gr10Y_!n+CTk`>P+S-FI_u|R`W!zl?hrdaSOvZelpwDUT`3Bh?Y!QBDGw{3l{oQe5>t!z>SbMPRG|o8UbXb)9 zzxCum%#mX~geIZ^G3!&ReO~UrlRNRSF=)N{0O8jcUcZFgX)ORDu})c{H);1r2&Dwk zGvYM7`%n}arnxgDlv7kt*Gq$8v9+$obF?Pkx9!MrG+#6!I%L-pL7K9G7pG>}O@iYniUHHnl@ z<9YV;TZ()k8gLLuZh_+#F=v?Vu14qv!>8)U%3n(-$~*yH8~Rq_?}=RH!f3>Am@aw3z zG`p~%s^c~ZnffVj=b&P1nC8@Ey^7uR1|e(SFV;Z?&FOg~S)fJcvER74aXXEa+cwUj zFzqC*w5%-tw5E2EP0!w-zeUc-$x}O(0O+4UcbU66I9aS-R9N^YwA2j68#l9&iKMC8i*;+`kgnMM-1Anxtdp6LzrhD+t8Pc zxg6&4KSK4>^%>NiH=cR^5f0P--5%|(B=h6Z4%lrRufHZ4G9xp%HtEx7thIzn#xPLm! zeD`_$;y&-4B7aXm)Em=1>e|XO>UURLz0z&3&0W z3TBr6_>5#=K3if-nrxOAn0)!j)|YB}HAvfhu0xIU$<}=6-pQ(Hq3ly^9}>=zJ#e@~juMafzCQhbYf9P5=mD2?w|GZ1&dr{YpL+_JO(?3Sa0~N@aar}KE~k8g>$pTG=m4(>DLha7duO=4gM|X#UffoA_aBc z&GulGCozWHy1+SMEA{80LEMV}vzp1smov|PiA8AY>LQ}b!m}ClXP_oYM7kefkTU&T z{W0H{UyetY{S9OV@bYr7SsB7;jRE8z03!GkjE9@=FAR2gRjj->I2?OgYPOz#q^fc5^;+MyfYG?yH^vrcGor@?M9^s z85?7TV;H^#`BBP|8?v(reE$^dc~laJf!T!eoX1a~ZM3vcM%^42``JmaD8M>pZMSt_ zK%V3_(JvqI({Z@oTq&k|lFRv3Ho8;r?_U?x!4ku;WD zVk>%6GU~d)^j#Uj_1aKp3P!hJF4!0Ks;(5%)txxVbm+@mLU1Y~BQ=W`Kq0tQm2ho< z3=p3J;&={FKD8uw;w6d6< zn?B8Wzk?|HwZ30BPy^C*z@m(ALV$xXCOw2rH z+CLEl7HtoIQtlHTK$RGRxF~0I`Cs1ZkCRdwR37nqGBA}UiB8|OI#A4RYdqnn#$6;} z8i%QHV@Ah=N{ZFWRCS&M0ZNB@K}{QeAerR#)*^3Az%Nq@`R(@6smIK-h~A*Gq@B)x z^qzo+1Q;?Ntd+{z!KQtm*aWHUA9T6N$a$nSTB1F6fZY$)a(;e<+H?}U9y_Nmk?;uT&TL#Ej862utC9vmaVVqPurpelw2V$$UZiMz-=XWxR-ZoOs`U~1>EmZL!6k5JF&;* zPU1ZCteELb#lp}ME?2W`&abq5Zv|Xmn#1T=hjHmLPfQn9et+#M6xo+@4GL}Z2092P zdAD=1{&}f?4^So{8??X%zgKSoS?ZVo~+z zc$6xo0L}HoGwX(M>YCvzslT)gFg*KoG+e3=T_d{r%Ae1`I1E5_Nt@sqfQYyhhG^z} zm!Ca;2~5wV_gd$=&#sap4b{Bz{4@6ydcdkSbUjtQ@X-Kuv3cUzXTZ4wa$s1&aC*Ia z$q?6k`SSYgDWwPuRESDHaa%fH8&C`4=&z~48OjNh4&{?l=PYxWR(-rPN;--w5)Thg zuPe%5oSYfm+yune00FOSZqC%5l2>b7@K@Z?asuI80OjSdcJlt!q#yKXn(x#U?tw1D z@`R_t<+WbEXV{zwF3L~5fT`9Bw;PBifmAA{pXk)c)XKNN0W%|4Wt|#71~o?t@v=79 zeEX~1WpMWZGOhSO8=l2U*g><$fX@)H*=I6oc?`{|s2BE+Q&@F*)1(D4+|Pdh@^l_6 zK~^}De3b#?<^2?!2`3_)MR(Bv)qDfJiE^N~HivWw(Ys(N$fsy(N2N)sme2Xum&Ih8 zbi8{CS=TA21Xxg>+__ zb2ARGWTpUZ7xoa?A9WR}3D0z>V27j~c>@Y2P=%9T-zM+)r+WliSF(7JuShCl1hJ{A z00={x)obK!TvjN6;@7)mFEnzU%vlF{qm$sxXWFD`U_bA$L>L*tx)h)iez-;K%V{+? z-M_+}0w&$crOC>uWhj;sfjmyI)H1PfvgAI9a;1u}>q$ z`q2XX*3yUyx*MtNcu4v{Z}LPv$Rzq^2OoTu%2dXMh8LFGu1ecyWofK0_R&Ia7r;N^ zTZpKhbdi{WTq8WXrrfEOC%K=F{J>zCdfiFxEXMClp{NE( z$-S8>#9<6yYNJ#X9@zi115+cvI{S3cXja;-;}CH_6mD$e4CFLoV0}|H5;jrcoZix{ z+w1|nM1b!Ry}9*~MdXg}ln^$fIu97KOS;jWK_h20+4vzcjSujJ0qbs3_UhIZiwaIA z+QosNZLA`N6>GoxcsIjm86|SKr(*woSE|)(r^6jmz*l_)rf(FwmEh^<9W=Ct?K$=m zfX0CkdZ6U=0c*Wgq4+11AMsD>0e{{pcyxnq6I5ud&`dW_!TnslE@ZJg?wp~XFY)ed zrpaRhScyx|M6mcLeIR3jlS6i zBNU+Se5(`gu2?us1dFcM;p^AX%u`cGGFC&njLgjSqkZ&{BTU&!Wx3{#H9+K&-2o$e zdl|CZ(g9Tknkf!ZRfZoL$d(q`&~1M|H==rs0xR+HPsrIrgNT}<*#`#PMK~k}JJ@J< zJ0?b%HoD}49Sn!!31`|n^*X-PgSl8lIqq9k1PFYj?PlStL4&LD-!v z3`Ub!>@`a-4{uNJtH;!~gwlVIru0e2SG8H_h6l8ILC*u5xSoZsY7H|dFw%Bq`1Mm@ zm?E8`32VLFg?R*7zd&pF0RqR_;KXgIla0$>0QAWbTKIk?%A(VchUvH+JwG^qDzo5F z_9w_~?ADn*3lyF6d=BO+mCMgfUxbEfC5j(vCl|%zUE_DLL&oondAih3zg8`HEXT_k z!=-yWAxd&WoP=mh?CgtJLymCJo9Q z+!wO*&5ObfG6FoZ5{7?>HP%Xnzjyb|BZW_umpwvkIm8mvvrT$W2~cl4 zAL6FbMfrVhO|D(fzrjo`wyaWZ@w+bEQj4+sn`jDR<9BCZiC5z2@Dt3^aT}_*O8NxH z)%*fuBu#-0n=jCEgo}s=L+)aSE|2$vDN9QYOfDc~ks$pB`U$d!ZEruOOxgk32M}Q} z1JmWC4GdECawlflZvZ~Li1rsD0OhgU6L*L{lKd{RMpN=V1Bo!00>X5>1*<4rT=$bJ zlPOjfSFT$31SjXm#yH03H${k|ai;zrOzbQ?#w`Mk(xe;z1{3J`drB0|B=tf1Zb`QN zY_OIm<*KsfR3{2$L=wD}0kdHeKlhWd?t#G;Xx2+J_uSYb@gP1>$Y>?c52gX~Q`Q|T zYIjT3^l%qTyURlU{H8+3Mj-|D%4Ci0E4>&_1pDj#g;}oJjy=EarhodyA+vpT>3HOO zgBQtmymXO!1Rl#Y9^Brl0T)S`M)CPw=9#(Wf7nxJ>wOJ+>^aMAcs+pqX)?Du-Ini@ zQmVxz6R_kBoPDI{=A!xQ-nAxUn>`k8j*;3h=yI68EvxvjcCLFu?`<#PvD)Ts9XR9v z3eTsg;I@hehax_277kDRwf~-YYz`@e@DVNM#SZS!{=n(UECJ4 z!B_57TS1l1WZGgZ7F`M>s$k;wK6Lj*gDcDEXw}P_9E(%+C*fFEw=(E?y75D;R+}rfS=%4=fC1=c%_B5SvhB0`N z{5U3Sr3?6_CrCyTm1B`SNTa8Hauc@WUsf;5J)o5$p;Ue-mLkiqNq(y;)TQZIiT&HL z2r|3rSi@w{4T$v9rd~n|M)gNK0?o_4R- z0*$lf$+d~G{{KHb`P0Y7L={Z;((mG%f>D$Qec}>wG&1+d4HdEzI=0(IagQABPP(PH z>8&CvHA{y%`{xeLY+R%!cTvn`uf9X`5c4i{$5preJ*Ia{vq4JYvk>CjIsExLEdqdm z^CMN9Wou=e4E1MI{SbQC`pg2l$Yg)MmC?23F+x1NU(KI6;ekmGrq2Ou5S@Y6#4SK( zRj;=9F$`(dHm}a25$On}qCD7LMrj%_TLXp zWradM{o=Arw4MZ38{0QhI)}aSt0Sww z_a8ot5_*NMUh%mn!CrEjYbfIfFndAs3*INQ(K3}|=9=V>RrdRzz9)~`j@QLSe-^D8 z<;<}dF|DkU2?G_z9xoipxtQr}w-u-cK{v;Gv)EaDyI+qJ%itsbTb=pLuG$6eT(#RI zoGwI5Y^yadOp;~cw7AQ?z!syx{S}{4LwM-p6ZjRb|7Nyq{|B>0@DH4K;wFAJnCVS(|0y80(71)64=Ifo zuI3C|gsKe`ukzRQ^t^btmDD!u1RNQRd!5u=(kP!&`fLe?ywinDspK=pyugfu6o-Rf ziD(6$$zk|FT!k9pnc>)3`!#UPiu;ChVb&fa2n+5xIGWX$S+`V8ETo_iwL)Ju`a#@q ztpay=QXdwLWaDOS#-cdf%$sG)mJIKE(goOyM{-KMBQ%x&`U?=>NNNu@_I#Gyvrh|r z?=?hUuGb;glQT&`;qjo@qvrFkdQfIj^rSnm`m)W13A?%mJq zS?T}U2?(ylKiB*IakzGFe>}`TdunTyI89e!uYZiZ6SH-*22ff87i%Tb`_0@Z^gOdw z%e}o&f7W+ZI3Y2!vk2wgc?+oCFG6f~Pbh)OhY;@}NtXhTEY&68U;W%|`XbnR0AIv2 zU&W1$vHM(PfUp;fy!k@N*6~H6h(FlzU!HXLiG)#y3=@VFGhq?45ayxN zcW#H?mqvKIV*Ehw2ig&f4TH`=@vFXf&EdB)#Zae{+iHJ1`$$(=TZo)_3~XD{q&kAh zC3l{Gf(Zp`$hmi<8kLP(obPiTj@c$gQjW#GC-hKb7)~9{rU$A-IARgKg~pp$R1zW0 zQ5EwYUh67x5nmp1MF70QTEK?v&F{r&L*5F}VAw18D~fx`Sabbscc9RB$40E-8@mf; zRXK~w)(v5LT4XLwC@N)V4o{J0AU5=*vo^kY8nu?QYqxARL=0NAUI-n0CZ2~%&(W<< z2|1g0ZBsseln z2LGFrBG-xBYUdK1Aqls}#Y!V&oIv-gjlj^Db2l;}x~*KTwUGe$*!uyIKA402qPD2Y zzM=ad$mSXO{f|_FfSEGin{vx|U6YUf`~h>JUn50r;$eiBGQsBsZ~ zeuME=n(p_npjglsw8*b$kh&#gJJ|ScrI@I58%0t1=?gPGGESGz4lfldKg(_RYW*W^ zKSEmrY9c22nzq4r8TdPJKOl{t%Ez%uU}8`CWFz4v|2^T0toLlap9|$RJ-~d=8##(s z_J1f-0gCQPRWV>xZ~PhG=qic%?87~5CVRYVZsOG1@K=K@bXZ`B2h0F=Ha6b0;upu< z*whCKreGJOjQA#B-_x<5U#=FI*mMw!Br;+_leG2SeK%O~J(ib?oo*w=*|i5)$p114 zZlgVJhT*vV$g1NdLk;ZNN`y}3B8!K#{!(OkG8FMB=Fyk`dw!KtfK}p&qs0jdrV~Vt zGr8O47YJ^FL8>Tst z4|^GAaIEJ>de)bxV3rz$1c>A;t*nsFuW5{pd>QPL8-+iJA1DZC;Y0ang@4MwXK2% zuTXjW`{P+?Y}?fp>ZT6+N(SJBfHvy6V_I{(Yxam~rc->jbkb&^^H>%8aR-29x^gUD z=(I;eQh3eD*jvC@@(FfkUDe)?=_W8e)oBpx+xfnAxmw)sQPniO5d%E-z0@8@&}iq; zp(N7h)j54tVqZdh@0jxt$V>>Btr572%-&n+NobyoDw%^}=m76=$vS#(g-OEUwTaJg z^i!IXE?4J!05#9A*HtZDcx5#Mmg-$cIGsnJVcG|AZIYxB~xt5#vlnYR_ z8s2$-8s6`^<;i4qpwr9`8eP)db(RdzvZypeH{~+{TYjzjM}a-N%CI@u)U;P(L&71<14i#fwFsvL#BQC9bFdVP5RM)mPWZaj(zet{% zpZ5i=jN8BnQ4rI_)bx!{0Gamp`2E2u6G{e+Di0Ht;&j_zzwmPM@?>-Yf?7A2I}J^T zT^=hZA1PX?DJ!JS)!lS(I^7`!%^II0ZD10Ij?bty5{jWeQH9YGLhpI7y%=kiyd%^0 zcZa-q&!+?~x&s?Kdd^lIhLJa0m%w1YXzlg9QymgBZW!PX5GVDnz?_haII&yjO((w| z*R@6uWqK!uW9Mk+ljaEawt?`@bVEy|__vYU~OcDL*-kNGV2rKeG-oWso}ma}QH3aMhLG9sTJ zrgELiAzztOd~w!|P`y6kyxXFg?JO$)G&&(wN_RnLdoGBCpZk_}-8ZBqVj8>D!p$yQ z8;lU-wg6&wh9rpyU;4;?NQEQ<+GNTFhCV>kiJWoJW5bh~DVg*^+?d1Fa;Nn1k=?pe zC-5WvASn^E_WRiJTW;=pdq8sE{@!{uKRm9=QhjmY-Rehf+Gm^K-?E(PS&bJk$*=Xt z;;%pi?&AasxeU*f+x-ZWF}0>KdNkl>QxU7dU_T;~CbL@5(=-Q+lnFW`Bco=P8o;Zv zTbM^dM@OGv<^)aza(qs~z*6iqire+62LkGm>M8y;*ZxH+k#HE)Ld$9spb+(aT!iX8 zvgQR>E${aAvg>ocAtXUkBVjCTsRL5|AKuf=T=pq-KDT54 zX^hfvrDL|kdPrm>@y_otp9*`cbeEZ&m(#EIYo_l?n(w#B0k_N>J3F&E20eHp&I?v6 zWf=FQE5g(8*E9*oaLCBW&Rh9jp)iM6F(d&dgmVEA!LkdGRPSjl7=jrle4!d#Z^0~) zSpBqXc55dXGoimETt5kx?G@>3q&x(gp!%`mH)hGe*m0Fj+Y{ap5j4=A2oH4W z1)_OMrIW1hhcNm)Onnh2J^f05w1o3udj)ZbH0!*D{%C~@L#n{epu%av_gDMp=i4zd z>sn79ydHnFMZQ)Y(-JNSc6EvbIO8iVF>D@K7VStxyzmY_E0m4f84$;KCuwZGu>o>v zY4pj~0K-SPZvOC?qE&mNeH62uv-Dd|jJr@{H7E2Jp05$^3$uu-w#E-cn)`WAN-S1z z{K>g}bG4t|R>~u1jQ<#>vNDzr-{enHGxO{;g`GKofbUyzWWuvx&4!HzV7wY;sApiX zpdz28N+?I|T%>=Z5jc`%VgyFYqC!*Me|<2z#rX5%Q+6qkY25RAjlZCGxoxH9Iiyhq_+JHQ! z$y*Th+(y2`D{kZqI<@52;kC!wI$KweE=Qzwo5bh9`+4PeHmhr0@Oa|CndJCJit;V zzS!@t9&hqBs=4Y}utq5b4ODZskp%rvh119YA+8WX-LzWjGC7g*mseZ|+?#;~IdqaJ zxRBF@3Q z9lj22YDW+_>MnH?GTqB%0jt_Q)H$%1I!hIad-mC9w2{x&)0v&Mcsl=NSyB`bEEh)$ z!LCVxeQftJ3m4x5kJZ-1@2OAwD+YTi?gGAkFp1rz( z1#B(q8lOf>hwDG$tmrLey840W* zK4OKzJb5_y5l#>-2kz>#0GEo5$^?UXot*f^qynlr$v=M=yrS3KglL*~Kw3VCZjNyE zLoblNPf7{soH@JJ$+$UR$<@95AsiHP6X;vvzH}21ZJm$X)WF$!TJe zj$au)3&3Ex_A&g)HLo?jn))8z-V^OQ;JfOcgRL2J`DL#pphU3Up*;lUwPz_|a48{1 zTf4rdDIO0zqhz+m{%O$}sr?GI8%5V0g&4*s55D{_V`A#LTkzS&3dT49a`!>fa?s!G zkK&?HOCbgs6rj>_|1<2|9C6SeEOlCU6ml5XgBd?K?{_bOr^-v+o2du9z?J~mAyf8! zE+P1Pqs|>~DXt+t;)QY9S|=?UE%V~k!_pr85vAy~&apFE?$55l=kuMp$aKWt)$>H;*n{+mF4!T<8NpWhl{Iid&HTV1M=&^vzHd~= z<;-utxdLFPp8Y0Vv376sAl?)3*m?H`;DJjZvZgs$Di#?do@A)1B?f(MtZQ9rB6h}T z*ZbZ*%VD|2p)-z*Nme&SDcr}AH;x%q_OqqWsGI(Z5!=}tJaG&Am-d_g(avn%OOn^w z?Kijlt@rY-KzO^i*T>p*Ac#9&eF_8Y{RHZ~P^Ewq`e23qd$Sv0Y$HjZN9BXBr;SM% zMuE&v&@$A@1w%xKwu#x9T*r-<2dfCdCDoCqE zsmNMvG>|>rok**gYy1ESbNRhe{#@D)PDO`C2?3Dr)B`4y#r_7aahD4rg?D$84eyfC zaKZzbJCgn{g-(6)bf0T~oA~;pQbjLAv5MgMaHkPeEH$qGQNBKw|9@ovpOhP=;&b@6 z6)v%*jA^8X^1Jelmf0Y0h~=n?wgle|L-U{IvHB$jSe+lfq{&t&N%~Db zO5tnXGr(^L87J`hYaG8u-6as2oNc&!j4G^JNQB+j4DH(GEzXn<1?(d?NGOL}ESQAJC zQnI`{T5!gn||LY|rFRnUiorr)QOk#RL-j zCZg>@MO_y+w}$IOW}awCyC56)-V(3f`TB*<$NwQct|4u-3Z4*;)&`#QPvd^HklWV- zil8A4{--)CraU+(6|uLV=dW#ZdrINQQA!0`vdkiD@k6z2n54Uqg!gWhaKpl{_gnCsaWePvP|6>q!bZaX%#}07Gm&6 zrezF#m6DEPb58CjEW8Jpd!63Zlm__wO-K2B)fwEL5N-~Y(Yt)c`b;Bi{ojtA(ZR%I zW9;q0MlQtJJx;z=OwlV)bR>2uFgHgZ?hERsFzOFUglWHGkaGK!)E+fB1!A@FdM(;M z-4ADVP2p8L=2-*)r~H*H!TWa(7gt-#*R zjdSFGwhXBOjmSRBN7d{(FFpFGBDy}^dyYkpe9Lpr?#bA%1b&Lu&54^cHw>#^H&1uN zVlsJl;)Sea5=)7GXDYal{|u*7Q&Y?Q_5L=H+#jYpDRfv2`=m8%KV9pxV&9kj&KMtk z99C*TLCE)J4y|^%vz&lC=VLPHX|@t2HZ?wO+ZH;7*`t zZ%6M`MAHp}dSC`kX^zF-TW8I?Ge6AUe_ra0Af^?!!-`-#c-fNJX9)ToWd5>oZ&-Hc zK4^%KV~{Kk#zfxVe!c!!rrEP$bVmc`^w}*Uznop3;8_wnh=Dns<9`2R7Wpss+WmKc zY+DX;^|-#8&pBJJhzQ`)QkqRU`~Hq}76mu5EHW9OSWw|oqjPge6# zWrB(cFiv>ogNmkq71#4LM_DQ_Di?&WwGTMW$=!>~KPq2&#{)a(#0CQd+E|P)pN49R z1im5qMb)yx@xG)Xjf!OSv1G(_)am`mIH-Y9LiJrYkjXv2g+G82|0Bk*aA4@aVEGZf z#Wk0`n7Rxs4EIV3_Vi=TML=o&1XLtwSNT#{->bZ1CjHh)^(uCf61-xuV-fK(M(-Cd zDLE?^HMtWoHa%8Wyu8W}97a1Ci=YMkL1a2F^B3Fo!l%bU5&-r$(>Mu7Tm1^tL0}mq z6rD9m1tB1J2;J26MPE90w|sb-^8+=@Q~LbE=1hL7`Q!j*=atx{N}tOZujLv3mG26WS}aodb2Nb1`e z9whvO(|JPJdr-j1vMoR+K znZ~{q|4nhm++(=D`ckq$<%`vX;;@V}KX@0b=uf#5=zkyiT1@h&6#>y<9ggEx1c;qq zJ566hC_urA!JDND&!F42ofN=>7HZiv>h`aQa0bK6KwY{Q<-?5-{i}^R$@wH866Nwo zsZT4x+Rpqg{s2q(EU{cIylpm{cf zCA_M6|Mw;Y=KF|b-QnF0Xk(0^!h0bqrKF0mS=2iO@p4>n|5uM@)(3I?3=t+gRi8Q0 zgK>-P!>H=|H}r#~6iqRpyL^ntx2IngkYj1Ly7mwqCGYudt^;p4v@fCJ`4#3m#qXdL zcb?sXv5Tu~#s)F1lwMTR(~)n5jXMF9rt;d!u2%hp`T--WwG;xAJl`=n;?%W(J4tBf z>g&fM+f->VQ5%>B2O4v9s=Is-|;SqWJ-eU$7%5fkE>HHf~@DkTd zDXFq*EhYpwWCcNA;R}R>_RpFVurrid{BIw`-HX1Nx771L1vVZU{ZE07!Q$XtYisi$ zFG;Z{-Ice)636MvE`EIHX?9_{7r&FUw;FU&EUI=PzE9TwK?&wG-CFvVz}SdSb8WbC zP-W2lB7H{6YFp>r<4<)5P&>Tx=N@>bYrV(u1a%gj1=y6PzO)zi4buc(=2N;j&$W_n zSg5zZIH;EHjMPQ^0J+l-Q4(QQD}hC198nhvF~$AgS_OlAYsUCVr~MAmd+`eWnSypBNKQH0~a_v8QhlZF3$K>ev zU)7II#?7xNE0Fp9W5;%O0MEg?o7P*ksQyy6bZmQ0g@0s(2k+ypc|T6-55&28a2daE zEFC?ogqLk-2tw~Gtqs!qq4@j9X}m^VlTe_Pr%uj| z<_1Wtar$Qd>b#+KbNpBI6%&O1O19yb?0r%QM{O6*Qxhw?Re8LfT1@GSNaeKknPuSi z&M@EukuEro^*L$+D9FAU_xd&`Tupp-)jKHx6S8n&NAB|j&_jI1(xCqJI-AAU-<7<* z*S&Y=S%$oyKUQ3=7^vLCLgfMw z^1a9O#14yVE=i>X`x;5~T38zB72hhMpBLsd*6#&kB{<$>uBjV=Fea^u`lD71g>;C4 zVy87B)(7$FAO_AsED_EGx}6o0Q}XIS7H&2wuGRd087^tT+UZ>{q@WTed{o&Z?BB{B z67DF{Rnkl?Z`E7P<`kFMLV_JKth=KUpE_O|ZY{PZLarDqP~+R%uVD$I%5Dk>?-$A~ zbHe<#=x>sO))dMxn`BY%23X#QBH!Stc8zn1h>WH50m=pYr^adCdP7na`yR7vQ3i>N zaDInUbj#-l??jrMnaswAhrZ}myn9wX@BrPD`B0p^F_{J%F3!D2g=+fnFJit@o|oX@ z<158A3p9t-RJExRb(|OLZyUgopDVZvOi(X#ET0h_c51i=x^ehOC~+dr$Se2$7uD}2 z@Jarqn!@bZAYA+lX_%{v+dYbi$7i{}R(dY^nlr=N<(_c*4#g4m7eJb5jpQk0GDiJY zrW*u)W>t>hdmlFVOio<{vx1K%MjStWRtK6mclj9|MxN=-$fIo+%FN$q5Mje z>%ZKzSY>x?f?c->i?(HHjdTSCvl>{&OGYouJcgPC!o3bMJ&B}$XgSirGC!ahVIQPj zwlydk?SGsjPWHK~uX;V~b|d-ymDNs*pV^4V3Q3o|_7*D=W)*#))KiBeLFz>m(psG=jk7^Q)!xES9>Fjt{DVk+}6vyhWJiReOteB zeltxjoL1R{_s9NcXgH4o$2~r7o2SuKw;Ff~B)YZJ?p(T7lwX@5!^y}S_U^FL!>uIO z&a_u6%9BsFDy!M`OGU0>HAM-~RConSFo zZF+%G5wk~^BsAaE%qqz?1eUIQI-@w&Uf?`sugdx3NCpyiFysx+lUM@~gZLa|{(wkX zLOL}2OLE&$`Awzk@m7!5+i@n>==`53kG1@azuBqe_@IIPGhQh=h<4mv`|H4}xk)@p zCucuYqGUoel=5K+4L?Luozt833t;PEF?F9u*Y%o##llzSu`eOl1BMloSbzv3D(YXS7+Q4J&1nj+PuK4rC0FOdT<>cqDzf!{`GB`0DGvK@&X`EW6(u36`kZS{ouc3+!Xw+T_6{^{ z<9DjE#eS|5Rn5Vc({fxV$47ZA{VTU$SY($F^v!i=vZl{!TA1-t-B3#xQutl@`3#3T zJF_MSI|GOvapXDIiyf09t#y+Sgpr*4M(>GC?7)EVCd8^Db1T_Gy_Hwo;KuFo7s$6MA0W?nR<6Y;4yViHHZVi1}QTp@RQuzK2?2v7P@ z{QAW_?~UWt?JXdB)CLS7=_)yqALt>zU#>0pcbjkan^fWd*^EEI5MI7jOGG~2-*H6$ryU*m0s@v4_`^ny_J7KD zfOD4!Z1(yl&Eflm%K?9&Ivl;~Z|hqR-0gq0oqcmm`j74)+z`|8y26YfQ$0JQe&g1_ z2wj-1fplbo@YxEdobSKuojZ|>2c3cAEqVlpGDY^a8DPhE3fp@69jS8U}lPj#R(d^SO>N2(elb{_7pl60cFW?|l7^J=+6 z+4)r8I1CB&*f;N`wSh7$3F(<{AO}7Yk^ukD>1NaN$;@y$*}=}5$F8#fa4L6TtGa*M6QTr#h+Uu zISZGXi#G9_%Z_`iWUcS{?G)CT60xX`oQZIKOs3(`q~-itWgU;wi`kjtT| z!!`LNa*&wuec%TzNadep>@yJZzqWx6I+kGzw-t7$RVT z_#i(Of+>M|7Hxy&w9o^(cgjB*`N6_5O($y36>Wz7&7tp;nf&?^TH3q2J9jXQ38|79 zB*~*!{tAzfDizdH=0Ic8yMRw3_S^WKSUU<#?|0z7-lQvIRI0qikqi0$(L8;p<}Jfr zkau=x&@K46wgs}4S;1LGi_HPku8)Gi{Cfd)+A9g1gjINt8EG+5{N7vZKJ!@q z69Zd=YYbs$g}OlCimEM0x9Lo$1-0o~Q~r|#R^8F{*nHEDFH#`yhFeA>-~39Sv+3B9 zmeVWM5x74l5htG`3SIN{D!SVLBEv(t@0pXjiuO+nzkbR128i_U1wv$ChZh>l!6d0b^f3$g`6TuA++JH68j$R9;|_EcTCu z1#r(~EOqiqOh^HPr^h*0i~PzN5N})m)y{jwApNO}w5eE&Bkc?9&zWB`uaNb92UQTf zXEfqbnOwsopgRI~{sld_$IO>T;6Toj@+7`b+Mm%5Xo?xwRqsXeeJJHo`NC*tj96US zJt*6njW#Q>(sBy0pZN7*wy(GMs%*$Su+>Ws!M#I48RCyl3vri)t#4+1l&uFoAQeeb z7Z;Zl&$1%(EG9p66|_6ocI-78;1{dPrtgi71VTc26XYP{>{0SJ&MZZgBq;5znE3fYxQ-|5 z{e;V;T(W_b3cAOoGmrSgA#;Dq3jzoBJ7y}r_hQO@xi9M0uQsJG&#tlklJ+K-r62sB z9Ba30V_2j5#J31J`Rz7m_bMsZPUJNhd9GIBT}4c;*2a~d51{^w3u@h0&O(hBonij* z&RdlvCCJ|9f;c7@(91b-aA070rae@j7*z96=~N2i^W6oF3iq9b!q_z z86F)SRrdSie?7T}Na`>qK9FU8K~V<93Ub}ib|pgXGamh1IfIQ`Leq{!;@gwwKrviC zYxM$90)t(HPdZH@+0TuLmXWtSQzL_#m_d{P-x8SUDZkD!=7OdWAnWY;!mguEsRtg# zeACtcUf{lmJ-He}3#x^^JPVbY?aoe>ns{Puozwi3wJR6-1{79dbX|S+Gma&ne1{cO zLGR#MdB@Vk=>6KPXE|I0ltce08@j0N&vpv8hkue39hoO>FSOjz3)wKKqupkf5mQZn zP|C%gB*v_!CzYKuF}y`NEyigg7d`aM#41%-`bnA}Wf-OnET)VzsPM|~-XZ~-AZmy^ zTKbpR8{=kKcN7l18_2dW0WDO>4C{hqLHF7`4_UR)Wi`wntOulg1!m3Z{^vHtkRLO4O5-S1S@FKm%`}D zPNT1B4aSV7e{Cpxakw{Puh?^q00is=YvdW+&yxeT^HgiwXdlfRIC}C)$c}tj^??dc z1wxM)==`tP8yWB^PR}I}JR@kKqP`=A2@6YgoTGGEo#y!@VUskFdC%#~#HM-g=jb5N zCB|Sbn#g5;nHWUhoKL2*zJEnog=Coeld277}6pRRW z-X*EIGKBs1u2Wr4s<`SPxJjW@`q^+VJ>7Fo?8!sx{n2OULX9w@#iik!r*3|B5@HM= zGs<~NmqMu&@#yta3_~Ev!2QP&zkC&3Fay_Y9{p^}{$Vg{x0mm^JOA{zXN}U2uXR3(Cx2Qx zykf&d!Nj`!PvzUGHTZ|gKW$`BHNAKR+I9R>(KYI`N@FCMAx9T}RAtZKMC|jtI0@$t zFU?mVlk3bA%@+y|oS@AjVeMn1u%;(${t_}@GxfwlxX<^+mqe$~{UZ^J4I@b~>R=Ll zqoaU{+?ShJ_bQCHDd+3>m3Y#cAV2)5SwpoARz6|EP4XbRkbiRif#F;P$m%3|c(=$s z8|9(n6ROVcLEq7hD!0}8Kl$dYg_6(kfqu#Z3;dK;gwX^AJcOra2b+DKz3RF$BP}5) zRJW7ur%$!zvv!X57g`5rI7oT3%%z; zlF7HF-M6sQWo(78_C-l>4d->M^bG$qtkpBLd^8sGgjeHhT8}(AVUei;mxke64Z|ga z+RGH~*qj770pwAvAIag)luLG1bULm}i`?E0$o|3DMAu1aHtFQ}K}j6k^CXNAA1rL} z$IW<%9_jGxZywk%Q{J5U+%wMdnc&~&a>~s1%|8nop>TVG?!Ff3t#;zi8xjQBk#vo!NEVq1IJOOj%~FCn}vjhPq>!-PXRO!>6? z`r*Iq`q<2Dhd^<&JdDI&E-;g>du7AcdwHAQbbJd^R?-jaKuYeiV1^*LER6Y0K?>v% zYgM+EYE8Mcg^A&?drCO+OhhF*2M@jbTM+X_WU|jCGDb*>5njLzY-`OM72uzvb(5I- z_{g6pF}20Ue;%mhi**7k_)VqHB~o@=@cinp7nlD&Ct)|jHsmA$&wU@f;yd-6@nIZ} zpFrkE1)msQuc+x(Ge6BDUFZIMO~?8WI;uIFVzUI>$zFl=Jp_$)fU@F2(}gK>F^#Dh zn!1$lFD*FiLJl|LWJgxn!?ti;T7^@`e7BH67J9BcJZ`Ap#WTTFqi;j^>VMkQtNSH} zCVo%$x?KI*gA^gz&em6G5wnm!c5VqS&d}Ul5`2!qO{A2;>t6Z39sIq7tKIhP<24^G z-tT%?46cg`Pe}z|%)E8$+`PsbLwdcGvmRN!q?>HQ!LOIL>n|(DU@*N)P3VnRJ&Uj5 zb&k24!At26%pM18TbBrWRkYiD%bs$jsw*&S|Au1qM0+MYAHAM8w5x02Pv;ywmjmY) zPnPP^GkID3t-Et&FK4fgHQtJ1YY_c}cIe%D6J(*W)BbTD$2>wq3nbb=c?VNc*i}h6yfh8Q})^jm+FpJ5&bw&9Ju{!adh= zN;Y>LIQkz;z;`!zR+=`1Ln4$!bzdZAZ2#G54AoWRQb%E3yt1ZByVshXH;YtyYj4-E z=*|p(Z$-{Kp=OC*|GAK-m4nhpuW5L!4c7E_+1wkk_e>52+jo7jcp>^8^t(;PhSNZV z{9|S93U?&snEl&%WhE(UD!o<#p5orI{7Q zH^yDYNA?WY)%9!bJ<$=JP!#|3VK#n*#DZbC3}r~7^RDB7H~LIxAaqk3W=)YyOie3{ zbn%qfZ>pN`x~`fMn?GN! zY>F?{rG`rCIV!9yzDYPuSKQ34!?-Ta zXDusVqk9aMYV>rysn!tE`e1WeiAA2kT|Od|HP`$d#MyHe9bLJ;R^jArYFU6>3|_k1 z{>06VZS|}rssrnVYkd|n>57SV+Vxq%o$A_xcSGqD1B`nXcef4(K-fiHOw4)L7+PE41sQ^5x$8V1oT(ja4R681}o;ga7PG4SCekZ=2j~Gp{_OCUEPbXAJ%(W|>s|Acl zO&9do+p~m!RE1g^35);qENG-tN)!`>ZNa_MCrG#47b|!}q({cHvOAFA437=%Eu!^5 zo4XTEzFTap-kIEU4WbdxS>>bDdG4Eepq6cx8~5hK7QkW9*m0d7)Ep3*C=mG8pRC*u z8}u^S-yTC7WS3Sc-ar4Tgl@li+GV}kdGs9>eJH&WQom4lrLBGC7u!;O%ve3;fdm@ ztv_%!6n)&K_8tyw4biv~mDRUjyptTdH}$zWau~I@=x(^Lgg>S0JV+NRA$HK)dr@ki zy=$i2sS6>1kfN&g_r3!19a=)>_H36bF4j2pTMJYh%@oaEV!nIFO~~c-i-GTBp<8d) zN1^K;Hpx;-b)|DoEs5C&NZ&K(>a;AfuTW4>@b5SArY^0a-(DvQD%{kIym@!H4ZZm` z3hiXKpC!B1Gd*i>_`yE(Ein~JRPiUv*N9m@^@w!EW<7G4S8o2;0x#N`6E$z(HlOM| zMuisPUR*@?&1YU`28zTjrsIVcltU^=hi#EcjYFdeOJCa;l4rQvc1)eunuUYW{q~{T z2YP!lZgZ;#7p2H)YzqGCTIZLgyR^s9%Dp+X<>NB**$cyA0tFBfZ0?gn(1-P*d4~11 zWJ>F?EZB-MOUuv&=0WPjO{k5wWuB|UoRiCZLDOPhi&!GCW))@WNi?B+&n+^5E6d1X z&>b!^HLy0eJ%%EOtygk`-LBP~75iO|WA@p(e;{B!nZAO#NPC6q_f*Q5!G3JTXl=Dp z@a=9S6OY%($~~JqO0b&}-)$zp+sUaw1w+s9%X8s-DKG_`mY~(Y4U`1M5&xNw?29II~zO)s2W0>r{UWxHk9o6q`fl_K^J$OI}-@tigL9 zwvg6sn}Uidc{pg7m4<2Y?doE$(3b{t6l#G_4dEdNXir_P=bMjyPs}E*bX08_M9DRh+=vXYfneEesPr@$Z zE5=r3Xvg`GC>WI{c`-u^e^Gs5vn8(2;(@ea;S{Z}2mXWYr;ocj8l?vV_7`KS4c3g* zTUu1TEKBw|de^?sxMZ`4rSazP_kD!DzSxjWiP-5KTrzQsa8PiT{Z#Z#(c?tKBzOQ3 z!6kT<(t^L-Ga#pS``klMJeO)c6GTyLUhusFlm4%_aDvJ2@s^qkckA#kLuWWk}%Af`e;dsRaA z?PiR|5~;mZA1gqAVpCIQv;L9U-A5P)Athi2DEVE}KaU`#9N$8x2g2AbZd#8&n)elUHO;i!t-_7T{ATMV?Vzm zJEg8Y!*NvfY0r*cYaZk&`%)B2MqehNRysbOIU0I5^v!x3G!|C22Uk-~-&K?&Fs{@s za4Ye|;pSfM*UyTPcTf+avq8B_95lFViVSx3OC*VHzbdwz@-*nhqk7vMtt-0NI|U>U zAL-iHbTNq8U;DPJl;U*>DEGLXxY$s2Etk9=_l00%sfG7{MN3~T%&~)6Nvd1IMtRN6 zSf$gQHM8v#Y1|h5V#cDy7qjgT;y8%+pFQ^wFt${X*^%hxvf290%8V04{g5)C9lBY<$1^%TTGe)gh9iQde#sY>sqv#V=iWL*tH&a`BEfIqCTli(KYZ9t2Kz z$1>B}FPhMC()pc9YklQB`%{SRU<6w(qT6qEz}*(Z+B=zKk<*iFAH!-^R&-b2Z6f%x zfU%BMt&C%3{dMmEKT4e^A^bLZGk0yylbX5s5^7jw3w4xvT1p> z5mR%*^Itv6pKoX6Jtjh2>gL3X`b(XWu^6dgom0O^^XUfbRWZA2D}y{&8dQR<(Ze%C zX!e$A*ZW1^TsMd+3`c90m=1Q|dn32*>DcW!+D^K92i7Og(kyu{+m@rc%6d6gr}RBE zU0prU)fam=%qCW{)_8;CZOX)<_9zzhmakf_h%=!^o;u4gz28fPuy1qivy&6u1LRY> zb}~i5biz_~O4~v?WjmY2({0fFN+kOEuG|Q-l0?Kt#B5s6<1?UAUxS(iqH>tQwo}^X zZ3lXLh0I{o8EG`tF1NrEqfe7ebReOc{1mE#UAZ>o|8XmEs}`ACF2%F3fpA${z!vC$ zEs?N7~%%G0WcYg4*HgUF#e5!w`l1g32-M$NzVWLYOD!HShYFVY4Pc~9%OG@{+tRYEguUJy{RZZ^8UR= zPFLP;CTH!pCWki%rHhy3c?<8TdShf&gYoGe$Ml8Kpa^srO9NcPYC>e9I2BX9oZqfP zePz+-A`^=-+l1OaP%d{QRveJ;cM$P5TcH%u zbL36j?flU?9(nh?I_FeW#`|al#hiL=`$g8qrR#LErvlWGF5=L4lONq-o;T8`(EYrR zZ%Ep$tFQDU=ifIs2x(hWdnS2FLAA3Oq%Fjqb@KbMSDN*6-oQddIeCz-$s+c1y3it; zO%ah8Q+<+ZrIMS91N+@Xl~$!J9_#o2C|)UHxU-2^&I#Thibr6BcCMN-dUfGRMh_6T zifr0hc^A0zwm*g^*&l2jgw})&$eGE#q0;vVHyzA$EV{8ARyqL^aU}uF{_XDLS?E}=ML=JHJ*N`4e;_X62ZFt=RC3V`Kl4UHSv$?{&j%Z zv7xq`xzPPd-`zpGd-3;E6rPC)^8HJ19mm_2l?|^~yvr8IIeFlgT`GG{3!^>E!~sOz zbF@p9TmNCWV((6$6bA=~F?;5h_bVb4)rMq%M3@)FP_MKpKhM~I7Z+7e(^vwkZGZWQx+EKsy zE8$JqUnkWPl)cptDohHj2i+1pt&~q}0h1i6_1Rk8-dfs)=Bk28?e@^|bXsSXY}>RD zj*m>94MlwhiheUr6At~(rJp4#aOa}?mx5t?aHA}p~jdjvwAi9V6+&i&W`msGkKbT49r-jWB+b&7T%HCGDj?sP| z4%pVr@6YY)ot?>XRvj_dmF=J(OXkh;Ksfihgq0h;h~Rs*hv>aki@Y|1rrN7}&cVN> zvs2Q>%^N#3)w$XQ^ZV5rS-KcJ_V25)uw-A)Q$Q4^Q8aXAYt@7EMyhRHWP4%P()3fm zlRq&H{akjw8g0SS5|eIB5|N$+?3RRce-Xd=dbcVx5pXpZ6)EIi?eZo5$#h|rbk&h9 z={VHn)5W}KhZvU6(L1~V)%Z>9ZqpsOT>PpouK(y%r1crytkM13Hat7Jo_RC(f6?-0 ze*OXOqnL^}9D_yiMY)wI);8@B-qQ8i;@Ms8(e8emD3+9P?MEJ~z36A~UAF8yiv`tP zy#%x7(5%bo(u1UJ)8X{O^@nRS1$|`?>WOW8JB8~u(51|38rHFvpKlDFP0$;SRQu4* zU8-#}#1gIHkykufr#&{>loMPqTUO5_Uen0QoqQ_*jv9+|*>9LKD9aWKjFiZ&=;CFn zAmQlr%tOxQnev3&^rtCo>Z~mD%GOYTJKTBT;9;j#hoEft*Ze)FLFOcvOq)$Rs8?=9 ztR%Cpc0#+I^s_G(yfaQy+`{oI&YjkI;3%y^ZGN@hDb3#Ti_r^ywso*2T~lh2D|*{? z|MVMA`gHFUKtzhZ`R>hq*FqgToLx8I&GvzZQt+Ag9T^!7hAIR$%#cSXlr zlT&R;RLm9)I#?`^26B_ad(HOd2l8ZT$>+x3r3SW$3cBYA9mJ(5qdZh-y_Ti&dh2LD zwdU8XCA5czMycyai7PT(A1Pm+S8lT|N<@x*GVQirv_!wJz8KWlpV^+>RPQ9sPAvH( zH!E4?X<4>#;983WKk9i6Xn~jvII~WFlZ^S;w&BIVYT`ceGN}#Qjt_hF_}(HCoBbA{ zJ+A&%-(u_)VkKC*7Rrr3mCg)!l+5Lu==Z}yt-+~DwLf4eM=pJvda3N)3A4Qct zipzYvZ!{Cz+u_`o>?&{MExyF7nl8>$@r>5?rBjHwH{JLCx!EqeA=GZ`7T(j?>Cs+N*rmZ8B0l-`7k73*y1kivT0;)F1ydE`OPD(4 zjWf8cq6~GM7X-hFDtgTr8P8CzgHxcWYI(FdpYhg}FxML%SL-xxv7O~wffZmE+_ z*`Dvp>ZSDhVKUwjev|cpP?X1i>yqo^#V+;8ddjA3(roRC?54&X`AG|K8H~nOqJxvX zD?pbZhyf~*OEQ{S7rDZ22=@Eb)}2pzR^pbIvU zRndn}6q|i&nI`TZZXFwVAy@I=_+k0JpbEpH+9$^k`=fk7MhM@8LHN(#^9g(!U32fx zC4A`9Pi$kSnRk#A2l*f2>uHUw?}68rdSx*f$HRuk2f~ zJU*ThOc6|O`VO}^oWJBBJ38+9aorSlvf+S$H$_&H932WelWC@v=h7a;zT1MU-24jz zAa>w$;!$~E%YsdFXr};bF9vb~WeASW`!%La0}7HuH`cM{iO0!^&C`={>9X%A843TN zU-;evPBp64`8U9PW&i;lovJSX0-oyZ3P_l>Qp{={>$}3sSRKaA= z54~U*4m8KnuqKVS;j7*7+Kqs zBAwH9Rhze+qgZMDs$`Khb?x})IyfJJ{|-P_%LKd;+w~0IL6NQW%S&^k*(0}S1&5>< zwnFKw_q7M&<&)+dKQtceXTCp3Nr*5*kcUHFk`4nu)Y}95w@Y{>6oaorHvBW%`-?{> z(rNl$&7ItHxLPWZDe!A{9^bPpRqEyYDu<@zD>K)X2I$OWM0kVEUSam)@Oy|o{u@E>x}T5I=x9yeV_ zg~T|I5kD%!?dLW%Ib_jt$7=;Z5y(Ss%5Xf)#oewG)-(O4Zx}hmnm9zRt6u+qclwp( zD2#s|!roho-#9?|z{Y~wmELmZlmj_^Zb7u@AXnRMigcKFN<#?`N8u`;QDfxx?p$uF zD%9+Opnew145&<#_b=<18&*MJ0V(7+P? zM%TGlG|6SOAuDUQK4COduUpFZHGztfm-CS8)I8<%>!JyGI zURy3%TCaML6g)Ck|7>rjc=g44^pt~6$%(y|O(~HY=^f#NjzdqH}+z1t| zRjsfdSqS`c8P{0RtDUC006mT+`{s4zO*ECOC77Z#hXZFl1}PLKK7- zNCz)UUt9DZ{*cumL#2By$#r%mE0dN0U)1PBG=47CopTu)c(pE?X$E z^WGYC=6yHq_g772l*Y+sRZ1eQmJNy<>vEE-7SF20DSw)qZ-Q)fb_`6vG5JW}lWwN_ zhAO@D%(wdkPJ4+fD{L>n@$0%D1pnSED*JY@HH2mqbC`a=fb>M3S*fL}9&38kUN2?U zS8!Q$cP?ulYExHpQTjp4rg9k>n-|qsozfRE#i=%-k^Z;gjcs0iuP^LLB)JyZWPNLF z)EordY1che5 znQd06dwO@MBY&ab^`em+f3!fxhYxVF#T<2R=y|(W(Zc-d6avLd9TFG1Y%OKVQEl3) zjxBnwP?utaecqG@r&?mXGR$5_(T310X$IFq`aA2~MuE75t8!E5oBSac>Syh7dA*)99lC*yTXv$|J@2l%p3- z_|vh6FUX-jxWyVKiUY@&q5S#j!y6$$1BfZ0*@nZ(&}#(K!QdCQ+(1lO+#!?v-|G`2 zogI)E|Pa*{PIQnBU%veSPa#0Qs5g(*?kLs0D(j+TxT_uO3O2=ShCX z_&5QHM-*&xgF*&2COGS8FHFmQD9=ZJ1Slal>3sk9q9id5^0AOt0Vw%MW})%-z5!8D z?;$gKEZ97QC4x6jka4)iFRTyKaf`J)%T9j{fMf>?w@(rhJT*9Yii-iA@2!G3ZuZ}} zEAad#W~uz4cYmwk^c~5AN9cHl`CcIE>@7w#j@DnP{h=IK>f<;C!>bU+WSqVe|2YXe zKUnHpg)bujO@Pm7onRs|2`qJevf~W~8sIF=ISMPomBY}=yLR)3N3)IKS8+KHrBLxA8wPEpfhO&?%h#QiN#60=1>-*+-&3@)zbuf`pL>P5kFOzY4?u z4g==Q!ZUy1)1*~1{MQqJS===MO1>iWl(2vS=LNtQX+lRGQA6jcIZ4F&z088c*J-XaO4iD1X6-ozfoH7@%q2quM)*f!Ojez zyrNL_;bi^B-Z@K;zOPO66q5p-e1Z&A6e?Na_J{H&R1SuJhkle zk(oZWssIp97LQX0AKy{6V3$7lY&3c8}We0 zYc^QbY=Aa!gHDhQf#A%$A8xsve%1Mtt-)|x;_vXoAE!j(1z~Q;!%bquPFg(KC~)vn zkGPg9*f0(P@#DFCACvLXV?O@^rp(ECdT1@fkWY#OZV*O46#(R5f@Awv#!Ml{4f4hE z)x-nGK2GFRSSQ4m@J$jV7z|IXnedl&f(^ptQQta+(SIKvwX7u^NCo^*Q<9 zs{%t2Gv_03p04JMP5sS^3~0uxe<;2J%2I0pd4 zpS%zR+`|H58*qqk@_e5oD#!AT1E>)!6OlhUoaE^~UyjH>8=ywZj2s~M@J)aMq#Uz6 zK5=aP<#~t5KPVs%^|=Rr!FLWkr}ZKKi!%1J*!-l7d?w&|LU70NFc@f3zT(}HO;H5n zi}7ci7EgR{QIM$X0(cyw9)}*$#qrMwlv3y~-S?UE{mgNSOo4qP7jm7os#cta=`<(8 z@?{0wMfi%9ykM68DO3Wwxexe4M1XxQC!^iz7adH1p783-aBA5ZPZ2z>IpEyg)~TXn+(xygM?7*q#L^Ek__K;N}yX;vh)O0?<1H=m)bqu384hE`T(7EpeIo4&4hJvI5>IojT$JkusdKJLp|550VHgi1p&j>&ZN?~zVTgh?yPACpQ#OMuZVPDhy zEm$Ri>G3^@nN<%^x$8v7Wz3i?DRd`0>FWVxjWzB}a8rO)VpN#JWdY?8+!WS0Dhh`? z>sxoe_?Uc6sR8!ei_N2sh|To9&(T4EL;x-pAEZ`&ysy5y1YZsbNdZU;)^fU5e~{3j z3sJz(PaeSLTVKJy)Rw}7GkZt^q{C^#U8gnKe5!|XDVhMw%|EipPC&ji^J zQ*v--|FEl@g#ZZ|eualfu%~>8@seUDYP|rq(HPQoq;S7a^f^APDXthKjAc^o_-%#VinF57rg0tgZhCdNkQrpi%vkLv%z^*D(H*(>X*(ps+h* zkFoumLj=YJ?R}cO){L>{c@d^~6S=9Xu(2eF$LM=4;?NtLY%Pm5(%;BWQ5rlmI*O=yGF% zJh_Yg{|pukz`&dp3KU;+#|l^yfVwgvryQm+FtFHox;Tcw!{jV*uq7|A@Gr<+4lK;j zXmj8ORshiqvC~270)YJ*XiDAE1B|oOJHU0-pb$D0dSC}63c7(&5Zx1Z9Ad1)PfiK& z^wO3kK;^1mzrs2)8tRP6z?#p28<_E;E0{{)=^xmOaRU~br$OR%d@hLKSa5~4r{BR5 z=o;=MDHh~f8Q2_*TnG|RRXc(t&H!u|B|yn*TAEghYUjiwg$M_eNFJxGHCPKvn7=YqTGguVC2_zGE?jR&v z1V{kI56xf?1c?KEDQW;2O$aamiZ{*V0xeJmd1a(vv@Z`#aX;O4@7`s zGXZ4&Yyr@i1|$fkv^4+?4X6N_KU-K3kwP`f7(WVYcmPAk(XV>}EOi16*N9`BD8339 zw*l#HF_1WixL(7pk*P0|DdxarWfMdQ09Blr?@+9A;AeN3H?ne|&l`cZvK_km*T@v9 z$^nWC05f~50rygw=8Xsk0mU7F;;cr3hY&p;uz?E-K>P=;v z6yaSSi24g4^=8VCfEAI0CWi#9#04HM4peWU3Eo4|_()6uItUps0~9)Q!~?;OX@pO# zLYoe~2OyyXpI8;y1Pq-C>F$u3Z(w{uCsw&)fGxTQ!YVef&}n=mAfO6d9s;a)_5N52 zDMBI}6vIy90`iTEfMc8DM@={Num>E2(bDpmBTL%(h@O1TaS?83{1OT46O9=n~ literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..ba35806f606640266d7cdc6a7693a5c9b1795ffe GIT binary patch literal 62789 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..0447c2d34833ee792e59d49d6ceaf7cc2aee13ec GIT binary patch literal 45283 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