import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import AppImage from '@dukang/shared-ui/AppImage'; import { request } from '../lib/api'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; import { isSubAccount } from '../lib/partnerAccess'; import { storeStatusLabel, storeStatusPillClass, type StoreStatusValue } from '../lib/storeStatus'; const STATUS_OPTIONS: StoreStatusValue[] = ['OPEN', 'PAUSED', 'CLOSED']; export default function StoreDetailPage() { const { id } = useParams(); const navigate = useNavigate(); const { account } = usePartnerSession(); const subReadonly = isSubAccount(account); const [store, setStore] = useState | null>(null); const [loadError, setLoadError] = useState(''); const [form, setForm] = useState({ name: '', phone: '', address: '', intro: '' }); const [status, setStatus] = useState('OPEN'); const [statusSaving, setStatusSaving] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const [toast, setToast] = useState(''); function showToast(message: string) { setToast(message); window.setTimeout(() => setToast(''), 2000); } function applyStore(data: Record) { setStore(data); setForm({ name: String(data.name || ''), phone: String(data.phone || ''), address: String(data.address || ''), intro: String(data.intro || ''), }); setStatus(String(data.status || 'OPEN').toUpperCase() as StoreStatusValue); } useEffect(() => { if (!id) return; setLoadError(''); request>('PARTNER_H5', `/partner/stores/${id}`) .then(applyStore) .catch((e) => { setStore(null); setLoadError(e instanceof Error ? e.message : '加载失败'); }); }, [id]); async function changeStatus(next: StoreStatusValue) { if (!id || next === status || statusSaving) return; if (status === 'CLOSED') return; if (next === 'CLOSED') { const ok = window.confirm('关闭后不可恢复营业,确认关闭该门店?'); if (!ok) return; } setStatusSaving(true); setError(''); try { const updated = await request>('PARTNER_H5', `/partner/stores/${id}/status`, { method: 'PUT', body: JSON.stringify({ status: next }), }); setStatus(next); setStore((prev) => (prev ? { ...prev, ...updated, status: next } : prev)); showToast('状态已更新'); } catch (e) { setError(e instanceof Error ? e.message : '状态更新失败'); } finally { setStatusSaving(false); } } async function saveBasic() { if (!id || saving || status === 'CLOSED') return; setSaving(true); setError(''); try { const data = await request>('PARTNER_H5', `/partner/stores/${id}/basic`, { method: 'PUT', body: JSON.stringify({ name: form.name.trim(), phone: form.phone.trim(), address: form.address.trim(), intro: form.intro.trim(), }), }); applyStore(data); showToast('已保存'); } catch (e) { setError(e instanceof Error ? e.message : '保存失败'); } finally { setSaving(false); } } if (loadError) { return (
navigate('/stores')} />
{loadError}
); } if (!store) return
加载中...
; const envPhotos = Array.isArray(store.media) ? (store.media as Array<{ url?: string; bizType?: string }>).filter((m) => m.bizType === 'ENV') : []; const readOnly = subReadonly || status === 'CLOSED'; return (
navigate('/stores')} />
{error &&

{error}

} {!subReadonly && (

运营状态

{status === 'OPEN' && } {storeStatusLabel(status)}
{STATUS_OPTIONS.map((s) => ( ))}
{status === 'CLOSED' && (

门店已关闭,不可再变更状态或编辑资料

)}
)}

基本信息

setForm({ ...form, name: e.target.value })} style={{ width: '100%', padding: '12px 16px', border: '1px solid rgba(226,190,188,0.5)', borderRadius: 8, fontSize: 16, fontWeight: 500 }} />
call setForm({ ...form, phone: e.target.value })} />