mirror of https://github.com/hykilpikonna/AquaDX
[F] Fix userbox
parent
073febe24a
commit
69ab9d96f7
|
@ -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}
|
||||
|
@ -547,8 +494,8 @@
|
|||
|
||||
&.active
|
||||
color: $c-main
|
||||
|
||||
img
|
||||
|
||||
img
|
||||
width: 100%
|
||||
height: auto
|
||||
|
||||
|
@ -596,12 +543,12 @@
|
|||
img
|
||||
width: auto
|
||||
height: 100%
|
||||
|
||||
|
||||
|
||||
.nameplate
|
||||
position: relative
|
||||
width: 400px
|
||||
|
||||
|
||||
> .trophy
|
||||
position: absolute
|
||||
top: 10px
|
||||
|
@ -646,28 +593,28 @@
|
|||
gap: 12px
|
||||
width: 100%
|
||||
flex-grow: 0
|
||||
|
||||
|
||||
label
|
||||
display: flex
|
||||
flex-direction: column
|
||||
|
||||
select
|
||||
width: 100%
|
||||
|
||||
|
||||
.field
|
||||
display: flex
|
||||
flex-direction: column
|
||||
width: 100%
|
||||
|
||||
|
||||
label
|
||||
max-width: max-content
|
||||
|
||||
|
||||
> div:not(.bool)
|
||||
display: flex
|
||||
align-items: center
|
||||
gap: 1rem
|
||||
margin-top: 0.5rem
|
||||
|
||||
|
||||
> select
|
||||
flex: 1
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Reference in New Issue