feat(evolver): useEvolverApi hook (4 fetch + activity merge sort)

This commit is contained in:
2026-05-23 02:14:16 +09:00
parent e8d33906ba
commit 5fd32030ab

View 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 };
}