import { RefreshCw } from 'lucide-react'; import { useAppStore } from '@/store/app-store'; // Extracted hooks import { useSpecLoading, useSpecSave, useSpecGeneration } from './spec-view/hooks'; // Extracted components import { SpecHeader, SpecEditor, SpecEmptyState } from './spec-view/components'; // Extracted dialogs import { CreateSpecDialog, RegenerateSpecDialog } from './spec-view/dialogs'; export function SpecView() { const { currentProject, appSpec } = useAppStore(); // Loading state const { isLoading, specExists, isGenerationRunning, loadSpec } = useSpecLoading(); // Save state const { isSaving, hasChanges, saveSpec, handleChange, setHasChanges } = useSpecSave(); // Generation state and handlers const { // Dialog visibility showCreateDialog, setShowCreateDialog, showRegenerateDialog, setShowRegenerateDialog, // Create state projectOverview, setProjectOverview, isCreating, generateFeatures, setGenerateFeatures, analyzeProjectOnCreate, setAnalyzeProjectOnCreate, featureCountOnCreate, setFeatureCountOnCreate, // Regenerate state projectDefinition, setProjectDefinition, isRegenerating, generateFeaturesOnRegenerate, setGenerateFeaturesOnRegenerate, analyzeProjectOnRegenerate, setAnalyzeProjectOnRegenerate, featureCountOnRegenerate, setFeatureCountOnRegenerate, // Feature generation isGeneratingFeatures, // Status currentPhase, errorMessage, // Handlers handleCreateSpec, handleRegenerate, } = useSpecGeneration({ loadSpec }); // Reset hasChanges when spec is reloaded // (This is needed because loadSpec updates appSpec in the store) // No project selected if (!currentProject) { return (

No project selected

); } // Loading state if (isLoading) { return (
); } // Empty state - no spec exists or generation is running // When generation is running, we skip loading the spec to avoid 500 errors, // so we show the empty state with generation indicator if (!specExists || isGenerationRunning) { // If generation is running (from loading hook check), ensure we show the generating UI const showAsGenerating = isCreating || isGenerationRunning; return ( <> setShowCreateDialog(true)} /> ); } // Main view - spec exists return (
setShowRegenerateDialog(true)} onSaveClick={saveSpec} />
); }