diff --git a/src/components/ExportPage.tsx b/src/components/ExportPage.tsx
index 897b20b..682240f 100644
--- a/src/components/ExportPage.tsx
+++ b/src/components/ExportPage.tsx
@@ -3,28 +3,29 @@ import { Check, AlertTriangle, FileText, FolderTree, ChevronDown, Download, Pack
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'
import { AppLayout } from '@/components/AppLayout'
-import { loadProductData, hasExportZip, getExportZipUrl } from '@/lib/product-loader'
+import { useProductData } from '@/lib/use-product-data'
+import { hasExportZip, getExportZipUrl } from '@/lib/product-loader'
import { getAllSectionIds, getSectionScreenDesigns } from '@/lib/section-loader'
export function ExportPage() {
- const productData = useMemo(() => loadProductData(), [])
+ const { productData, loading } = useProductData()
// Get section stats
const sectionStats = useMemo(() => {
const allSectionIds = getAllSectionIds()
- const sectionCount = productData.roadmap?.sections.length || 0
+ const sectionCount = productData?.roadmap?.sections.length || 0
const sectionsWithScreenDesigns = allSectionIds.filter(id => {
const screenDesigns = getSectionScreenDesigns(id)
return screenDesigns.length > 0
}).length
return { sectionCount, sectionsWithScreenDesigns, allSectionIds }
- }, [productData.roadmap])
+ }, [productData?.roadmap])
- const hasOverview = !!productData.overview
- const hasRoadmap = !!productData.roadmap
- const hasDataModel = !!productData.dataModel
- const hasDesignSystem = !!productData.designSystem
- const hasShell = !!productData.shell
+ const hasOverview = !!productData?.overview
+ const hasRoadmap = !!productData?.roadmap
+ const hasDataModel = !!productData?.dataModel
+ const hasDesignSystem = !!productData?.designSystem
+ const hasShell = !!productData?.shell
const hasSections = sectionStats.sectionsWithScreenDesigns > 0
const requiredComplete = hasOverview && hasRoadmap && hasSections
@@ -33,6 +34,23 @@ export function ExportPage() {
const exportZipAvailable = hasExportZip()
const exportZipUrl = getExportZipUrl()
+ if (loading) {
+ return (
+
+
+
+
+ Export
+
+
+ Loading...
+
+
+
+
+ )
+ }
+
return (
diff --git a/src/components/PhaseNav.tsx b/src/components/PhaseNav.tsx
index 9f87618..bf9ee66 100644
--- a/src/components/PhaseNav.tsx
+++ b/src/components/PhaseNav.tsx
@@ -1,7 +1,8 @@
import { useLocation, useNavigate } from 'react-router-dom'
import { useMemo } from 'react'
import { FileText, Boxes, Layout, LayoutList, Package } from 'lucide-react'
-import { loadProductData, hasExportZip } from '@/lib/product-loader'
+import { useProductData } from '@/lib/use-product-data'
+import { hasExportZip } from '@/lib/product-loader'
import { getAllSectionIds, getSectionScreenDesigns } from '@/lib/section-loader'
export type Phase = 'product' | 'data-model' | 'design' | 'sections' | 'export'
@@ -29,16 +30,16 @@ interface PhaseInfo {
isComplete: boolean
}
-function usePhaseStatuses(): PhaseInfo[] {
+function usePhaseStatuses(): { phaseInfos: PhaseInfo[]; loading: boolean } {
const location = useLocation()
- const productData = useMemo(() => loadProductData(), [])
+ const { productData, loading } = useProductData()
// Calculate completion status for each phase
- const hasOverview = !!productData.overview
- const hasRoadmap = !!productData.roadmap
- const hasDataModel = !!productData.dataModel
- const hasDesignSystem = !!productData.designSystem
- const hasShell = !!productData.shell
+ const hasOverview = !!productData?.overview
+ const hasRoadmap = !!productData?.roadmap
+ const hasDataModel = !!productData?.dataModel
+ const hasDesignSystem = !!productData?.designSystem
+ const hasShell = !!productData?.shell
const sectionIds = useMemo(() => getAllSectionIds(), [])
const sectionsWithScreenDesigns = useMemo(() => {
@@ -74,7 +75,7 @@ function usePhaseStatuses(): PhaseInfo[] {
'export': exportZipExists,
}
- return phases.map(phase => {
+ const phaseInfos = phases.map(phase => {
const isComplete = phaseComplete[phase.id]
let status: PhaseStatus
if (phase.id === currentPhaseId) {
@@ -86,11 +87,41 @@ function usePhaseStatuses(): PhaseInfo[] {
}
return { phase, status, isComplete }
})
+
+ return { phaseInfos, loading }
}
export function PhaseNav() {
const navigate = useNavigate()
- const phaseInfos = usePhaseStatuses()
+ const { phaseInfos, loading } = usePhaseStatuses()
+
+ if (loading) {
+ return (
+
+ )
+ }
return (