ca86b6268c
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 55s
- Fix broken barrel exports in components/game/index.ts - Remove skill system from stores (gameStore, gameActions, gameLoopActions, gameHooks, craftingStore, combat) - Remove skill system from components (page.tsx, LeftPanel, StatsTab, SpellsTab, EnchantmentDesigner, EnchantmentPreparer, GameContext/Provider) - Delete dead code: stats/ directory, attunements/ directory, layout/ Header+TabBar, shared/ StudyProgress+UpgradeDialog duplicates, effects.ts.fix, study-slice.ts, navigation-slice.ts - Delete legacy store/ and store-modules/ directories, redirect remaining callers - Merge root formatting.ts into utils/formatting.ts - Move effects files (dynamic-compute, upgrade-effects, special-effects, upgrade-effects.types) into effects/ directory - Move debug-context.tsx into components/game/debug/ - Create tabs/index.ts barrel for tab components - Fix page.tsx lazy imports to use tabs barrel - Fix all broken import paths across codebase - Remove SKILLS_DEF and skill-evolution references - Trim store.ts to under 400 lines by removing dead skill actions
60 lines
1.9 KiB
TypeScript
Executable File
60 lines
1.9 KiB
TypeScript
Executable File
'use client';
|
|
|
|
import { Button } from '@/components/ui/button';
|
|
import { Progress } from '@/components/ui/progress';
|
|
import { BookOpen, X } from 'lucide-react';
|
|
import { SPELLS_DEF } from '@/lib/game/constants';
|
|
import { formatStudyTime } from '@/lib/game/utils/formatting';
|
|
import type { StudyTarget } from '@/lib/game/types';
|
|
|
|
interface StudyProgressProps {
|
|
currentStudyTarget: StudyTarget | null;
|
|
skills: Record<string, number>;
|
|
studySpeedMult: number;
|
|
cancelStudy: () => void;
|
|
}
|
|
|
|
export function StudyProgress({
|
|
currentStudyTarget,
|
|
skills,
|
|
studySpeedMult,
|
|
cancelStudy,
|
|
}: StudyProgressProps) {
|
|
if (!currentStudyTarget) return null;
|
|
|
|
const target = currentStudyTarget;
|
|
const progressPct = Math.min(100, (target.progress / target.required) * 100);
|
|
const isSkill = target.type === 'skill';
|
|
const def = isSkill ? undefined : SPELLS_DEF[target.id];
|
|
const currentLevel = isSkill ? (skills[target.id] || 0) : 0;
|
|
|
|
return (
|
|
<div className="p-3 rounded border border-purple-600/50 bg-purple-900/20">
|
|
<div className="flex items-center justify-between mb-2">
|
|
<div className="flex items-center gap-2">
|
|
<BookOpen className="w-4 h-4 text-purple-400" />
|
|
<span className="text-sm font-semibold text-purple-300">
|
|
{def?.name ?? target.id}
|
|
{isSkill && ` Lv.${currentLevel + 1}`}
|
|
</span>
|
|
</div>
|
|
<Button
|
|
variant="ghost"
|
|
size="sm"
|
|
className="h-6 w-6 p-0 text-gray-400 hover:text-white"
|
|
onClick={cancelStudy}
|
|
>
|
|
<X className="w-4 h-4" />
|
|
</Button>
|
|
</div>
|
|
<Progress value={progressPct} className="h-2 bg-gray-800" />
|
|
<div className="flex justify-between text-xs text-gray-400 mt-1">
|
|
<span>{formatStudyTime(target.progress)} / {formatStudyTime(target.required)}</span>
|
|
<span>{studySpeedMult.toFixed(1)}x speed</span>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
StudyProgress.displayName = "StudyProgress";
|