import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import { createPartnerStaff, sendPartnerStaffPhoneSms } from '../lib/staff'; import { toastError, toastSuccess } from '../lib/toast'; type FieldErrors = { name?: string; phone?: string; smsCode?: string; }; export default function StaffCreatePage() { const navigate = useNavigate(); const [name, setName] = useState(''); const [phone, setPhone] = useState(''); const [smsCode, setSmsCode] = useState(''); const [smsCooldown, setSmsCooldown] = useState(0); const [smsHint, setSmsHint] = useState(''); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(''); const [fieldErrors, setFieldErrors] = useState({}); function patchName(value: string) { setName(value); setSubmitError(''); setFieldErrors((prev) => ({ ...prev, name: undefined })); } function patchPhone(value: string) { setPhone(value); setSmsHint(''); setSubmitError(''); setFieldErrors((prev) => ({ ...prev, phone: undefined, smsCode: undefined })); if (smsCode) setSmsCode(''); } function patchSmsCode(value: string) { setSmsCode(value.replace(/\D/g, '')); setSubmitError(''); setFieldErrors((prev) => ({ ...prev, smsCode: undefined })); } async function sendPhoneCode() { const trimmedPhone = phone.trim(); if (!/^1[3-9]\d{9}$/.test(trimmedPhone)) { setFieldErrors({ phone: '请先填写正确的11位手机号' }); return; } setSmsHint(''); setFieldErrors((prev) => ({ ...prev, phone: undefined })); try { const res = await sendPartnerStaffPhoneSms(trimmedPhone); setSmsHint(`验证码已发送至 ${res.maskedPhone}`); setSmsCooldown(60); const timer = setInterval(() => { setSmsCooldown((s) => { if (s <= 1) { clearInterval(timer); return 0; } return s - 1; }); }, 1000); } catch (e) { const msg = e instanceof Error ? e.message : '验证码发送失败'; setFieldErrors({ phone: msg }); } } async function submit() { const trimmedName = name.trim(); const trimmedPhone = phone.trim(); const trimmedSmsCode = smsCode.trim(); const nextFieldErrors: FieldErrors = {}; if (!trimmedName) nextFieldErrors.name = '请填写真实姓名'; if (!trimmedPhone) { nextFieldErrors.phone = '请填写手机号码'; } else if (!/^1[3-9]\d{9}$/.test(trimmedPhone)) { nextFieldErrors.phone = '请输入正确的11位手机号'; } if (!trimmedSmsCode) { nextFieldErrors.smsCode = '请输入手机号验证码'; } else if (!/^\d{4,6}$/.test(trimmedSmsCode)) { nextFieldErrors.smsCode = '验证码格式不正确'; } if (Object.keys(nextFieldErrors).length) { setFieldErrors(nextFieldErrors); return; } setSubmitting(true); setSubmitError(''); setFieldErrors({}); try { await createPartnerStaff({ name: trimmedName, phone: trimmedPhone, smsCode: trimmedSmsCode, }); toastSuccess('子账号创建成功'); navigate('/center/staff'); } catch (e) { const message = e instanceof Error ? e.message : '创建失败'; if (message.includes('验证码')) { setFieldErrors({ smsCode: message }); return; } if (message.includes('手机号')) { setFieldErrors({ phone: message }); return; } setSubmitError(message); toastError(message); } finally { setSubmitting(false); } } return (
navigate('/center/staff')} /> {submitError && (

{submitError}

)}

子账号信息

person patchName(e.target.value)} />
{fieldErrors.name && (

{fieldErrors.name}

)}
call patchPhone(e.target.value)} />
{fieldErrors.phone && (

{fieldErrors.phone}

)}
shield patchSmsCode(e.target.value)} />
{smsHint && (

{smsHint}

)} {fieldErrors.smsCode && (

{fieldErrors.smsCode}

)}
info

子账号创建后默认禁用,需在子账号列表中手动启用后方可登录。

); }