import React, { useCallback } from 'react'; import { Box, Chip, Spinner, Text, Tooltip, TooltipProvider, color, config, toRem } from 'folds'; import { Icon, Icons } from '../../components/icons'; import { MatrixError, Room } from 'matrix-js-sdk'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; /** * Extract server name from a room ID (!abc:server.com => server.com) */ function getServerFromRoomId(roomId: string): string { const parts = roomId.split(':'); return parts.length > 1 ? parts.slice(1).join(':') : ''; } type UnjoinedSubRoomItemProps = { roomId: string; depth: number; isLast?: boolean; }; /** * Displays an unjoined sub-room with a Join button. * Used when a parent room has sub-rooms that the user hasn't joined yet. */ export function UnjoinedSubRoomItem({ roomId, depth, isLast = false }: UnjoinedSubRoomItemProps) { const mx = useMatrixClient(); const viaServers = [getServerFromRoomId(roomId)].filter(Boolean); const [joinState, join] = useAsyncCallback( useCallback(() => mx.joinRoom(roomId, { viaServers }), [mx, roomId, viaServers]) ); const canJoin = joinState.status === AsyncStatus.Idle || joinState.status === AsyncStatus.Error; const paddingLeft = depth > 0 ? '30px' : undefined; let treeIcon = ''; if (depth > 0) { treeIcon = isLast ? '╰' : '├'; } return ( {treeIcon && ( {treeIcon} )} {roomId} {joinState.status === AsyncStatus.Error && ( {joinState.error.data?.error || joinState.error.message} } > {(triggerRef) => ( )} )} : } onClick={join} disabled={!canJoin} > Join ); }