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.
)}
);
}