23a83a04cf
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m17s
- Fixed DisciplinesAttunementType enum usage in discipline data files - Fixed EquipmentSlot import in equipment/types.ts - Fixed enchantment-effects.ts export/import chain - Fixed safe-persist.ts StateStorage type compatibility - Fixed store persist partial return types for all stores - Fixed gameStore.ts ElementState type and error handling - Fixed useGameDerived.ts missing properties on GameCoordinatorStore - Added SkillUpgradeChoice type to types.ts - Fixed ActionButtons.tsx optional currentStudyTarget prop - Fixed GameToast.tsx Toast type compatibility - Fixed EnchantmentDesigner sub-component type mismatches - Fixed SpireCombatPage equippedInstances/equipmentInstances types - Fixed page.tsx computeClickMana argument - Added baseCastTime to SpellDef type - Fixed golem/types.ts and loot-drops.ts import paths - Fixed craftingStore.ts missing lastError in initial state and actions - Fixed store-actions-combat-prestige.test.ts Memory type usage - Fixed floor-utils.upgraded.test.ts array type annotation - Fixed computed-stats.test.ts state type assertions - Fixed activity-log.test.ts state type annotation - Fixed discipline-math.test.ts enum value usage - Fixed game-loop.test.ts vitest mock import - Various other test file type fixes
72 lines
1.9 KiB
TypeScript
Executable File
72 lines
1.9 KiB
TypeScript
Executable File
// ─── UI Store ────────────────────────────────────────────────────────────────
|
|
// Handles logs, pause state, and UI-specific state
|
|
|
|
import { create } from 'zustand';
|
|
import { persist } from 'zustand/middleware';
|
|
import { createSafeStorage } from '../utils/safe-persist';
|
|
|
|
export interface LogEntry {
|
|
message: string;
|
|
timestamp: number;
|
|
}
|
|
|
|
export interface UIState {
|
|
logs: string[];
|
|
paused: boolean;
|
|
gameOver: boolean;
|
|
victory: boolean;
|
|
|
|
// Actions
|
|
addLog: (message: string) => void;
|
|
clearLogs: () => void;
|
|
togglePause: () => void;
|
|
setPaused: (paused: boolean) => void;
|
|
setGameOver: (gameOver: boolean, victory?: boolean) => void;
|
|
reset: () => void;
|
|
}
|
|
|
|
const MAX_LOGS = 50;
|
|
|
|
export const useUIStore = create<UIState>()(
|
|
persist(
|
|
(set) => ({
|
|
logs: ['✨ The loop begins. You start with Mana Bolt. Gather your strength, mage.'],
|
|
paused: false,
|
|
gameOver: false,
|
|
victory: false,
|
|
|
|
addLog: (message: string) => {
|
|
set((state) => ({
|
|
logs: [message, ...state.logs.slice(0, MAX_LOGS - 1)],
|
|
}));
|
|
},
|
|
|
|
clearLogs: () => {
|
|
set({ logs: [] });
|
|
},
|
|
|
|
togglePause: () => {
|
|
set((state) => ({ paused: !state.paused }));
|
|
},
|
|
|
|
setPaused: (paused: boolean) => {
|
|
set({ paused });
|
|
},
|
|
|
|
setGameOver: (gameOver: boolean, victory: boolean = false) => {
|
|
set({ gameOver, victory });
|
|
},
|
|
|
|
reset: () => {
|
|
set({
|
|
logs: ['✨ The loop begins. You start with Mana Bolt. Gather your strength, mage.'],
|
|
paused: false,
|
|
gameOver: false,
|
|
victory: false,
|
|
});
|
|
},
|
|
}),
|
|
{ storage: createSafeStorage(), name: 'mana-loop-ui-storage', partialize: (state) => ({ logs: state.logs, paused: state.paused, gameOver: state.gameOver, victory: state.victory }) }
|
|
)
|
|
);
|