index.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useState } from 'react'
  4. import {
  5. useCSVReader,
  6. } from 'react-papaparse'
  7. import { useTranslation } from 'react-i18next'
  8. import cn from '@/utils/classnames'
  9. import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files'
  10. export type Props = {
  11. onParsed: (data: string[][]) => void
  12. }
  13. const CSVReader: FC<Props> = ({
  14. onParsed,
  15. }) => {
  16. const { t } = useTranslation()
  17. const { CSVReader } = useCSVReader()
  18. const [zoneHover, setZoneHover] = useState(false)
  19. return (
  20. <CSVReader
  21. onUploadAccepted={(results: any) => {
  22. onParsed(results.data)
  23. setZoneHover(false)
  24. }}
  25. onDragOver={(event: DragEvent) => {
  26. event.preventDefault()
  27. setZoneHover(true)
  28. }}
  29. onDragLeave={(event: DragEvent) => {
  30. event.preventDefault()
  31. setZoneHover(false)
  32. }}
  33. >
  34. {({
  35. getRootProps,
  36. acceptedFile,
  37. }: any) => (
  38. <>
  39. <div
  40. {...getRootProps()}
  41. className={cn(
  42. 'flex items-center h-20 rounded-xl bg-components-dropzone-bg border border-dashed border-components-dropzone-border system-sm-regular',
  43. acceptedFile && 'px-6 bg-components-panel-on-panel-item-bg border-solid border-components-panel-border hover:bg-components-panel-on-panel-item-bg-hover hover:border-components-panel-bg-blur',
  44. zoneHover && 'bg-components-dropzone-bg-accent border border-components-dropzone-border-accent',
  45. )}
  46. >
  47. {
  48. acceptedFile
  49. ? (
  50. <div className='w-full flex items-center space-x-2'>
  51. <CSVIcon className="shrink-0" />
  52. <div className='flex w-0 grow'>
  53. <span className='max-w-[calc(100%_-_30px)] truncate text-text-secondary'>{acceptedFile.name.replace(/.csv$/, '')}</span>
  54. <span className='shrink-0 text-text-tertiary'>.csv</span>
  55. </div>
  56. </div>
  57. )
  58. : (
  59. <div className='w-full flex items-center justify-center space-x-2'>
  60. <CSVIcon className="shrink-0" />
  61. <div className='text-text-tertiary'>{t('share.generation.csvUploadTitle')}<span className='text-text-accent cursor-pointer'>{t('share.generation.browse')}</span></div>
  62. </div>
  63. )}
  64. </div>
  65. </>
  66. )}
  67. </CSVReader>
  68. )
  69. }
  70. export default React.memo(CSVReader)