diff --git a/apps/roam/src/components/settings/DiscourseNodeConfigPanel.tsx b/apps/roam/src/components/settings/DiscourseNodeConfigPanel.tsx index 5b649438c..cb1d0295f 100644 --- a/apps/roam/src/components/settings/DiscourseNodeConfigPanel.tsx +++ b/apps/roam/src/components/settings/DiscourseNodeConfigPanel.tsx @@ -1,4 +1,5 @@ import { + Alert, Button, ControlGroup, InputGroup, @@ -12,6 +13,8 @@ import refreshConfigTree from "~/utils/refreshConfigTree"; import createPage from "roamjs-components/writes/createPage"; import type { CustomField } from "roamjs-components/components/ConfigPanels/types"; import posthog from "posthog-js"; +import getDiscourseRelations from "~/utils/getDiscourseRelations"; +import { deleteBlock } from "roamjs-components/writes"; type DiscourseNodeConfigPanelProps = React.ComponentProps< CustomField["options"]["component"] @@ -32,6 +35,10 @@ const DiscourseNodeConfigPanel: React.FC = ({ null, ); + const [isAlertOpen, setIsAlertOpen] = useState(false); + const [alertMessage, setAlertMessage] = useState(""); + const [affectedRelations, setAffectedRelations] = useState([]); + const [nodeTypeIdToDelete, setNodeTypeIdToDelete] = useState(""); const navigateToNode = (uid: string) => { if (isPopup) { setSelectedTabId(uid); @@ -40,6 +47,15 @@ const DiscourseNodeConfigPanel: React.FC = ({ } }; + const deleteNodeType = async (uid: string) => { + await window.roamAlphaAPI.deletePage({ + page: { uid }, + }); + setNodes((prevNodes) => prevNodes.filter((nn) => nn.type !== uid)); + refreshConfigTree(); + setDeleteConfirmation(null); + }; + return ( <> @@ -121,38 +137,100 @@ const DiscourseNodeConfigPanel: React.FC = ({ icon="trash" minimal onClick={() => { - if (deleteConfirmation) setDeleteConfirmation(null); - else setDeleteConfirmation(n.type); + if (deleteConfirmation === n.type) { + setDeleteConfirmation(null); + } else { + setDeleteConfirmation(n.type); + } }} /> ))} + + { + if (affectedRelations.length > 0) { + try { + for (const rel of affectedRelations) { + await deleteBlock(rel.id).catch((error) => { + console.error( + `Failed to delete relation: ${rel.id}, ${error.message}`, + ); + throw error; + }); + } + deleteNodeType(nodeTypeIdToDelete); + } catch (error) { + console.error( + `Failed to complete deletion for UID: ${nodeTypeIdToDelete}): ${error instanceof Error ? error.message : String(error)}`, + ); + } finally { + setIsAlertOpen(false); + } + } + }} + onCancel={() => { + setIsAlertOpen(false); + setDeleteConfirmation(null); + }} + intent={Intent.DANGER} + confirmButtonText="Delete" + cancelButtonText="Cancel" + canEscapeKeyCancel={true} + canOutsideClickCancel={true} + > +
+ {alertMessage} +
+
); };