'use client' import React, { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { useSDK } from '@/lib/sdk' import type { ProjectInfo, CustomerType } from '@/lib/sdk/types' // ============================================================================= // CREATE PROJECT DIALOG // ============================================================================= interface CreateProjectDialogProps { open: boolean onClose: () => void onCreated: (project: ProjectInfo) => void existingProjects: ProjectInfo[] } function CreateProjectDialog({ open, onClose, onCreated, existingProjects }: CreateProjectDialogProps) { const { createProject } = useSDK() const [name, setName] = useState('') const [customerType, setCustomerType] = useState('new') const [copyFromId, setCopyFromId] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState('') if (!open) return null const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!name.trim()) { setError('Projektname ist erforderlich') return } setIsSubmitting(true) setError('') try { const project = await createProject( name.trim(), customerType, copyFromId || undefined ) onCreated(project) setName('') setCopyFromId('') onClose() } catch (err) { setError(err instanceof Error ? err.message : 'Fehler beim Erstellen des Projekts') } finally { setIsSubmitting(false) } } return (
e.stopPropagation()} >

Neues Projekt erstellen

{/* Project Name */}
setName(e.target.value)} placeholder="z.B. KI-Produkt X, SaaS API, Tochter GmbH..." className="w-full px-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 outline-none" autoFocus />
{/* Customer Type */}
{/* Copy from existing project */} {existingProjects.length > 0 && (

Firmenprofil wird kopiert und kann dann unabhaengig bearbeitet werden.

)} {/* Error */} {error && (
{error}
)} {/* Actions */}
) } // ============================================================================= // PROJECT CARD // ============================================================================= function ProjectCard({ project, onClick }: { project: ProjectInfo; onClick: () => void }) { const timeAgo = formatTimeAgo(project.updatedAt) return ( ) } // ============================================================================= // HELPER // ============================================================================= function formatTimeAgo(dateStr: string): string { const date = new Date(dateStr) const now = Date.now() const diff = now - date.getTime() const seconds = Math.floor(diff / 1000) if (seconds < 60) return 'Gerade eben' const minutes = Math.floor(seconds / 60) if (minutes < 60) return `vor ${minutes} Min` const hours = Math.floor(minutes / 60) if (hours < 24) return `vor ${hours} Std` const days = Math.floor(hours / 24) return `vor ${days} Tag${days > 1 ? 'en' : ''}` } // ============================================================================= // MAIN COMPONENT // ============================================================================= export function ProjectSelector() { const router = useRouter() const { listProjects } = useSDK() const [projects, setProjects] = useState([]) const [loading, setLoading] = useState(true) const [showCreateDialog, setShowCreateDialog] = useState(false) useEffect(() => { loadProjects() }, []) const loadProjects = async () => { setLoading(true) try { const result = await listProjects() setProjects(result) } catch (error) { console.error('Failed to load projects:', error) } finally { setLoading(false) } } const handleProjectClick = (project: ProjectInfo) => { router.push(`/sdk?project=${project.id}`) } const handleProjectCreated = (project: ProjectInfo) => { router.push(`/sdk?project=${project.id}`) } return (
{/* Header */}

Ihre Projekte

Waehlen Sie ein Compliance-Projekt oder erstellen Sie ein neues.

{/* Loading */} {loading && (
)} {/* Empty State */} {!loading && projects.length === 0 && (

Noch keine Projekte

Erstellen Sie Ihr erstes Compliance-Projekt, um mit der DSGVO- und AI-Act-Konformitaet zu beginnen.

)} {/* Project Grid */} {!loading && projects.length > 0 && (
{projects.map(project => ( handleProjectClick(project)} /> ))}
)} {/* Create Dialog */} setShowCreateDialog(false)} onCreated={handleProjectCreated} existingProjects={projects} />
) }