import React, { useMemo, useState, useCallback } from 'react'; import { Field, Box, Skeleton, Margins, Button } from '@rocket.chat/fuselage'; import { SuccessModal, DeleteWarningModal } from './EditIntegrationsPage'; import { useTranslation } from '../../../contexts/TranslationContext'; import { useEndpointDataExperimental, ENDPOINT_STATES } from '../../../hooks/useEndpointDataExperimental'; import { useMethod } from '../../../contexts/ServerContext'; import { useEndpointAction } from '../../../hooks/useEndpointAction'; import { useRoute } from '../../../contexts/RouterContext'; import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext'; import { useForm } from '../../../hooks/useForm'; import IncomingWebhookForm from '../IncomingWebhookForm'; export default function EditIncomingWebhookWithData({ integrationId, ...props }) { const t = useTranslation(); const [cache, setCache] = useState(); // TODO: remove cache. Is necessary for data validation const { data, state, error } = useEndpointDataExperimental('integrations.get', useMemo(() => ({ integrationId }), [integrationId, cache])); const onChange = () => setCache(new Date()); if (state === ENDPOINT_STATES.LOADING) { return ; } if (error) { return {t('Oops_page_not_found')}; } return ; } const getInitialValue = (data) => { const initialValue = { enabled: data.enabled, channel: data.channel.join(', ') ?? '', username: data.username ?? '', name: data.name ?? '', alias: data.alias ?? '', avatarUrl: data.avatarUrl ?? '', emoji: data.emoji ?? '', scriptEnabled: data.scriptEnabled, script: data.script, }; return initialValue; }; function EditIncomingWebhook({ data, onChange, ...props }) { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const { values: formValues, handlers: formHandlers, reset } = useForm(getInitialValue(data)); const [modal, setModal] = useState(); const deleteQuery = useMemo(() => ({ type: 'webhook-incoming', integrationId: data._id }), [data._id]); const deleteIntegration = useEndpointAction('POST', 'integrations.remove', deleteQuery); const saveIntegration = useMethod('updateIncomingIntegration'); const router = useRoute('admin-integrations'); const handleDeleteIntegration = useCallback(() => { const closeModal = () => setModal(); const onDelete = async () => { const result = await deleteIntegration(); if (result.success) { setModal( { closeModal(); router.push({}); }}/>); } }; setModal(); }, [deleteIntegration, router]); const handleSave = useCallback(async () => { try { await saveIntegration(data._id, { ...formValues }); dispatchToastMessage({ type: 'success', message: t('Integration_updated') }); onChange(); } catch (e) { dispatchToastMessage({ type: 'error', message: e }); } }, [data._id, dispatchToastMessage, formValues, onChange, saveIntegration, t]); const actionButtons = useMemo(() => , [handleDeleteIntegration, handleSave, reset, t]); return <> { modal } ; }