diff --git a/apps/h5-partner/src/pages/StoreDetailPage.tsx b/apps/h5-partner/src/pages/StoreDetailPage.tsx index fbe7110..3a49f16 100644 --- a/apps/h5-partner/src/pages/StoreDetailPage.tsx +++ b/apps/h5-partner/src/pages/StoreDetailPage.tsx @@ -47,6 +47,7 @@ export default function StoreDetailPage() { const [saving, setSaving] = useState(false); const [mediaSaving, setMediaSaving] = useState(false); const [actionError, setActionError] = useState(''); + const [closeConfirmOpen, setCloseConfirmOpen] = useState(false); function applyStore(data: Record) { setStore(data); @@ -92,8 +93,8 @@ export default function StoreDetailPage() { return; } if (next === 'CLOSED') { - const ok = window.confirm('关闭后不可恢复营业,确认关闭该门店?'); - if (!ok) return; + setCloseConfirmOpen(true); + return; } setStatusSaving(true); setActionError(''); @@ -104,7 +105,27 @@ export default function StoreDetailPage() { }); setStatus(next); setStore((prev) => (prev ? { ...prev, ...updated, status: next } : prev)); - toastSuccess('状态已更新'); + toastSuccess(next === 'OPEN' ? '开店成功' : '状态已更新'); + } catch (e) { + setActionError(e instanceof Error ? e.message : '状态更新失败'); + } finally { + setStatusSaving(false); + } + } + + async function confirmCloseStore() { + if (!id || statusSaving) return; + setCloseConfirmOpen(false); + setStatusSaving(true); + setActionError(''); + try { + const updated = await request>('PARTNER_H5', `/partner/stores/${id}/status`, { + method: 'PUT', + body: JSON.stringify({ status: 'CLOSED' }), + }); + setStatus('CLOSED'); + setStore((prev) => (prev ? { ...prev, ...updated, status: 'CLOSED' } : prev)); + toastSuccess('门店已关闭'); } catch (e) { setActionError(e instanceof Error ? e.message : '状态更新失败'); } finally { @@ -385,6 +406,25 @@ export default function StoreDetailPage() { )} + + {closeConfirmOpen && ( +
setCloseConfirmOpen(false)}> +
e.stopPropagation()}> +

确认关闭门店?

+

+ 关闭后不可恢复营业,确认关闭该门店? +

+
+ + +
+
+
+ )} ); } diff --git a/apps/h5-partner/src/pages/StoreListPage.tsx b/apps/h5-partner/src/pages/StoreListPage.tsx index e5bbcda..0a4d4ca 100644 --- a/apps/h5-partner/src/pages/StoreListPage.tsx +++ b/apps/h5-partner/src/pages/StoreListPage.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import { isLoggedIn, request } from '../lib/api'; +import { toastSuccess } from '../lib/toast'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; import { canCreatePartnerStore, canManagePartnerStore } from '../lib/partnerAccess'; import { @@ -36,6 +37,7 @@ export default function StoreListPage() { const [filter, setFilter] = useState(initialFilter); const [updatingId, setUpdatingId] = useState(null); const [error, setError] = useState(''); + const [closeTarget, setCloseTarget] = useState(null); const loadStores = useCallback(() => { return request>>('PARTNER_H5', '/partner/stores').then(setStores); @@ -67,8 +69,8 @@ export default function StoreListPage() { return; } if (next === 'CLOSED') { - const ok = window.confirm('关闭后不可恢复营业,确认关闭该门店?'); - if (!ok) return; + setCloseTarget(storeId); + return; } setUpdatingId(storeId); setError(''); @@ -78,6 +80,26 @@ export default function StoreListPage() { body: JSON.stringify({ status: next }), }); await loadStores(); + if (next === 'OPEN') toastSuccess('开店成功'); + } catch { + /* request 已 toast */ + } finally { + setUpdatingId(null); + } + } + + async function confirmCloseStore() { + if (!closeTarget) return; + const storeId = closeTarget; + setCloseTarget(null); + setUpdatingId(storeId); + setError(''); + try { + await request('PARTNER_H5', `/partner/stores/${storeId}/status`, { + method: 'PUT', + body: JSON.stringify({ status: 'CLOSED' }), + }); + await loadStores(); } catch { /* request 已 toast */ } finally { @@ -189,6 +211,24 @@ export default function StoreListPage() { ); })} + {closeTarget && ( +
setCloseTarget(null)}> +
e.stopPropagation()}> +

确认关闭门店?

+

+ 关闭后不可恢复营业,确认关闭该门店? +

+
+ + +
+
+
+ )} ); }