index.tsx 1.6 KB

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