mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 18:57:03 +02:00
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import { produce } from 'immer';
|
|
import { create } from 'zustand';
|
|
import { devtools, persist } from 'zustand/middleware';
|
|
import { CustomColumnDisplay } from '../app/tools/session/components/CustomColumn';
|
|
import { Region } from '../constants/regions';
|
|
import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID';
|
|
import fetchBlitz from '../core/blitz/fetchWargaming';
|
|
import { NormalizedTankStats, TanksStats } from '../types/tanksStats';
|
|
|
|
type Session = (
|
|
| {
|
|
isTracking: false;
|
|
}
|
|
| {
|
|
isTracking: true;
|
|
|
|
region: Region;
|
|
id: number;
|
|
nickname: string;
|
|
tankStats: NormalizedTankStats;
|
|
time: number;
|
|
}
|
|
) & {
|
|
promptBeforeReset: boolean;
|
|
showEmbedPrompt: boolean;
|
|
customColumns: {
|
|
display: CustomColumnDisplay;
|
|
showDelta: boolean;
|
|
}[] & { length: 4 };
|
|
showTotal: boolean;
|
|
showCareer: boolean;
|
|
};
|
|
|
|
export async function setSession(region: Region, id: number, nickname: string) {
|
|
// TODO: generalize this function and also check for more of these kind
|
|
const rawTankStats = (
|
|
await fetchBlitz<TanksStats>(
|
|
`https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`,
|
|
)
|
|
)[id];
|
|
const tankStats = rawTankStats.reduce<NormalizedTankStats>(
|
|
(accumulator, tank) => ({
|
|
...accumulator,
|
|
[tank.tank_id]: tank,
|
|
}),
|
|
{},
|
|
);
|
|
|
|
useSession.setState({
|
|
isTracking: true,
|
|
id,
|
|
region,
|
|
nickname,
|
|
tankStats,
|
|
time: Date.now(),
|
|
});
|
|
}
|
|
|
|
export function resetSession() {
|
|
const session = useSession.getState();
|
|
if (!session.isTracking) return;
|
|
setSession(session.region, session.id, session.nickname);
|
|
}
|
|
|
|
export const useSession = create<Session>()(
|
|
devtools(
|
|
persist(
|
|
(set) => ({
|
|
isTracking: false,
|
|
promptBeforeReset: true,
|
|
showTotal: true,
|
|
showCareer: true,
|
|
showEmbedPrompt: true,
|
|
|
|
customColumns: [
|
|
{ display: 'battles', showDelta: false },
|
|
{ display: 'winrate', showDelta: true },
|
|
{ display: 'wn8', showDelta: false },
|
|
{ display: 'damage', showDelta: true },
|
|
],
|
|
}),
|
|
{
|
|
name: 'session',
|
|
},
|
|
),
|
|
),
|
|
);
|
|
|
|
export default function mutateSession(recipe: (draft: Session) => void) {
|
|
useSession.setState(produce(recipe));
|
|
}
|