import { Plus, FolderOpen, Layout, Layers, Settings, Trash2, Minus, Square, X } from 'lucide-react'; import { useAppStore } from '../store'; import { useRef, useState, useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { getCurrentWindow } from '@tauri-apps/api/window'; const appWindow = getCurrentWindow(); interface ProjectEntry { id: string; title: string; element_count: number; saved_at: number; } export const StarterHub = () => { const { setCurrentScreen, setIsSettingsOpen, setImages, setTextNotes, setAnnotations, setPalettes, setZoom, setPan, setActiveProjectId, setBoardTitle } = useAppStore(); const [projects, setProjects] = useState([]); const fileInputRef = useRef(null); const loadProjects = () => invoke('projects_list').then(setProjects).catch(() => {}); useEffect(() => { loadProjects(); }, []); const handleOpenFile = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (ev) => { try { const d = JSON.parse(ev.target?.result as string); if (d.images) setImages(d.images); if (d.textNotes) setTextNotes(d.textNotes); if (d.annotations) setAnnotations(d.annotations); if (d.palettes) setPalettes(d.palettes); if (d.zoom) setZoom(d.zoom); if (d.pan) setPan(d.pan); if (d.title) setBoardTitle(d.title); setCurrentScreen('board'); } catch {} }; reader.readAsText(file); if (e.target) e.target.value = ''; }; const handleNewBoard = async () => { try { const entry = await invoke('project_create', { title: null }); setActiveProjectId(entry.id); setBoardTitle(entry.title); } catch {} setImages([]); setTextNotes([]); setAnnotations([]); setPalettes([]); setZoom(1); setPan({ x: 0, y: 0 }); setCurrentScreen('board'); }; const handleOpenProject = async (project: ProjectEntry) => { try { const json = await invoke('project_load', { id: project.id }); const d = JSON.parse(json); setImages(d.images || []); setTextNotes(d.textNotes || []); setAnnotations(d.annotations || []); setPalettes(d.palettes || []); setZoom(d.zoom || 1); setPan(d.pan || { x: 0, y: 0 }); setBoardTitle(d.title || project.title); setActiveProjectId(project.id); } catch { setImages([]); setTextNotes([]); setAnnotations([]); setPalettes([]); setZoom(1); setPan({ x: 0, y: 0 }); setBoardTitle(project.title); setActiveProjectId(project.id); } setCurrentScreen('board'); }; const handleDeleteProject = async (id: string, e: React.MouseEvent) => { e.stopPropagation(); try { await invoke('project_delete', { id }); } catch {} loadProjects(); }; const timeAgo = (ts: number) => { const diff = Math.floor(Date.now() / 1000) - ts; if (diff < 60) return 'Just now'; if (diff < 3600) return `${Math.floor(diff / 60)}m ago`; if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`; if (diff < 604800) return `${Math.floor(diff / 86400)}d ago`; return new Date(ts * 1000).toLocaleDateString(); }; return (
{/* Top bar */}
{/* Left: Logo */}
Refstudio
{/* Right: Settings + Window controls */}
{/* Content */}
{/* Action buttons */}
{/* Recent projects */}
Recent
{projects.length === 0 ? (

No projects yet

) : (
{projects.map(p => ( ))}
)}
); };