import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useDataProvider, useNotify, useTranslate } from "ra-core"; import { Button } from "@/components/ds/ui/button"; import { Card, CardContent, CardHeader, CardTitle, } from "@/components/ds/ui/card"; import { Label } from "@/components/ds/ui/label"; import { Plus, Trash2, Copy, Activity } from "lucide-react"; import { CreateChannelDialog } from "./CreateChannelDialog"; import { Badge } from "@/components/ds/ui/badge"; import { format } from "date-fns"; import { getSupabaseConfig } from "@/lib/supabase-config"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ds/ui/alert-dialog"; export const IngestionChannelsTab = () => { const [showCreateDialog, setShowCreateDialog] = useState(false); const [channelToDelete, setChannelToDelete] = useState(null); const dataProvider = useDataProvider(); const notify = useNotify(); const queryClient = useQueryClient(); const translate = useTranslate(); const { data: channels, isLoading } = useQuery({ queryKey: ["ingestion_providers"], queryFn: async () => { const { data } = await dataProvider.getList("ingestion_providers", { pagination: { page: 1, perPage: 100 }, sort: { field: "created_at", order: "DESC" }, filter: {}, }); return data; }, }); const deleteMutation = useMutation({ mutationFn: async (id: string) => { await dataProvider.delete("ingestion_providers", { id, previousData: {}, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["ingestion_providers"] }); notify(translate("crm.integrations.ingestion.notification.deleted")); setChannelToDelete(null); }, onError: () => { notify( translate("crm.integrations.ingestion.notification.error_deleting"), { type: "error" }, ); }, }); return (

{translate("crm.integrations.ingestion.description")}

{isLoading ? ( {translate("crm.integrations.ingestion.loading")} ) : channels && channels.length > 0 ? (
{channels.map((channel: any) => ( setChannelToDelete(channel.id)} /> ))}
) : (

{translate("crm.integrations.ingestion.empty")}

)} setShowCreateDialog(false)} /> setChannelToDelete(null)} > {translate("crm.integrations.ingestion.dialog.delete_title")} {translate( "crm.integrations.ingestion.dialog.delete_description", )} {translate("crm.activity.cancel")} channelToDelete && deleteMutation.mutate(channelToDelete) } className="bg-destructive hover:bg-destructive/90" > {translate("crm.integrations.webhooks.action.delete")}
); }; const ChannelCard = ({ channel, onDelete, }: { channel: any; onDelete: () => void; }) => { const notify = useNotify(); const translate = useTranslate(); // Get the actual Supabase URL from config (localStorage or env vars) const supabaseConfig = getSupabaseConfig(); const webhookUrl = supabaseConfig ? `${supabaseConfig.url}/functions/v1/ingest-activity?key=${channel.ingestion_key}` : `https://your-project.supabase.co/functions/v1/ingest-activity?key=${channel.ingestion_key}`; const copyUrl = () => { navigator.clipboard.writeText(webhookUrl); notify(translate("crm.integrations.ingestion.action.url_copied")); }; return (
{channel.name}
{channel.provider_code} {channel.is_active ? ( {translate("crm.integrations.webhooks.status.active")} ) : ( {translate("crm.integrations.webhooks.status.inactive")} )}
{webhookUrl}

{translate("crm.integrations.ingestion.fields.created", { date: format(new Date(channel.created_at), "PPP"), })}

); };