// 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 (

Поддержка

{error &&
{error}
}
{/* Threads list — hidden on mobile when a thread is open */} {(!isMobile || !selected) && (
{threads.length === 0 &&
Обращений нет
} {threads.map(t => (
setSelected(t.user_id)} style={{ padding: '12px 14px', borderBottom: '1px solid var(--border)', cursor: 'pointer', background: selected === t.user_id ? 'var(--primary-dim)' : 'transparent', }} >
{t.user_name ? '@' + t.user_name : '#' + t.user_id} {t.has_unanswered && ● новый}
{t.last_message_text}
{formatDisplay(t.last_message_at)} · {t.message_count} сообщ.
))}
)} {/* Thread view — on mobile only shown when a thread is selected */} {(!isMobile || selected) && (
{!selected ? (
Выберите обращение слева
) : ( <>
{isMobile && ( )} {sel ? (sel.user_name ? '@' + sel.user_name : '#' + sel.user_id) : ''} {sel && sel.first_name && ({sel.first_name})}
{messages.map(m => (
{m.text}
{formatTime(m.created_at)}
))}
setReply(e.target.value)} onKeyDown={e => e.key === 'Enter' && send()} />
)}
)}
); } Object.assign(window, { AdminSupport });