import * as React from 'react'; import { Header } from '../Header'; import { useRecoilValue } from 'recoil'; import { SettingsSelector } from '../../state'; import { DataForm } from './DataForm'; import { useCallback, useEffect, useState } from 'react'; import { DataFile } from '../../../models/DataFile'; import { Messenger } from '@estruyf/vscode/dist/client'; import { DashboardMessage } from '../../DashboardMessage'; import { SponsorMsg } from '../SponsorMsg'; import { EventData } from '@estruyf/vscode'; import { DashboardCommand } from '../../DashboardCommand'; import { Button } from '../Button'; import { arrayMoveImmutable } from 'array-move'; import { EmptyView } from './EmptyView'; import { Container } from './SortableContainer'; import { SortableItem } from './SortableItem'; import { ChevronRightIcon, DatabaseIcon } from '@heroicons/react/outline'; import { ToastContainer, toast, Slide } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import { DataType } from '../../../models/DataType'; import { TelemetryEvent } from '../../../constants'; import { NavigationItem } from '../Layout'; export interface IDataViewProps {} export const DataView: React.FunctionComponent = (props: React.PropsWithChildren) => { const [ selectedData, setSelectedData ] = useState(null); const [ selectedIndex, setSelectedIndex ] = useState(null); const [ dataEntries, setDataEntries ] = useState(null); const settings = useRecoilValue(SettingsSelector); const setSchema = (dataFile: DataFile) => { setSelectedData(dataFile); setSelectedIndex(null); setDataEntries(null); Messenger.send(DashboardMessage.getDataEntries, { ...dataFile }); }; const messageListener = (message: MessageEvent>) => { if (message.data.command === DashboardCommand.dataFileEntries) { setDataEntries(message.data.data); } }; const deleteItem = useCallback((index: number) => { const dataClone: any[] = Object.assign([], dataEntries); if (!selectedData) { return; } dataClone.splice(index, 1); updateData(dataClone); }, [selectedData, dataEntries]); const onSubmit = useCallback((data: any) => { const dataClone: any[] = Object.assign([], dataEntries); if (selectedIndex !== null && selectedIndex !== undefined) { dataClone[selectedIndex] = data; } else { dataClone.push(data); } updateData(dataClone); }, [selectedData, dataEntries, selectedIndex]); const onSortEnd = useCallback(({ oldIndex, newIndex }: any) => { if (!dataEntries || dataEntries.length === 0) { return null; } if (selectedIndex !== null && selectedIndex !== undefined) { setSelectedIndex(newIndex); } const newEntries = arrayMoveImmutable(dataEntries, oldIndex, newIndex); updateData(newEntries); }, [selectedData, dataEntries, selectedIndex]); const updateData = useCallback((data: any) => { if (!selectedData) { return; } Messenger.send(DashboardMessage.putDataEntries, { file: selectedData.file, fileType: selectedData.fileType, entries: data }); // Show toast message toast.success("Updated your data entries", { position: "top-right", autoClose: 2000, hideProgressBar: true, closeOnClick: true, pauseOnHover: false, transition: Slide }); }, [selectedData]); useEffect(() => { Messenger.listen(messageListener); Messenger.send(DashboardMessage.sendTelemetry, { event: TelemetryEvent.webviewDataView }); return () => { Messenger.unlisten(messageListener); } }, []); // Retrieve the data files, check if they have a schema or ID, if not, they shouldn't be shown const dataFiles = (settings?.dataFiles || []).map((dataFile: DataFile) => { if (!dataFile.schema && !dataFile.id) { return null; } const clonedFile = Object.assign({}, dataFile); if (clonedFile.type) { const dataType = settings?.dataTypes?.find((dataType: DataType) => dataType.id === clonedFile.type); if (!dataType) { return null; } clonedFile.schema = Object.assign({}, dataType.schema); } return clonedFile; }).filter(d => d !== null) as DataFile[]; return (
{ (settings?.dataFiles && settings.dataFiles.length > 0) ? (
{ selectedData ? ( <>

Your {selectedData?.title?.toLowerCase() || ""} data items

{ (dataEntries && dataEntries.length > 0) ? ( <> { (dataEntries || []).map((dataEntry, idx) => ( setSelectedIndex(index)} onDeleteItem={deleteItem} /> )) } ) : (

No {selectedData.title.toLowerCase()} data entries found

) }

Create or modify your {selectedData.title.toLowerCase()} data

{ selectedData ? ( setSelectedIndex(null)} /> ) : (

Select a data type to get started

) }
) : ( ) }
) : ( ) }
); };