|
|
@@ -0,0 +1,116 @@
|
|
|
+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()
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|