feat(partner): require WeChat OAuth before store photo upload

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-03 15:44:46 +08:00
parent 81413e4d08
commit cabc9e6ebb
11 changed files with 231 additions and 13 deletions
@@ -6,6 +6,11 @@ import OssUploadField from '../components/OssUploadField';
import { request } from '../lib/api';
import { resolveRegionBinding } from '../lib/china-region';
import { fetchPartnerCities, type OpenCityOption } from '../lib/upload';
import {
fetchPartnerProfile,
handlePartnerWechatCallback,
savePartnerWechatAuth,
} from '../lib/wechat-auth';
import { isWechatEnv, weixinSdk } from '../lib/weixin';
import {
clearStoreDraft,
@@ -28,6 +33,7 @@ export default function StoreCreatePage() {
const [submitting, setSubmitting] = useState(false);
const [cities, setCities] = useState<OpenCityOption[]>([]);
const [citiesError, setCitiesError] = useState('');
const [wechatReady, setWechatReady] = useState(false);
const stepFromUrl = Number(params.get('step') || 0);
const step = stepFromUrl >= 1 && stepFromUrl <= 3 ? stepFromUrl : (saved?.step ?? 1);
@@ -44,11 +50,25 @@ export default function StoreCreatePage() {
useEffect(() => {
if (step !== 2 || !isWechatEnv()) return;
void fetchPartnerProfile()
.then((me) => setWechatReady(!!me.hasWechat))
.catch(() => setWechatReady(false));
void weixinSdk.init().catch(() => {
/* OssUploadField 点击时会再次初始化 */
});
}, [step]);
useEffect(() => {
if (!isWechatEnv() || !params.get('code')) return;
void handlePartnerWechatCallback()
.then((result) => {
if (result && savePartnerWechatAuth(result)) {
setWechatReady(true);
}
})
.catch((e) => setError(e instanceof Error ? e.message : '微信授权失败'));
}, [params]);
useEffect(() => {
void fetchPartnerCities()
.then((items) => {
@@ -259,6 +279,8 @@ export default function StoreCreatePage() {
bizType="STORE_TITLE"
mediaType="IMAGE"
value={form.coverUrl}
wechatReady={wechatReady}
onWechatReadyChange={setWechatReady}
onChange={(coverUrl) => patchForm({ coverUrl })}
label="点击或拖拽上传"
/>
@@ -275,6 +297,8 @@ export default function StoreCreatePage() {
bizType="STORE_ENV"
mediaType="IMAGE"
value={url}
wechatReady={wechatReady}
onWechatReadyChange={setWechatReady}
label="添加照片"
onChange={(nextUrl) => {
const envPhotoUrls = [...form.envPhotoUrls];
@@ -294,6 +318,8 @@ export default function StoreCreatePage() {
mediaType="FILE"
accept="image/*,.pdf"
value={form.contractUrl}
wechatReady={wechatReady}
onWechatReadyChange={setWechatReady}
onChange={(contractUrl) => patchForm({ contractUrl })}
label="上传合同副本"
/>