import React, { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useBoolean } from 'ahooks' import copy from 'copy-to-clipboard' import { RiClipboardLine, RiDeleteBinLine, RiEditLine, RiLoginCircleLine } from '@remixicon/react' import type { EndpointListItem } from '../types' import EndpointModal from './endpoint-modal' import { NAME_FIELD } from './utils' import { addDefaultValue, toolCredentialToFormSchemas } from '@/app/components/tools/utils/to-form-schema' import { ClipboardCheck } from '@/app/components/base/icons/src/vender/line/files' import ActionButton from '@/app/components/base/action-button' import Confirm from '@/app/components/base/confirm' import Indicator from '@/app/components/header/indicator' import Switch from '@/app/components/base/switch' import Toast from '@/app/components/base/toast' import Tooltip from '@/app/components/base/tooltip' import { useDeleteEndpoint, useDisableEndpoint, useEnableEndpoint, useUpdateEndpoint, } from '@/service/use-endpoints' type Props = { data: EndpointListItem handleChange: () => void } const EndpointCard = ({ data, handleChange, }: Props) => { const { t } = useTranslation() const [active, setActive] = useState(data.enabled) const endpointID = data.id // switch const [isShowDisableConfirm, { setTrue: showDisableConfirm, setFalse: hideDisableConfirm, }] = useBoolean(false) const { mutate: enableEndpoint } = useEnableEndpoint({ onSuccess: async () => { await handleChange() }, onError: () => { Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) setActive(false) }, }) const { mutate: disableEndpoint } = useDisableEndpoint({ onSuccess: async () => { await handleChange() hideDisableConfirm() }, onError: () => { Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) setActive(false) }, }) const handleSwitch = (state: boolean) => { if (state) { setActive(true) enableEndpoint(endpointID) } else { setActive(false) showDisableConfirm() } } // delete const [isShowDeleteConfirm, { setTrue: showDeleteConfirm, setFalse: hideDeleteConfirm, }] = useBoolean(false) const { mutate: deleteEndpoint } = useDeleteEndpoint({ onSuccess: async () => { await handleChange() hideDeleteConfirm() }, onError: () => { Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }, }) // update const [isShowEndpointModal, { setTrue: showEndpointModalConfirm, setFalse: hideEndpointModalConfirm, }] = useBoolean(false) const formSchemas = useMemo(() => { return toolCredentialToFormSchemas([NAME_FIELD, ...data.declaration.settings]) }, [data.declaration.settings]) const formValue = useMemo(() => { const formValue = { name: data.name, ...data.settings, } return addDefaultValue(formValue, formSchemas) }, [data.name, data.settings, formSchemas]) const { mutate: updateEndpoint } = useUpdateEndpoint({ onSuccess: async () => { await handleChange() hideEndpointModalConfirm() }, onError: () => { Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }, }) const handleUpdate = (state: any) => updateEndpoint({ endpointID, state, }) const [isCopied, setIsCopied] = useState(false) const handleCopy = (value: string) => { copy(value) setIsCopied(true) } useEffect(() => { if (isCopied) { const timer = setTimeout(() => { setIsCopied(false) }, 2000) return () => { clearTimeout(timer) } } }, [isCopied]) const CopyIcon = isCopied ? ClipboardCheck : RiClipboardLine return (
{data.name}
{data.declaration.endpoints.map((endpoint, index) => (
{endpoint.method}
{`${data.url}${endpoint.path}`}
handleCopy(`${data.url}${endpoint.path}`)}>
))}
{active && (
{t('plugin.detailPanel.serviceOk')}
)} {!active && (
{t('plugin.detailPanel.disabled')}
)}
{isShowDisableConfirm && ( {t('plugin.detailPanel.endpointDisableContent', { name: data.name })}
} onCancel={() => { hideDisableConfirm() setActive(true) }} onConfirm={() => disableEndpoint(endpointID)} /> )} {isShowDeleteConfirm && ( {t('plugin.detailPanel.endpointDeleteContent', { name: data.name })}} onCancel={hideDeleteConfirm} onConfirm={() => deleteEndpoint(endpointID)} /> )} {isShowEndpointModal && ( )} ) } export default EndpointCard