2026-05-19 18:04:08 +08:00

146 lines
4.5 KiB
JavaScript

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,
};
}