feat(evolver): useEvolverApi hook (4 fetch + activity merge sort)
This commit is contained in:
60
src/pages/lotto/evolver/useEvolverApi.js
Normal file
60
src/pages/lotto/evolver/useEvolverApi.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
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 };
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user