// 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 });