Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

modal.tsx 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback, useState } from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import Modal from '@/app/components/base/modal'
  6. import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card'
  7. import Button from '@/app/components/base/button'
  8. import type { Permissions, ReferenceSetting } from '@/app/components/plugins/types'
  9. import { PermissionType } from '@/app/components/plugins/types'
  10. import type { AutoUpdateConfig } from './auto-update-setting/types'
  11. import AutoUpdateSetting from './auto-update-setting'
  12. import { defaultValue as autoUpdateDefaultValue } from './auto-update-setting/config'
  13. import { useGlobalPublicStore } from '@/context/global-public-context'
  14. import Label from './label'
  15. const i18nPrefix = 'plugin.privilege'
  16. type Props = {
  17. payload: ReferenceSetting
  18. onHide: () => void
  19. onSave: (payload: ReferenceSetting) => void
  20. }
  21. const PluginSettingModal: FC<Props> = ({
  22. payload,
  23. onHide,
  24. onSave,
  25. }) => {
  26. const { t } = useTranslation()
  27. const { auto_upgrade: autoUpdateConfig, permission: privilege } = payload || {}
  28. const [tempPrivilege, setTempPrivilege] = useState<Permissions>(privilege)
  29. const [tempAutoUpdateConfig, setTempAutoUpdateConfig] = useState<AutoUpdateConfig>(autoUpdateConfig || autoUpdateDefaultValue)
  30. const { enable_marketplace } = useGlobalPublicStore(s => s.systemFeatures)
  31. const handlePrivilegeChange = useCallback((key: string) => {
  32. return (value: PermissionType) => {
  33. setTempPrivilege({
  34. ...tempPrivilege,
  35. [key]: value,
  36. })
  37. }
  38. }, [tempPrivilege])
  39. const handleSave = useCallback(async () => {
  40. await onSave({
  41. permission: tempPrivilege,
  42. auto_upgrade: tempAutoUpdateConfig,
  43. })
  44. onHide()
  45. }, [onHide, onSave, tempAutoUpdateConfig, tempPrivilege])
  46. return (
  47. <Modal
  48. isShow
  49. onClose={onHide}
  50. closable
  51. className='w-[620px] max-w-[620px] !p-0'
  52. >
  53. <div className='shadows-shadow-xl flex w-full flex-col items-start rounded-2xl border border-components-panel-border bg-components-panel-bg'>
  54. <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
  55. <span className='title-2xl-semi-bold self-stretch text-text-primary'>{t(`${i18nPrefix}.title`)}</span>
  56. </div>
  57. <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
  58. {[
  59. { title: t(`${i18nPrefix}.whoCanInstall`), key: 'install_permission', value: tempPrivilege?.install_permission || PermissionType.noOne },
  60. { title: t(`${i18nPrefix}.whoCanDebug`), key: 'debug_permission', value: tempPrivilege?.debug_permission || PermissionType.noOne },
  61. ].map(({ title, key, value }) => (
  62. <div key={key} className='flex flex-col items-start gap-1 self-stretch'>
  63. <Label label={title} />
  64. <div className='flex w-full items-start justify-between gap-2'>
  65. {[PermissionType.everyone, PermissionType.admin, PermissionType.noOne].map(option => (
  66. <OptionCard
  67. key={option}
  68. title={t(`${i18nPrefix}.${option}`)}
  69. onSelect={() => handlePrivilegeChange(key)(option)}
  70. selected={value === option}
  71. className="flex-1"
  72. />
  73. ))}
  74. </div>
  75. </div>
  76. ))}
  77. </div>
  78. {
  79. enable_marketplace && (
  80. <AutoUpdateSetting payload={tempAutoUpdateConfig} onChange={setTempAutoUpdateConfig} />
  81. )
  82. }
  83. <div className='flex h-[76px] items-center justify-end gap-2 self-stretch p-6 pt-5'>
  84. <Button
  85. className='min-w-[72px]'
  86. onClick={onHide}
  87. >
  88. {t('common.operation.cancel')}
  89. </Button>
  90. <Button
  91. className='min-w-[72px]'
  92. variant={'primary'}
  93. onClick={handleSave}
  94. >
  95. {t('common.operation.save')}
  96. </Button>
  97. </div>
  98. </div>
  99. </Modal>
  100. )
  101. }
  102. export default React.memo(PluginSettingModal)