import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import { FileList } from './file-uploader-in-chat-input/file-list' import type { FileEntity } from './types' import { SupportUploadFileTypes } from '@/app/components/workflow/types' import { TransferMethod } from '@/types/app' const SAMPLE_IMAGE = 'data:image/svg+xml;utf8,IMG' const filesSample: FileEntity[] = [ { id: '1', name: 'Project Brief.pdf', size: 256000, type: 'application/pdf', progress: 100, transferMethod: TransferMethod.local_file, supportFileType: SupportUploadFileTypes.document, url: '', }, { id: '2', name: 'Design.png', size: 128000, type: 'image/png', progress: 100, transferMethod: TransferMethod.local_file, supportFileType: SupportUploadFileTypes.image, base64Url: SAMPLE_IMAGE, }, { id: '3', name: 'Voiceover.mp3', size: 512000, type: 'audio/mpeg', progress: 45, transferMethod: TransferMethod.remote_url, supportFileType: SupportUploadFileTypes.audio, url: '', }, ] const meta = { title: 'Base/Data Display/FileList', component: FileList, parameters: { docs: { description: { component: 'Renders a responsive gallery of uploaded files, handling icons, previews, and progress states.', }, }, }, tags: ['autodocs'], args: { files: filesSample, }, } satisfies Meta export default meta type Story = StoryObj const FileListPlayground = (args: React.ComponentProps) => { const [items, setItems] = useState(args.files || []) return (
setItems(list => list.filter(file => file.id !== fileId))} />
) } export const Playground: Story = { render: args => , parameters: { docs: { source: { language: 'tsx', code: ` const [files, setFiles] = useState(initialFiles) setFiles(list => list.filter(file => file.id !== id))} /> `.trim(), }, }, }, } export const UploadStates: Story = { args: { files: filesSample.map(file => ({ ...file, progress: file.id === '3' ? 45 : 100 })), }, }