188 lines
6.2 KiB
JavaScript
188 lines
6.2 KiB
JavaScript
/**
|
||||
|
|
* 婚恋态度页 U10(Phase 04 P04-T25)
|
|||
|
|
*
|
|||
|
|
* 重构要点(遵循 AGENTS.md 不变量):
|
|||
|
|
* - 数据:profileService.getProfile + userStore.updateProfile(第 9 条)
|
|||
|
|
* - V1 不做泛交友选项(功能清单 §4.5:默认"寻找以婚姻为目标的稳定关系")
|
|||
|
|
* - 草稿恢复:onLoad 读 ONBOARDING_DRAFT.intent,保存前写回
|
|||
|
|
* - 下一步:跳 profile-intro
|
|||
|
|
*/
|
|||
|
|
const { userStore, appStore } = require('../../stores');
|
|||
|
|
const { profileService } = require('../../services');
|
|||
|
|
const { ROUTE, STORAGE_KEYS } = require('../../constants');
|
|||
|
|
|
|||
|
|
const MARRIAGE_PLAN_OPTIONS = [
|
|||
|
|
{ value: 'half_year', label: '半年内' },
|
|||
|
|
{ value: 'one_year', label: '1年内' },
|
|||
|
|
{ value: 'one_to_two_years', label: '1~2年' },
|
|||
|
|
{ value: 'two_years_plus', label: '2年以上' },
|
|||
|
|
{ value: 'let_it_be', label: '顺其自然' },
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const ACTIVITY_WILLINGNESS_OPTIONS = [
|
|||
|
|
{ value: 'willing', label: '愿意' },
|
|||
|
|
{ value: 'not_now', label: '暂不考虑' },
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const MATCHMAKER_WILLINGNESS_OPTIONS = [
|
|||
|
|
{ value: 'accept', label: '接受' },
|
|||
|
|
{ value: 'not_now', label: '暂不接受' },
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const DEFAULT_GOAL = '寻找以婚姻为目标的稳定关系';
|
|||
|
|
|
|||
|
|
Page({
|
|||
|
|
data: {
|
|||
|
|
statusBarHeight: 20,
|
|||
|
|
navBarHeight: 44,
|
|||
|
|
loading: false,
|
|||
|
|
saving: false,
|
|||
|
|
relationshipGoal: DEFAULT_GOAL,
|
|||
|
|
marriagePlan: '',
|
|||
|
|
activityWillingness: '',
|
|||
|
|
matchmakerWillingness: '',
|
|||
|
|
// 选项
|
|||
|
|
marriagePlanOptions: MARRIAGE_PLAN_OPTIONS,
|
|||
|
|
activityWillingnessOptions: ACTIVITY_WILLINGNESS_OPTIONS,
|
|||
|
|
matchmakerWillingnessOptions: MATCHMAKER_WILLINGNESS_OPTIONS,
|
|||
|
|
marriagePlanIndex: -1,
|
|||
|
|
activityWillingnessIndex: -1,
|
|||
|
|
matchmakerWillingnessIndex: -1,
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
onLoad() {
|
|||
|
|
this._initSystemInfo();
|
|||
|
|
this._applyDraft();
|
|||
|
|
this.loadProfile();
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
_initSystemInfo() {
|
|||
|
|
try {
|
|||
|
|
const sysInfo = wx.getSystemInfoSync();
|
|||
|
|
this.setData({
|
|||
|
|
statusBarHeight: sysInfo.statusBarHeight || 20,
|
|||
|
|
navBarHeight: 44,
|
|||
|
|
});
|
|||
|
|
} catch (e) { /* 使用默认值 */ }
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
async loadProfile() {
|
|||
|
|
this.setData({ loading: true });
|
|||
|
|
try {
|
|||
|
|
const profile = await profileService.getProfile();
|
|||
|
|
this._mergeProfile(profile);
|
|||
|
|
} catch (err) { /* 首次填写 */ } finally {
|
|||
|
|
this.setData({ loading: false });
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
_mergeProfile(profile) {
|
|||
|
|
if (!profile) return;
|
|||
|
|
const d = this._readDraft();
|
|||
|
|
const relationshipGoal = d.relationshipGoal || profile.relationshipGoal || DEFAULT_GOAL;
|
|||
|
|
const marriagePlan = d.marriagePlan || profile.marriagePlan || '';
|
|||
|
|
const activityWillingness = d.activityWillingness || profile.activityWillingness || '';
|
|||
|
|
const matchmakerWillingness = d.matchmakerWillingness || profile.matchmakerWillingness || '';
|
|||
|
|
this.setData({
|
|||
|
|
relationshipGoal,
|
|||
|
|
marriagePlan,
|
|||
|
|
activityWillingness,
|
|||
|
|
matchmakerWillingness,
|
|||
|
|
marriagePlanIndex: MARRIAGE_PLAN_OPTIONS.findIndex((o) => o.value === marriagePlan),
|
|||
|
|
activityWillingnessIndex: ACTIVITY_WILLINGNESS_OPTIONS.findIndex((o) => o.value === activityWillingness),
|
|||
|
|
matchmakerWillingnessIndex: MATCHMAKER_WILLINGNESS_OPTIONS.findIndex((o) => o.value === matchmakerWillingness),
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// ============ 草稿 ============
|
|||
|
|
_readDraft() {
|
|||
|
|
try {
|
|||
|
|
const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {};
|
|||
|
|
return draft.intent || {};
|
|||
|
|
} catch (e) {
|
|||
|
|
return {};
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
_applyDraft() {
|
|||
|
|
const d = this._readDraft();
|
|||
|
|
if (!d || Object.keys(d).length === 0) return;
|
|||
|
|
const marriagePlan = d.marriagePlan || '';
|
|||
|
|
const activityWillingness = d.activityWillingness || '';
|
|||
|
|
const matchmakerWillingness = d.matchmakerWillingness || '';
|
|||
|
|
this.setData({
|
|||
|
|
relationshipGoal: d.relationshipGoal || DEFAULT_GOAL,
|
|||
|
|
marriagePlan,
|
|||
|
|
activityWillingness,
|
|||
|
|
matchmakerWillingness,
|
|||
|
|
marriagePlanIndex: MARRIAGE_PLAN_OPTIONS.findIndex((o) => o.value === marriagePlan),
|
|||
|
|
activityWillingnessIndex: ACTIVITY_WILLINGNESS_OPTIONS.findIndex((o) => o.value === activityWillingness),
|
|||
|
|
matchmakerWillingnessIndex: MATCHMAKER_WILLINGNESS_OPTIONS.findIndex((o) => o.value === matchmakerWillingness),
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
_writeDraft() {
|
|||
|
|
try {
|
|||
|
|
const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {};
|
|||
|
|
draft.intent = {
|
|||
|
|
relationshipGoal: this.data.relationshipGoal,
|
|||
|
|
marriagePlan: this.data.marriagePlan,
|
|||
|
|
activityWillingness: this.data.activityWillingness,
|
|||
|
|
matchmakerWillingness: this.data.matchmakerWillingness,
|
|||
|
|
};
|
|||
|
|
draft.currentStep = 'intent';
|
|||
|
|
wx.setStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT, draft);
|
|||
|
|
} catch (e) { /* ignore */ }
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// ============ 表单交互 ============
|
|||
|
|
onGoalInput(e) {
|
|||
|
|
this.setData({ relationshipGoal: e.detail.value });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
onMarriagePlanChange(e) {
|
|||
|
|
const idx = Number(e.detail.value);
|
|||
|
|
this.setData({ marriagePlanIndex: idx, marriagePlan: MARRIAGE_PLAN_OPTIONS[idx].value });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
onActivityWillingnessChange(e) {
|
|||
|
|
const idx = Number(e.detail.value);
|
|||
|
|
this.setData({ activityWillingnessIndex: idx, activityWillingness: ACTIVITY_WILLINGNESS_OPTIONS[idx].value });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
onMatchmakerWillingnessChange(e) {
|
|||
|
|
const idx = Number(e.detail.value);
|
|||
|
|
this.setData({ matchmakerWillingnessIndex: idx, matchmakerWillingness: MATCHMAKER_WILLINGNESS_OPTIONS[idx].value });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// ============ 导航 ============
|
|||
|
|
onBack() {
|
|||
|
|
this._writeDraft();
|
|||
|
|
wx.navigateBack();
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
async onNext() {
|
|||
|
|
if (this.data.saving) return;
|
|||
|
|
const { relationshipGoal, marriagePlan, activityWillingness, matchmakerWillingness } = this.data;
|
|||
|
|
if (!marriagePlan) return appStore.toast('请选择希望多久进入婚姻');
|
|||
|
|
if (!activityWillingness) return appStore.toast('请选择是否参加公益活动');
|
|||
|
|
if (!matchmakerWillingness) return appStore.toast('请选择是否接受红娘推荐');
|
|||
|
|
|
|||
|
|
this.setData({ saving: true });
|
|||
|
|
this._writeDraft();
|
|||
|
|
try {
|
|||
|
|
await userStore.updateProfile({
|
|||
|
|
relationshipGoal,
|
|||
|
|
marriagePlan,
|
|||
|
|
activityWillingness,
|
|||
|
|
matchmakerWillingness,
|
|||
|
|
});
|
|||
|
|
this.setData({ saving: false });
|
|||
|
|
wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_INTRO });
|
|||
|
|
} catch (err) {
|
|||
|
|
this.setData({ saving: false });
|
|||
|
|
appStore.toastError(err, '保存失败');
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
});
|