{"version":3,"file":"FileInput.stories.jsx","sourceRoot":"","sources":["../../../src/core/File/FileInput.stories.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Meta, StoryFn } from '@storybook/react';\nimport { useState, useMemo, useCallback, useRef, useContext } from 'react';\nimport { action } from '@storybook/addon-actions';\n\nimport {\n  FileInput,\n  useAfterInitialEffect,\n  Flex,\n  Link,\n  createUID,\n  hasProp\n} from '@pega/cosmos-react-core';\nimport type { FileInputProps, OmitStrict } from '@pega/cosmos-react-core';\n\nimport { FileServiceContext } from './FileService.mock';\nimport type {\n  MockFileItem,\n  MockFileAttachmentResource,\n  MockFileUploadItem\n} from './FileService.mock';\n\nexport default {\n  title: 'Core/File/Input',\n  component: FileInput\n} as Meta;\n\ninterface FileInputStoryProps extends OmitStrict<FileInputProps, 'accept'> {\n  sizeLimit?: number;\n  showAdditionalInfo?: boolean;\n  accept?: string;\n}\n\nexport const FileInputDemo: StoryFn<FileInputStoryProps & { enableDownloadAll?: boolean }> = (\n  args: FileInputStoryProps & { enableDownloadAll?: boolean }\n) => {\n  const { files, setFiles, attachFile, deleteFile, cancelFile } = useContext(FileServiceContext);\n\n  const errCounts = useRef({ invalidType: 0, invalidSize: 0 });\n  const [hasError, setHasError] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [uploadedFileCount, setUploadedFileCount] = useState(0);\n  const [filesBeforeCancel, setFilesBeforeCancel] = useState<\n    (MockFileAttachmentResource | MockFileUploadItem | MockFileItem)[]\n  >([]);\n  const sizeLimit = args.sizeLimit || 100;\n\n  const isMockFileItems = (\n    fileItems: (MockFileAttachmentResource | MockFileUploadItem | MockFileItem)[]\n  ): fileItems is MockFileItem[] => {\n    return fileItems.every(item => hasProp(item, 'format'));\n  };\n\n  // Fires anytime files are added to the input either through selection or drop\n  const onFilesAdded = useCallback(\n    (addedFiles: File[]) => {\n      errCounts.current = { invalidType: 0, invalidSize: 0 };\n\n      const newFiles = addedFiles.filter(f => {\n        let isValidSize = true;\n\n        if (f.size / 1000000 > sizeLimit) {\n          errCounts.current.invalidSize += 1;\n          isValidSize = false;\n        }\n\n        return isValidSize;\n      });\n\n      setHasError(newFiles.length < addedFiles.length);\n\n      newFiles.forEach((File: File) => {\n        const id = createUID();\n        attachFile({\n          id,\n          thumbnail: File.type.startsWith('image') ? URL.createObjectURL(File) : undefined,\n          name: File.name,\n          format: File.name.split('.').pop(),\n          category: 'category-1',\n          File\n        });\n      });\n    },\n    [attachFile]\n  );\n\n  useAfterInitialEffect(() => {\n    if (files.length === 0) setHasError(false);\n  }, [files.length]);\n\n  const info = useMemo(() => {\n    return hasError\n      ? errCounts.current.invalidSize > 0 && (\n          <div>{`File size must be less than ${sizeLimit}MB`}</div>\n        )\n      : null;\n  }, [hasError]);\n\n  const items = isMockFileItems(files)\n    ? files.map(({ id, name, format, progress, thumbnail }) => {\n        const isLoaded = progress === 100;\n        return {\n          id,\n          name,\n          format,\n          progress: progress ?? 0,\n          thumbnail: isLoaded ? thumbnail : undefined,\n          onEdit: isLoaded ? action('edit') : undefined,\n          onCancel: () => {\n            cancelFile(id);\n          },\n          onPreview: isLoaded ? action('on preview') : undefined,\n          onDownload: isLoaded ? action('on download') : undefined,\n          onDelete: isLoaded\n            ? () => {\n                setTimeout(() => {\n                  deleteFile(id);\n                }, 1000);\n              }\n            : undefined\n        };\n      })\n    : [];\n\n  const handleDownloadAll = () => action(`${items.length} files downloaded`);\n\n  return (\n    <FileInput\n      label={args.label}\n      labelHidden={args.labelHidden}\n      multiple={args.multiple}\n      status={hasError ? 'error' : args.status}\n      info={info || args.info}\n      required={args.required}\n      disabled={args.disabled}\n      readOnly={args.readOnly}\n      onFilesAdded={onFilesAdded}\n      onDownloadAll={args.enableDownloadAll ? handleDownloadAll : undefined}\n      files={args.files || items}\n      compact={args.compact}\n      previewFromActions={args.previewFromActions}\n      count={args.compact && args.multiple ? uploadedFileCount : undefined}\n      modal={\n        args.compact && args.multiple\n          ? {\n              onBeforeOpen: () => {\n                if (items.length > 0) {\n                  setLoading(true);\n                  setFilesBeforeCancel(files);\n                  setTimeout(() => {\n                    setLoading(false);\n                  }, 1000);\n                } else {\n                  setFilesBeforeCancel(files);\n                }\n              },\n              onCancel: ({ close }) => {\n                if (filesBeforeCancel) setFiles(filesBeforeCancel);\n                close();\n              },\n              onSubmit: ({ close }) => {\n                setLoading(true);\n                setTimeout(() => {\n                  setLoading(false);\n                  setUploadedFileCount(items.length);\n                  close();\n                }, 1000);\n              },\n              loading\n            }\n          : undefined\n      }\n      additionalInfo={\n        args.showAdditionalInfo\n          ? {\n              content: (\n                <Flex container={{ direction: 'column', alignItems: 'start', gap: 2 }}>\n                  <p>\n                    Lorem ipsum dolor sit amet, consectetur it, sed do tempor incididunt ut labore\n                    magna aliqua. Nibh praesent tristique magna sit amet. Nec tincidunt praesent\n                    semper feugiat nibh sed pulvinar proin gravida.\n                  </p>\n                  <p>\n                    Pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Est velit\n                    egestas dui id ornare arcu odio ut. Varius sit amet mattis vulputate enim nulla\n                    aliquet porttitor lacus.\n                  </p>\n                  <Link href='/' target='_blank'>\n                    Neque vitae\n                  </Link>\n                </Flex>\n              )\n            }\n          : undefined\n      }\n      accept={args.accept?.split(',')}\n    />\n  );\n};\n\nFileInputDemo.args = {\n  multiple: true,\n  sizeLimit: 100,\n  label: 'File input label',\n  labelHidden: false,\n  info: '',\n  status: undefined,\n  required: false,\n  disabled: false,\n  readOnly: false,\n  showAdditionalInfo: false,\n  accept: 'application/pdf, .jpeg, image/png, .doc, .docx',\n  compact: false,\n  previewFromActions: false,\n  enableDownloadAll: true\n};\n\nFileInputDemo.argTypes = {\n  multiple: { control: { type: 'boolean' } },\n  sizeLimit: { control: { type: 'number' } },\n  label: { control: { type: 'text' } },\n  labelHidden: { control: { type: 'boolean' } },\n  info: { control: { type: 'text' } },\n  status: {\n    options: [undefined, 'success', 'warning', 'error', 'pending'],\n    control: { type: 'select' }\n  },\n  required: { control: { type: 'boolean' } },\n  disabled: { control: { type: 'boolean' } },\n  readOnly: { control: { type: 'boolean' } },\n  showAdditionalInfo: { control: { type: 'boolean' } },\n  accept: { control: { type: 'text' } },\n  compact: { control: { type: 'boolean' } },\n  previewFromActions: { control: { type: 'boolean' } },\n  enableDownloadAll: { control: { type: 'boolean' } }\n};\n"]}