import { FullPageEmptyState } from '@/components/full-page-empty-state'; import { IntegrationCard, IntegrationCardFooter, IntegrationCardLogoImage, } from '@/components/integrations/integration-card'; import { Skeleton } from '@/components/skeleton'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Tooltiper } from '@/components/ui/tooltip'; import { useAppParams } from '@/hooks/use-app-params'; import { useTRPC } from '@/integrations/trpc/react'; import { pushModal } from '@/modals'; import { IMPORT_PROVIDERS } from '@openpanel/importer/providers'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { createFileRoute } from '@tanstack/react-router'; import { formatDistanceToNow } from 'date-fns'; import { CheckCircleIcon, Download, InfoIcon, Loader2Icon, XCircleIcon, } from 'lucide-react'; import { toast } from 'sonner'; export const Route = createFileRoute( '/_app/$organizationId/$projectId/settings/_tabs/imports', )({ component: ImportsSettings, }); function ImportsSettings() { const { projectId } = useAppParams(); const trpc = useTRPC(); const queryClient = useQueryClient(); const importsQuery = useQuery( trpc.import.list.queryOptions( { projectId }, { refetchInterval: 5000, }, ), ); const imports = importsQuery.data ?? []; const deleteImport = useMutation( trpc.import.delete.mutationOptions({ onSuccess: () => { toast.success('Import deleted', { description: 'The import has been successfully deleted.', }); queryClient.invalidateQueries(trpc.import.list.pathFilter()); }, }), ); const retryImport = useMutation( trpc.import.retry.mutationOptions({ onSuccess: () => { toast.success('Import retried', { description: 'The import has been queued for processing again.', }); queryClient.invalidateQueries(trpc.import.list.pathFilter()); }, }), ); const handleProviderSelect = ( provider: (typeof IMPORT_PROVIDERS)[number], ) => { pushModal('AddImport', { provider: provider.id, name: provider.name, types: provider.types, }); }; const getStatusBadge = (status: string, errorMessage: string | null) => { const variants: Record = { pending: 'secondary', processing: 'default', completed: 'success', failed: 'destructive', }; const icons: Record = { pending: , processing: , completed: , failed: , }; if (status === 'failed') { return ( {icons[status] || null} {status} ); } return ( {icons[status] || null} {status} ); }; return (
{IMPORT_PROVIDERS.map((provider) => ( } name={provider.name} description={provider.description} > ))}

Import History

Provider Created Status Progress Config Actions {!importsQuery.isLoading && imports.length === 0 && ( )} {importsQuery.isLoading && [1, 2, 3, 4].map((index) => ( ))} {imports.map((imp) => (
{imp.config.provider}
{imp.config.type}
{formatDistanceToNow(new Date(imp.createdAt), { addSuffix: true, })}
{getStatusBadge(imp.status, imp.errorMessage)} {imp.statusMessage && (
{imp.statusMessage}
)}
{imp.totalEvents > 0 ? (
{imp.processedEvents.toLocaleString()} {' / '} {imp.totalEvents.toLocaleString()}{' '}
{imp.status === 'processing' && (
)}
) : imp.totalEvents === -1 ? (
{imp.processedEvents.toLocaleString()} {' / '} N/A
) : ( '-' )} {JSON.stringify(imp.config, null, 2)} } tooltipClassName="max-w-xs" > Config {imp.status === 'failed' && ( )} ))}
); }