diff --git a/app/manuals/page.tsx b/app/manuals/page.tsx index 13d94a29..9321d46e 100644 --- a/app/manuals/page.tsx +++ b/app/manuals/page.tsx @@ -3,16 +3,10 @@ export const dynamic = "force-dynamic" import { existsSync } from 'fs' import { join } from 'path' import { Metadata } from 'next' -import { PublicInset, PublicPageHeader } from '@/components/public-surface' import { businessConfig } from '@/lib/seo-config' -import { ManualsPageShell } from '@/components/manuals-page-shell' +import { ManualsPageExperience } from '@/components/manuals-page-experience' import { listConvexManuals } from '@/lib/convex-service' -import { - scanManuals, - groupManuals, - getManufacturers, - getCategories, -} from '@/lib/manuals' +import { scanManuals } from '@/lib/manuals' import { selectManualsForSite } from '@/lib/manuals-site-selection' import { generateStructuredData } from '@/lib/seo' import { getManualsThumbnailsRoot } from '@/lib/manuals-paths' @@ -98,11 +92,6 @@ export default async function ManualsPage() { : { ...manual, thumbnailUrl: undefined } }) - // 4. Group and get unique lists - const groupedManuals = groupManuals(manuals) - const manufacturers = getManufacturers(manuals) - const categories = getCategories(manuals) - // Generate structured data for SEO const structuredData = generateStructuredData({ title: 'Vending Machine Manuals', @@ -147,26 +136,7 @@ export default async function ManualsPage() { dangerouslySetInnerHTML={{ __html: JSON.stringify(collectionSchema) }} />
Manufacturer: {data.metadata[0].manufacturer}
-Model: {data.metadata[0].model_number || 'N/A'}
-Type: {data.metadata[0].manual_type}
- {data.metadata[0].specifications?.interfaces && ( -Interfaces: {data.metadata[0].specifications.interfaces.join(', ')}
+Manufacturer: {liveData.metadata[0].manufacturer}
+Model: {liveData.metadata[0].model_number || 'N/A'}
+Type: {liveData.metadata[0].manual_type}
+ {liveData.metadata[0].specifications?.interfaces && ( +Interfaces: {liveData.metadata[0].specifications.interfaces.join(', ')}
)}- Total Schemas: {data.structuredData.length} + Total Schemas: {liveData.structuredData.length}
Schema Types:
@@ -443,7 +466,7 @@ export function ManualsDashboardClient({ data }: ManualsDashboardClientProps) {
Note: Using placeholder embeddings. Ready for production integration.
diff --git a/components/manuals-page-experience.tsx b/components/manuals-page-experience.tsx
new file mode 100644
index 00000000..4c6fbf39
--- /dev/null
+++ b/components/manuals-page-experience.tsx
@@ -0,0 +1,68 @@
+'use client'
+
+import { useEffect, useMemo, useState } from 'react'
+import { PublicInset, PublicPageHeader } from '@/components/public-surface'
+import { ManualsPageShell } from '@/components/manuals-page-shell'
+import { groupManuals, getCategories, getManufacturers } from '@/lib/manuals-catalog'
+import { fetchPublishedManualsCatalog } from '@/lib/manuals-live-catalog'
+import type { Manual } from '@/lib/manuals-types'
+
+interface ManualsPageExperienceProps {
+ initialManuals: Manual[]
+}
+
+export function ManualsPageExperience({ initialManuals }: ManualsPageExperienceProps) {
+ const [manuals, setManuals] = useState(initialManuals)
+
+ useEffect(() => {
+ let cancelled = false
+
+ void (async () => {
+ const liveManuals = await fetchPublishedManualsCatalog()
+ if (cancelled || liveManuals.length === 0) {
+ return
+ }
+
+ setManuals((current) => {
+ if (liveManuals.length === current.length) {
+ return current
+ }
+
+ return liveManuals
+ })
+ })()
+
+ return () => {
+ cancelled = true
+ }
+ }, [])
+
+ const groupedManuals = useMemo(() => groupManuals(manuals), [manuals])
+ const manufacturers = useMemo(() => getManufacturers(manuals), [manuals])
+ const categories = useMemo(() => getCategories(manuals), [manuals])
+
+ return (
+ <>
+