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 { useServerStore } from '../../stores/serverStore'; import { api } from '../../api/client'; import type { User } from '@backspace/shared'; 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 = useServerStore((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 = useServerStore.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.id }); 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="w-full px-3 py-2 bg-surface-input text-txt-primary placeholder-txt-tertiary/60 rounded-[4px] text-[14px] outline-none focus:ring-1 focus:ring-accent-primary" /> {error && (

{error}

)}
{isSearching && (
Searching...
)} {!isSearching && query.trim().length >= 2 && results.length === 0 && (
No users found
)} {results.map((user) => ( ))}
); }