"use client"; import { ChangeEvent, useEffect } from "react"; import { SearchView } from "@/ui/Partials"; import { LoadingIndicator } from "@/ui/App"; import { AddIcon, SearchIcon } from "@/ui/Icons"; import { CTAButton, GhostButton, Modal, NeutralButton, StatusIndicator } from "@/ui/elements"; import { useBoolean } from "@/utils"; import addData from "@/modules/ingestion/addData"; import cognifyDataset from "@/modules/datasets/cognifyDataset"; import createDataset from "@/modules/datasets/createDataset"; import getDatasetGraph from "@/modules/datasets/getDatasetGraph"; import useDatasets, { Dataset } from "@/modules/ingestion/useDatasets"; export interface NodesAndLinks { nodes: { id: string; label: string }[]; links: { source: string; target: string; label: string }[]; } export interface NodesAndEdges { nodes: { id: string; label: string }[]; edges: { source: string; target: string; label: string }[]; } interface CogneeAddWidgetProps { onData: (data: NodesAndLinks) => void; } export default function CogneeAddWidget({ onData }: CogneeAddWidgetProps) { const { datasets, refreshDatasets, } = useDatasets(); useEffect(() => { refreshDatasets() .then((datasets) => { const dataset = datasets?.[0]; if (dataset) { getDatasetGraph(dataset) .then((graph) => onData({ nodes: graph.nodes, links: graph.edges, })); } }); }, [onData, refreshDatasets]); const { value: isProcessingFiles, setTrue: setProcessingFilesInProgress, setFalse: setProcessingFilesDone, } = useBoolean(false); const handleAddFiles = (dataset: Dataset, event: ChangeEvent) => { event.stopPropagation(); if (isProcessingFiles) { return; } setProcessingFilesInProgress(); if (!event.target.files) { return; } const files: File[] = Array.from(event.target.files); if (!files.length) { return; } return addData(dataset, files) .then(() => { const onUpdate = (data: NodesAndEdges) => { onData({ nodes: data.nodes, links: data.edges, }); setProcessingFilesDone(); }; return cognifyDataset(dataset, onUpdate) .then(() => { refreshDatasets(); }); }); }; const handleAddFilesNoDataset = (event: ChangeEvent) => { event.stopPropagation(); if (isProcessingFiles) { return; } setProcessingFilesInProgress(); createDataset({ name: "main_dataset" }) .then((newDataset: Dataset) => { return handleAddFiles(newDataset, event); }); }; const { value: isSearchModalOpen, setTrue: openSearchModal, setFalse: closeSearchModal, } = useBoolean(false); const handleSearchClick = () => { openSearchModal(); }; return (
{datasets.length ? datasets.map((dataset) => (
{dataset.name}
{isProcessingFiles && }
)) : ( + Add Data {isProcessingFiles && } )}
); }