diff --git a/client/src/Hooks/useNotifications.js b/client/src/Hooks/useNotifications.js index c8dc6b3db..8e7f896e9 100644 --- a/client/src/Hooks/useNotifications.js +++ b/client/src/Hooks/useNotifications.js @@ -152,10 +152,36 @@ const useEditNotification = () => { return [editNotification, isLoading, error]; }; +const useTestNotification = () => { + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const { t } = useTranslation(); + + const testNotification = async (notification) => { + try { + setIsLoading(true); + await networkService.testNotification({ notification }); + createToast({ + body: t("notifications.test.success"), + }); + } catch (error) { + setError(error); + createToast({ + body: t("notifications.test.failed"), + }); + } finally { + setIsLoading(false); + } + }; + + return [testNotification, isLoading, error]; +}; + export { useCreateNotification, useGetNotificationsByTeamId, useDeleteNotification, useGetNotificationById, useEditNotification, + useTestNotification, }; diff --git a/client/src/Pages/Notifications/create/index.jsx b/client/src/Pages/Notifications/create/index.jsx index b123dcbd7..19335c790 100644 --- a/client/src/Pages/Notifications/create/index.jsx +++ b/client/src/Pages/Notifications/create/index.jsx @@ -16,6 +16,7 @@ import { useCreateNotification, useGetNotificationById, useEditNotification, + useTestNotification, } from "../../../Hooks/useNotifications"; import { notificationEmailValidation, @@ -35,6 +36,8 @@ const CreateNotifications = () => { const [createNotification, isCreating, createNotificationError] = useCreateNotification(); const [editNotification, isEditing, editNotificationError] = useEditNotification(); + const [testNotification, isTesting, testNotificationError] = useTestNotification(); + const BREADCRUMBS = [ { name: "notifications", path: "/notifications" }, { name: "create", path: "/notifications/create" }, @@ -178,6 +181,56 @@ const CreateNotifications = () => { setNotification(newNotification); }; + const onTestNotification = () => { + const form = { + ...notification, + type: NOTIFICATION_TYPES.find((type) => type._id === notification.type).value, + }; + + if (notification.type === 2) { + form.type = "webhook"; + } + + let error = null; + + if (form.type === "email") { + error = notificationEmailValidation.validate( + { notificationName: form.notificationName, address: form.address }, + { abortEarly: false } + ).error; + } else if (form.type === "webhook") { + form.config = { + platform: form.config.platform, + webhookUrl: form.config.webhookUrl, + }; + error = notificationWebhookValidation.validate( + { notificationName: form.notificationName, config: form.config }, + { abortEarly: false } + ).error; + } else if (form.type === "pager_duty") { + form.config = { + platform: form.config.platform, + routingKey: form.config.routingKey, + }; + error = notificationPagerDutyValidation.validate( + { notificationName: form.notificationName, config: form.config }, + { abortEarly: false } + ).error; + } + + if (error) { + const newErrors = {}; + error.details.forEach((err) => { + newErrors[err.path[0]] = err.message; + }); + createToast({ body: "Please check the form for errors." }); + setErrors(newErrors); + return; + } + + testNotification(form); + }; + return ( @@ -357,7 +410,16 @@ const CreateNotifications = () => { +