import { APP_CHECKIN_CHECK, APP_CHECKIN_GET, success, } from '../../api'; import { ApiEnvelope, Http } from '../../request'; import { ICheckInData, ICheckInResponseData } from './data'; class CheckInStore { private _checkInData: ICheckInData = null; private _nextCheckInTime = 0; private _canCheckIn = false; public get checkInData() { return this._checkInData; } public get nextCheckInTime() { return this._nextCheckInTime; } public get canCheckIn() { return this._canCheckIn; } async reqCheckinCheck(): Promise { const res = await Http.call(APP_CHECKIN_CHECK); if (success(res) && res.data) { this.parseCheckInData(res.data); return this._canCheckIn; } return false; } async reqCheckinGet(): Promise { const res = await Http.call(APP_CHECKIN_GET); if (success(res)) { this._canCheckIn = false; try { await this.reqCheckinCheck(); } catch (error) { console.warn('[CheckInStore] failed to refresh check-in info', error); } } return res; } clear() { this._checkInData = null; this._nextCheckInTime = 0; this._canCheckIn = false; } private parseCheckInData(data: ICheckInResponseData) { const config = Array.isArray(data.config) ? data.config : []; const record = String(data.RecordDay || ''); let signInDay = -1; const dailyRewards = config.map((item, index) => { signInDay = Number(item.SignInDay); return { dayNumber: Number(item.DayNumber), rewardScore: Number(item.RewardScore) / 100, isCheckedIn: Number.parseInt(record.substring(index, index + 1), 10) > 0, }; }); const seconds = Number(data.seconds || 0); const nextCheckInTime = seconds > 0 ? Date.now() + seconds * 1000 : 0; let nextDayNumber = Number(data.NextDayNumber || 0); let canCheckIn = nextCheckInTime === 0 || Date.now() >= nextCheckInTime; if (nextDayNumber > 7) { nextDayNumber = 7; canCheckIn = false; } const parsedLastDate = data.LastDate ? Date.parse(String(data.LastDate)) : 0; this._checkInData = { ...data, dailyRewards, nDayNumber: signInDay, LastDate: Number.isFinite(parsedLastDate) ? parsedLastDate : 0, NextDayNumber: nextDayNumber, }; this._nextCheckInTime = nextCheckInTime; this._canCheckIn = canCheckIn; } } export const checkInStore = new CheckInStore();