/* Copyright 2026 Marimo. All rights reserved. */ import { useState } from "react"; import type { FieldValues } from "react-hook-form"; import type { z } from "zod"; import { ProtocolIcon } from "@/components/storage/components"; import type { KnownStorageProtocol } from "@/core/storage/types"; import { ConnectionForm, SelectorButton, SelectorGrid } from "../components"; import { generateStorageCode, type StorageLibrary, StorageLibraryDisplayNames, } from "./as-code"; import { AzureStorageSchema, CoreWeaveStorageSchema, GCSStorageSchema, GoogleDriveStorageSchema, S3StorageSchema, type StorageConnection, } from "./schemas"; interface StorageProviderSchema { name: string; schema: z.ZodType; protocol: string; storageLibraries: { libraries: StorageLibrary[]; preferred: StorageLibrary; }; } const BACKGROUND_COLOR = "#232F3E"; const STORAGE_PROVIDERS = [ { name: "Amazon S3", schema: S3StorageSchema, protocol: "s3", storageLibraries: { libraries: ["obstore"], preferred: "obstore", }, }, { name: "Google Cloud Storage", schema: GCSStorageSchema, protocol: "gcs", storageLibraries: { libraries: ["obstore"], preferred: "obstore", }, }, { name: "Azure Blob Storage", schema: AzureStorageSchema, protocol: "azure", storageLibraries: { libraries: ["obstore"], preferred: "obstore", }, }, { name: "CoreWeave", schema: CoreWeaveStorageSchema, protocol: "coreweave", storageLibraries: { libraries: ["obstore"], preferred: "obstore", }, }, { name: "Google Drive", schema: GoogleDriveStorageSchema, protocol: "gdrive", storageLibraries: { libraries: ["fsspec"], preferred: "fsspec", }, }, ] satisfies StorageProviderSchema[]; const StorageProviderSelector: React.FC<{ onSelect: (schema: z.ZodType) => void; }> = ({ onSelect }) => { return ( {STORAGE_PROVIDERS.map(({ name, schema, protocol }) => ( } onSelect={() => onSelect(schema)} /> ))} ); }; export const AddStorageForm: React.FC<{ onSubmit: () => void; header?: React.ReactNode; }> = ({ onSubmit, header }) => { const [selectedSchema, setSelectedSchema] = useState | null>(null); if (!selectedSchema) { return ( <> {header}
); } const provider = STORAGE_PROVIDERS.find((p) => p.schema === selectedSchema); const libs = provider?.storageLibraries; return ( schema={selectedSchema} libraries={libs?.libraries ?? []} preferredLibrary={libs?.preferred ?? "obstore"} displayNames={StorageLibraryDisplayNames} libraryLabel="Preferred storage library" generateCode={(values, library) => generateStorageCode(values, library)} onSubmit={onSubmit} onBack={() => setSelectedSchema(null)} /> ); };