Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions apps/roam/src/components/ModifyNodeDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ export type ModifyNodeDialogProps = {
includeDefaultNodes?: boolean; // Include default nodes (Page, Block) in node type selector
imageUrl?: string; // For image conversion from canvas
disableNodeTypeChange?: boolean; // Disable node type selector (e.g. canvas contexts)
createOverride?: (args: {
formattedTitle: string;
configPageUid: string;
}) => Promise<string | void>;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why void?

onSuccess: (result: {
text: string;
uid: string;
Expand All @@ -69,6 +73,7 @@ const ModifyNodeDialog = ({
includeDefaultNodes = false,
imageUrl,
disableNodeTypeChange = false,
createOverride,
onSuccess,
onClose,
}: RoamOverlayProps<ModifyNodeDialogProps>) => {
Expand Down Expand Up @@ -416,13 +421,20 @@ const ModifyNodeDialog = ({
return;
}

// Create new discourse node
const newPageUid = await createDiscourseNode({
text: formattedTitle,
configPageUid: selectedNodeType?.type ?? "",
extensionAPI,
imageUrl,
});
const configPageUid = selectedNodeType?.type ?? "";
const overrideUid = createOverride
? await createOverride({ formattedTitle, configPageUid })
: undefined;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we just do a single const:

const overrideUid = createOverride
          ? await createOverride({ formattedTitle, configPageUid })
          : await createDiscourseNode({
              text: formattedTitle,
              configPageUid,
              extensionAPI,
              imageUrl,
            });


const newPageUid =
overrideUid !== undefined
? overrideUid
: await createDiscourseNode({
text: formattedTitle,
configPageUid,
extensionAPI,
imageUrl,
});

if (sourceBlockUid) {
const pageRef = `[[${formattedTitle}]]`;
Expand Down
96 changes: 96 additions & 0 deletions apps/roam/src/utils/registerCommandPaletteCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ import {
getOverlayHandler,
onPageRefObserverChange,
} from "./pageRefObserverHandlers";
import findDiscourseNode from "~/utils/findDiscourseNode";
import getFullTreeByParentUid from "roamjs-components/queries/getFullTreeByParentUid";
import getSubTree from "roamjs-components/util/getSubTree";
import stripUid from "roamjs-components/util/stripUid";
import { HIDE_METADATA_KEY } from "~/data/userSettings";
import posthog from "posthog-js";
import { extractRef } from "roamjs-components/util";
Expand Down Expand Up @@ -121,6 +125,95 @@ export const createDiscourseNodeFromCommand = (
});
};

export const convertPageToNodeFromCommand = (
extensionAPI: OnloadArgs["extensionAPI"],
) => {
posthog.capture("Discourse Node: Convert Command Triggered");
const pageUid = getCurrentPageUid();
if (!pageUid) {
renderToast({
id: "convert-page-no-page",
content: "Navigate to a page to convert it to a discourse node.",
});
return;
}

const pageTitle = getPageTitleByPageUid(pageUid);
if (!pageTitle) {
renderToast({
id: "convert-page-no-title",
content: "Could not determine the current page title.",
});
return;
}

const existingNode = findDiscourseNode({ uid: pageUid, title: pageTitle });
if (existingNode && existingNode.backedBy !== "default") {
renderToast({
id: "convert-page-already-node",
content: `This page is already a ${existingNode.text} node.`,
});
return;
}

renderModifyNodeDialog({
mode: "create",
nodeType: "",
initialValue: { text: pageTitle, uid: "" },
extensionAPI,
createOverride: async ({ formattedTitle, configPageUid }) => {
await window.roamAlphaAPI.data.page.update({
page: { uid: pageUid, title: formattedTitle },
});

const nodeTree = getFullTreeByParentUid(configPageUid).children;
const templateNode = getSubTree({ tree: nodeTree, key: "template" });
if (templateNode.children.length > 0) {
const hasSmartBlockSyntax = (
node: Parameters<typeof stripUid>[0][0],
): boolean => {
if (node.text.includes("<%")) return true;
if (node.children) return node.children.some(hasSmartBlockSyntax);
return false;
};
const useSmartBlocks = hasSmartBlockSyntax(templateNode);

if (useSmartBlocks && window.roamjs?.extension?.smartblocks) {
void window.roamjs.extension.smartblocks?.triggerSmartblock({
srcUid: templateNode.uid,
targetUid: pageUid,
});
} else {
if (useSmartBlocks) {
renderToast({
content:
"This template requires SmartBlocks. Enable SmartBlocks in Roam Depot to use this template.",
id: "smartblocks-extension-disabled",
intent: "warning",
});
}
const existingChildren =
getFullTreeByParentUid(pageUid).children || [];
const lastOrder = existingChildren.length;
await Promise.all(
stripUid(templateNode.children).map((node, order) =>
createBlock({
node,
order: lastOrder + order,
parentUid: pageUid,
}),
),
Comment thread
sid597 marked this conversation as resolved.
Comment on lines +169 to +205
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like code that is used elsewhere. Can we DRY it?

);
}
}

return pageUid;
},
onSuccess: async () => {},
onClose: () => {},
});
};

export const registerCommandPaletteCommands = (onloadArgs: OnloadArgs) => {
const { extensionAPI } = onloadArgs;

Expand Down Expand Up @@ -314,6 +407,9 @@ export const registerCommandPaletteCommands = (onloadArgs: OnloadArgs) => {
};

// Roam organizes commands alphabetically
void addCommand("DG: Convert current page to discourse node", () =>
convertPageToNodeFromCommand(extensionAPI),
);
void addCommand("DG: Create/Insert discourse node", () =>
createDiscourseNodeFromCommand(extensionAPI),
);
Expand Down
Loading