import React, { FormEventHandler, useCallback, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import FocusTrap from 'focus-trap-react'; import { Avatar, Box, Button, Dialog, Header, Icon, IconButton, Icons, Input, Overlay, OverlayBackdrop, OverlayCenter, Text, color, config, } from 'folds'; import { NavCategory, NavCategoryHeader, NavItem, NavItemContent, NavLink, } from '../../../components/nav'; import { getExploreFeaturedPath, getExploreServerPath } from '../../pathUtils'; import { useClientConfig } from '../../../hooks/useClientConfig'; import { useExploreFeaturedSelected, useExploreServer, } from '../../../hooks/router/useExploreSelected'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { getMxIdServer } from '../../../utils/matrix'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useNavToActivePathMapper } from '../../../hooks/useNavToActivePathMapper'; import { PageNav, PageNavContent, PageNavHeader } from '../../../components/page'; import { stopPropagation } from '../../../utils/keyboard'; export function AddServer() { const mx = useMatrixClient(); const navigate = useNavigate(); const [dialog, setDialog] = useState(false); const serverInputRef = useRef(null); const [exploreState] = useAsyncCallback( useCallback((server: string) => mx.publicRooms({ server, limit: 1 }), [mx]) ); const getInputServer = (): string | undefined => { const serverInput = serverInputRef.current; if (!serverInput) return undefined; const server = serverInput.value.trim(); return server || undefined; }; const handleSubmit: FormEventHandler = (evt) => { evt.preventDefault(); const server = getInputServer(); if (!server) return; // explore(server); navigate(getExploreServerPath(server)); setDialog(false); }; const handleView = () => { const server = getInputServer(); if (!server) return; navigate(getExploreServerPath(server)); setDialog(false); }; return ( <> }> setDialog(false), escapeDeactivates: stopPropagation, }} >
Add Server setDialog(false)} radii="300">
Add server name to explore public communities. Server Name {exploreState.status === AsyncStatus.Error && ( Failed to load public rooms. Please try again. )} {/* */}
); } export function Explore() { const mx = useMatrixClient(); useNavToActivePathMapper('explore'); const userId = mx.getUserId(); const clientConfig = useClientConfig(); const userServer = userId ? getMxIdServer(userId) : undefined; const servers = clientConfig.featuredCommunities?.servers?.filter((server) => server !== userServer) ?? []; const featuredSelected = useExploreFeaturedSelected(); const selectedServer = useExploreServer(); return ( Explore Community Featured {userServer && ( {userServer} )} {servers.length > 0 && ( Servers {servers.map((server) => ( {server} ))} )} ); }