diff --git a/src/pages/ProjectsPage.jsx b/src/pages/ProjectsPage.jsx index aa361b2..b35da03 100644 --- a/src/pages/ProjectsPage.jsx +++ b/src/pages/ProjectsPage.jsx @@ -75,6 +75,16 @@ function typeOf(project) { return 'project' } +// Typen mit Hosting (Subdomain + Deploy) +const HOSTED_TYPES = new Set(['preview', 'website', 'template']) + +// Gleiche Logik wie isPreviewProjectReady im Backend (auth.js): +// nur 'ready'/'deployed' gelten als tatsaechlich gehostet. +function isProjectReady(project) { + const st = String(project.provisioningStatus || project.status || '').toLowerCase() + return ['ready', 'deployed'].includes(st) +} + export default function ProjectsPage() { const { projects, loading, error, fetchAllProjects, assignProjects, unassignProject } = useWebsiteProjects() const { customers } = useCustomers() @@ -93,6 +103,7 @@ export default function ProjectsPage() { const [syncLoading, setSyncLoading] = useState(false) const [notice, setNotice] = useState('') const [assignBusyId, setAssignBusyId] = useState('') + const [hostBusyId, setHostBusyId] = useState('') // Bearbeiten-Modal const [editProject, setEditProject] = useState(null) @@ -194,6 +205,25 @@ export default function ProjectsPage() { setAssignBusyId('') } + const handleHostNow = async (project) => { + setHostBusyId(project.$id) + setNotice('') + try { + // Deploy ueber die vorhandene PATCH-Route anstossen (Typ bleibt gleich) + const r = await updateWebsiteProject(project.$id, { projectType: typeOf(project) }) + setNotice( + r.deploy?.deployed + ? `"${project.projectName}" wird jetzt gehostet${r.previewUrl ? ': ' + r.previewUrl : ''}` + : `Deploy angestossen, aber nicht bestaetigt: ${r.deploy?.error || 'siehe Server-Logs'}` + ) + await fetchAllProjects() + } catch (err) { + setNotice('Hosten fehlgeschlagen: ' + (err.message || 'unbekannt')) + } finally { + setHostBusyId('') + } + } + const openEdit = (project) => { setEditError('') setEditProject(project) @@ -324,7 +354,11 @@ export default function ProjectsPage() { }} > {filteredProjects.map((project) => { - const t = TYPES[typeOf(project)] + const type = typeOf(project) + const t = TYPES[type] + const hosted = HOSTED_TYPES.has(type) + const ready = isProjectReady(project) + const needsHosting = hosted && !ready && !project.archived return (
)}
- - {t.icon} {t.short} - +
+ + {t.icon} {t.short} + + {hosted && !project.archived && ( + + {ready ? 'gehostet' : 'nicht deployt'} + + )} +
@@ -389,7 +430,20 @@ export default function ProjectsPage() { > Bearbeiten - + {needsHosting ? ( + + ) : ( + + )}