diff --git a/src/pages/lotto/hooks/useBriefing.js b/src/pages/lotto/hooks/useBriefing.js index a405623..02394ed 100644 --- a/src/pages/lotto/hooks/useBriefing.js +++ b/src/pages/lotto/hooks/useBriefing.js @@ -1,6 +1,18 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { getLatestBriefing, triggerLottoCurate } from '../../../api'; +const normalizePicks = (picks) => { + if (Array.isArray(picks)) { + return { core: picks, bonus: [], extended: [], pool: [] }; + } + return { + core: picks?.core || [], + bonus: picks?.bonus || [], + extended: picks?.extended || [], + pool: picks?.pool || [], + }; +}; + export default function useBriefing() { const [briefing, setBriefing] = useState(null); const [loading, setLoading] = useState(true); @@ -12,7 +24,7 @@ export default function useBriefing() { setLoading(true); setError(''); try { const data = await getLatestBriefing(); - setBriefing(data); + setBriefing(data ? { ...data, picks: normalizePicks(data.picks) } : data); } catch (e) { setError(e.message); } finally { @@ -33,7 +45,7 @@ export default function useBriefing() { try { const data = await getLatestBriefing(); if (data && data.generated_at !== prevGen) { - setBriefing(data); + setBriefing({ ...data, picks: normalizePicks(data.picks) }); setRegenerating(false); clearInterval(pollingRef.current); } diff --git a/src/pages/lotto/hooks/useReview.js b/src/pages/lotto/hooks/useReview.js new file mode 100644 index 0000000..b7dac64 --- /dev/null +++ b/src/pages/lotto/hooks/useReview.js @@ -0,0 +1,23 @@ +import { useEffect, useState } from 'react'; +import { getLatestReview, getReviewHistory } from '../../../api'; + +export default function useReview() { + const [latest, setLatest] = useState(null); + const [history, setHistory] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + let cancel = false; + Promise.all([getLatestReview(), getReviewHistory(4)]) + .then(([l, h]) => { + if (cancel) return; + setLatest(l); + setHistory(h); + }) + .catch(() => {}) + .finally(() => !cancel && setLoading(false)); + return () => { cancel = true; }; + }, []); + + return { latest, history, loading }; +}