From 7a0e1d8d03f867cffbc3cef6fb3f78b58e59633a Mon Sep 17 00:00:00 2001 From: sid597 Date: Fri, 7 Aug 2026 11:39:58 +0530 Subject: [PATCH 1/2] [ENG-1860] Add Roam manual refresh for imported nodes --- .../RefreshImportedNodeTitleButton.tsx | 62 ++++++ .../__tests__/materializeSharedNode.test.ts | 26 +++ .../__tests__/refreshImportedNode.test.ts | 187 ++++++++++++++++++ .../utils/initializeObserversAndListeners.ts | 7 + apps/roam/src/utils/materializeSharedNode.ts | 3 + apps/roam/src/utils/refreshImportedNode.ts | 89 +++++++++ .../src/lib/__tests__/sharedNodes.test.ts | 153 +++++++++++++- packages/database/src/lib/sharedNodes.ts | 75 +++++-- 8 files changed, 588 insertions(+), 14 deletions(-) create mode 100644 apps/roam/src/components/RefreshImportedNodeTitleButton.tsx create mode 100644 apps/roam/src/utils/__tests__/refreshImportedNode.test.ts create mode 100644 apps/roam/src/utils/refreshImportedNode.ts diff --git a/apps/roam/src/components/RefreshImportedNodeTitleButton.tsx b/apps/roam/src/components/RefreshImportedNodeTitleButton.tsx new file mode 100644 index 000000000..1e6eec39a --- /dev/null +++ b/apps/roam/src/components/RefreshImportedNodeTitleButton.tsx @@ -0,0 +1,62 @@ +import { Button } from "@blueprintjs/core"; +import posthog from "posthog-js"; +import React, { useState } from "react"; +import renderToast from "roamjs-components/components/Toast"; +import { handleTitleAdditions } from "~/utils/handleTitleAdditions"; +import { refreshImportedNode } from "~/utils/refreshImportedNode"; + +const REFRESH_TITLE_BUTTON_ATTRIBUTE = + "data-roamjs-refresh-imported-node-title-button"; + +const RefreshImportedNodeTitleButton = ({ + uid, +}: { + uid: string; +}): JSX.Element => { + const [refreshing, setRefreshing] = useState(false); + + const refresh = async (): Promise => { + setRefreshing(true); + try { + const result = await refreshImportedNode({ pageUid: uid }); + renderToast({ + id: result.success + ? "refresh-imported-node-success" + : "refresh-imported-node-failed", + intent: result.success ? "success" : "danger", + content: result.message, + }); + } finally { + setRefreshing(false); + } + }; + + return ( +