import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import type { Project, ProjectMember, Member, Label } from "@/lib/api"; import { updateProject, deleteProject, getProjectMembers, addProjectMember, removeProjectMember, getMembers, getLabels, createLabel, deleteLabel, } from "@/lib/api"; interface Props { project: Project; onUpdated: (p: Project) => void; } export default function ProjectSettings({ project, onUpdated }: Props) { const navigate = useNavigate(); const [name, setName] = useState(project.name); const [description, setDescription] = useState(project.description || ""); const [repoUrls, setRepoUrls] = useState(project.repo_urls?.join("\n") || ""); const [status, setStatus] = useState(project.status); const [saving, setSaving] = useState(false); const [saved, setSaved] = useState(false); const [confirmDelete, setConfirmDelete] = useState(false); // Members state const [members, setMembers] = useState([]); const [allMembers, setAllMembers] = useState([]); const [loadingMembers, setLoadingMembers] = useState(true); const [selectedMember, setSelectedMember] = useState(""); // Labels state const [labels, setLabels] = useState([]); const [newLabelName, setNewLabelName] = useState(""); const [newLabelColor, setNewLabelColor] = useState("#6366f1"); // Load project members and all members useEffect(() => { const loadMembers = async () => { try { const [projectMembers, allMembersList] = await Promise.all([ getProjectMembers(project.id), getMembers() ]); setMembers(projectMembers); setAllMembers(allMembersList); const projectLabels = await getLabels(project.id); setLabels(projectLabels); } catch (e) { console.error("Failed to load members:", e); } finally { setLoadingMembers(false); } }; loadMembers(); }, [project.slug]); // Get available members for adding (not already in project) const availableMembers = allMembers.filter( (member) => !members.some((pm) => pm.slug === member.slug) ); const handleAddMember = async () => { if (!selectedMember) return; try { await addProjectMember(project.id, selectedMember); const newMember = allMembers.find((m) => m.id === selectedMember); if (newMember) { setMembers([...members, { id: newMember.id, name: newMember.name, slug: newMember.slug, type: newMember.type, role: "member" }]); setSelectedMember(""); } } catch (e) { console.error("Failed to add member:", e); } }; // handleRemoveMember is now inline in agent toggle const handleSave = async () => { setSaving(true); try { const urls = repoUrls.split("\n").map((u) => u.trim()).filter(Boolean); const updated = await updateProject(project.id, { name: name.trim(), description: description.trim() || null, repo_urls: urls, status, }); onUpdated(updated); setSaved(true); setTimeout(() => setSaved(false), 2000); } catch (e) { console.error(e); } finally { setSaving(false); } }; const handleDelete = async () => { try { await deleteProject(project.id); navigate("/"); } catch (e) { console.error(e); } }; return (

Настройки проекта

setName(e.target.value)} className="w-full px-3 py-2 bg-[var(--bg)] border border-[var(--border)] rounded-lg outline-none focus:border-[var(--accent)] text-sm" />