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} { 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() } }) }