document-file-icon.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import FileTypeIcon from '../../base/file-uploader/file-type-icon'
  5. import type { FileAppearanceType } from '@/app/components/base/file-uploader/types'
  6. import { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
  7. const extendToFileTypeMap: { [key: string]: FileAppearanceType } = {
  8. pdf: FileAppearanceTypeEnum.pdf,
  9. json: FileAppearanceTypeEnum.document,
  10. html: FileAppearanceTypeEnum.document,
  11. txt: FileAppearanceTypeEnum.document,
  12. markdown: FileAppearanceTypeEnum.markdown,
  13. md: FileAppearanceTypeEnum.markdown,
  14. xlsx: FileAppearanceTypeEnum.excel,
  15. xls: FileAppearanceTypeEnum.excel,
  16. csv: FileAppearanceTypeEnum.excel,
  17. doc: FileAppearanceTypeEnum.word,
  18. docx: FileAppearanceTypeEnum.word,
  19. ppt: FileAppearanceTypeEnum.ppt,
  20. pptx: FileAppearanceTypeEnum.ppt,
  21. jpg: FileAppearanceTypeEnum.image,
  22. jpeg: FileAppearanceTypeEnum.image,
  23. png: FileAppearanceTypeEnum.image,
  24. }
  25. type Props = {
  26. extension?: string
  27. name?: string
  28. size?: 'sm' | 'lg' | 'md'
  29. className?: string
  30. }
  31. const DocumentFileIcon: FC<Props> = ({
  32. extension,
  33. name,
  34. size = 'md',
  35. className,
  36. }) => {
  37. const localExtension = extension?.toLowerCase() || name?.split('.')?.pop()?.toLowerCase()
  38. return (
  39. <FileTypeIcon type={extendToFileTypeMap[localExtension!] || FileAppearanceTypeEnum.document} size={size} className={className} />
  40. )
  41. }
  42. export default React.memo(DocumentFileIcon)