[F] Fix userbox

pull/96/head
Azalea 2024-12-17 20:09:48 -05:00
parent 073febe24a
commit 69ab9d96f7
3 changed files with 40 additions and 117 deletions

View File

@ -4,7 +4,6 @@
import {
UserBoxItemKind,
type AquaNetUser,
type ChangeUserBoxReq,
} from "../libs/generalTypes";
import { USER, USERBOX } from "../libs/sdk";
import { t, ts } from "../libs/i18n";
@ -15,7 +14,6 @@
import Icon from "@iconify/svelte";
let user: AquaNetUser;
let aimeId = "";
let loading = true;
let error = "";
let submitting = "";
@ -137,28 +135,20 @@
back: undefined,
} as Record<string, number | undefined>;
function submit(body: ChangeUserBoxReq, field: string) {
if (submitting) return;
submitting = body.kind;
function submit(obj: { field: string; value: string }) {
if (submitting) return
submitting = obj.field
USERBOX.setUserBox(body)
.then(() => {
changed = changed.filter((c) => c !== field);
})
.catch((e) => {
error = e.message;
submitting = "";
})
.finally(() => {
submitting = "";
});
USERBOX.setUserBox(obj)
.then(() => changed = changed.filter((c) => c !== obj.field))
.catch(e => error = e.message)
.finally(() => submitting = "")
}
async function fetchData() {
const currentValues = await USERBOX.getProfile(aimeId).catch((e) => {
const currentValues = await USERBOX.getProfile().catch((e) => {
loading = false;
error = t("userbox.error.noprofile")
return;
});
if(!currentValues) return;
@ -189,7 +179,7 @@
await Promise.all(
userBoxItems.map(async (kind) => {
// Populate info about the items
return USERBOX.getUnlockedItems(aimeId, kind).then((items) => {
return USERBOX.getUnlockedItems(kind).then((items) => {
switch (kind) {
case UserBoxItemKind.nameplate:
// Add the item id and the label to the available options
@ -291,65 +281,22 @@
loading = false;
}
const kindMap: Record<string, string> =
{ nameplate: "nameplateId", frame: "frameId", trophy: "trophyId", mapicon: "mapIconId", voice: "voiceId" }
const categories = ["wear", "head", "face", "skin", "item", "front", "back"]
function generateBodyFromKind(
kind:
| "frame"
| "nameplate"
| "trophy"
| "mapicon"
| "voice"
| "wear"
| "head"
| "face"
| "skin"
| "item"
| "front"
| "back",
kind: "frame" | "nameplate" | "trophy" | "mapicon" | "voice" | "wear" | "head" | "face" | "skin" | "item" | "front" | "back",
value: number,
aimeId: string,
): ChangeUserBoxReq {
switch (kind) {
case "frame":
return { kind: "frame", frameId: value, aimeId };
case "nameplate":
return { kind: "plate", nameplateId: value, aimeId };
case "trophy":
return { kind: "trophy", trophyId: value, aimeId };
case "mapicon":
return { kind: "mapicon", mapiconid: value, aimeId };
case "voice":
return { kind: "sysvoice", voiceId: value, aimeId };
case "wear":
return { kind: "avatar", accId: value, category: 1, aimeId };
case "head":
return { kind: "avatar", accId: value, category: 2, aimeId };
case "face":
return { kind: "avatar", accId: value, category: 3, aimeId };
case "skin":
return { kind: "avatar", accId: value, category: 4, aimeId };
case "item":
return { kind: "avatar", accId: value, category: 5, aimeId };
case "front":
return { kind: "avatar", accId: value, category: 6, aimeId };
case "back":
return { kind: "avatar", accId: value, category: 7, aimeId };
}
) {
if (kind in kindMap) return { field: kindMap[kind], value: `${value}` }
return { field: "avatar", value: `${categories.indexOf(kind) + 1}:${value}` }
}
USER.me().then((u) => {
if (u) {
user = u;
const card = user.cards.length > 0 ? user.cards[0].luid : "";
aimeId = card;
if (aimeId) {
fetchData();
} else {
loading = false;
}
}
});
USER.me().then(u => {
if (!u) throw new Error(t("userbox.error.noprofile"))
user = u
fetchData()
}).catch((e) => { loading = false; error = e.message });
</script>
{#if !loading && !error}
@ -402,7 +349,7 @@
if (newValue === undefined) return;
submit(generateBodyFromKind(key, newValue, aimeId), key);
submit(generateBodyFromKind(key, newValue));
}}
>
{#if submitting === key}

View File

@ -173,18 +173,4 @@ export enum UserBoxItemKind {
}
// Define type only with the keys
export type UserBoxItemKindStr = keyof typeof UserBoxItemKind;
type ChangePlateReq = {kind:'plate', nameplateId:number}
type ChangeFrameReq = {kind:'frame', frameId:number}
type ChangeTrophyReq = {kind:'trophy',trophyId:number}
type ChangeMapIconReq = {kind:'mapicon',mapiconid:number}
type ChangeVoiceReq = {kind:'sysvoice',voiceId:number}
type ChangeAvatarReq = {
kind:'avatar',
accId:number,
category:number
}
export type ChangeUserBoxReq = {aimeId:string} & (ChangePlateReq | ChangeFrameReq | ChangeTrophyReq | ChangeMapIconReq | ChangeVoiceReq | ChangeAvatarReq);
export type UserBoxItemKindStr = keyof typeof UserBoxItemKind

View File

@ -8,7 +8,6 @@ import type {
TrendEntry,
AquaNetUser, GameOption,
UserBox,
ChangeUserBoxReq,
UserBoxItemKind
} from './generalTypes'
import type { GameName } from './scoring'
@ -94,6 +93,7 @@ export async function post(endpoint: string, params: Record<string, any> = {}, i
export async function get(endpoint: string, params:any,init?: RequestInitWithParams): Promise<any> {
// Add token if exists
const token = localStorage.getItem('token')
if (token && !('token' in params)) params = { ...(params ?? {}), token }
if (init?.localCache) {
const cached = cache[endpoint + JSON.stringify(init)]
@ -262,23 +262,13 @@ export const USER = {
}
export const USERBOX = {
getAimeId:(cardId:string):Promise<{luid:string}|null> =>realPost('/api/sega/aime/getByAccessCode',{ accessCode:cardId }),
getProfile:(aimeId:string):Promise<UserBox> =>get('/api/game/chuni/v2/profile',{ aimeId }),
getUnlockedItems:(aimeId:string, itemId: UserBoxItemKind):Promise<{itemKind:number, itemId:number,stock:number,isValid:boolean}[]> =>
get(`/api/game/chuni/v2/item/${itemId}`,{ aimeId }),
getItemLabels:() => {
const kinds = [ 'nameplate', 'frame', 'trophy', 'mapicon', 'sysvoice', 'avatar' ]
return Promise.all(kinds.map(it =>
get(`/api/game/chuni/v2/data/${it}`,{}).then((res:{id:number,name:string}[]) =>
// Use the id as the key
res.reduce((acc, cur) => ({ ...acc, [cur.id]: cur.name }), {}) as { [index: number]: string }
))).then(([ nameplate, frame, trophy, mapicon, sysvoice, avatar ]) => ({
nameplate, frame, trophy, mapicon, sysvoice, avatar
}))
},
setUserBox:({ kind,...body }:ChangeUserBoxReq) =>
put(`/api/game/chuni/v2/profile/${kind}`, body),
getProfile: (): Promise<UserBox> =>
get('/api/v2/game/chu3/user-box', {}),
getUnlockedItems: (itemId: UserBoxItemKind): Promise<{ itemKind: number, itemId: number, stock: number, isValid: boolean }[]> =>
get(`/api/v2/game/chu3/user-box-item-by-kind`,{ itemId }),
getItemLabels: () => get(`/api/v2/game/chu3/user-box-all-items`, {}),
setUserBox: (d: { field: string, value: number | string }) =>
post(`/api/v2/game/chu3/user-detail-set`, d),
}
export const CARD = {