import React, { useEffect, useMemo, useState } from 'react'; import { deleteHistory, getHistory, getLatest, recommend } from '../../api'; const fmtKST = (value) => value?.replace('T', ' ') ?? ''; const ballClass = (n) => { if (n <= 10) return 'lotto-ball range-a'; if (n <= 20) return 'lotto-ball range-b'; if (n <= 30) return 'lotto-ball range-c'; if (n <= 40) return 'lotto-ball range-d'; return 'lotto-ball range-e'; }; const Ball = ({ n }) => {n}; const NumberRow = ({ nums }) => (
{nums.map((n) => ( ))}
); export default function Functions() { const [latest, setLatest] = useState(null); const [params, setParams] = useState({ recent_window: 200, recent_weight: 2.0, avoid_recent_k: 5, }); const presets = useMemo( () => [ { name: '기본', recent_window: 200, recent_weight: 2.0, avoid_recent_k: 5 }, { name: '최근 가중치↑', recent_window: 100, recent_weight: 3.0, avoid_recent_k: 10 }, { name: '안전(분산)', recent_window: 300, recent_weight: 1.6, avoid_recent_k: 8 }, { name: '공격(최근)', recent_window: 80, recent_weight: 3.5, avoid_recent_k: 12 }, ], [] ); const [result, setResult] = useState(null); const [history, setHistory] = useState([]); const [loading, setLoading] = useState({ latest: false, recommend: false, history: false, }); const [error, setError] = useState(''); const refreshLatest = async () => { setLoading((s) => ({ ...s, latest: true })); setError(''); try { const data = await getLatest(); setLatest(data); } catch (e) { setError(e?.message ?? String(e)); } finally { setLoading((s) => ({ ...s, latest: false })); } }; const refreshHistory = async () => { setLoading((s) => ({ ...s, history: true })); setError(''); try { const data = await getHistory(30); setHistory(data.items ?? []); } catch (e) { setError(e?.message ?? String(e)); } finally { setLoading((s) => ({ ...s, history: false })); } }; const onRecommend = async () => { setLoading((s) => ({ ...s, recommend: true })); setError(''); try { const data = await recommend(params); setResult(data); await refreshHistory(); } catch (e) { setError(e?.message ?? String(e)); } finally { setLoading((s) => ({ ...s, recommend: false })); } }; const onDelete = async (id) => { const ok = confirm(`히스토리 #${id}를 삭제할까요?`); if (!ok) return; setError(''); try { await deleteHistory(id); setHistory((prev) => prev.filter((item) => item.id !== id)); } catch (e) { setError(e?.message ?? String(e)); } }; const copyNumbers = async (nums) => { const text = nums.join(', '); try { await navigator.clipboard.writeText(text); alert(`복사 완료: ${text}`); } catch { prompt('복사해서 사용하세요:', text); } }; useEffect(() => { refreshLatest(); refreshHistory(); }, []); return (
{error ? (

오류

{error}

) : null}

Latest Draw

최신 회차

최신 회차와 번호를 빠르게 확인할 수 있습니다.

{loading.latest ? 로딩 중 : null}
{latest ? ( <>

{latest.drawNo}회

{latest.date}

보너스 {latest.bonus}

) : (

최신 회차 데이터가 없습니다.

)}

Recommendation

추천 생성

파라미터를 조정해 다른 추천 전략을 만들 수 있습니다.

{loading.recommend ? 계산 중 : null}
{presets.map((preset) => ( ))}
{result ? (

추천 ID #{result.id}

기준 회차 {result.based_on_latest_draw ?? '-'}

설명 보기
{JSON.stringify(result.explain, null, 2)}
) : (

아직 추천 결과가 없습니다.

)}

History

추천 히스토리

최근 추천 결과를 모아서 확인할 수 있습니다.

{history.length}건
{loading.history ?

불러오는 중...

: null} {history.length === 0 ? (

저장된 히스토리가 없습니다.

) : (
{history.map((item) => (

#{item.id}

{fmtKST(item.created_at)}

기준 회차 {item.based_on_draw ?? '-'}

window={item.params?.recent_window}, weight= {item.params?.recent_weight}, avoid_k= {item.params?.avoid_recent_k}

))}
)}
); }