index.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import {
  6. RiLoader2Line,
  7. RiPlayLargeLine,
  8. } from '@remixicon/react'
  9. import CSVReader from './csv-reader'
  10. import CSVDownload from './csv-download'
  11. import Button from '@/app/components/base/button'
  12. import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
  13. import cn from '@/utils/classnames'
  14. export type IRunBatchProps = {
  15. vars: { name: string }[]
  16. onSend: (data: string[][]) => void
  17. isAllFinished: boolean
  18. }
  19. const RunBatch: FC<IRunBatchProps> = ({
  20. vars,
  21. onSend,
  22. isAllFinished,
  23. }) => {
  24. const { t } = useTranslation()
  25. const media = useBreakpoints()
  26. const isPC = media === MediaType.pc
  27. const [csvData, setCsvData] = React.useState<string[][]>([])
  28. const [isParsed, setIsParsed] = React.useState(false)
  29. const handleParsed = (data: string[][]) => {
  30. setCsvData(data)
  31. // console.log(data)
  32. setIsParsed(true)
  33. }
  34. const handleSend = () => {
  35. onSend(csvData)
  36. }
  37. const Icon = isAllFinished ? RiPlayLargeLine : RiLoader2Line
  38. return (
  39. <div className='pt-4'>
  40. <CSVReader onParsed={handleParsed} />
  41. <CSVDownload vars={vars} />
  42. <div className='flex justify-end'>
  43. <Button
  44. variant="primary"
  45. className={cn('mt-4 pl-3 pr-4', !isPC && 'grow')}
  46. onClick={handleSend}
  47. disabled={!isParsed || !isAllFinished}
  48. >
  49. <Icon className={cn(!isAllFinished && 'animate-spin', 'shrink-0 w-4 h-4 mr-1')} aria-hidden="true" />
  50. <span className='uppercase text-[13px]'>{t('share.generation.run')}</span>
  51. </Button>
  52. </div>
  53. </div>
  54. )
  55. }
  56. export default React.memo(RunBatch)