feat(lotto): useReview 훅 + useBriefing 4계층 정규화

This commit is contained in:
2026-05-11 08:57:14 +09:00
parent 9d2dfad512
commit cd3c538eb7
2 changed files with 37 additions and 2 deletions

View File

@@ -1,6 +1,18 @@
import { useState, useEffect, useCallback, useRef } from 'react'; import { useState, useEffect, useCallback, useRef } from 'react';
import { getLatestBriefing, triggerLottoCurate } from '../../../api'; 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() { export default function useBriefing() {
const [briefing, setBriefing] = useState(null); const [briefing, setBriefing] = useState(null);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
@@ -12,7 +24,7 @@ export default function useBriefing() {
setLoading(true); setError(''); setLoading(true); setError('');
try { try {
const data = await getLatestBriefing(); const data = await getLatestBriefing();
setBriefing(data); setBriefing(data ? { ...data, picks: normalizePicks(data.picks) } : data);
} catch (e) { } catch (e) {
setError(e.message); setError(e.message);
} finally { } finally {
@@ -33,7 +45,7 @@ export default function useBriefing() {
try { try {
const data = await getLatestBriefing(); const data = await getLatestBriefing();
if (data && data.generated_at !== prevGen) { if (data && data.generated_at !== prevGen) {
setBriefing(data); setBriefing({ ...data, picks: normalizePicks(data.picks) });
setRegenerating(false); setRegenerating(false);
clearInterval(pollingRef.current); clearInterval(pollingRef.current);
} }

View File

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