import { useState, useEffect } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useCompany } from "../context/CompanyContext"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { companiesApi } from "../api/companies"; import { queryKeys } from "../lib/queryKeys"; import { formatCents } from "../lib/utils"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Pencil, Check, X } from "lucide-react"; export function Companies() { const { companies, selectedCompanyId, setSelectedCompanyId, createCompany, loading, error, } = useCompany(); const { setBreadcrumbs } = useBreadcrumbs(); const queryClient = useQueryClient(); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [budget, setBudget] = useState("0"); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); // Inline edit state const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(""); const editMutation = useMutation({ mutationFn: ({ id, newName }: { id: string; newName: string }) => companiesApi.update(id, { name: newName }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: queryKeys.companies.all }); setEditingId(null); }, }); useEffect(() => { setBreadcrumbs([{ label: "Companies" }]); }, [setBreadcrumbs]); async function onSubmit(e: React.FormEvent) { e.preventDefault(); if (!name.trim()) return; setSubmitting(true); setSubmitError(null); try { await createCompany({ name: name.trim(), description: description.trim() || null, budgetMonthlyCents: Number(budget) || 0, }); setName(""); setDescription(""); setBudget("0"); } catch (err) { setSubmitError(err instanceof Error ? err.message : "Failed to create company"); } finally { setSubmitting(false); } } function startEdit(companyId: string, currentName: string) { setEditingId(companyId); setEditName(currentName); } function saveEdit() { if (!editingId || !editName.trim()) return; editMutation.mutate({ id: editingId, newName: editName.trim() }); } function cancelEdit() { setEditingId(null); setEditName(""); } return (

Companies

Create and manage your companies.

Create Company

setName(e.target.value)} /> setDescription(e.target.value)} /> setBudget(e.target.value.replace(/[^0-9]/g, ""))} />
{submitError &&

{submitError}

}
{loading &&

Loading companies...

} {error &&

{error.message}

}
{companies.map((company) => { const selected = company.id === selectedCompanyId; const isEditing = editingId === company.id; return (
) : (

{company.name}

)} {company.description && !isEditing && (

{company.description}

)}
{formatCents(company.spentMonthlyCents)} / {formatCents(company.budgetMonthlyCents)}
); })} ); }