CheckInStore.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {
  2. APP_CHECKIN_CHECK,
  3. APP_CHECKIN_GET,
  4. } from '../../api';
  5. import { success } from '@scripts/api/ApiHelper';
  6. import { ApiEnvelope, Http } from '../../request';
  7. import { ICheckInData, ICheckInResponseData } from './data';
  8. class CheckInStore {
  9. private _checkInData: ICheckInData = null;
  10. private _nextCheckInTime = 0;
  11. private _canCheckIn = false;
  12. public get checkInData() { return this._checkInData; }
  13. public get nextCheckInTime() { return this._nextCheckInTime; }
  14. public get canCheckIn() { return this._canCheckIn; }
  15. async reqCheckinCheck(): Promise<boolean> {
  16. const res = await Http.call<ICheckInResponseData>(APP_CHECKIN_CHECK);
  17. if (success(res) && res.data) {
  18. this.parseCheckInData(res.data);
  19. return this._canCheckIn;
  20. }
  21. return false;
  22. }
  23. async reqCheckinGet(): Promise<ApiEnvelope> {
  24. const res = await Http.call(APP_CHECKIN_GET);
  25. if (success(res)) {
  26. this._canCheckIn = false;
  27. try {
  28. await this.reqCheckinCheck();
  29. } catch (error) {
  30. console.warn('[CheckInStore] failed to refresh check-in info', error);
  31. }
  32. }
  33. return res;
  34. }
  35. clear() {
  36. this._checkInData = null;
  37. this._nextCheckInTime = 0;
  38. this._canCheckIn = false;
  39. }
  40. private parseCheckInData(data: ICheckInResponseData) {
  41. const config = Array.isArray(data.config) ? data.config : [];
  42. const record = String(data.RecordDay || '');
  43. let signInDay = -1;
  44. const dailyRewards = config.map((item, index) => {
  45. signInDay = Number(item.SignInDay);
  46. return {
  47. dayNumber: Number(item.DayNumber),
  48. rewardScore: Number(item.RewardScore) / 100,
  49. isCheckedIn: Number.parseInt(record.substring(index, index + 1), 10) > 0,
  50. };
  51. });
  52. const seconds = Number(data.seconds || 0);
  53. const nextCheckInTime = seconds > 0 ? Date.now() + seconds * 1000 : 0;
  54. let nextDayNumber = Number(data.NextDayNumber || 0);
  55. let canCheckIn = nextCheckInTime === 0 || Date.now() >= nextCheckInTime;
  56. if (nextDayNumber > 7) {
  57. nextDayNumber = 7;
  58. canCheckIn = false;
  59. }
  60. const parsedLastDate = data.LastDate ? Date.parse(String(data.LastDate)) : 0;
  61. this._checkInData = {
  62. ...data,
  63. dailyRewards,
  64. nDayNumber: signInDay,
  65. LastDate: Number.isFinite(parsedLastDate) ? parsedLastDate : 0,
  66. NextDayNumber: nextDayNumber,
  67. };
  68. this._nextCheckInTime = nextCheckInTime;
  69. this._canCheckIn = canCheckIn;
  70. }
  71. }
  72. export const checkInStore = new CheckInStore();