fix: resolve 22 remaining issues - type exports, dead code, state mutations, orphaned components
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s

This commit is contained in:
2026-05-18 21:03:43 +02:00
parent a9918e83a6
commit c3a5f333da
31 changed files with 108 additions and 1519 deletions
+48 -29
View File
@@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react';
import React, { useEffect, useState, useCallback } from 'react';
import { useDisciplineStore } from '@/lib/game/stores/discipline-slice';
import type { DisciplineDefinition } from '@/lib/game/types/disciplines';
import { baseDisciplines } from '@/lib/game/data/disciplines/base';
@@ -33,6 +33,10 @@ interface DisciplineCardProps {
drainBase: number;
difficultyFactor: number;
scalingFactor: number;
xp: number;
paused: boolean;
concurrentLimit: number;
onToggle: (id: string, paused: boolean) => void;
}
const DisciplineCard: React.FC<DisciplineCardProps> = ({
@@ -47,14 +51,14 @@ const DisciplineCard: React.FC<DisciplineCardProps> = ({
drainBase,
difficultyFactor,
scalingFactor,
xp,
paused,
concurrentLimit,
onToggle,
}) => {
const activeIds = useDisciplineStore((s) => s.activeIds);
const concurrentLimit = useDisciplineStore((s) => s.concurrentLimit);
const currentDisc = useDisciplineStore((s) => s.disciplines[id] ?? { xp: 0, paused: true });
const displayXp = currentDisc.xp;
const displayXp = xp;
const progressPercent = Math.min(displayXp / Math.max(1, concurrentLimit * 100), 100);
const isPaused = currentDisc.paused;
const isPaused = paused;
const activeStatBonus = calculateStatBonus(baseValue, displayXp, scalingFactor);
const estimatedDrain = calculateManaDrain(drainBase, displayXp, difficultyFactor);
@@ -73,11 +77,7 @@ const DisciplineCard: React.FC<DisciplineCardProps> = ({
}, []);
const toggleAction = () => {
if (isPaused) {
useDisciplineStore.getState().activate(id);
} else {
useDisciplineStore.getState().deactivate(id);
}
onToggle(id, isPaused);
};
return (
@@ -135,7 +135,11 @@ const DisciplineCard: React.FC<DisciplineCardProps> = ({
};
export const DisciplinesTab: React.FC = () => {
const { activeIds, concurrentLimit } = useDisciplineStore();
const activeIds = useDisciplineStore((s) => s.activeIds);
const concurrentLimit = useDisciplineStore((s) => s.concurrentLimit);
const disciplines = useDisciplineStore((s) => s.disciplines);
const activate = useDisciplineStore((s) => s.activate);
const deactivate = useDisciplineStore((s) => s.deactivate);
const [mounted, setMounted] = useState(false);
const [activeAttunement, setActiveAttunement] = useState<string>('base');
@@ -144,6 +148,14 @@ export const DisciplinesTab: React.FC = () => {
setMounted(true);
}, []);
const handleToggle = useCallback((id: string, paused: boolean) => {
if (paused) {
activate(id);
} else {
deactivate(id);
}
}, [activate, deactivate]);
if (!mounted) {
return (
<div className="flex items-center justify-center p-8 text-gray-500">
@@ -177,22 +189,29 @@ export const DisciplinesTab: React.FC = () => {
{/* Discipline cards — only render active tab */}
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{activeTab?.items.map((disc) => (
<DisciplineCard
key={disc.id}
id={disc.id}
name={disc.name}
description={disc.description}
perkThresholds={disc.perks?.map((p) => p.threshold)}
perkValues={disc.perks?.map((p) => p.value)}
perkTypes={disc.perks?.map((p) => p.type)}
statBonus={disc.statBonus.stat}
baseValue={disc.statBonus.baseValue}
drainBase={disc.drainBase}
difficultyFactor={disc.difficultyFactor}
scalingFactor={disc.scalingFactor}
/>
))}
{activeTab?.items.map((disc) => {
const discState = disciplines[disc.id] ?? { xp: 0, paused: true };
return (
<DisciplineCard
key={disc.id}
id={disc.id}
name={disc.name}
description={disc.description}
perkThresholds={disc.perks?.map((p) => p.threshold)}
perkValues={disc.perks?.map((p) => p.value)}
perkTypes={disc.perks?.map((p) => p.type)}
statBonus={disc.statBonus.stat}
baseValue={disc.statBonus.baseValue}
drainBase={disc.drainBase}
difficultyFactor={disc.difficultyFactor}
scalingFactor={disc.scalingFactor}
xp={discState.xp}
paused={discState.paused}
concurrentLimit={concurrentLimit}
onToggle={handleToggle}
/>
);
})}
</div>
{/* Summary info */}