114 lines
4.3 KiB
JavaScript
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,
|
|
};
|
|
}
|