| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import { backfillProfile as apiBackfill } from './api.js'
- const fieldUsage = require('./profile-field-usage.js')
- /**
- * 就地补充 → 自动回写个人信息
- * @param {Object} opts
- * targetType: 'user' | 'member'
- * targetId: memberId(targetType=member 时)
- * fields: { phone: '138...', birthday: '...' }
- * scene: 'activity-signup'(必传,校验字段是否属于本场景)
- * prevValues: { phone: '旧值' } 当前人已有值(用于「修改已有值」判定)
- * @returns {Promise<Object>} { updatedFields: [], skippedFields: [] }
- */
- export function backfillProfile(opts) {
- return new Promise(function(resolve, reject) {
- var scene = opts.scene
- var fields = opts.fields || {}
- var fieldNames = Object.keys(fields)
- if (!scene || fieldNames.length === 0) {
- resolve({ updatedFields: [], skippedFields: fieldNames })
- return
- }
- // 1. 场景校验:只回写本场景登记过的字段
- var allowedFields = {}
- var skippedFields = []
- for (var i = 0; i < fieldNames.length; i++) {
- var name = fieldNames[i]
- var usage = fieldUsage[name]
- if (!usage) {
- skippedFields.push(name)
- continue
- }
- var inScene = false
- var targetsOk = false
- for (var j = 0; j < usage.scenes.length; j++) {
- var sc = usage.scenes[j]
- if (sc.scene === scene) {
- inScene = true
- if (sc.backfillTarget.indexOf(opts.targetType) >= 0) {
- targetsOk = true
- }
- }
- }
- if (inScene && targetsOk) {
- allowedFields[name] = fields[name]
- } else {
- skippedFields.push(name)
- }
- }
- if (Object.keys(allowedFields).length === 0) {
- resolve({ updatedFields: [], skippedFields: skippedFields })
- return
- }
- // 2. 修改已有值 → 弹确认
- var prev = opts.prevValues || {}
- var changedNames = []
- for (var k in allowedFields) {
- var oldVal = prev[k]
- var newVal = allowedFields[k]
- if (oldVal && oldVal !== newVal && !(newVal === '' && oldVal === newVal)) {
- changedNames.push(fieldUsage[k].label)
- }
- }
- function doBackfill() {
- apiBackfill({
- targetType: opts.targetType,
- targetId: opts.targetId || null,
- fields: allowedFields
- }).then(function(res) {
- if (res && res.code === 200) {
- // 3. 成功后更新本地缓存
- var profile = (res.data && res.data.profile) || {}
- if (opts.targetType === 'user') {
- var userInfo = uni.getStorageSync('userInfo') || {}
- for (var f in allowedFields) {
- if (profile[f] !== undefined) {
- userInfo[f] = profile[f]
- }
- }
- uni.setStorageSync('userInfo', userInfo)
- }
- resolve({
- updatedFields: (res.data && res.data.updatedFields) || [],
- skippedFields: skippedFields
- })
- } else {
- reject(new Error((res && res.message) || '回写失败'))
- }
- }).catch(function(err) {
- reject(err)
- })
- }
- if (changedNames.length > 0) {
- uni.showModal({
- title: '同步更新资料',
- content: '检测到您修改了' + changedNames.join('、') + ',是否同步更新' + (opts.targetType === 'member' ? '该家人的' : '您的') + '个人信息?',
- confirmText: '同步更新',
- cancelText: '仅本次使用',
- success: function(modalRes) {
- if (modalRes.confirm) {
- doBackfill()
- } else {
- resolve({ updatedFields: [], skippedFields: skippedFields })
- }
- }
- })
- } else {
- doBackfill()
- }
- })
- }
|