feat(lotto): useReview 훅 + useBriefing 4계층 정규화
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/pages/lotto/hooks/useReview.js
Normal file
23
src/pages/lotto/hooks/useReview.js
Normal 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 };
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user