Fix LeftPanel.tsx to use modular stores instead of legacy useGameStore
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m22s

- Added useCraftingStore import for crafting progress fields
- Changed spireMode/enterSpireMode to useCombatStore
- Changed currentStudyTarget to useSkillStore
- Changed crafting progress fields to useCraftingStore
- Added useCraftingStore export to stores/index.ts
- Kept useGameStore only for gatherMana, day, hour
This commit is contained in:
Refactoring Agent
2026-05-05 11:10:33 +02:00
parent 235bc09856
commit dc1aad3700
7 changed files with 42 additions and 28 deletions
+13 -10
View File
@@ -7,7 +7,7 @@ import { ManaDisplay } from '@/components/game';
import { ActionButtons } from '@/components/game';
import { CalendarDisplay } from '@/components/game';
import { DebugName } from '@/lib/game/debug-context';
import { useGameStore, useManaStore, useSkillStore, useCombatStore } from '@/lib/game/stores';
import { useGameStore, useManaStore, useSkillStore, useCombatStore, useCraftingStore } from '@/lib/game/stores';
import { getUnifiedEffects } from '@/lib/game/effects';
import { computeMaxMana, computeClickMana, getMeditationBonus } from '@/lib/game/stores';
@@ -24,18 +24,21 @@ export function LeftPanel() {
const skillUpgrades = useSkillStore((s) => s.skillUpgrades);
const gatherMana = useGameStore((s) => s.gatherMana);
const spireMode = useGameStore((s) => s.spireMode);
const currentAction = useCombatStore((s) => s.currentAction);
const currentStudyTarget = useGameStore((s) => s.currentStudyTarget);
const designProgress = useGameStore((s) => s.designProgress);
const designProgress2 = useGameStore((s) => s.designProgress2);
const preparationProgress = useGameStore((s) => s.preparationProgress);
const applicationProgress = useGameStore((s) => s.applicationProgress);
const equipmentCraftingProgress = useGameStore((s) => s.equipmentCraftingProgress);
const enterSpireMode = useGameStore((s) => s.enterSpireMode);
const day = useGameStore((s) => s.day);
const hour = useGameStore((s) => s.hour);
const spireMode = useCombatStore((s) => s.spireMode);
const enterSpireMode = useCombatStore((s) => s.enterSpireMode);
const currentAction = useCombatStore((s) => s.currentAction);
const currentStudyTarget = useSkillStore((s) => s.currentStudyTarget);
const designProgress = useCraftingStore((s) => s.designProgress);
const designProgress2 = useCraftingStore((s) => s.designProgress2);
const preparationProgress = useCraftingStore((s) => s.preparationProgress);
const applicationProgress = useCraftingStore((s) => s.applicationProgress);
const equipmentCraftingProgress = useCraftingStore((s) => s.equipmentCraftingProgress);
const handleGatherStart = () => {
setIsGathering(true);
gatherMana();
@@ -1,13 +1,12 @@
'use client';
import { EquipmentSlot } from '@/lib/game/data/equipment';
import type { GameStore } from '@/lib/game/types';
// GameStore import removed - not used
import { ActionButton } from '@/components/ui/action-button';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
import { X } from 'lucide-react';
interface EquipmentControlsProps {
store: GameStore;
onUnequip: (slot: EquipmentSlot) => void;
onDelete: (instanceId: string, name: string) => void;
selectedSlot: EquipmentSlot | null;
@@ -17,7 +16,6 @@ interface EquipmentControlsProps {
}
export function EquipmentControls({
store,
onUnequip,
onDelete,
selectedSlot,
@@ -3,7 +3,7 @@
import { useState } from 'react';
import { EquipmentSlot } from '@/lib/game/data/equipment';
import { EQUIPMENT_TYPES } from '@/lib/game/data/equipment';
import type { GameStore, EquipmentInstance } from '@/lib/game/types';
import type { EquipmentInstance } from '@/lib/game/types';
import { GameCard } from '@/components/ui/game-card';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
@@ -17,7 +17,6 @@ import {
import { EnchantmentsPanel } from './EnchantmentsPanel';
interface EquipmentInventoryProps {
store: GameStore;
unequippedItems: EquipmentInstance[];
onEquip: (instanceId: string, slot: EquipmentSlot) => void;
onDelete: (instanceId: string, name: string) => void;
@@ -27,7 +26,6 @@ interface EquipmentInventoryProps {
}
export function EquipmentInventory({
store,
unequippedItems,
onEquip,
onDelete,
@@ -1,8 +1,8 @@
'use client';
import { EquipmentSlot } from '@/lib/game/data/equipment';
import { SLOT_NAMES } from '@/lib/game/data/equipment';
import type { GameStore, EquipmentInstance } from '@/lib/game/types';
import { SLOT_NAMES, EQUIPMENT_TYPES } from '@/lib/game/data/equipment';
import type { EquipmentInstance } from '@/lib/game/types';
import { GameCard } from '@/components/ui/game-card';
import { Badge } from '@/components/ui/badge';
import { AlertCircle, Sword, Shield, HardHat, Shirt, Hand, Footprints, Gem } from 'lucide-react';
@@ -23,7 +23,8 @@ const SLOT_ICONS: Record<EquipmentSlot, React.ElementType> = {
};
interface EquipmentSlotGridProps {
store: GameStore;
equippedInstances: Record<string, string | null>;
equipmentInstances: Record<string, EquipmentInstance>;
selectedSlot: EquipmentSlot | null;
onSlotClick: (slot: EquipmentSlot) => void;
onUnequip: (slot: EquipmentSlot) => void;
@@ -32,7 +33,8 @@ interface EquipmentSlotGridProps {
}
export function EquipmentSlotGrid({
store,
equippedInstances,
equipmentInstances,
selectedSlot,
onSlotClick,
onUnequip,
@@ -40,9 +42,9 @@ export function EquipmentSlotGrid({
SLOT_GROUPS,
}: EquipmentSlotGridProps) {
const renderSlot = (slot: EquipmentSlot) => {
const instanceId = store.equippedInstances[slot];
const instance = instanceId ? store.equipmentInstances[instanceId] : null;
const equipmentType = instance ? (store as any).EQUIPMENT_TYPES?.[instance.typeId] : null;
const instanceId = equippedInstances[slot];
const instance = instanceId ? equipmentInstances[instanceId] : null;
const equipmentType = instance ? EQUIPMENT_TYPES?.[instance.typeId] : null;
const blocked = isSlotBlocked(slot);
const isEmpty = !instance;
const SlotIcon = SLOT_ICONS[slot];
+2 -1
View File
@@ -15,6 +15,7 @@ import {
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { ScrollArea } from '@/components/ui/scroll-area';
import { fmt } from '@/lib/game/stores';
export function PrestigeTab() {
@@ -51,7 +52,7 @@ export function PrestigeTab() {
const effect = upgradeEffects ? upgradeEffects.specials.has(id) : false;
return (
<Card key={id} className={effect ? "border-[var(--color-success)]/50 bg-[var(--color-success)]/10" : "bg-gray-900/80 border-gray-700">
<Card key={id} className={effect ? "border-[var(--color-success)]/50 bg-[var(--color-success)]/10" : "bg-gray-900/80 border-gray-700"}>
<CardHeader>
<CardTitle className="text-sm flex items-center gap-2">
<span>{def.name}</span>
+11
View File
@@ -20,6 +20,9 @@ export interface CombatState {
currentAction: GameAction;
castProgress: number;
// Spire mode
spireMode: boolean;
// Spells
spells: Record<string, SpellState>;
@@ -37,6 +40,9 @@ export interface CombatState {
learnSpell: (spellId: string) => void;
setSpellState: (spellId: string, state: Partial<SpellState>) => void;
// Spire mode
enterSpireMode: () => void;
// Combat tick
processCombatTick: (
skills: Record<string, number>,
@@ -62,6 +68,7 @@ export const useCombatStore = create<CombatState>()(
activeSpell: 'manaBolt',
currentAction: 'meditate',
castProgress: 0,
spireMode: false,
spells: {
manaBolt: { learned: true, level: 1, studyProgress: 0 },
},
@@ -112,6 +119,10 @@ export const useCombatStore = create<CombatState>()(
set({ castProgress: progress });
},
enterSpireMode: () => {
set({ spireMode: true });
},
learnSpell: (spellId: string) => {
set((state) => ({
spells: {
+5 -4
View File
@@ -1,4 +1,4 @@
// ─── Store Index ──────────────────────────────────────────────────────────────
// ─── Store Index ──────────────────────────────────────────
// Exports all stores and re-exports commonly used utilities
// Stores
@@ -17,6 +17,9 @@ export type { SkillState } from './skillStore';
export { useCombatStore, makeInitialSpells } from './combatStore';
export type { CombatState } from './combatStore';
export { useCraftingStore } from './craftingStore';
export type { CraftingState, CraftingActions } from './craftingStore';
export { useGameStore } from './gameStore';
export { useGameLoop } from './gameHooks';
export type { GameCoordinatorState, GameCoordinatorStore } from './gameStore';
@@ -31,16 +34,14 @@ export {
computeRegen,
computeEffectiveRegen,
computeClickMana,
getElementalBonus,
getMeditationBonus,
getBoonBonuses,
calcDamage,
calcInsight,
getMeditationBonus,
getIncursionStrength,
canAffordSpellCost,
deductSpellCost,
} from '../utils';
export { computeElementMax } from '../store-modules/computed-stats';
export { getStudySpeedMultiplier, getStudyCostMultiplier } from '../constants';