import React, { useCallback } from 'react'; import { Box, Button, Spinner, Text, color } from 'folds'; import { selectRoom } from '../../../client/action/navigation'; import * as css from './RoomTombstone.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { genRoomVia } from '../../../util/matrixUtil'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { Membership } from '../../../types/matrix/room'; import { RoomInputPlaceholder } from './RoomInputPlaceholder'; type RoomTombstoneProps = { roomId: string; body?: string; replacementRoomId: string }; export function RoomTombstone({ roomId, body, replacementRoomId }: RoomTombstoneProps) { const mx = useMatrixClient(); const [joinState, handleJoin] = useAsyncCallback( useCallback(() => { const currentRoom = mx.getRoom(roomId); const via = currentRoom ? genRoomVia(currentRoom) : []; return mx.joinRoom(replacementRoomId, { viaServers: via, }); }, [mx, roomId, replacementRoomId]) ); const replacementRoom = mx.getRoom(replacementRoomId); const handleOpen = () => { if (replacementRoom) selectRoom(replacementRoom.roomId); if (joinState.status === AsyncStatus.Success) selectRoom(joinState.data.roomId); }; return ( {body || 'This room has been replaced and is no longer active.'} {joinState.status === AsyncStatus.Error && ( {(joinState.error as any)?.message ?? 'Failed to join replacement room!'} )} {replacementRoom?.getMyMembership() === Membership.Join || joinState.status === AsyncStatus.Success ? ( ) : ( )} ); }