import { useOverlayTrigger } from '@react-aria/overlays'; import { useOverlayTriggerState } from '@react-stately/overlays'; import { Popover } from '@rocket.chat/fuselage'; import { useStableCallback } from '@rocket.chat/fuselage-hooks'; import { useRoomToolbox, UserCardContext } from '@rocket.chat/ui-contexts'; import type { ComponentProps, ReactNode, UIEvent } from 'react'; import { Suspense, lazy, useCallback, useMemo, useRef, useState } from 'react'; import { useRoom } from '../contexts/RoomContext'; const UserCard = lazy(() => import('../UserCard')); export type UserCardProviderProps = { children: ReactNode }; const UserCardProvider = ({ children }: UserCardProviderProps) => { const room = useRoom(); const [userCardData, setUserCardData] = useState | null>(null); const triggerRef = useRef(null); const state = useOverlayTriggerState({}); const { triggerProps, overlayProps } = useOverlayTrigger({ type: 'dialog' }, state, triggerRef); delete triggerProps.onPress; const { openTab } = useRoomToolbox(); const openUserInfo = useStableCallback((username?: string) => { switch (room.t) { case 'l': openTab('room-info', username); break; case 'd': (room.uids?.length ?? 0) > 2 ? openTab('user-info-group', username) : openTab('user-info', username); break; default: openTab('members-list', username); break; } }); const handleSetUserCard = useCallback( (e: UIEvent, username: string) => { triggerRef.current = e.target as Element | null; state.open(); setUserCardData({ username, rid: room._id, onOpenUserInfo: () => openUserInfo(username), onClose: () => setUserCardData(null), }); }, [openUserInfo, room._id, state], ); const contextValue = useMemo( () => ({ openUserCard: handleSetUserCard, closeUserCard: () => setUserCardData(null), triggerProps, triggerRef, state, }), [handleSetUserCard, state, triggerProps], ); return ( {children} {state.isOpen && userCardData && ( )} ); }; export default UserCardProvider;