import { useCallback, useEffect, useMemo, useState } from "react"; import { parseForm } from "@/shared/forms/validation"; import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; import { getLuckyGiftConfig, listLuckyGiftDraws, updateLuckyGiftConfig } from "@/features/lucky-gift/api"; import { emptyLuckyGiftForm, formFromConfig, payloadFromLuckyGiftForm } from "@/features/lucky-gift/configModel.js"; import { useLuckyGiftAbilities } from "@/features/lucky-gift/permissions.js"; import { luckyGiftConfigFormSchema } from "@/features/lucky-gift/schema"; const pageSize = 10; const emptyDraws = { items: [], page: 1, pageSize, total: 0 }; export function useLuckyGiftPage() { const abilities = useLuckyGiftAbilities(); const { showToast } = useToast(); const [config, setConfig] = useState(null); const [configDrawerOpen, setConfigDrawerOpen] = useState(false); const [form, setForm] = useState(emptyLuckyGiftForm()); const [configLoading, setConfigLoading] = useState(false); const [configSaving, setConfigSaving] = useState(false); const [giftId, setGiftId] = useState(""); const [userId, setUserId] = useState(""); const [roomId, setRoomId] = useState(""); const [status, setStatus] = useState(""); const [page, setPage] = useState(1); const drawFilters = useMemo( () => ({ gift_id: giftId, room_id: roomId, status, user_id: userId }), [giftId, roomId, status, userId], ); const { data: draws = emptyDraws, error: drawsError, loading: drawsLoading, reload: reloadDraws, } = usePaginatedQuery({ errorMessage: "加载幸运礼物记录失败", fetcher: listLuckyGiftDraws, filters: drawFilters, page, pageSize, queryKey: ["lucky-gift-draws", drawFilters, page], }); const reloadConfig = useCallback(async () => { setConfigLoading(true); try { const nextConfig = await getLuckyGiftConfig(); setConfig(nextConfig); setForm(formFromConfig(nextConfig)); } catch (err) { showToast(err.message || "加载幸运礼物配置失败", "error"); } finally { setConfigLoading(false); } }, [showToast]); useEffect(() => { void reloadConfig(); }, [reloadConfig]); const openConfigDrawer = useCallback(() => { setForm(config ? formFromConfig(config) : emptyLuckyGiftForm()); setConfigDrawerOpen(true); }, [config]); const closeConfigDrawer = useCallback(() => { setConfigDrawerOpen(false); setForm(config ? formFromConfig(config) : emptyLuckyGiftForm()); }, [config]); const submitConfig = async (event) => { event.preventDefault(); if (!abilities.canUpdate) { return; } setConfigSaving(true); try { const parsed = parseForm(luckyGiftConfigFormSchema, form); const saved = await updateLuckyGiftConfig(payloadFromLuckyGiftForm(parsed, config)); setConfig(saved); setForm(formFromConfig(saved)); setConfigDrawerOpen(false); showToast("幸运礼物配置已保存", "success"); await reloadDraws(); } catch (err) { showToast(err.message || "保存幸运礼物配置失败", "error"); } finally { setConfigSaving(false); } }; const changeGiftId = (value) => { setGiftId(value); setPage(1); }; const changeUserId = (value) => { setUserId(value); setPage(1); }; const changeRoomId = (value) => { setRoomId(value); setPage(1); }; const changeStatus = (value) => { setStatus(value); setPage(1); }; const resetDrawFilters = () => { setGiftId(""); setUserId(""); setRoomId(""); setStatus(""); setPage(1); }; return { abilities, changeGiftId, changeRoomId, changeStatus, changeUserId, closeConfigDrawer, config, configDrawerOpen, configLoading, configSaving, draws, drawsError, drawsLoading, form, giftId, openConfigDrawer, page, reloadConfig, reloadDraws, resetDrawFilters, roomId, setForm, setPage, status, submitConfig, userId, }; }