import type { Meta, StoryObj } from '@storybook/nextjs' import { useMemo, useState } from 'react' import ImageList from './image-list' import ImageLinkInput from './image-link-input' import type { ImageFile } from '@/types/app' import { TransferMethod } from '@/types/app' const SAMPLE_BASE64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsSAAALEgHS3X78AAABbElEQVR4nO3SsQkAIBDARMT+V20sTg6LXhWEATnnMHDx4sWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFu2r/H3n4BG518Gr4AAAAASUVORK5CYII=' const createRemoteImage = ( id: string, progress: number, url: string, ): ImageFile => ({ type: TransferMethod.remote_url, _id: id, fileId: `remote-${id}`, progress, url, }) const createLocalImage = (id: string, progress: number): ImageFile => ({ type: TransferMethod.local_file, _id: id, fileId: `local-${id}`, progress, url: SAMPLE_BASE64, base64Url: SAMPLE_BASE64, }) const initialImages: ImageFile[] = [ createLocalImage('local-initial', 100), createRemoteImage( 'remote-loading', 40, 'https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=300&q=80', ), { ...createRemoteImage( 'remote-error', -1, 'https://example.com/not-an-image.jpg', ), url: 'https://example.com/not-an-image.jpg', }, ] const meta = { title: 'Base/Data Entry/ImageList', component: ImageList, parameters: { layout: 'centered', docs: { description: { component: 'Renders thumbnails for uploaded images and manages their states like uploading, error, and deletion.', }, }, }, argTypes: { list: { control: false }, onRemove: { control: false }, onReUpload: { control: false }, onImageLinkLoadError: { control: false }, onImageLinkLoadSuccess: { control: false }, }, tags: ['autodocs'], } satisfies Meta export default meta type Story = StoryObj const ImageUploaderPlayground = ({ readonly }: Story['args']) => { const [images, setImages] = useState(() => initialImages) const activeImages = useMemo(() => images.filter(item => !item.deleted), [images]) const handleRemove = (id: string) => { setImages(prev => prev.map(item => (item._id === id ? { ...item, deleted: true } : item))) } const handleReUpload = (id: string) => { setImages(prev => prev.map((item) => { if (item._id !== id) return item return { ...item, progress: 60, } })) setTimeout(() => { setImages(prev => prev.map((item) => { if (item._id !== id) return item return { ...item, progress: 100, } })) }, 1200) } const handleImageLinkLoadSuccess = (id: string) => { setImages(prev => prev.map(item => (item._id === id ? { ...item, progress: 100 } : item))) } const handleImageLinkLoadError = (id: string) => { setImages(prev => prev.map(item => (item._id === id ? { ...item, progress: -1 } : item))) } const handleUploadFromLink = (imageFile: ImageFile) => { setImages(prev => [ ...prev, { ...imageFile, fileId: `remote-${imageFile._id}`, }, ]) } const handleAddLocalImage = () => { const id = `local-${Date.now()}` setImages(prev => [ ...prev, createLocalImage(id, 100), ]) } return (
Add images
Files state
          {JSON.stringify(activeImages, null, 2)}
        
) } export const Playground: Story = { render: args => , args: { list: [], }, } export const ReadonlyList: Story = { render: args => , args: { list: [], }, }