index.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* eslint-disable react/jsx-props-no-spreading */
  2. import { h } from 'preact'
  3. import classNames from 'classnames'
  4. import type { I18n } from '@uppy/utils/lib/Translator'
  5. import type {
  6. PartialTreeFile,
  7. PartialTreeFolderNode,
  8. PartialTreeId,
  9. } from '@uppy/core/lib/Uppy.ts'
  10. import GridItem from './components/GridItem.tsx'
  11. import ListItem from './components/ListItem.tsx'
  12. type ItemProps = {
  13. file: PartialTreeFile | PartialTreeFolderNode
  14. openFolder: (folderId: PartialTreeId) => void
  15. toggleCheckbox: (event: Event) => void
  16. viewType: string
  17. showTitles: boolean
  18. i18n: I18n
  19. }
  20. export default function Item(props: ItemProps): h.JSX.Element {
  21. const { viewType, toggleCheckbox, showTitles, i18n, openFolder, file } = props
  22. const restrictionError = file.type === 'folder' ? null : file.restrictionError
  23. const isDisabled = !!restrictionError && file.status !== 'checked'
  24. const ourProps = {
  25. file,
  26. openFolder,
  27. toggleCheckbox,
  28. i18n,
  29. viewType,
  30. showTitles,
  31. className: classNames(
  32. 'uppy-ProviderBrowserItem',
  33. { 'uppy-ProviderBrowserItem--disabled': isDisabled },
  34. { 'uppy-ProviderBrowserItem--noPreview': file.data.icon === 'video' },
  35. { 'uppy-ProviderBrowserItem--is-checked': file.status === 'checked' },
  36. { 'uppy-ProviderBrowserItem--is-partial': file.status === 'partial' },
  37. ),
  38. isDisabled,
  39. restrictionError,
  40. }
  41. switch (viewType) {
  42. case 'grid':
  43. return <GridItem {...ourProps} />
  44. case 'list':
  45. return <ListItem {...ourProps} />
  46. case 'unsplash':
  47. return (
  48. <GridItem {...ourProps}>
  49. <a
  50. href={`${file.data.author!.url}?utm_source=Companion&utm_medium=referral`}
  51. target="_blank"
  52. rel="noopener noreferrer"
  53. className="uppy-ProviderBrowserItem-author"
  54. tabIndex={-1}
  55. >
  56. {file.data.author!.name}
  57. </a>
  58. </GridItem>
  59. )
  60. default:
  61. throw new Error(`There is no such type ${viewType}`)
  62. }
  63. }