import { useState, useEffect } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useCompany } from "../context/CompanyContext"; import { useDialog } from "../context/DialogContext"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { companiesApi } from "../api/companies"; import { queryKeys } from "../lib/queryKeys"; import { formatCents } from "../lib/utils"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Pencil, Check, X, Plus } from "lucide-react"; export function Companies() { const { companies, selectedCompanyId, setSelectedCompanyId, loading, error, } = useCompany(); const { openOnboarding } = useDialog(); const { setBreadcrumbs } = useBreadcrumbs(); const queryClient = useQueryClient(); // 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]); 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

Manage your companies.

{loading &&

Loading companies...

} {error &&

{error.message}

}
{companies.map((company) => { const selected = company.id === selectedCompanyId; const isEditing = editingId === company.id; return (
setSelectedCompanyId(company.id)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setSelectedCompanyId(company.id); } }} className={`group text-left bg-card border rounded-lg p-4 transition-colors cursor-pointer ${ selected ? "border-primary ring-1 ring-primary" : "border-border hover:border-muted-foreground/30" }`} >
{isEditing ? (
e.stopPropagation()}> setEditName(e.target.value)} className="h-7 text-sm" autoFocus onKeyDown={(e) => { if (e.key === "Enter") saveEdit(); if (e.key === "Escape") cancelEdit(); }} />
) : (

{company.name}

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

{company.description}

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