游戏机器人

This commit is contained in:
zhx 2026-06-16 20:47:19 +08:00
parent 97915b5980
commit 0be921409d

View File

@ -9,6 +9,7 @@ import { useCallback, useEffect, useMemo, useState } from "react";
import { PERMISSIONS } from "@/app/permissions";
import { useAuth } from "@/app/auth/AuthProvider.jsx";
import { deleteDiceRobot, generateDiceRobots, listDiceRobots, setDiceRobotStatus } from "@/features/games/api";
import { useCountryOptions } from "@/features/host-org/hooks/useCountryOptions.js";
import styles from "@/features/games/games.module.css";
import {
AdminActionIconButton,
@ -28,6 +29,7 @@ import { formatMillis } from "@/shared/utils/time.js";
const defaultGenerateForm = {
count: 20,
country: "SA",
nicknameLanguage: "arabic",
};
const maxGenerateRobotCount = 1000;
@ -39,6 +41,7 @@ export function GameRobotPage() {
const canCreate = can(PERMISSIONS.gameCreate);
const canUpdate = can(PERMISSIONS.gameUpdate);
const canDelete = can(PERMISSIONS.gameDelete) || canUpdate;
const { countryOptions, loadingCountries } = useCountryOptions();
const [items, setItems] = useState([]);
const [status, setStatus] = useState("");
const [nextCursor, setNextCursor] = useState("");
@ -67,6 +70,21 @@ export function GameRobotPage() {
load("", false);
}, [load]);
useEffect(() => {
setGenerateForm((current) => {
if (countryOptions.length === 0) {
return current;
}
const currentCountryEnabled = countryOptions.some((option) => option.value === current.country);
if (current.country && currentCountryEnabled) {
return current;
}
// 沿 SA user-service
const defaultCountry = countryOptions.find((option) => option.value === "SA")?.value || countryOptions[0].value;
return { ...current, country: defaultCountry };
});
}, [countryOptions]);
const changeStatus = useCallback(
async (robot, checked) => {
setLoadingAction(`status-${robot.userId}`);
@ -178,7 +196,11 @@ export function GameRobotPage() {
event.preventDefault();
setLoadingAction("generate");
try {
const enabledCountry = countryOptions.some((option) => option.value === generateForm.country)
? generateForm.country
: countryOptions[0]?.value || generateForm.country || "SA";
const result = await generateDiceRobots({
country: enabledCountry,
count: Number(generateForm.count || 0),
nicknameLanguage: generateForm.nicknameLanguage || "arabic",
});
@ -244,6 +266,8 @@ export function GameRobotPage() {
</AdminListBody>
<GenerateDialog
form={generateForm}
countryOptions={countryOptions}
loadingCountries={loadingCountries}
loading={loadingAction === "generate"}
open={dialogOpen}
setForm={setGenerateForm}
@ -254,7 +278,11 @@ export function GameRobotPage() {
);
}
function GenerateDialog({ form, loading, open, setForm, onClose, onSubmit }) {
function GenerateDialog({ countryOptions, form, loading, loadingCountries, open, setForm, onClose, onSubmit }) {
const selectCountryOptions = countryOptions.length > 0 ? countryOptions : [{ label: "SA", value: "SA" }];
const selectedCountry = selectCountryOptions.some((country) => country.value === form.country)
? form.country
: selectCountryOptions[0]?.value || "SA";
return (
<AdminFormDialog
loading={loading}
@ -282,6 +310,19 @@ function GenerateDialog({ form, loading, open, setForm, onClose, onSubmit }) {
<MenuItem value="arabic">阿拉伯语账号</MenuItem>
<MenuItem value="english">英语账号</MenuItem>
</TextField>
<TextField
disabled={loadingCountries}
label="国家"
select
value={selectedCountry}
onChange={(event) => setForm({ ...form, country: event.target.value })}
>
{selectCountryOptions.map((country) => (
<MenuItem key={country.value} value={country.value}>
{country.label}
</MenuItem>
))}
</TextField>
</AdminFormFieldGrid>
</AdminFormDialog>
);