diff --git a/src/components/Markdowns/MarkdownEditor.js b/src/components/Markdowns/MarkdownEditor.js index 13613b8..5e9af37 100644 --- a/src/components/Markdowns/MarkdownEditor.js +++ b/src/components/Markdowns/MarkdownEditor.js @@ -42,9 +42,8 @@ const MarkdownEditor = () => { const hasPermission = roles.includes("admin") || roles.includes("creator"); - if (!hasPermission) { + if (!hasPermission) return
Loading...
; diff --git a/src/components/Modals/PathSettingModal.js b/src/components/Modals/PathSettingModal.js new file mode 100644 index 0000000..6d748ee --- /dev/null +++ b/src/components/Modals/PathSettingModal.js @@ -0,0 +1,363 @@ +import React, { useState, useEffect } from "react"; +import { + useCreateWebhookSetting, + useUpdateWebhookSetting, + useWebhookSettingByPathId, + useWebhooks, + useCreateWebhook, + useUpdateWebhook, + useDeleteWebhook +} from "../../utils/webhook-queries"; + +const PathSettingModal = ({ pathId, isOpen, onClose }) => { + const { data: setting } = useWebhookSettingByPathId(pathId); + const { data: webhooks } = useWebhooks(); + + const createWebhookSetting = useCreateWebhookSetting(); + const updateWebhookSetting = useUpdateWebhookSetting(); + const createWebhook = useCreateWebhook(); + const updateWebhook = useUpdateWebhook(); + const deleteWebhook = useDeleteWebhook(); + + const [url, setUrl] = useState(""); + const [enabled, setEnabled] = useState(false); + const [webhookId, setWebhookId] = useState(-1); + const [isOnMarkdownCreated, setIsOnMarkdownCreated] = useState(false); + const [isOnMarkdownUpdated, setIsOnMarkdownUpdated] = useState(false); + const [isOnMarkdownDeleted, setIsOnMarkdownDeleted] = useState(false); + + const [isOnPathCreated, setIsOnPathCreated] = useState(false); + const [isOnPathUpdated, setIsOnPathUpdated] = useState(false); + const [isOnPathDeleted, setIsOnPathDeleted] = useState(false); + + const [triggerEvents, setTriggerEvents] = useState(0); + const [isRecursive, setIsRecursive] = useState(false); + const [additionalHeaders, setAdditionalHeaders] = useState({}); + const [headerList, setHeaderList] = useState([]); + const handleTriggerEventsUpdate = (eventType, isChecked) => { + setTriggerEvents((prevEvents) => { + let newEvents = prevEvents; + + switch (eventType) { + case "isOnMarkdownCreated": + newEvents = isChecked ? (newEvents | 1) : (newEvents & ~1); + break; + case "isOnMarkdownUpdated": + newEvents = isChecked ? (newEvents | 2) : (newEvents & ~2); + break; + case "isOnMarkdownDeleted": + newEvents = isChecked ? (newEvents | 4) : (newEvents & ~4); + break; + case "isOnPathCreated": + newEvents = isChecked ? (newEvents | 8) : (newEvents & ~8); + break; + case "isOnPathUpdated": + newEvents = isChecked ? (newEvents | 16) : (newEvents & ~16); + break; + case "isOnPathDeleted": + newEvents = isChecked ? (newEvents | 32) : (newEvents & ~32); + break; + default: + break; + } + + return newEvents; + }); + }; + + const assignFromTriggerEvents = (events) => { + setIsOnMarkdownCreated((events & 1) > 0); + setIsOnMarkdownUpdated((events & 2) > 0); + setIsOnMarkdownDeleted((events & 4) > 0); + setIsOnPathCreated((events & 8) > 0); + setIsOnPathUpdated((events & 16) > 0); + setIsOnPathDeleted((events & 32) > 0); + }; + + useEffect(() => { + if (setting && webhooks) { + setEnabled(setting.enabled); + setWebhookId(setting.webhook_id || -1); + const selectedWebhook = webhooks?.find(hook => hook.id === setting.webhook_id); + if (selectedWebhook) { + setUrl(selectedWebhook.hook_url); + } + setTriggerEvents(setting.on_events); + assignFromTriggerEvents(setting.on_events); + setIsRecursive(setting.recursive); + try{ + const headers = setting.additional_header ? + JSON.parse(setting.additional_header) : {}; + setAdditionalHeaders(headers); + setHeaderList(Object.entries(headers).map(([key, value]) => ({key, value }))); + } catch(err) { + setAdditionalHeaders({}); + setHeaderList([]); + } + } else { + setUrl(""); + setEnabled(false); + setWebhookId(-1); + setTriggerEvents(0); + assignFromTriggerEvents(0); + setIsRecursive(false); + setAdditionalHeaders({}); + setHeaderList([]); + } + }, [setting, webhooks]); + + const handleSave = () => { + const payload = { + path_id: pathId, + webhook_id: webhookId, + enabled, + on_events: triggerEvents, + recursive: isRecursive, + additional_header: JSON.stringify(additionalHeaders), + }; + console.log(payload); + if (!setting) { + createWebhookSetting.mutate(payload, { + onSuccess: () => alert("Webhook setting created successfully"), + onError: () => alert("Webhook setting creation failed"), + }); + } else { + updateWebhookSetting.mutate({ id: setting.id, data: payload }, { + onSuccess: () => alert("Webhook setting updated successfully"), + onError: () => alert("Webhook setting update failed"), + }); + } + + onClose(); + }; + + const handleCreateWebhook = () => { + const newUrl = prompt("Enter new webhook URL"); + if (newUrl) { + createWebhook.mutate(newUrl, { + onSuccess: () => alert("Webhook created successfully"), + onError: () => alert("Webhook creation failed"), + }); + } + }; + + const handleUpdateWebhook = () => { + const newUrl = prompt("Enter new webhook URL", url); + if (newUrl && webhookId !== -1) { + updateWebhook.mutate({ id: webhookId, data: { hook_url: newUrl } }, { + onSuccess: () => alert("Webhook updated successfully"), + onError: () => alert("Webhook update failed"), + }); + } + }; + + const handleDeleteWebhook = () => { + if (webhookId !== -1 && window.confirm("Are you sure you want to delete this webhook?")) { + deleteWebhook.mutate(webhookId, { + onSuccess: () => alert("Webhook deleted successfully"), + onError: () => alert("Webhook deletion failed"), + }); + } + }; + + const handleApplyHeaders = () => { + const newHeaders = {}; + headerList.forEach(({ key, value }) => { + if (key.trim()) newHeaders[key] = value; + }); + setAdditionalHeaders(newHeaders); + }; + + const handleHeaderChange = (index, field, value) => { + const updatedHeaders = [...headerList]; + updatedHeaders[index][field] = value; + setHeaderList(updatedHeaders); + }; + const handleAddHeader = () => { + setHeaderList([...headerList, { key: "", value: "" }]) + }; + + return ( +Webhook Settings
+ +