import { formatDistance } from "date-fns"; import { UserPlus, Receipt } from "lucide-react"; import { RecordContextProvider, ShowBase, useListContext, useRecordContext, useShowContext, useTranslate, useLocale, useNotify, useRedirect, } from "ra-core"; import { useEffect } from "react"; import { Link as RouterLink, useLocation, useMatch, useNavigate, } from "react-router-dom"; import { Button } from "@/components/ds/ui/button"; import { Card, CardContent } from "@/components/ds/ui/card"; import { Tabs, TabsList, TabsTrigger, TabsContent, } from "@/components/ds/ui/tabs"; import { ReferenceManyField } from "@/components/ds/admin/reference-many-field"; import { SortButton } from "@/components/ds/admin/sort-button"; import { ActivityLog } from "../activity/ActivityLog"; import { Avatar } from "../contacts/Avatar"; import { TagsList } from "../contacts/TagsList"; import { findDealLabel } from "../deals/deal"; import { Status } from "../misc/Status"; import { NoteCreate } from "../notes/NoteCreate"; import { NotesIterator } from "../notes/NotesIterator"; import { useConfigurationContext } from "../root/ConfigurationContext"; import type { Company, Contact, Deal, Invoice } from "../types"; import { CompanyAside } from "./CompanyAside"; import { CompanyAvatar } from "./CompanyAvatar"; import { InvoiceCard } from "../invoices"; import { getDateFnsLocale } from "@/i18n/date-fns"; export const CompanyShow = () => ( ); const CompanyShowContent = () => { const { record, isPending, error } = useShowContext(); const navigate = useNavigate(); const translate = useTranslate(); const notify = useNotify(); const redirect = useRedirect(); // Handle error (company not found) useEffect(() => { if (error) { notify("Company not found or has been deleted", { type: "error" }); redirect("/companies"); } }, [error, notify, redirect]); // Get tab from URL or default to "activity" const tabMatch = useMatch("/companies/:id/show/:tab"); const currentTab = tabMatch?.params?.tab || "activity"; const handleTabChange = (value: string) => { if (value === currentTab) return; if (value === "activity") { navigate(`/companies/${record?.id}/show`); return; } navigate(`/companies/${record?.id}/show/${value}`); }; if (isPending || !record) return null; return (
{record.name}
{translate("crm.common.activity")} {translate("crm.common.contacts", { smart_count: record.nb_contacts || 0, })} {translate("crm.common.notes", { smart_count: record.nb_notes || 0, })} {record.nb_deals ? ( {translate("crm.common.deals", { smart_count: record.nb_deals || 0, })} ) : null} {translate("crm.common.invoices", { smart_count: record.nb_invoices || 0, })} {record.nb_contacts ? (
{!!record.nb_contacts && ( )}
) : (
)}
} > {record.nb_deals ? ( ) : null}
); }; const ContactsIterator = () => { const location = useLocation(); const { data: contacts, error, isPending } = useListContext(); const translate = useTranslate(); const locale = useLocale(); if (isPending || error) return null; const now = Date.now(); return (
{contacts.map((contact) => (
{`${contact.first_name} ${contact.last_name}`}
{contact.title} {contact.nb_tasks ? ` - ${translate("crm.task.field.task", { count: contact.nb_tasks, smart_count: contact.nb_tasks, })}` : ""}    
{contact.last_seen && (
{translate("crm.common.last_activity", { distance: formatDistance(contact.last_seen, now, { locale: getDateFnsLocale(locale), }), })}{" "}
)}
))}
); }; const CreateRelatedContactButton = () => { const company = useRecordContext(); const translate = useTranslate(); return ( ); }; const DealsIterator = () => { const { data: deals, error, isPending } = useListContext(); const { dealStages } = useConfigurationContext(); const translate = useTranslate(); const locale = useLocale(); if (isPending || error) return null; const now = Date.now(); return (
{deals.map((deal) => (
{deal.name}
{findDealLabel(dealStages, deal.stage)},{" "} {deal.amount.toLocaleString(locale, { notation: "compact", style: "currency", currency: "USD", currencyDisplay: "narrowSymbol", minimumSignificantDigits: 3, })} {deal.category ? `, ${deal.category}` : ""}
{translate("crm.common.last_activity", { distance: formatDistance(deal.updated_at, now, { locale: getDateFnsLocale(locale), }), })}{" "}
))}
); }; const InvoicesIterator = () => { const { data: invoices, error, isPending } = useListContext(); if (isPending || error) return null; return (
{invoices.map((invoice) => ( ))}
); }; const CreateRelatedInvoiceButton = () => { const company = useRecordContext(); const translate = useTranslate(); return ( ); };