selectPackage.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. 'use client'
  2. import React from 'react'
  3. import type { Item } from '@/app/components/base/select'
  4. import { PortalSelect } from '@/app/components/base/select'
  5. import Button from '@/app/components/base/button'
  6. import type { PluginDeclaration, UpdateFromGitHubPayload } from '../../../types'
  7. import { useTranslation } from 'react-i18next'
  8. import { useGitHubUpload } from '../../hooks'
  9. const i18nPrefix = 'plugin.installFromGitHub'
  10. type SelectPackageProps = {
  11. updatePayload: UpdateFromGitHubPayload
  12. repoUrl: string
  13. selectedVersion: string
  14. versions: Item[]
  15. onSelectVersion: (item: Item) => void
  16. selectedPackage: string
  17. packages: Item[]
  18. onSelectPackage: (item: Item) => void
  19. onUploaded: (result: {
  20. uniqueIdentifier: string
  21. manifest: PluginDeclaration
  22. }) => void
  23. onFailed: (errorMsg: string) => void
  24. onBack: () => void
  25. }
  26. const SelectPackage: React.FC<SelectPackageProps> = ({
  27. updatePayload,
  28. repoUrl,
  29. selectedVersion,
  30. versions,
  31. onSelectVersion,
  32. selectedPackage,
  33. packages,
  34. onSelectPackage,
  35. onUploaded,
  36. onFailed,
  37. onBack,
  38. }) => {
  39. const { t } = useTranslation()
  40. const isEdit = Boolean(updatePayload)
  41. const [isUploading, setIsUploading] = React.useState(false)
  42. const { handleUpload } = useGitHubUpload()
  43. const handleUploadPackage = async () => {
  44. if (isUploading) return
  45. setIsUploading(true)
  46. try {
  47. const repo = repoUrl.replace('https://github.com/', '')
  48. await handleUpload(repo, selectedVersion, selectedPackage, (GitHubPackage) => {
  49. onUploaded({
  50. uniqueIdentifier: GitHubPackage.unique_identifier,
  51. manifest: GitHubPackage.manifest,
  52. })
  53. })
  54. }
  55. catch (e: any) {
  56. if (e.response?.message)
  57. onFailed(e.response?.message)
  58. else
  59. onFailed(t(`${i18nPrefix}.uploadFailed`))
  60. }
  61. finally {
  62. setIsUploading(false)
  63. }
  64. }
  65. return (
  66. <>
  67. <label
  68. htmlFor='version'
  69. className='flex flex-col justify-center items-start self-stretch text-text-secondary'
  70. >
  71. <span className='system-sm-semibold'>{t(`${i18nPrefix}.selectVersion`)}</span>
  72. </label>
  73. <PortalSelect
  74. value={selectedVersion}
  75. onSelect={onSelectVersion}
  76. items={versions}
  77. installedValue={updatePayload?.originalPackageInfo.version}
  78. placeholder={t(`${i18nPrefix}.selectVersionPlaceholder`) || ''}
  79. popupClassName='w-[512px] z-[1001]'
  80. />
  81. <label
  82. htmlFor='package'
  83. className='flex flex-col justify-center items-start self-stretch text-text-secondary'
  84. >
  85. <span className='system-sm-semibold'>{t(`${i18nPrefix}.selectPackage`)}</span>
  86. </label>
  87. <PortalSelect
  88. value={selectedPackage}
  89. onSelect={onSelectPackage}
  90. items={packages}
  91. readonly={!selectedVersion}
  92. placeholder={t(`${i18nPrefix}.selectPackagePlaceholder`) || ''}
  93. popupClassName='w-[512px] z-[1001]'
  94. />
  95. <div className='flex justify-end items-center gap-2 self-stretch mt-4'>
  96. {!isEdit
  97. && <Button
  98. variant='secondary'
  99. className='min-w-[72px]'
  100. onClick={onBack}
  101. disabled={isUploading}
  102. >
  103. {t('plugin.installModal.back')}
  104. </Button>
  105. }
  106. <Button
  107. variant='primary'
  108. className='min-w-[72px]'
  109. onClick={handleUploadPackage}
  110. disabled={!selectedVersion || !selectedPackage || isUploading}
  111. >
  112. {t('plugin.installModal.next')}
  113. </Button>
  114. </div>
  115. </>
  116. )
  117. }
  118. export default SelectPackage