style(store): 统一门店套餐页 UI 与拓店校验弹窗

管理后台套餐 Tab 对齐 Ant Design 表单;合伙人/门店端套餐表单与基本信息页风格一致;拓店下一步校验增加弹窗提示。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 19:59:44 +08:00
parent 4e7079c221
commit 3ba7b179e8
8 changed files with 637 additions and 235 deletions
+35 -6
View File
@@ -102,6 +102,7 @@ export default function StoreCreatePage() {
const [categoryTree, setCategoryTree] = useState<StoreCategoryNode[]>([]);
const [mapPickerOpen, setMapPickerOpen] = useState(false);
const [stepErrorModal, setStepErrorModal] = useState<string | null>(null);
const draftSaveDisabledRef = useRef(false);
@@ -109,6 +110,11 @@ export default function StoreCreatePage() {
setSubmitError(message);
}
function reportStepError(message: string) {
setSubmitError(message);
setStepErrorModal(message);
}
const stepFromUrl = Number(params.get('step') || 0);
const step = stepFromUrl >= 1 && stepFromUrl <= 4 ? stepFromUrl : (saved?.step ?? 1);
@@ -301,7 +307,7 @@ export default function StoreCreatePage() {
const msg = validateStoreStep1(form);
if (msg) {
reportFormError(msg);
reportStepError(msg);
return;
}
@@ -312,7 +318,7 @@ export default function StoreCreatePage() {
const msg = validateStoreStep2(form);
if (msg) {
reportFormError(msg);
reportStepError(msg);
return;
}
@@ -323,9 +329,10 @@ export default function StoreCreatePage() {
if (msg) {
if (isPhoneValidationMessage(msg)) {
setFieldErrors({ phone: msg });
reportStepError(msg);
return;
}
reportFormError(msg);
reportStepError(msg);
return;
}
}
@@ -1128,13 +1135,19 @@ export default function StoreCreatePage() {
{step === 4 && (
<>
<section className="partner-section">
<h2 className="partner-section-title"></h2>
<p className="partner-form-hint"></p>
<section className="partner-form-card">
<div className="partner-section-title">
<div className="partner-section-bar" />
<h2 className="headline-md"></h2>
</div>
<p className="label-md text-muted" style={{ marginBottom: 16 }}>
</p>
<StorePackagesForm
items={form.packages?.length ? form.packages : [{ name: '', price: '', dishes: '', usableTime: '', otherNotes: '', sortOrder: 0 }]}
onChange={(packages) => setForm((prev) => ({ ...prev, packages }))}
disabled={submitting}
embedded
/>
</section>
</>
@@ -1181,6 +1194,22 @@ export default function StoreCreatePage() {
</footer>
{stepErrorModal ? (
<div className="partner-ship-modal-backdrop" role="presentation" onClick={() => setStepErrorModal(null)}>
<div className="partner-ship-modal" role="dialog" aria-modal="true" onClick={(e) => e.stopPropagation()}>
<h3 className="headline-md" style={{ marginBottom: 8 }}></h3>
<p className="body-md text-muted" style={{ lineHeight: 1.6, whiteSpace: 'pre-wrap' }}>
{stepErrorModal}
</p>
<div className="partner-ship-actions">
<button type="button" className="partner-btn-primary" onClick={() => setStepErrorModal(null)}>
</button>
</div>
</div>
</div>
) : null}
<TencentLocPickerOverlay
open={mapPickerOpen}
onClose={() => setMapPickerOpen(false)}