item.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import type { FC } from 'react'
  2. import { useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import {
  5. RiDeleteBinLine,
  6. RiEditLine,
  7. } from '@remixicon/react'
  8. import Button from '@/app/components/base/button'
  9. import type { ApiBasedExtension } from '@/models/common'
  10. import { useModalContext } from '@/context/modal-context'
  11. import { deleteApiBasedExtension } from '@/service/common'
  12. import Confirm from '@/app/components/base/confirm'
  13. type ItemProps = {
  14. data: ApiBasedExtension
  15. onUpdate: () => void
  16. }
  17. const Item: FC<ItemProps> = ({
  18. data,
  19. onUpdate,
  20. }) => {
  21. const { t } = useTranslation()
  22. const { setShowApiBasedExtensionModal } = useModalContext()
  23. const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
  24. const handleOpenApiBasedExtensionModal = () => {
  25. setShowApiBasedExtensionModal({
  26. payload: data,
  27. onSaveCallback: () => onUpdate(),
  28. })
  29. }
  30. const handleDeleteApiBasedExtension = async () => {
  31. await deleteApiBasedExtension(`/api-based-extension/${data.id}`)
  32. setShowDeleteConfirm(false)
  33. onUpdate()
  34. }
  35. return (
  36. <div className='group flex items-center mb-2 px-4 py-2 border-[0.5px] border-transparent rounded-xl bg-components-input-bg-normal hover:border-components-input-border-active hover:shadow-xs'>
  37. <div className='grow'>
  38. <div className='mb-0.5 text-[13px] font-medium text-text-secondary'>{data.name}</div>
  39. <div className='text-xs text-text-tertiary'>{data.api_endpoint}</div>
  40. </div>
  41. <div className='hidden group-hover:flex items-center'>
  42. <Button
  43. className='mr-1'
  44. onClick={handleOpenApiBasedExtensionModal}
  45. >
  46. <RiEditLine className='mr-1 w-4 h-4' />
  47. {t('common.operation.edit')}
  48. </Button>
  49. <Button
  50. onClick={() => setShowDeleteConfirm(true)}
  51. >
  52. <RiDeleteBinLine className='mr-1 w-4 h-4' />
  53. {t('common.operation.delete')}
  54. </Button>
  55. </div>
  56. {
  57. showDeleteConfirm
  58. && <Confirm
  59. isShow={showDeleteConfirm}
  60. onCancel={() => setShowDeleteConfirm(false)}
  61. title={`${t('common.operation.delete')} “${data.name}”?`}
  62. onConfirm={handleDeleteApiBasedExtension}
  63. confirmText={t('common.operation.delete') || ''}
  64. />
  65. }
  66. </div>
  67. )
  68. }
  69. export default Item