fix(h5-partner): resolve merge conflicts for auth and sub-accounts

Merge partner session model (AuthGate, ensureSession, WeChat OAuth in Context) with sub-account routing, admin partner-account tree CRUD, upload lock, and partner staff flows.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-10 11:24:48 +08:00
20 changed files with 378 additions and 264 deletions
+71 -27
View File
@@ -39,6 +39,8 @@ import {
validateStoreStep3,
patchEnvPhotoAt,
} from '../lib/storeDraft';
@@ -63,6 +65,14 @@ function isPhoneConflictMessage(message: string) {
function isPhoneValidationMessage(message: string) {
return message.includes('联系电话') || message.includes('手机号');
}
export default function StoreCreatePage() {
const navigate = useNavigate();
@@ -93,7 +103,6 @@ export default function StoreCreatePage() {
function reportFormError(message: string) {
setSubmitError(message);
toastError(message);
}
const stepFromUrl = Number(params.get('step') || 0);
@@ -153,7 +162,6 @@ export default function StoreCreatePage() {
.catch((e) => {
const msg = e instanceof Error ? e.message : '加载开城城市失败';
setCitiesError(msg);
toastError(msg);
});
}, []);
@@ -196,6 +204,22 @@ export default function StoreCreatePage() {
function patchEnvPhotoUrl(index: number, url: string) {
setForm((prev) => ({
...prev,
envPhotoUrls: patchEnvPhotoAt(prev.envPhotoUrls, index, url),
}));
setSubmitError('');
}
function bindRegionSelection(codes: string[]) {
const binding = resolveRegionBinding(codes, cities);
@@ -260,11 +284,11 @@ export default function StoreCreatePage() {
if (!phoneCheck.available) {
const phoneMsg = phoneCheck.message ?? '该手机号已绑定门店,请更换';
setFieldErrors({ phone: phoneMsg });
toastError(phoneMsg);
return;
}
} catch {
} catch (e) {
reportFormError(e instanceof Error ? e.message : '手机号校验失败');
return;
} finally {
@@ -304,6 +328,10 @@ export default function StoreCreatePage() {
const step1Msg = validateStoreStep1(form);
if (step1Msg) {
if (isPhoneValidationMessage(step1Msg)) {
setFieldErrors({ phone: step1Msg });
return;
}
reportFormError(step1Msg);
goStep(1);
return;
@@ -341,13 +369,16 @@ export default function StoreCreatePage() {
});
goStep(1);
return;
}
} catch (e) {
reportFormError(e instanceof Error ? e.message : '手机号校验失败');
return;
}
try {
const envPhotoUrls = form.envPhotoUrls.map((u) => u.trim()).filter(Boolean);
@@ -396,11 +427,10 @@ export default function StoreCreatePage() {
const message = e instanceof Error ? e.message : '提交失败';
if (isPhoneConflictMessage(message)) {
setFieldErrors({ phone: message });
toastError(message);
goStep(1);
return;
}
setSubmitError(message);
toastError(message);
} finally {
setSubmitting(false);
@@ -677,15 +707,7 @@ export default function StoreCreatePage() {
onWechatReadyChange={() => { void refresh(); }}
onChange={(nextUrl) => {
const envPhotoUrls = [...form.envPhotoUrls];
envPhotoUrls[index] = nextUrl;
patchForm({ envPhotoUrls });
}}
onChange={(nextUrl) => patchEnvPhotoUrl(index, nextUrl)}
/>
@@ -757,22 +779,44 @@ export default function StoreCreatePage() {
</div>
<section className="partner-form-card partner-store-phone-summary">
<section className="partner-form-card">
<div className="partner-store-phone-summary-main">
<div className="partner-field">
<span className="label-md text-muted"></span>
<label> <span className="text-primary">*</span></label>
<span className="body-md">{form.phone.trim() || '未填写'}</span>
<div className="partner-field-input">
<span className="material-symbols-outlined">call</span>
<input
type="tel"
placeholder="请输入11位手机号"
value={form.phone}
onChange={(e) => patchForm({ phone: e.target.value })}
/>
</div>
{fieldErrors.phone && (
<p className="partner-field-error" role="alert">{fieldErrors.phone}</p>
)}
<p className="label-md text-muted" style={{ marginTop: 8 }}>
</p>
</div>
<button type="button" className="partner-weekly-link" onClick={() => goStep(1)}>
</button>
</section>
<section className="partner-form-card">