146 lines
4.5 KiB
JavaScript
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,
|
|
};
|
|
}
|