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 { useEndpointAction } from '../../../hooks/useEndpointAction'; import { useRoute } from '../../../contexts/RouterContext'; import { useMethod } from '../../../contexts/ServerContext'; import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext'; import { useSetModal } from '../../../contexts/ModalContext'; import OutgoingWebhookForm from '../OutgoiongWebhookForm'; import { useForm } from '../../../hooks/useForm'; export default function EditOutgoingWebhookWithData({ 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 ?? true, impersonateUser: data.impersonateUser, event: data.event, token: data.token, urls: data.urls.join('\n') ?? '', triggerWords: data.triggerWords?.join('; ') ?? '', targetRoom: data.targetRoom ?? '', channel: data.channel.join(', ') ?? '', username: data.username ?? '', name: data.name ?? '', alias: data.alias ?? '', avatarUrl: data.avatarUrl ?? '', emoji: data.emoji ?? '', scriptEnabled: data.scriptEnabled ?? false, script: data.script ?? '', retryFailedCalls: data.retryFailedCalls ?? true, retryCount: data.retryCount ?? 5, retryDelay: data.retryDelay ?? 'power-of-ten', triggerrWordAnywhere: data.triggerrWordAnywhere ?? false, runOnEdits: data.runOnEdits ?? true, }; return initialValue; }; function EditOutgoingWebhook({ data, onChange, setSaveAction, ...props }) { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const { handlers: formHandlers, values: formValues, reset } = useForm(getInitialValue(data)); const setModal = useSetModal(); const saveIntegration = useMethod('updateOutgoingIntegration'); const router = useRoute('admin-integrations'); const deleteQuery = useMemo(() => ({ type: 'webhook-outgoing', integrationId: data._id }), [data._id]); const deleteIntegration = useEndpointAction('POST', 'integrations.remove', deleteQuery); const handleDeleteIntegration = useCallback(() => { const closeModal = () => setModal(); const onDelete = async () => { const result = await deleteIntegration(); if (result.success) { setModal( { closeModal(); router.push({}); }}/>); } }; setModal(); }, [deleteIntegration, router]); const { urls, triggerWords, } = formValues; const handleSave = useCallback(async () => { try { await saveIntegration(data._id, { ...formValues, triggerWords: triggerWords.split(/\s*(?:;|$)\s*/), urls: urls.split('\n'), }); dispatchToastMessage({ type: 'success', message: t('Integration_updated') }); onChange(); } catch (e) { dispatchToastMessage({ type: 'error', message: e }); } }, [data._id, dispatchToastMessage, formValues, onChange, saveIntegration, t, triggerWords, urls]); const actionButtons = useMemo(() => , [handleDeleteIntegration, handleSave, reset, t]); return ; }