import { useState, useEffect, useMemo } from 'react' import { FaFolder, FaPlus, FaArrowUpRightFromSquare } from 'react-icons/fa6' import { useWebsiteProjects } from '../hooks/useWebsiteProjects' import { useCustomers } from '../hooks/useCustomers' import { useWorkorders } from '../hooks/useWorkorders' import { createProjectFromTemplate } from '../lib/projectAdminApi' function slugify(value) { return String(value || '') .toLowerCase() .replace(/[^a-z0-9-]+/g, '-') .replace(/^-+|-+$/g, '') .slice(0, 100) } const WORKORDER_FILTERS = { limit: 500 } export default function ProjectsPage() { const { projects, loading, error, fetchAllProjects } = useWebsiteProjects() const { customers } = useCustomers() const { workorders } = useWorkorders(WORKORDER_FILTERS) const [filter, setFilter] = useState('all') const [showCreateModal, setShowCreateModal] = useState(false) const [createForm, setCreateForm] = useState({ displayName: '', subdomain: '', repoName: '', customerId: '', }) const [createLoading, setCreateLoading] = useState(false) const [createError, setCreateError] = useState('') useEffect(() => { fetchAllProjects() }, [fetchAllProjects]) const customerMap = useMemo(() => { const map = {} for (const c of customers) { map[c.$id] = c.name || c.code || c.$id } return map }, [customers]) const ticketMap = useMemo(() => { const map = {} for (const wo of workorders) { map[wo.$id] = wo.woid || wo.$id } return map }, [workorders]) const filteredProjects = useMemo(() => { if (filter === 'unassigned') { return projects.filter((p) => !p.customerId) } if (filter === 'assigned') { return projects.filter((p) => Boolean(p.customerId)) } return projects }, [projects, filter]) const handleCreate = async (e) => { e.preventDefault() setCreateLoading(true) setCreateError('') try { await createProjectFromTemplate({ repoName: createForm.repoName || createForm.subdomain, displayName: createForm.displayName, subdomain: slugify(createForm.subdomain), customerId: createForm.customerId || '', ticketId: '', }) setShowCreateModal(false) setCreateForm({ displayName: '', subdomain: '', repoName: '', customerId: '' }) await fetchAllProjects() } catch (err) { setCreateError(err.message || 'Projekt konnte nicht angelegt werden') } finally { setCreateLoading(false) } } return (

Website-Projekte

{error && (
{error}
)} {loading ? (

Projekte werden geladen...

) : filteredProjects.length === 0 ? (

Keine Projekte gefunden.

) : (
{filteredProjects.map((project) => ( ))}
Name Subdomain Template Kunde Ticket (WOID) Status Preview
{project.projectName} {project.subdomain} {project.templateName || '-'} {project.customerId ? customerMap[project.customerId] || project.customerId : '-'} {project.ticketId ? ticketMap[project.ticketId] || project.ticketId : '-'} {project.status || '-'} {project.previewUrl ? ( Link ) : ( '-' )}
)} {showCreateModal && (
setShowCreateModal(false)}>×

Neues Website-Projekt

{createError && (
{createError}
)}
setCreateForm((p) => ({ ...p, displayName: e.target.value }))} required />
setCreateForm((p) => ({ ...p, subdomain: e.target.value, repoName: p.repoName || slugify(e.target.value), })) } required />
setCreateForm((p) => ({ ...p, repoName: e.target.value }))} />
)}
) }