Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import {
  4. RiArrowDownSLine,
  5. RiCheckLine,
  6. } from '@remixicon/react'
  7. import { AUTO_UPDATE_STRATEGY } from './types'
  8. import {
  9. PortalToFollowElem,
  10. PortalToFollowElemContent,
  11. PortalToFollowElemTrigger,
  12. } from '@/app/components/base/portal-to-follow-elem'
  13. import Button from '@/app/components/base/button'
  14. const i18nPrefix = 'plugin.autoUpdate.strategy'
  15. type Props = {
  16. value: AUTO_UPDATE_STRATEGY
  17. onChange: (value: AUTO_UPDATE_STRATEGY) => void
  18. }
  19. const StrategyPicker = ({
  20. value,
  21. onChange,
  22. }: Props) => {
  23. const { t } = useTranslation()
  24. const [open, setOpen] = useState(false)
  25. const options = [
  26. {
  27. value: AUTO_UPDATE_STRATEGY.disabled,
  28. label: t(`${i18nPrefix}.disabled.name`),
  29. description: t(`${i18nPrefix}.disabled.description`),
  30. },
  31. {
  32. value: AUTO_UPDATE_STRATEGY.fixOnly,
  33. label: t(`${i18nPrefix}.fixOnly.name`),
  34. description: t(`${i18nPrefix}.fixOnly.description`),
  35. },
  36. {
  37. value: AUTO_UPDATE_STRATEGY.latest,
  38. label: t(`${i18nPrefix}.latest.name`),
  39. description: t(`${i18nPrefix}.latest.description`),
  40. },
  41. ]
  42. const selectedOption = options.find(option => option.value === value)
  43. return (
  44. <PortalToFollowElem
  45. open={open}
  46. onOpenChange={setOpen}
  47. placement='top-end'
  48. offset={4}
  49. >
  50. <PortalToFollowElemTrigger onClick={(e) => {
  51. e.stopPropagation()
  52. e.nativeEvent.stopImmediatePropagation()
  53. setOpen(v => !v)
  54. }}>
  55. <Button
  56. size='small'
  57. >
  58. {selectedOption?.label}
  59. <RiArrowDownSLine className='h-3.5 w-3.5' />
  60. </Button>
  61. </PortalToFollowElemTrigger>
  62. <PortalToFollowElemContent className='z-[99]'>
  63. <div className='w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
  64. {
  65. options.map(option => (
  66. <div
  67. key={option.value}
  68. className='flex cursor-pointer rounded-lg p-2 pr-3 hover:bg-state-base-hover'
  69. onClick={(e) => {
  70. e.stopPropagation()
  71. e.nativeEvent.stopImmediatePropagation()
  72. onChange(option.value)
  73. setOpen(false)
  74. }}
  75. >
  76. <div className='mr-1 w-4 shrink-0'>
  77. {
  78. value === option.value && (
  79. <RiCheckLine className='h-4 w-4 text-text-accent' />
  80. )
  81. }
  82. </div>
  83. <div className='grow'>
  84. <div className='system-sm-semibold mb-0.5 text-text-secondary'>{option.label}</div>
  85. <div className='system-xs-regular text-text-tertiary'>{option.description}</div>
  86. </div>
  87. </div>
  88. ))
  89. }
  90. </div>
  91. </PortalToFollowElemContent>
  92. </PortalToFollowElem>
  93. )
  94. }
  95. export default StrategyPicker