import React, { useCallback, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Avatar, Box, Button, Overlay, OverlayBackdrop, OverlayCenter, Spinner, Text, as } from 'folds'; import { Room } from 'matrix-js-sdk'; import { useAtomValue } from 'jotai'; import { IRoomCreateContent, Membership, StateEvent } from '../../../types/matrix/room'; import { getMemberDisplayName, getStateEvent } from '../../utils/room'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { timeDayMonthYear, timeHourMinute } from '../../utils/time'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; import { RoomAvatar } from '../room-avatar'; import { nameInitials } from '../../utils/common'; import { useRoomAvatar, useLocalRoomName, useRoomTopic } from '../../hooks/useRoomMeta'; import { mDirectAtom } from '../../state/mDirectList'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { InviteUserPrompt } from '../invite-user-prompt'; import { RoomTopicViewer } from '../room-topic-viewer'; import { stopPropagation } from '../../utils/keyboard'; export type RoomIntroProps = { room: Room; }; export const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => { const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); const { navigateRoom } = useRoomNavigate(); const mDirects = useAtomValue(mDirectAtom); const [invitePrompt, setInvitePrompt] = useState(false); const [viewTopic, setViewTopic] = useState(false); const createEvent = getStateEvent(room, StateEvent.RoomCreate); const avatarMxc = useRoomAvatar(room, mDirects.has(room.roomId)); const name = useLocalRoomName(room); const topic = useRoomTopic(room); const avatarHttpUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication) : undefined; const createContent = createEvent?.getContent(); const ts = createEvent?.getTs(); const creatorId = createEvent?.getSender(); const creatorName = creatorId && (getMemberDisplayName(room, creatorId) ?? getMxIdLocalPart(creatorId)); const prevRoomId = createContent?.predecessor?.room_id; const [prevRoomState, joinPrevRoom] = useAsyncCallback( useCallback(async (roomId: string) => mx.joinRoom(roomId), [mx]), ); const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); return ( {nameInitials(name)}} /> {name} {topic ? ( <> {viewTopic && ( }> setViewTopic(false), escapeDeactivates: stopPropagation, }} > setViewTopic(false)} /> )} setViewTopic(true)} size="T400" priority="400" style={{ background: 'none', border: 'none', padding: 0, cursor: 'pointer', textAlign: 'left' }} > {topic.topic} ) : ( This is the beginning of conversation. )} {creatorName && ts && ( {'Created by '} @{creatorName} {` on ${timeDayMonthYear(ts)} ${timeHourMinute(ts, hour24Clock)}`} )} {invitePrompt && ( setInvitePrompt(false)} /> )} {typeof prevRoomId === 'string' && (mx.getRoom(prevRoomId)?.getMyMembership() === Membership.Join ? ( ) : ( ))} ); });