From 5fd32030abc8ed856aefdff68e6e5ecfc5e50828 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sat, 23 May 2026 02:14:16 +0900 Subject: [PATCH] feat(evolver): useEvolverApi hook (4 fetch + activity merge sort) --- src/pages/lotto/evolver/useEvolverApi.js | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/pages/lotto/evolver/useEvolverApi.js diff --git a/src/pages/lotto/evolver/useEvolverApi.js b/src/pages/lotto/evolver/useEvolverApi.js new file mode 100644 index 0000000..4fc0bc1 --- /dev/null +++ b/src/pages/lotto/evolver/useEvolverApi.js @@ -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 }; +}