Files
web-page/src/pages/lotto/hooks/usePurchases.js

114 lines
4.3 KiB
JavaScript

import { useCallback, useEffect, useState } from 'react';
import {
getPurchases, getPurchaseStats, addPurchase, updatePurchase, deletePurchase,
bulkPurchase as apiBulkPurchase,
} from '../../../api';
import { emptyPurchaseForm } from '../lottoUtils';
export default function usePurchases() {
const [purchases, setPurchases] = useState([]);
const [purchaseStats, setPurchaseStats] = useState(null);
const [purchaseLoading, setPurchaseLoading] = useState(false);
// 폼 상태
const [purchaseFormOpen, setPurchaseFormOpen] = useState(false);
const [purchaseForm, setPurchaseForm] = useState(emptyPurchaseForm);
const [purchaseFormSaving, setPurchaseFormSaving] = useState(false);
const [purchaseFormError, setPurchaseFormError] = useState('');
const [purchaseEditId, setPurchaseEditId] = useState(null);
const refreshPurchases = useCallback(async () => {
setPurchaseLoading(true);
try {
const [recs, st] = await Promise.all([getPurchases(), getPurchaseStats()]);
setPurchases(recs?.records ?? []);
setPurchaseStats(st);
} catch {}
finally { setPurchaseLoading(false); }
}, []);
const handlePurchaseFormOpen = useCallback(() => {
setPurchaseEditId(null);
setPurchaseForm(emptyPurchaseForm());
setPurchaseFormError('');
setPurchaseFormOpen(true);
}, []);
const handlePurchaseFormClose = useCallback(() => {
setPurchaseFormOpen(false);
setPurchaseEditId(null);
setPurchaseFormError('');
}, []);
const handlePurchaseFormChange = useCallback((field, value) => {
setPurchaseForm((prev) => ({ ...prev, [field]: value }));
}, []);
const handlePurchaseEditStart = useCallback((rec) => {
setPurchaseEditId(rec.id);
setPurchaseForm({
draw_no: String(rec.draw_no ?? ''),
amount: rec.amount ?? 5000,
sets: rec.sets ?? 5,
prize: rec.prize ?? 0,
note: rec.note ?? '',
});
setPurchaseFormError('');
setPurchaseFormOpen(true);
}, []);
const handlePurchaseFormSubmit = useCallback(async (e) => {
e.preventDefault();
setPurchaseFormSaving(true); setPurchaseFormError('');
const payload = {
draw_no: Number(purchaseForm.draw_no),
amount: Number(purchaseForm.amount),
sets: Number(purchaseForm.sets),
prize: Number(purchaseForm.prize),
note: purchaseForm.note.trim(),
};
try {
if (purchaseEditId != null) {
const updated = await updatePurchase(purchaseEditId, payload);
setPurchases((prev) =>
prev.map((r) => r.id === purchaseEditId ? (updated ?? { ...payload, id: purchaseEditId }) : r)
);
} else {
const saved = await addPurchase(payload);
setPurchases((prev) => [saved ?? { ...payload, id: Date.now() }, ...prev]);
}
try { setPurchaseStats(await getPurchaseStats()); } catch {}
handlePurchaseFormClose();
} catch (err) {
setPurchaseFormError(err?.message ?? String(err));
} finally {
setPurchaseFormSaving(false);
}
}, [purchaseForm, purchaseEditId, handlePurchaseFormClose]);
const handlePurchaseDelete = useCallback(async (id) => {
if (!confirm('이 구매 기록을 삭제할까요?')) return;
setPurchases((prev) => prev.filter((r) => r.id !== id));
try {
await deletePurchase(id);
try { setPurchaseStats(await getPurchaseStats()); } catch {}
} catch { refreshPurchases(); }
}, [refreshPurchases]);
const handleBulkPurchase = useCallback(async (params) => {
const result = await apiBulkPurchase(params);
await refreshPurchases();
return result;
}, [refreshPurchases]);
useEffect(() => { refreshPurchases(); }, []); // eslint-disable-line react-hooks/exhaustive-deps
return {
purchases, purchaseStats, purchaseLoading,
purchaseFormOpen, purchaseForm, purchaseFormSaving, purchaseFormError, purchaseEditId,
handlePurchaseFormOpen, handlePurchaseFormClose, handlePurchaseFormChange,
handlePurchaseFormSubmit, handlePurchaseEditStart, handlePurchaseDelete,
handleBulkPurchase,
};
}