Newer
Older
taehui / qwilight-fe / src / avatar / setAvatarStore.ts
@Taehui Taehui on 6 Nov 4 KB 2023-11-06 오후 10:13
import { TFunction } from "i18next";
import { runInAction } from "mobx";
import { sprintf } from "sprintf-js";
import { getMillis } from "taehui-ts/date";

import { Note } from "src/avatar/Avatar";
import { formatText, toDate } from "src/Utility";
import { wwwAXIOS } from "src/Www";
import { GetAvatarAPI, AvatarAPILevel, AvatarAPIWantAvatar } from "src/wwwAPI";

export default function setAvatarStore() {
  let lastMillis = getMillis();

  return {
    input: "",
    wantAvatars: [] as AvatarAPIWantAvatar[],
    avatarID: "",
    avatarName: "",
    avatarIntro: "",
    totalCount: "",
    totalLength: "",
    highestCount: "",
    date: "",
    avatarLevels: [] as number[],
    avatarAbility5K: 0,
    avatarAbility5KClass: 0,
    avatarAbility5KPlace: 0,
    avatarAbility5KCount: 0,
    avatarAbility7K: 0,
    avatarAbility7KClass: 0,
    avatarAbility7KPlace: 0,
    avatarAbility7KCount: 0,
    avatarAbility9K: 0,
    avatarAbility9KClass: 0,
    avatarAbility9KPlace: 0,
    avatarAbility9KCount: 0,
    levels: [] as AvatarAPILevel[],
    lasts: [] as Note[],
    favorites: [] as Note[],
    dateSet: [] as string[],
    dateValues: [] as number[],
    quitStatusValues: [] as number[],
    isLoading: false,

    setInput(input: string) {
      this.input = input;
    },

    async getAvatar(
      t: TFunction,
      { avatarID, avatarName }: { avatarID?: string; avatarName?: string },
    ) {
      this.wantAvatars = [];
      this.avatarID = "";
      if (avatarID || avatarName) {
        const millis = getMillis();
        lastMillis = millis;
        this.isLoading = true;
        const { status, data } = await wwwAXIOS.get<GetAvatarAPI>("/avatar", {
          params: { avatarID, avatarName },
        });
        if (millis >= lastMillis) {
          switch (status) {
            case 200:
              if (Array.isArray(data)) {
                runInAction(() => {
                  this.wantAvatars = data;
                  this.isLoading = false;
                });
              } else {
                runInAction(() => {
                  this.avatarID = data.avatarID;
                  this.avatarName = data.avatarName;
                  this.avatarIntro = data.avatarIntro;
                  this.totalCount = formatText(data.totalCount);
                  this.totalLength = sprintf(
                    t("totalLengthText"),
                    Math.floor(data.totalLength / 1000 / 60 / 60),
                    Math.floor((data.totalLength / 1000 / 60) % 60),
                    Math.floor((data.totalLength / 1000) % 60),
                  );
                  this.highestCount = formatText(data.highestCount);
                  this.date = toDate(data.date);
                  this.avatarLevels = data.avatarLevels;
                  this.levels = data.levels;
                  this.avatarAbility5K = data.avatarAbility5K;
                  this.avatarAbility5KClass = data.avatarAbility5KClass;
                  this.avatarAbility5KPlace = data.avatarAbility5KPlace;
                  this.avatarAbility5KCount = data.avatarAbility5KCount;
                  this.avatarAbility7K = data.avatarAbility7K;
                  this.avatarAbility7KClass = data.avatarAbility7KClass;
                  this.avatarAbility7KPlace = data.avatarAbility7KPlace;
                  this.avatarAbility7KCount = data.avatarAbility7KCount;
                  this.avatarAbility9K = data.avatarAbility9K;
                  this.avatarAbility9KClass = data.avatarAbility9KClass;
                  this.avatarAbility9KPlace = data.avatarAbility9KPlace;
                  this.avatarAbility9KCount = data.avatarAbility9KCount;
                  this.lasts = data.lasts.map((last) => ({
                    ...last,
                    fittedText: toDate(last.date),
                  }));
                  this.favorites = data.favorites.map((favorite) => ({
                    ...favorite,
                    fittedText: sprintf(t("handledUnit"), favorite.totalCount),
                  }));
                  this.dateSet = data.dateSet.map((date) =>
                    new Date(date).toLocaleDateString(),
                  );
                  this.dateValues = data.dateValues;
                  this.quitStatusValues = data.quitStatusValues;
                  this.isLoading = false;
                });
              }
              break;
            case 204:
              this.isLoading = false;
              break;
          }
        }
      }
    },
  };
}