61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
import { useEffect, useState, useCallback } from 'react';
|
|
import {
|
|
fetchEvolverStatus,
|
|
fetchEvolverHistory,
|
|
fetchLottoTasks,
|
|
fetchLottoLogs,
|
|
} from '../../../api';
|
|
|
|
|
|
function mergeActivityStream({ logs, tasks, evolverEvents }) {
|
|
const stream = [];
|
|
for (const l of logs.items || []) {
|
|
stream.push({ ts: l.created_at, kind: 'log', payload: l });
|
|
}
|
|
for (const t of tasks.items || tasks.tasks || []) {
|
|
stream.push({ ts: t.created_at, kind: 'task', payload: t });
|
|
}
|
|
for (const e of evolverEvents) {
|
|
stream.push({ ts: e.created_at, kind: 'evolver', payload: e });
|
|
}
|
|
stream.sort((a, b) => (b.ts || '').localeCompare(a.ts || ''));
|
|
return stream;
|
|
}
|
|
|
|
|
|
export function useEvolverApi({ days = 7, weeks = 12 } = {}) {
|
|
const [status, setStatus] = useState(null);
|
|
const [history, setHistory] = useState({ items: [] });
|
|
const [activity, setActivity] = useState([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState(null);
|
|
|
|
const refetch = useCallback(async () => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const [s, h, t, l] = await Promise.all([
|
|
fetchEvolverStatus(),
|
|
fetchEvolverHistory(weeks),
|
|
fetchLottoTasks({ days }),
|
|
fetchLottoLogs({ days }),
|
|
]);
|
|
setStatus(s);
|
|
setHistory(h);
|
|
setActivity(mergeActivityStream({
|
|
logs: l,
|
|
tasks: t,
|
|
evolverEvents: h.items || [],
|
|
}));
|
|
} catch (e) {
|
|
setError(e);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [days, weeks]);
|
|
|
|
useEffect(() => { refetch(); }, [refetch]);
|
|
|
|
return { status, history, activity, loading, error, refetch };
|
|
}
|