refactor: 合并多语言支持的显示名称字段,优化奖池手动爆发功能的返回数据结构,增强管理端权限控制

This commit is contained in:
2026-05-25 14:31:24 +08:00
parent 7d01e5c47e
commit ddedef824e
101 changed files with 3033 additions and 641 deletions

View File

@@ -18,6 +18,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter";
import { useConfirmAction } from "@/hooks/use-confirm-action";
import { LotteryApiBizError } from "@/types/api/errors";
import type { AdminDrawShowData } from "@/types/api/admin-draws";
import { adminHasAnyPermission } from "@/lib/admin-permissions";
@@ -25,7 +26,11 @@ import { useAdminProfile } from "@/stores/admin-session";
import { cn } from "@/lib/utils";
import { drawResultSourceLabel, drawStatusLabel } from "./draw-display";
import {
drawResultSourceLabel,
drawStatusLabel,
hallPreviewDiffersFromDbStatus,
} from "./draw-display";
import { DrawStatusBadge } from "./draw-status-badge";
import {
PRD_DRAW_REOPEN_MANAGE,
@@ -58,6 +63,7 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
const [error, setError] = useState<string | null>(null);
const [loading, setLoading] = useState(true);
const [acting, setActing] = useState<string | null>(null);
const { request: requestConfirm, ConfirmDialog } = useConfirmAction();
const load = useCallback(async () => {
if (!Number.isFinite(idNum)) {
@@ -120,13 +126,15 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
status={data.status}
label={drawStatusLabel(data.status, t)}
/>
<p className="flex flex-wrap items-center justify-end gap-2 text-sm text-muted-foreground">
<span>{t("hallPreviewStatusLabel")}</span>
<DrawStatusBadge
status={data.hall_preview_status}
label={drawStatusLabel(data.hall_preview_status, t)}
/>
</p>
{hallPreviewDiffersFromDbStatus(data.status, data.hall_preview_status) ? (
<p className="flex flex-wrap items-center justify-end gap-2 text-sm text-muted-foreground">
<span>{t("hallPreviewStatusLabel")}</span>
<DrawStatusBadge
status={data.hall_preview_status}
label={drawStatusLabel(data.hall_preview_status, t)}
/>
</p>
) : null}
</div>
</div>
</CardHeader>
@@ -186,7 +194,13 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
variant="outline"
size="sm"
disabled={!canManageDraw || acting !== null || !["pending", "open"].includes(data.status)}
onClick={() => void runAction(t("manualClose"), () => postAdminManualCloseDraw(idNum))}
onClick={() =>
requestConfirm({
title: t("confirm.manualCloseTitle"),
description: t("confirm.manualCloseDescription"),
onConfirm: () => runAction(t("manualClose"), () => postAdminManualCloseDraw(idNum)),
})
}
>
{acting === t("manualClose") ? t("processing") : t("manualClose")}
</Button>
@@ -195,7 +209,13 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
variant="outline"
size="sm"
disabled={!canManageDraw || acting !== null || !["pending", "open", "closing", "closed"].includes(data.status)}
onClick={() => void runAction(t("cancelDraw"), () => postAdminCancelDraw(idNum))}
onClick={() =>
requestConfirm({
title: t("confirm.cancelDrawTitle"),
description: t("confirm.cancelDrawDescription"),
onConfirm: () => runAction(t("cancelDraw"), () => postAdminCancelDraw(idNum)),
})
}
>
{acting === t("cancelDraw") ? t("processing") : t("cancelBeforeDraw")}
</Button>
@@ -204,7 +224,13 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
variant="outline"
size="sm"
disabled={!canManageDraw || acting !== null || data.status !== "closed"}
onClick={() => void runAction(t("rngDraw"), () => postAdminRunDrawRng(idNum))}
onClick={() =>
requestConfirm({
title: t("confirm.rngDrawTitle"),
description: t("confirm.rngDrawDescription"),
onConfirm: () => runAction(t("rngDraw"), () => postAdminRunDrawRng(idNum)),
})
}
>
{acting === t("rngDraw") ? t("generating") : t("rngAutoGenerate")}
</Button>
@@ -214,7 +240,14 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
variant="destructive"
size="sm"
disabled={acting !== null || data.status !== "cooldown"}
onClick={() => void runAction(t("reopen"), () => postAdminReopenDraw(idNum))}
onClick={() =>
requestConfirm({
title: t("confirm.reopenTitle"),
description: t("confirm.reopenDescription"),
confirmVariant: "destructive",
onConfirm: () => runAction(t("reopen"), () => postAdminReopenDraw(idNum)),
})
}
>
{acting === t("reopen") ? t("processing") : t("cooldownReopen")}
</Button>
@@ -224,13 +257,20 @@ export function DrawDetailConsole({ drawId }: { drawId: string }) {
variant="outline"
size="sm"
disabled={!canRunSettlement || acting !== null || data.status !== "settling"}
onClick={() => void runAction(t("runSettlement"), () => postAdminRunDrawSettlement(idNum))}
onClick={() =>
requestConfirm({
title: t("confirm.runSettlementTitle"),
description: t("confirm.runSettlementDescription"),
onConfirm: () => runAction(t("runSettlement"), () => postAdminRunDrawSettlement(idNum)),
})
}
>
{acting === t("runSettlement") ? t("processing") : t("runSettlement")}
</Button>
</CardContent>
</Card>
) : null}
<ConfirmDialog />
</div>
);
}