import React, { useState, useRef, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { Modal } from '../ui/Modal'; import { Avatar } from '../ui/Avatar'; import { useUIStore } from '../../stores/uiStore'; import { useSpaceStore } from '../../stores/spaceStore'; import { api } from '../../api/client'; import type { User } from '@backspace/shared'; import { parseFederatedUsername } from '../../utils/identity'; export function NewDmModal() { const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [error, setError] = useState(''); const activeModal = useUIStore((s) => s.activeModal); const closeModal = useUIStore((s) => s.closeModal); const addDmChannel = useSpaceStore((s) => s.addDmChannel); const navigate = useNavigate(); const inputRef = useRef(null); const searchTimer = useRef>(); const isOpen = activeModal === 'newDm'; useEffect(() => { if (isOpen) { setQuery(''); setResults([]); setError(''); setTimeout(() => inputRef.current?.focus(), 100); } }, [isOpen]); const handleSearch = (value: string) => { setQuery(value); setError(''); if (searchTimer.current) { clearTimeout(searchTimer.current); } if (value.trim().length < 2) { setResults([]); return; } searchTimer.current = setTimeout(async () => { setIsSearching(true); try { const users = await api.social.search(value.trim()); setResults(users); } catch { setResults([]); } finally { setIsSearching(false); } }, 300); }; const handleSelectUser = async (user: User) => { setError(''); try { const existing = useSpaceStore.getState().findExistingDmForUser(user); if (existing) { closeModal(); useUIStore.getState().setShowDms(true); navigate(`/channels/@me/${existing.dm.id}`); return; } const channel = await api.dm.create({ userId: user.homeInstance ? undefined : user.id, homeUserId: user.homeUserId ?? undefined, homeInstance: user.homeInstance ?? undefined, }); addDmChannel(channel); closeModal(); useUIStore.getState().setShowDms(true); navigate(`/channels/@me/${channel.id}`); } catch (err) { setError((err as Error).message || 'Failed to create DM'); } }; return (
handleSearch(e.target.value)} placeholder="Search for a user..." className="input-search w-full py-2 text-[14px]" /> {error && (

{error}

)}
{isSearching && (
Searching...
)} {!isSearching && query.trim().length >= 2 && results.length === 0 && (
No users found
)} {results.map((user) => { const { baseName } = parseFederatedUsername(user.username); const displayName = user.displayName ?? baseName; return ( ); })}
); }