diff --git a/src/components/AgentModal.tsx b/src/components/AgentModal.tsx index dd7c0e7..18e5148 100644 --- a/src/components/AgentModal.tsx +++ b/src/components/AgentModal.tsx @@ -28,7 +28,7 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { setSaving(true); try { const caps = capabilities.split(",").map((c) => c.trim()).filter(Boolean); - const updated = await updateMember(agent.slug, { + const updated = await updateMember(agent.id, { name: name.trim(), agent_config: { capabilities: caps, @@ -49,7 +49,7 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { const handleRegenerate = async () => { try { - const { token } = await regenerateToken(agent.slug); + const { token } = await regenerateToken(agent.id); setCurrentToken(token); setConfirmRegen(false); } catch (e) { @@ -59,7 +59,7 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { const handleRevoke = async () => { try { - await revokeToken(agent.slug); + await revokeToken(agent.id); setCurrentToken(null); setConfirmRevoke(false); } catch (e) { diff --git a/src/components/ChatPanel.tsx b/src/components/ChatPanel.tsx index 4acc1c2..5c45679 100644 --- a/src/components/ChatPanel.tsx +++ b/src/components/ChatPanel.tsx @@ -22,7 +22,7 @@ interface StreamingState { interface Props { chatId: string; - projectSlug?: string; + projectId?: string; } function formatFileSize(bytes: number): string { @@ -35,7 +35,7 @@ function isImageMime(mime: string | null): boolean { return !!mime && mime.startsWith("image/"); } -export default function ChatPanel({ chatId, projectSlug }: Props) { +export default function ChatPanel({ chatId, projectId }: Props) { const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [sending, setSending] = useState(false); @@ -399,7 +399,7 @@ export default function ChatPanel({ chatId, projectSlug }: Props) { {uploading ? "⏳" : "📎"} void; onSubmit: () => void; @@ -11,7 +11,7 @@ interface Props { disabled?: boolean; } -export default function MentionInput({ projectSlug, value, onChange, onSubmit, placeholder, disabled }: Props) { +export default function MentionInput({ projectId, value, onChange, onSubmit, placeholder, disabled }: Props) { const [members, setMembers] = useState([]); const [showDropdown, setShowDropdown] = useState(false); const [filter, setFilter] = useState(""); @@ -22,9 +22,9 @@ export default function MentionInput({ projectSlug, value, onChange, onSubmit, p // Load members once useEffect(() => { - if (!projectSlug) return; - getProjectMembers(projectSlug).then(setMembers).catch(() => {}); - }, [projectSlug]); + if (!projectId) return; + getProjectMembers(projectId).then(setMembers).catch(() => {}); + }, [projectId]); const filtered = members.filter((m) => m.name.toLowerCase().includes(filter.toLowerCase()) || diff --git a/src/components/ProjectFiles.tsx b/src/components/ProjectFiles.tsx index a827431..2b9518e 100644 --- a/src/components/ProjectFiles.tsx +++ b/src/components/ProjectFiles.tsx @@ -47,14 +47,14 @@ export default function ProjectFiles({ project }: Props) { const loadFiles = useCallback(async () => { try { - const data = await getProjectFiles(project.slug, search || undefined); + const data = await getProjectFiles(project.id, search || undefined); setFiles(data); } catch (e) { console.error("Failed to load files:", e); } finally { setLoading(false); } - }, [project.slug, search]); + }, [project.id, search]); // Debounced search useEffect(() => { @@ -67,7 +67,7 @@ export default function ProjectFiles({ project }: Props) { setUploading(true); try { for (const file of Array.from(fileList)) { - await uploadProjectFile(project.slug, file, uploadDesc || undefined); + await uploadProjectFile(project.id, file, uploadDesc || undefined); } setUploadDesc(""); setShowUploadDesc(false); @@ -83,7 +83,7 @@ export default function ProjectFiles({ project }: Props) { const handleDelete = async (f: ProjectFile) => { if (!confirm(`Удалить ${f.filename}?`)) return; try { - await deleteProjectFile(project.slug, f.id); + await deleteProjectFile(project.id, f.id); setFiles((prev) => prev.filter((x) => x.id !== f.id)); } catch (e) { console.error("Delete failed:", e); @@ -92,7 +92,7 @@ export default function ProjectFiles({ project }: Props) { const handleSaveDesc = async (f: ProjectFile) => { try { - const updated = await updateProjectFile(project.slug, f.id, { description: editDesc }); + const updated = await updateProjectFile(project.id, f.id, { description: editDesc }); setFiles((prev) => prev.map((x) => (x.id === f.id ? updated : x))); setEditingId(null); } catch (e) { @@ -171,7 +171,7 @@ export default function ProjectFiles({ project }: Props) { {!loading && files.length > 0 && (
{files.map((f) => { - const url = getProjectFileUrl(project.slug, f.id); + const url = getProjectFileUrl(project.id, f.id); const isImage = f.mime_type?.startsWith("image/"); return (
{ try { const [projectMembers, allMembersList] = await Promise.all([ - getProjectMembers(project.slug), + getProjectMembers(project.id), getMembers() ]); setMembers(projectMembers); @@ -58,8 +58,8 @@ export default function ProjectSettings({ project, onUpdated }: Props) { const handleAddMember = async () => { if (!selectedMember) return; try { - await addProjectMember(project.slug, selectedMember); - const newMember = allMembers.find((m) => m.slug === selectedMember); + await addProjectMember(project.id, selectedMember); + const newMember = allMembers.find((m) => m.id === selectedMember); if (newMember) { setMembers([...members, { id: newMember.id, @@ -75,10 +75,10 @@ export default function ProjectSettings({ project, onUpdated }: Props) { } }; - const handleRemoveMember = async (memberSlug: string) => { + const handleRemoveMember = async (memberId: string) => { try { - await removeProjectMember(project.slug, memberSlug); - setMembers(members.filter((m) => m.slug !== memberSlug)); + await removeProjectMember(project.id, memberId); + setMembers(members.filter((m) => m.id !== memberId)); } catch (e) { console.error("Failed to remove member:", e); } @@ -88,7 +88,7 @@ export default function ProjectSettings({ project, onUpdated }: Props) { setSaving(true); try { const urls = repoUrls.split("\n").map((u) => u.trim()).filter(Boolean); - const updated = await updateProject(project.slug, { + const updated = await updateProject(project.id, { name: name.trim(), description: description.trim() || null, repo_urls: urls, @@ -106,7 +106,7 @@ export default function ProjectSettings({ project, onUpdated }: Props) { const handleDelete = async () => { try { - await deleteProject(project.slug); + await deleteProject(project.id); navigate("/"); } catch (e) { console.error(e); @@ -197,7 +197,7 @@ export default function ProjectSettings({ project, onUpdated }: Props) {
{member.role !== "owner" && (