import { RefreshCcw, Save } from 'lucide-react'; import { FormEvent, useEffect, useState } from 'react'; import { getProfileWalletConfig, upsertProfileWalletConfig, } from '../api/adminApiClient'; import type { ProfileWalletConfigAdminResponse } from '../api/adminApiTypes'; import { useAdminWriteConfirm } from '../components/useAdminWriteConfirm'; import { handlePageError } from './pageUtils'; interface AdminProfileWalletConfigPageProps { token: string; result: ProfileWalletConfigAdminResponse | null; onUnauthorized: (message?: string) => void; onResultChange: (result: ProfileWalletConfigAdminResponse) => void; } export function AdminProfileWalletConfigPage({ token, result, onUnauthorized, onResultChange, }: AdminProfileWalletConfigPageProps) { const [initialMudPoints, setInitialMudPoints] = useState('100'); const [dailyFreePointsPerDay, setDailyFreePointsPerDay] = useState('20'); const [isLoading, setIsLoading] = useState(false); const [isSaving, setIsSaving] = useState(false); const [loadErrorMessage, setLoadErrorMessage] = useState(''); const [errorMessage, setErrorMessage] = useState(''); const { confirmWrite, confirmDialog } = useAdminWriteConfirm(); useEffect(() => { void refreshConfig(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [token]); async function refreshConfig() { setIsLoading(true); setLoadErrorMessage(''); try { const response = await getProfileWalletConfig(token); onResultChange(response); setInitialMudPoints(String(response.initialMudPoints)); setDailyFreePointsPerDay(String(response.dailyFreePointsPerDay)); } catch (error: unknown) { handlePageError(error, onUnauthorized, setLoadErrorMessage); } finally { setIsLoading(false); } } async function handleSave(event: FormEvent) { event.preventDefault(); if (isSaving) { return; } const normalizedDailyFreePointsPerDay = parsePositiveInteger( dailyFreePointsPerDay, ); if (!normalizedDailyFreePointsPerDay) { setErrorMessage('每日免费泥点数必须是大于 0 的整数'); return; } const normalizedInitialMudPoints = parsePositiveInteger(initialMudPoints); if (!normalizedInitialMudPoints) { setErrorMessage('账号初始泥点数必须是大于 0 的整数'); return; } setErrorMessage(''); const confirmed = await confirmWrite({ action: '保存账号配置', target: `初始 ${normalizedInitialMudPoints} 泥点,每日免费 ${normalizedDailyFreePointsPerDay} 泥点`, }); if (!confirmed) { return; } setIsSaving(true); try { const response = await upsertProfileWalletConfig(token, { initialMudPoints: normalizedInitialMudPoints, dailyFreePointsPerDay: normalizedDailyFreePointsPerDay, }); onResultChange(response); setInitialMudPoints(String(response.initialMudPoints)); setDailyFreePointsPerDay(String(response.dailyFreePointsPerDay)); } catch (error: unknown) { handlePageError(error, onUnauthorized, setErrorMessage); } finally { setIsSaving(false); } } return (

账号配置

泥点钱包

{loadErrorMessage ? (
{loadErrorMessage}
) : null}
{errorMessage ? (
{errorMessage}
) : null}

当前配置

{result?.configId ?? '-'}
{result ? (
初始泥点
{result.initialMudPoints}
每日免费泥点
{result.dailyFreePointsPerDay}
更新人
{result.updatedByDisplayName || '-'}
更新
{result.updatedAt}
) : (
{isLoading ? '加载中' : '暂无记录'}
)}
{confirmDialog}
); } function parsePositiveInteger(value: string) { const parsed = Number(value); return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : 0; }