import { useState, useEffect, useCallback } from 'react' import { FaExternalLinkAlt, FaPlus, FaTrash } from 'react-icons/fa' import { useWebsiteProjects } from '../hooks/useWebsiteProjects' import { createProjectFromTemplate } from '../lib/projectAdminApi' import { WEBPAGE_TICKET_TYPE } from '../lib/appwrite' function slugify(v) { return String(v || '').toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 100) } export default function WebpageProjectPanel({ ticket }) { const { fetchAllProjects, fetchByTicketId, getAvailableProjects, assignProjects, unassignProject } = useWebsiteProjects() const [assigned, setAssigned] = useState([]) const [available, setAvailable] = useState([]) const [selectedIds, setSelectedIds] = useState([]) const [loading, setLoading] = useState(true) const [actionLoading, setActionLoading] = useState(false) const [error, setError] = useState('') const [createForm, setCreateForm] = useState({ displayName: '', subdomain: '', repoName: '' }) const loadProjects = useCallback(async () => { if (!ticket?.$id || ticket.type !== WEBPAGE_TICKET_TYPE) return setLoading(true) setError('') try { const [all, mine] = await Promise.all([fetchAllProjects(), fetchByTicketId(ticket.$id)]) setAssigned(mine) const ids = new Set(mine.map((p) => p.$id)) setAvailable(getAvailableProjects(all, ticket.customerId).filter((p) => !ids.has(p.$id))) } catch (err) { setError(err.message) } finally { setLoading(false) } }, [ticket, fetchAllProjects, fetchByTicketId, getAvailableProjects]) useEffect(() => { loadProjects() }, [loadProjects]) if (ticket?.type !== WEBPAGE_TICKET_TYPE) return null const handleAssign = async () => { if (!selectedIds.length || !ticket.customerId) return setActionLoading(true) const r = await assignProjects(selectedIds, { customerId: ticket.customerId, ticketId: ticket.$id }) setActionLoading(false) if (r.success) { setSelectedIds([]); await loadProjects() } else setError(r.error) } const handleCreate = async (e) => { e.preventDefault() if (!ticket.customerId) { setError('Kein Kunde am Ticket.'); return } setActionLoading(true) setError('') try { await createProjectFromTemplate({ repoName: createForm.repoName || createForm.subdomain, displayName: createForm.displayName, subdomain: slugify(createForm.subdomain), customerId: ticket.customerId, ticketId: ticket.$id, }) setCreateForm({ displayName: '', subdomain: '', repoName: '' }) await loadProjects() } catch (err) { setError(err.message) } finally { setActionLoading(false) } } return (
Website-Projekte
{error &&
{error}
} {loading ?

Laden...

: ( <>
Zugewiesen
{assigned.length === 0 ?

Keine Projekte.

: assigned.map((p) => (
{p.projectName} ({p.subdomain}) {p.previewUrl && }
))}
Verfügbar zuweisen
{available.map((p) => ( ))}
Neues Projekt
setCreateForm((f) => ({ ...f, displayName: e.target.value }))} required /> setCreateForm((f) => ({ ...f, subdomain: e.target.value, repoName: f.repoName || slugify(e.target.value) }))} required />
)}
) }