"use client"; import { useState, useEffect, Suspense } from "react"; import Navbar from "@/components/Navbar"; import UploadSection from "@/components/UploadSection"; import dynamic from "next/dynamic"; const PanoramaViewer = dynamic(() => import("@/components/PanoramaViewer"), { ssr: false }); import { History as HistoryIcon, Maximize2, Download, Share2, Layers } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; interface Panorama { id: string; url: string; prompt: string; timestamp: Date; } export default function Home() { const [currentPano, setCurrentPano] = useState(null); const [history, setHistory] = useState([]); const [isGenerating, setIsGenerating] = useState(false); useEffect(() => { const saved = localStorage.getItem("pano-history"); if (saved) { try { const parsed = JSON.parse(saved); if (Array.isArray(parsed)) { // Only keep local or known stable URLs const filtered = parsed.filter(item => item.url && ( item.url.startsWith("/") || item.url.startsWith("data:") || item.url.includes("threejs.org") || item.url.includes("polyhaven.org") ) ); setHistory(filtered); if (filtered.length > 0) setCurrentPano(filtered[0]); } } catch (e) { console.error("Failed to load history"); } } }, []); useEffect(() => { if (history.length > 0) { try { // Limit history to last 10 items to save LocalStorage space const limitedHistory = history.slice(0, 10); localStorage.setItem("pano-history", JSON.stringify(limitedHistory)); } catch (e) { console.warn("Storage quota exceeded, history not fully saved"); // If quota exceeded, try saving fewer items try { localStorage.setItem("pano-history", JSON.stringify(history.slice(0, 3))); } catch (innerError) { console.error("Critical storage failure:", innerError); } } } }, [history]); const handleGenerate = async (prompt: string, images: File[]) => { setIsGenerating(true); try { const formData = new FormData(); formData.append("prompt", prompt); images.forEach(img => formData.append("images", img)); const response = await fetch("/api/generate", { method: "POST", body: formData, }); const result = await response.json(); if (!response.ok || !result.success) { throw new Error(result.message || "Failed to generate panorama"); } const newPano = { id: Math.random().toString(36).substr(2, 9), url: result.url, prompt: prompt || "Generated from photos", timestamp: new Date(), }; setCurrentPano(newPano); setHistory(prev => [newPano, ...prev]); } catch (error: any) { console.error("Generate error:", error); alert(`Generation Error: ${error.message}`); } finally { setIsGenerating(false); } }; return (
{/* Left Side - Controls */}
{/* Right Side - Viewer / Gallery */}

Immersive View

{currentPano && (
)}
{currentPano ? ( }> ) : (

No panoramas yet

Upload some photos and start generating your first immersive 360° view.

)}
{/* Gallery Section */}

Your Gallery

{history.length} Creations
{history.length > 0 ? (
{history.map((pano) => ( ))}
) : (

No history available

)}
); }