// AdminSupport — list of user threads with unanswered badge + reply form. const { useState: useAdmSState, useEffect: useAdmSEffect } = React; function AdminSupport({ onNavigate }) { const [threads, setThreads] = useAdmSState([]); const [selected, setSelected] = useAdmSState(null); const [messages, setMessages] = useAdmSState([]); const [reply, setReply] = useAdmSState(''); const [sending, setSending] = useAdmSState(false); const [error, setError] = useAdmSState(''); const [isMobile, setIsMobile] = useAdmSState(typeof window !== 'undefined' && window.innerWidth < 768); useAdmSEffect(() => { const onResize = () => setIsMobile(window.innerWidth < 768); window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, []); const loadThreads = async () => { try { const data = await api.get('/api/admin/support/threads'); if (!data.__unauthorized) setThreads(data.threads || []); } catch (e) { setError(e.message || 'Ошибка'); } }; const loadThread = async (uid) => { try { const data = await api.get('/api/admin/support/threads/' + uid); if (!data.__unauthorized) setMessages(data); } catch (e) { setError(e.message || 'Ошибка'); } }; useAdmSEffect(() => { loadThreads(); }, []); useAdmSEffect(() => { if (selected) loadThread(selected); else setMessages([]); }, [selected]); const send = async () => { if (!reply.trim() || !selected) return; setSending(true); setError(''); try { await api.post(`/api/admin/support/threads/${selected}/reply`, { text: reply.trim() }); setReply(''); await loadThread(selected); await loadThreads(); } catch (e) { setError(e.message || 'Не отправилось'); } finally { setSending(false); } }; const sel = threads.find(t => t.user_id === selected); return (