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 }
>;
}