react-app-shell
Version:
react打包脚本和example, 这里的版本请忽略
259 lines (225 loc) • 6.9 kB
JavaScript
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 {
state = {
loading: false,
userId: '', // 当前登录用户id, 获取团购信息时只用来驱动 joinStatus 变化的, 其他组件不需要依赖
groupId: '', // 当前活动Id
teamId: '', // 当前teamId
serverTime: Date.now(), // 服务器时间
groupStatus: GROUP_STATUS.UNKNOWN, // 团购活动状态: 未知, 未开始, 活动中, 已结束
serviceError: false // 获取团购信息时 接口是否发生异常或者超时
};
/**
* 团购活动数据
* @type {{}}
*/
groupInfo = {};
/**
* 参团信息, 服务端返回teamData可能为空
* @type {{}}
*/
teamData = {};
/**
* 参团/开团 状态
* NOT_JOIN: 'NOT_JOIN', // 未参加过团购, 未登录时无法获取用户身份 所以也判定是未参加团购
* MY_TEAM: 'MY_TEAM', // 自己参加的team
* OTHER_TEAM: 'OTHER_TEAM', // 别人开的team
* SINGLE_BUY: 'SINGLE_BUY', // 单独购买
*/
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;
}
/**
* 当前团人员是否已经满团
*/
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
*/
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>}
*/
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
*/
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();