UNPKG

react-app-shell

Version:

react打包脚本和example, 这里的版本请忽略

259 lines (225 loc) 6.9 kB
import { observable, action, computed } from 'mobx'; import _ from 'lodash'; import moment from 'moment'; import { JOIN_STATUS, GROUP_STATUS } from '../constants'; import { groupService, authService } from '../service'; import { message, monitor } from '../utils'; /** * 团购状态管理 */ class GroupStore { @observable state = { loading: false, userId: '', // 当前登录用户id, 获取团购信息时只用来驱动 joinStatus 变化的, 其他组件不需要依赖 groupId: '', // 当前活动Id teamId: '', // 当前teamId serverTime: Date.now(), // 服务器时间 groupStatus: GROUP_STATUS.UNKNOWN, // 团购活动状态: 未知, 未开始, 活动中, 已结束 serviceError: false // 获取团购信息时 接口是否发生异常或者超时 }; /** * 团购活动数据 * @type {{}} */ @observable groupInfo = {}; /** * 参团信息, 服务端返回teamData可能为空 * @type {{}} */ @observable teamData = {}; /** * 参团/开团 状态 * NOT_JOIN: 'NOT_JOIN', // 未参加过团购, 未登录时无法获取用户身份 所以也判定是未参加团购 * MY_TEAM: 'MY_TEAM', // 自己参加的team * OTHER_TEAM: 'OTHER_TEAM', // 别人开的team * SINGLE_BUY: 'SINGLE_BUY', // 单独购买 */ @computed get joinStatus() { // 用户未登录 if (!this.state.userId) { return JOIN_STATUS.NOT_JOIN; } // 1 没有teamId参数的时候, 如果返回空字符串, 表示未参加过团 // 2 未参加过团购 if (!this.teamData || this.teamData.isJoin === 0) { return JOIN_STATUS.NOT_JOIN; } // 单独购买 const members = this.teamData.members; if (members && members.length) { const firstUser = members[0]; if (firstUser.productType === 1 && String(this.state.userId) === String(firstUser.userId)) { return JOIN_STATUS.SINGLE_BUY; } } // 自己参加的team if (this.teamData.isJoin === 1) { return JOIN_STATUS.MY_TEAM; } // 别人开的team if (this.teamData.isJoin === 2) { return JOIN_STATUS.OTHER_TEAM; } // 没有teamId参数时, 参加过团, isJoin === 3 if (this.teamData.isJoin === 3) { return JOIN_STATUS.MY_TEAM; } return JOIN_STATUS.NOT_JOIN; } /** * 当前团人员是否已经满团 */ @computed get isFull() { if (!this.groupInfo.courseStep || !this.teamData.members) return false; const courseStep = this.objectToArray(this.groupInfo.courseStep); const lastStep = _.last(courseStep); // 最后一个step let isFull = false; // 是否团满 if (this.teamData.members.length >= lastStep.key) { isFull = true; } return isFull; } /** * 团长Id */ @computed get teamLeaderId() { const defaultTeamLeaderId = -1; // 服务端返回teamData可能为空 if (!this.teamData) { return defaultTeamLeaderId; } // team里没人 if (!this.teamData.members || !this.teamData.members.length) { return defaultTeamLeaderId; } // 团长信息 const leader = this.teamData.members[0]; if (leader && leader.userId) { return leader.userId; } return defaultTeamLeaderId; } /** * 加载团购数据, 同时更新用户状态 * @param groupId * @param teamId * @returns {Promise<void>} */ @action loadData = async (groupId, teamId) => { if (!groupId) { return; } // 设置 teamId if (!teamId || teamId === '-1') { teamId = ''; } this.state.loading = true; // 获取当前登录用户的id let userId = ''; // 团购活动状态: 未知, 未开始, 活动中, 已结束 let groupStatus = GROUP_STATUS.UNKNOWN; try { const userInfo = await authService.checkLogin(); if (userInfo) { userId = userInfo['userId']; } // 获取团购活动信息 const groupPromise = groupService.getGroupInfo(groupId); // 获取team信息 const teamPromise = groupService.getTeamData(groupId, teamId); const [groupInfo, teamData] = await Promise.all([groupPromise, teamPromise]); // 设置teamId if (teamData && teamData['groupTeamId']) { teamId = teamData['groupTeamId']; } // 团购价格 if (groupInfo && groupInfo.product && groupInfo.product.price) { groupInfo.groupPrice = groupInfo.product.price / 100; } // 单独购买价格 if (groupInfo && groupInfo.singleProduct && groupInfo.singleProduct.price) { groupInfo.singlePrice = groupInfo.singleProduct.price / 100; } if (groupInfo.startTime) groupInfo.startTime = Number(moment(groupInfo.startTime).format('x')); if (groupInfo.endTime) groupInfo.endTime = Number(moment(groupInfo.endTime).format('x')); if (groupInfo.nowTime) groupInfo.nowTime = Number(moment(groupInfo.nowTime).format('x')); // 判断活动状态 const { startTime, endTime, nowTime, status, memberType, steppedRewardBonusNum, steppedRewardPersonNum } = groupInfo; // status:0-进行中 1-已结束 if (startTime && endTime) { if (nowTime < startTime) { // 活动未开始 groupStatus = GROUP_STATUS.NOT_BEGIN; } // 在活动时间内并且活动是进行中的状态 else if (nowTime >= startTime && nowTime < endTime && status === 'ACTIVITY_ALREADY_BEGIN') { // 活动进行中 groupStatus = GROUP_STATUS.ACTIVE; } else { // 活动已结束 groupStatus = GROUP_STATUS.END; } } this.state = { loading: false, userId, groupId, teamId, groupStatus, memberType, steppedRewardBonusNum, steppedRewardPersonNum, serviceError: false, serverTime: nowTime }; this.groupInfo = groupInfo || {}; this.teamData = teamData || {}; } catch (error) { this.state = { loading: false, userId, groupId, teamId, groupStatus, serviceError: true }; this.groupInfo = {}; this.teamData = {}; monitor.log('', '获取团购信息失败'); message.error((error && error.msg) || '获取团购信息失败'); } }; /** * 设置当前登录用户的Id * @param userId */ @action setUserId = (userId) => { this.state.userId = userId; }; /** * 对象转数组 key value 并且排序 * @param {*} obj */ objectToArray(obj) { const arrs = []; _.mapKeys(obj, (value, key) => { arrs.push({ key: parseInt(key, 10), value: value }); }); _.sortBy(arrs, (o) => { return o.key; }); return arrs; } } export default new GroupStore();