import { formatDistance } from "date-fns"; import { useGetList, useLocaleState, useRecordContext, useTranslate, } from "ra-core"; import { ReferenceField } from "@/components/ds/admin/reference-field"; import { AlertCircle } from "lucide-react"; import { getDateFnsLocale } from "@/i18n/date-fns"; import { translateChoice, type Translate } from "@/i18n/utils"; import type { TaskActivity, Sale } from "../types"; const MAX_ACTIVITIES = 100; export const TaskActivityTimeline = ({ taskId, }: { taskId: string | number; }) => { const translate = useTranslate(); const [locale] = useLocaleState(); const dateFnsLocale = getDateFnsLocale(locale); const { data: activities, isPending, total, } = useGetList("task_activity", { filter: { task_id: taskId }, pagination: { page: 1, perPage: MAX_ACTIVITIES }, sort: { field: "created_at", order: "DESC" }, }); if (isPending) return (
{translate("crm.task.activity.loading")}
); if (!activities || activities.length === 0) return (
{translate("crm.task.activity.empty")}
); const isTruncated = total !== undefined && total > MAX_ACTIVITIES; return ( <>
{activities.map((activity) => (
{" "} {formatActivityMessage(activity, translate)}
{formatDistance(new Date(activity.created_at), new Date(), { addSuffix: true, locale: dateFnsLocale, })}
))}
{isTruncated && (
{translate("crm.task.activity.truncated", { count: MAX_ACTIVITIES, total, })}
)} ); }; const SaleName = () => { const record = useRecordContext(); if (!record) return null; return ( {record.first_name} {record.last_name} ); }; const formatActivityMessage = ( activity: TaskActivity, translate: Translate, ) => { switch (activity.action) { case "created": return translate("crm.task.activity.created"); case "updated": { if (!activity.field_name) return translate("crm.task.activity.updated"); const fieldLabel = translateChoice( translate, "crm.task.field", activity.field_name, activity.field_name, ); return translate("crm.task.activity.updated_field", { field: fieldLabel, }); } // Simplified because old/new values might be IDs or technical values case "assigned": return translate("crm.task.activity.assigned"); case "completed": return translate("crm.task.activity.completed"); case "reopened": return translate("crm.task.activity.reopened"); case "duplicated": return translate("crm.task.activity.duplicated"); case "archived": return translate("crm.task.activity.archived"); default: return activity.action; } };