import { useEffect, useState } from "react"; import ReactMarkdown from "react-markdown"; import usageMarkdown from "./usage.md?raw"; import { Button, Card, Dropdown, FileUploader, InputField, InputSection, Tabs, } from "@elvis/ui"; import { OKABE_ITO_COLORS } from "./colors"; import { CLASSIFIERS } from "./classifiers"; import type { CsvSettings, ModelSettings } from "./types"; import { DATASETS } from "./datasets"; interface SidebarProps { pointLabel: string; setPointLabel: (label: string) => void; setCanAddPoints: (canAddPoints: boolean) => void; undoDataPoint: () => void; clearDataPoints: () => void; modelSettings: ModelSettings; setModelSettings: (settings: ModelSettings) => void; csvSettings: CsvSettings; onGetDecisionBoundary: () => void; onCsvUpload: (file: File, settings?: CsvSettings) => void; onCsvSettingsChange: (settings: CsvSettings) => void; csvError: string | null; onCsvExport: () => void; onSvgExport: () => void; } export default function Sidebar({ pointLabel, setPointLabel, setCanAddPoints, undoDataPoint, clearDataPoints, modelSettings, setModelSettings, csvSettings, onGetDecisionBoundary, onCsvUpload, onCsvSettingsChange, csvError, onCsvExport, onSvgExport, }: SidebarProps) { const tabs = ["Data", "Model", "Export", "Usage"] as const; const [activeTab, setActiveTab] = useState<(typeof tabs)[number]>("Data"); const presetOptions = DATASETS.map((dataset) => dataset.name) as string[]; const customDatasetOptions = ["Manual...", "Upload..."] as string[]; const [datasetOption, setDatasetOption] = useState("Manual..."); function isPresetOption(option: string) { return presetOptions.includes(option); } function onDatasetOptionChange(option: string) { setDatasetOption(option); if (isPresetOption(option)) { loadPresetDataset(option); } } async function loadPresetDataset(datasetName: string) { const dataset = DATASETS.find((d) => d.name === datasetName); if (!dataset) { return; } const response = await fetch(dataset.url); const blob = await response.blob(); const file = new File([blob], `${dataset.name}.csv`, { type: "text/csv" }); const presetCsvSettings = { ...csvSettings, inputColumns: dataset.inputColumns, outputColumn: dataset.outputColumn, }; onCsvUpload(file, presetCsvSettings); } useEffect(() => { clearDataPoints(); setCanAddPoints(datasetOption === "Manual..."); }, [datasetOption]); return ( { /* Tab content */}
{ activeTab === "Data" && ( <> { datasetOption === "Manual..." && ( <> color.name)} activeOption={pointLabel} onChange={(option: string) => setPointLabel(option)} />
)} { datasetOption === "Upload..." && ( )} { (datasetOption === "Upload..." || isPresetOption(datasetOption)) && ( <>
{onCsvSettingsChange({ ...csvSettings, inputColumns: value })}} /> {onCsvSettingsChange({ ...csvSettings, outputColumn: value })}} />
)}
{ (datasetOption === "Upload..." || isPresetOption(datasetOption)) && ( <> {onCsvSettingsChange({ ...csvSettings, normalizerType: option })}} /> {onCsvSettingsChange({ ...csvSettings, normalNoiseStd: value })}} /> {onCsvSettingsChange({ ...csvSettings, projectionType: option })}} /> {csvSettings.projectionType === "Coordinates" && (
{onCsvSettingsChange({ ...csvSettings, x1Column: value })}} /> {onCsvSettingsChange({ ...csvSettings, x2Column: value })}} />
)}
{csvError && (

CSV Error: {csvError}

)} )} )} { activeTab === "Model" && ( <> { setModelSettings({ ...modelSettings, type: option }); }} /> { setModelSettings({ ...modelSettings, arguments: value }); }} />
)} { activeTab === "Usage" && (

{children}

, h2: ({ children }) =>

{children}

, h3: ({ children }) =>

{children}

, p: ({ children }) =>

{children}

, ul: ({ children }) =>
    {children}
, ol: ({ children }) =>
    {children}
, li: ({ children }) =>
  • {children}
  • , code: ({ children }) => {children} }} > {usageMarkdown}
    )}
    ) }