import { useEffect, useState } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import SubPageHeader from '../components/SubPageHeader'; import RegionPicker from '../components/RegionPicker'; import { request } from '../lib/api'; import { buildAddressListUrl, readCheckoutContext } from '../lib/navigation'; import { DEFAULT_REGION, formatRegion } from '../lib/region-data'; import { normalizePhoneInput, validateMobilePhone } from '../lib/phone'; type AddressForm = { receiverName: string; phone: string; province: string; city: string; district: string; detail: string; isDefault: boolean; }; export default function AddressEditPage() { const { id } = useParams(); const [params] = useSearchParams(); const isEdit = Boolean(id); const navigate = useNavigate(); const [pickerOpen, setPickerOpen] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const [form, setForm] = useState({ receiverName: '', phone: '', province: DEFAULT_REGION.province, city: params.get('city') || DEFAULT_REGION.city, district: DEFAULT_REGION.district, detail: '', isDefault: true, }); const checkoutCtx = readCheckoutContext(params); function goBackToList() { navigate(buildAddressListUrl(checkoutCtx)); } useEffect(() => { if (!id) return; request>>('USER_H5', '/user/addresses').then((list) => { const found = list.find((a) => String(a.id) === id); if (found) { setForm({ receiverName: String(found.receiverName), phone: String(found.phone), province: String(found.province), city: String(found.city), district: String(found.district), detail: String(found.detail), isDefault: found.isDefault === 1, }); } }); }, [id]); const regionText = formatRegion(form.province, form.city, form.district); function validateForm(): string | null { if (!form.receiverName.trim()) return '请输入收货人姓名'; const phoneCheck = validateMobilePhone(form.phone); if (!phoneCheck.ok) return phoneCheck.message ?? '请输入正确的手机号码'; if (!form.province || !form.city || !form.district) return '请选择所在地区'; if (!form.detail.trim()) return '请输入详细地址'; return null; } async function save() { const validationError = validateForm(); if (validationError) { setError(validationError); return; } setSaving(true); setError(''); try { if (isEdit && id) { await request('USER_H5', `/user/addresses/${id}`, { method: 'PUT', body: JSON.stringify(form), }); } else { await request('USER_H5', '/user/addresses', { method: 'POST', body: JSON.stringify(form), }); } navigate(buildAddressListUrl(checkoutCtx)); } finally { setSaving(false); } } return (
{ setForm({ ...form, receiverName: e.target.value }); setError(''); }} /> person
+86 { setForm({ ...form, phone: normalizePhoneInput(e.target.value) }); setError(''); }} /> smartphone