diff --git a/apps/roam/src/data/blockPropsSettingsConfig.ts b/apps/roam/src/data/blockPropsSettingsConfig.ts index 9b6b10987..54dc17ba3 100644 --- a/apps/roam/src/data/blockPropsSettingsConfig.ts +++ b/apps/roam/src/data/blockPropsSettingsConfig.ts @@ -1 +1,2 @@ -export const DG_BLOCK_PROP_SETTINGS_PAGE_TITLE ="roam/js/discourse-graph/block-prop-settings"; \ No newline at end of file +export const DG_BLOCK_PROP_SETTINGS_PAGE_TITLE ="roam/js/discourse-graph/block-prop-settings"; +export const TOP_LEVEL_BLOCK_PROP_KEYS = { featureFlags: "Feature Flags" }; \ No newline at end of file diff --git a/apps/roam/src/utils/initBlockPropSettings.ts b/apps/roam/src/utils/initBlockPropSettings.ts new file mode 100644 index 000000000..38f027b86 --- /dev/null +++ b/apps/roam/src/utils/initBlockPropSettings.ts @@ -0,0 +1,58 @@ +import { + TOP_LEVEL_BLOCK_PROP_KEYS, + DG_BLOCK_PROP_SETTINGS_PAGE_TITLE, +} from "~/data/blockPropsSettingsConfig"; +import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle"; +import getShallowTreeByParentUid from "roamjs-components/queries/getShallowTreeByParentUid"; +import { createPage, createBlock } from "roamjs-components/writes"; + +const ensurePageExists = async (pageTitle: string): Promise => { + let pageUid = getPageUidByPageTitle(pageTitle); + + if (!pageUid) { + pageUid = window.roamAlphaAPI.util.generateUID(); + await createPage({ + title: pageTitle, + uid: pageUid, + }); + } + + return pageUid; +}; + +const ensureBlocksExist = async ( + pageUid: string, +): Promise> => { + const blockTexts = Object.values(TOP_LEVEL_BLOCK_PROP_KEYS); + const existingChildren = getShallowTreeByParentUid(pageUid); + + const blockMap: Record = {}; + existingChildren.forEach((child) => { + blockMap[child.text] = child.uid; + }); + + const missingBlocks = blockTexts.filter((blockText) => !blockMap[blockText]); + + if (missingBlocks.length > 0) { + const createdBlocks = await Promise.all( + missingBlocks.map(async (blockText) => { + const uid = await createBlock({ + parentUid: pageUid, + node: { text: blockText }, + }); + return { text: blockText, uid }; + }), + ); + + createdBlocks.forEach((block) => { + blockMap[block.text] = block.uid; + }); + } + + return blockMap; +}; + +export const initSchema = async (): Promise> => { + const pageUid = await ensurePageExists(DG_BLOCK_PROP_SETTINGS_PAGE_TITLE); + return await ensureBlocksExist(pageUid); +};