import React, { useCallback } from 'react'; import { Box, Button, color, Icon, IconButton, Icons, Scroll, Spinner, Text } from 'folds'; import { useAtomValue } from 'jotai'; import { useQuery } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { useClientConfig } from '../../../hooks/useClientConfig'; import { RoomCard, CardGrid, CardName, CardBase } from '../../../components/room-card'; import { allRoomsAtom } from '../../../state/room-list/roomList'; import { RoomSummaryLoader } from '../../../components/RoomSummaryLoader'; import { Page, PageContent, PageContentCenter, PageHeader, PageHero, PageHeroSection, } from '../../../components/page'; import { RoomTopicViewer } from '../../../components/room-topic-viewer'; import * as css from './style.css'; import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { BackRouteHandler } from '../../../components/BackRouteHandler'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { millify } from '../../../plugins/millify'; import { getExploreServerPath } from '../../pathUtils'; type ServerCardProps = { serverName: string; onExplore: () => unknown; }; function ServerCard({ serverName, onExplore }: ServerCardProps) { const mx = useMatrixClient(); const fetchPublicRooms = useCallback( () => mx.publicRooms({ server: serverName }), [mx, serverName] ); const { data, isLoading, isError } = useQuery({ queryKey: [serverName, `publicRooms`], queryFn: fetchPublicRooms, }); const publicRoomCount = data?.total_room_count_estimate; return ( {serverName} {isLoading ? ( ) : ( <> {publicRoomCount === undefined ? 'Error loading rooms' : `${millify(publicRoomCount)} Public Rooms`} )} ); } export function FeaturedRooms() { const { featuredCommunities } = useClientConfig(); const { rooms, spaces, servers } = featuredCommunities ?? {}; const allRooms = useAtomValue(allRoomsAtom); const screenSize = useScreenSizeContext(); const { navigateSpace, navigateRoom } = useRoomNavigate(); const navigate = useNavigate(); const exploreServer = useCallback( async (server: string) => { navigate(getExploreServerPath(server)); }, [navigate] ); return ( {screenSize === ScreenSize.Mobile && ( {(onBack) => ( )} )} } title="Featured" subTitle="Find and explore public communities featured by your client provider." /> {servers && servers.length > 0 && ( Featured Servers {servers.map((serverName) => ( exploreServer(serverName)} /> ))} )} {spaces && spaces.length > 0 && ( Featured Spaces {spaces.map((roomIdOrAlias) => ( {(roomSummary) => ( ( )} /> )} ))} )} {rooms && rooms.length > 0 && ( Featured Rooms {rooms.map((roomIdOrAlias) => ( {(roomSummary) => ( ( )} /> )} ))} )} {((spaces && spaces.length === 0 && rooms && rooms.length === 0) || (!spaces && !rooms)) && ( No rooms or spaces are featured. )} ); }