Files
danyang-match/miniapp/pages/mine/mine.js
T

232 lines
7.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 我的页 U30-U33(重构:用 userStore 派生状态 + ui-section-header)
*
* 不变量(AGENTS.md):
* - 第 8 条:敏感数据默认拒绝——Profile 中不展示身份证号/手机号/完整生日,
* 仅展示前台脱敏字段(昵称/年龄/地区/职业大类)。
* - 第 2 条:Required 不可自动放宽——择偶条件入口仅跳转编辑页,不在本页软化。
* - 第 9 条:PostgreSQL 是 Source of Truth——本页状态全部来自 userStore 拉取的 /me/status。
*/
const { userStore, authStore, matchStore, appStore } = require('../../stores');
const { ROUTE, OPERATOR, DANGER_ACTION, RELATIONSHIP_STATUS, PROFILE_REVIEW } = require('../../constants');
const RELATIONSHIP_TEXT = {
[RELATIONSHIP_STATUS.SEARCHING]: '正在寻找',
[RELATIONSHIP_STATUS.GETTING_TO_KNOW]: '正在了解',
[RELATIONSHIP_STATUS.PAUSED]: '已暂停寻找',
[RELATIONSHIP_STATUS.MATCHED_SUCCESSFULLY]: '已成功牵手',
[RELATIONSHIP_STATUS.SERVICE_EXITED]: '已退出服务',
};
Page({
data: {
isLoggedIn: false,
profile: null,
userState: null,
verificationStatus: 'not_submitted',
loadStatus: 'idle',
isRealNameVerified: false,
isProfileApproved: false,
reviewStatusText: '',
relationshipText: '',
canPause: false,
canResume: false,
likersCount: 0,
showLogoutDialog: false,
logoutAction: DANGER_ACTION.LOGOUT,
loginActions: [{ text: '微信登录', event: 'login', variant: 'primary' }],
hasOperatorToken: false,
profileCompleteness: 78,
},
onLoad() {
// 订阅 userStore,派生展示状态
this._unsubUser = userStore.subscribe((state) => this._syncFromUserStore(state));
this._syncFromUserStore(userStore.state);
// 绑定 matchStore.likersCount(驱动"喜欢我"徽标)
this._unsubMatch = matchStore.bindToPage(this, { likersCount: 'likersCount' });
},
onShow() {
// 检测红娘工作台登录状态
if (authStore.state.isLoggedIn) {
userStore.fetchStatus().catch((err) => appStore.toastError(err));
userStore.fetchProfile().catch(() => {});
userStore.fetchVerificationStatus().catch(() => {});
matchStore.fetchLikersCount().catch(() => {});
}
},
onUnload() {
this._unsubUser && this._unsubUser();
this._unsubMatch && this._unsubMatch();
},
/** 把 userStore 状态派生为页面展示字段 */
_syncFromUserStore(state) {
const us = state.userState;
const isLoggedIn = !!us || authStore.state.isLoggedIn;
const isRealNameVerified = !!us && !!us.isRealNameVerified;
const reviewStatus = us ? us.profileReviewStatus : null;
const isProfileApproved = reviewStatus === PROFILE_REVIEW.APPROVED;
let reviewStatusText = '未提交';
if (reviewStatus === PROFILE_REVIEW.PENDING) reviewStatusText = '审核中';
else if (reviewStatus === PROFILE_REVIEW.APPROVED) reviewStatusText = '已审核';
else if (reviewStatus === PROFILE_REVIEW.NEED_EDIT) reviewStatusText = '需修改';
else if (reviewStatus === PROFILE_REVIEW.REJECTED) reviewStatusText = '未通过';
const rel = us ? us.relationshipStatus : null;
const relationshipText = rel ? RELATIONSHIP_TEXT[rel] || '' : '';
const canPause =
rel === RELATIONSHIP_STATUS.SEARCHING || rel === RELATIONSHIP_STATUS.GETTING_TO_KNOW;
const canResume = rel === RELATIONSHIP_STATUS.PAUSED;
this.setData({
isLoggedIn,
profile: state.profile,
userState: us,
verificationStatus: state.verificationStatus,
loadStatus: state.loadStatus,
isRealNameVerified,
isProfileApproved,
reviewStatusText,
relationshipText,
canPause,
canResume,
});
},
// ============ 登录 ============
onLoginAction(e) {
if ((e.detail || {}).event === 'login') {
wx.navigateTo({ url: ROUTE.AUTH.LOGIN });
}
},
// ============ 资料编辑 ============
onEditProfile() {
wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_INTRO });
},
onEditPreference() {
wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_PREFERENCE });
},
onEditPhotos() {
wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_PHOTOS });
},
// ============ 匹配 ============
onGoMessages() {
wx.switchTab({ url: ROUTE.TAB.MESSAGES });
},
onGoLikers() {
wx.navigateTo({ url: ROUTE.DETAIL.LIKERS });
},
// ============ 账户与安全 ============
onGoVerification() {
wx.navigateTo({ url: ROUTE.AUTH.VERIFICATION });
},
onGoPrivacy() {
wx.navigateTo({ url: ROUTE.SETTINGS.PRIVACY });
},
onGoBlacklist() {
wx.navigateTo({ url: ROUTE.SETTINGS.BLACKLIST });
},
onGoAccountStatus() {
wx.navigateTo({ url: ROUTE.SETTINGS.ACCOUNT_STATUS_PAGE });
},
// ============ 关系状态切换 ============
async onPause() {
try {
appStore.showLoading('处理中…');
await userStore.pauseSearching();
appStore.hideLoading();
appStore.toastSuccess('已暂停寻找');
} catch (err) {
appStore.hideLoading();
appStore.toastError(err);
}
},
async onResume() {
try {
appStore.showLoading('处理中…');
await userStore.resumeSearching();
appStore.hideLoading();
appStore.toastSuccess('已恢复寻找');
} catch (err) {
appStore.hideLoading();
appStore.toastError(err);
}
},
onGoFate() { wx.navigateTo({ url: ROUTE.MAIN.FATE_CENTER }); },
onGoMatchmaker() { wx.navigateTo({ url: ROUTE.MAIN.MATCHMAKER }); },
onGoCounseling() { wx.navigateTo({ url: ROUTE.SERVICE.COUNSELING }); },
onGoActivities() { wx.navigateTo({ url: ROUTE.DETAIL.MY_ACTIVITIES }); },
onGoAppointments() { wx.navigateTo({ url: ROUTE.SERVICE.MY_APPOINTMENTS }); },
onGoServiceHistory() { wx.navigateTo({ url: ROUTE.SERVICE.HISTORY }); },
onGoSafety() { wx.navigateTo({ url: ROUTE.SETTINGS.MY_REPORTS }); },
onGoClassroom() { wx.navigateTo({ url: ROUTE.SERVICE.CLASSROOM }); },
onGoAntiFraud() { wx.navigateTo({ url: ROUTE.SERVICE.ANTI_FRAUD }); },
onGoStation() { wx.navigateTo({ url: ROUTE.SERVICE.STATION }); },
// ============ 其他 ============
onGoSettings() {
wx.navigateTo({ url: ROUTE.SETTINGS.SETTINGS });
},
onGoHelp() {
wx.navigateTo({ url: ROUTE.SETTINGS.HELP_CENTER });
},
onGoAbout() {
wx.navigateTo({ url: ROUTE.SETTINGS.ABOUT });
},
// ============ 身份切换 ============
onSwitchRole() {
const token = wx.getStorageSync('operatorToken');
if (token) {
wx.navigateTo({ url: ROUTE.OPERATOR.WORKBENCH });
} else {
wx.navigateTo({ url: ROUTE.OPERATOR.LOGIN });
}
},
onLogout() {
this.setData({ showLogoutDialog: true });
},
async onConfirmLogout() {
this.setData({ showLogoutDialog: false });
try {
appStore.showLoading('退出中…');
await authStore.logout();
appStore.hideLoading();
wx.reLaunch({ url: ROUTE.AUTH.LOGIN });
} catch (err) {
appStore.hideLoading();
appStore.toastError(err);
}
},
onCancelLogout() {
this.setData({ showLogoutDialog: false });
},
});