import type { EquipedItem, Item, ItemId, Quality } from "./types"; export type State = { equipedItems: EquipedItem[]; bisList: ItemId[]; }; export const emptyState: State = { equipedItems: [], bisList: [], }; export type Action = | { action: "equipItem"; item: Item; } | { action: "unequipItem"; item: Item; } | { action: "changeQuality"; itemId: ItemId; quality: Quality; }; export const reducer = (state: State, action: Action): State => { switch (action.action) { case "equipItem": return { ...state, equipedItems: [ ...state.equipedItems, { id: action.item.id, quality: "champion", // Default quality, can be changed later }, ], }; case "unequipItem": return { ...state, equipedItems: state.equipedItems.filter( (item) => item.id !== action.item.id, ), }; case "changeQuality": return { ...state, equipedItems: state.equipedItems.map((item) => { if (item.id === action.itemId) { return { id: item.id, quality: action.quality, }; } return item; }), }; } }; export type LoadingAction = { action: "loadState"; state: S; }; function isLoadingAction( action: A | LoadingAction, ): action is LoadingAction { return (action as LoadingAction).action === "loadState"; } export const withLoadingAction = (reducer: (state: S, action: A) => S) => (state: S | "loading", action: A | LoadingAction): S | "loading" => { if (state !== "loading" && !isLoadingAction(action)) { return reducer(state, action); } if (state === "loading" && isLoadingAction(action)) { return action.state; } return state; };