// Orders history page with real API + client-side filter + server-side pagination const { useState: useOrdersState, useEffect: useOrdersEffect } = React; const STATUS_FILTERS = [ { key: 'all', label: 'Все' }, { key: 'Posted', label: 'В работе' }, { key: 'Completed', label: 'Завершённые' }, { key: 'Cancelled', label: 'Отменённые' }, ]; const PAGE_SIZE = 20; function parseLinksStr(s) { if (!s) return []; return String(s).split(',') .map(l => l.trim().replace(/^['"\[\] ]+|['"\[\] ]+$/g, '')) .filter(l => l.startsWith('http')); } function OrderMobileCard({ order: o, onNavigate }) { return (
onNavigate('order-detail', o)}>
{displayServiceName(o)}
#{o.order_id} · {formatDisplay(o.date) || '—'}
{o.price.toLocaleString('ru-RU')} ₽
Подробнее →
); } function OrdersPage({ onNavigate }) { const [orders, setOrders] = useOrdersState([]); const [total, setTotal] = useOrdersState(0); const [filter, setFilter] = useOrdersState('all'); const [page, setPage] = useOrdersState(1); const [loading, setLoading] = useOrdersState(true); const loadOrders = async (p = 1) => { setLoading(true); try { const data = await api.get(`/api/orders?page=${p}&page_size=${PAGE_SIZE}`); if (!data.__unauthorized) { setOrders(data.items || []); setTotal(data.total || 0); } } catch (_) {} finally { setLoading(false); } }; useOrdersEffect(() => { loadOrders(page); }, [page]); const filtered = filter === 'all' ? orders : orders.filter(o => o.status === filter); const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE)); const handleFilter = (key) => { setFilter(key); }; const handlePage = (p) => { setPage(p); loadOrders(p); }; return (

История заказов

{STATUS_FILTERS.map(f => ( ))}
{loading ? (
Загрузка...
) : filtered.length === 0 ? (
Заказов не найдено
{filter === 'all' ? 'Вы ещё не сделали ни одного заказа' : 'Нет заказов с таким статусом'}
) : ( <>
{filtered.map(o => { const links = parseLinksStr(o.links); return ( onNavigate('order-detail', o)}> ); })}
#УслугаСуммаСтатусДатаСсылки
#{o.order_id} {displayServiceName(o)} {o.price.toLocaleString('ru-RU')} ₽ {formatDisplay(o.date) || '—'} {links.length > 0 ? `${links.length} ссылк.` : '—'}
{filtered.map(o => )}
{totalPages > 1 && (
Страница {page} из {totalPages}
)} )}
); } Object.assign(window, { OrdersPage });