/* * 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 type { RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; import { Flex } from "../../../../../packages/shared-components/src/utils/Flex"; 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 ( ); }