From 96ff7fd830fb36f4ff9681bbcc40a89996584f39 Mon Sep 17 00:00:00 2001 From: Michael Gartner Date: Sat, 2 Aug 2025 17:15:42 -0600 Subject: [PATCH 1/5] Update React to 18.2.0 - Upgrade React and React DOM to version 18.2.0 in package.json and package-lock.json. - Fix minor type errors - Add patches for @blueprintjs/core and @blueprintjs/select to support children prop in TypeScript definitions. --- package-lock.json | 166 +++++++++++++++------ package.json | 22 ++- patches/@blueprintjs+core+3.50.4.patch | 48 ++++++ patches/@blueprintjs+select+3.18.6.patch | 12 ++ src/components.tsx | 43 ++++++ src/components/BlockErrorBoundary.tsx | 6 +- src/components/ComponentContainer.tsx | 1 + src/components/ConfigPanels/OauthPanel.tsx | 2 +- src/components/CursorMenu.tsx | 2 +- src/components/MenuItemSelect.tsx | 9 +- 10 files changed, 252 insertions(+), 59 deletions(-) create mode 100644 patches/@blueprintjs+core+3.50.4.patch create mode 100644 patches/@blueprintjs+select+3.18.6.patch diff --git a/package-lock.json b/package-lock.json index 3f3704b..d3c2d50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,8 +51,8 @@ "@types/jsdom": "^20.0.1", "@types/marked": "^4.0.3", "@types/nanoid": "2.0.0", - "@types/react": "17.0.39", - "@types/react-dom": "17.0.13", + "@types/react": "18.2.0", + "@types/react-dom": "18.2.0", "@types/use-sync-external-store": "^0.0.3", "chrono-node": "2.3.0", "crypto-js": "3.1.9-1", @@ -65,8 +65,8 @@ "marked": "4.0.16", "marked-react": "1.1.2", "nanoid": "2.0.4", - "react": "17.0.2", - "react-dom": "17.0.2", + "react": "18.2.0", + "react-dom": "18.2.0", "tslib": "2.2.0", "use-sync-external-store": "^1.2.0" } @@ -3204,9 +3204,10 @@ "peer": true }, "node_modules/@types/react": { - "version": "17.0.39", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", - "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", "peer": true, "dependencies": { "@types/prop-types": "*", @@ -3215,9 +3216,10 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==", + "license": "MIT", "peer": true, "dependencies": { "@types/react": "*" @@ -3806,6 +3808,43 @@ "react-dom": "^17.0.2" } }, + "node_modules/aws-sdk-plus/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-sdk-plus/node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/aws-sdk-plus/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "node_modules/aws-sdk/node_modules/uuid": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", @@ -7774,12 +7813,13 @@ ] }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -7798,16 +7838,17 @@ } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-is": { @@ -8128,12 +8169,13 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/secure-compare": { @@ -12142,9 +12184,9 @@ "peer": true }, "@types/react": { - "version": "17.0.39", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", - "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", "peer": true, "requires": { "@types/prop-types": "*", @@ -12153,9 +12195,9 @@ } }, "@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==", "peer": true, "requires": { "@types/react": "*" @@ -12587,6 +12629,36 @@ "aws-sdk": "^2.1004.0", "react": "^17.0.2", "react-dom": "^17.0.2" + }, + "dependencies": { + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "axios": { @@ -15509,12 +15581,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "react-day-picker": { @@ -15527,13 +15599,13 @@ } }, "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" } }, "react-is": { @@ -15789,12 +15861,12 @@ } }, "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "peer": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "secure-compare": { diff --git a/package.json b/package.json index 7dddba1..ee93298 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "@types/jsdom": "^20.0.1", "@types/marked": "^4.0.3", "@types/nanoid": "2.0.0", - "@types/react": "17.0.39", - "@types/react-dom": "17.0.13", + "@types/react": "18.2.0", + "@types/react-dom": "18.2.0", "@types/use-sync-external-store": "^0.0.3", "chrono-node": "2.3.0", "crypto-js": "3.1.9-1", @@ -40,8 +40,8 @@ "marked": "4.0.16", "marked-react": "1.1.2", "nanoid": "2.0.4", - "react": "17.0.2", - "react-dom": "17.0.2", + "react": "18.2.0", + "react-dom": "18.2.0", "tslib": "2.2.0", "use-sync-external-store": "^1.2.0" }, @@ -78,9 +78,17 @@ "roamjs": "./scripts/index.js" }, "overrides": { - "@testing-library/react": { - "react": "17.0.2", - "react-dom": "17.0.2" + "@blueprintjs/core": { + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "@blueprintjs/datetime": { + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "@blueprintjs/select": { + "react": "18.2.0", + "react-dom": "18.2.0" } }, "samepage": { diff --git a/patches/@blueprintjs+core+3.50.4.patch b/patches/@blueprintjs+core+3.50.4.patch new file mode 100644 index 0000000..2c9cbc3 --- /dev/null +++ b/patches/@blueprintjs+core+3.50.4.patch @@ -0,0 +1,48 @@ +diff --git a/node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts b/node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts +index 09b06be..f74f6a3 100644 +--- a/node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts ++++ b/node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts +@@ -5,6 +5,7 @@ import { IOverlayLifecycleProps } from "../overlay/overlay"; + export declare type AlertProps = IAlertProps; + /** @deprecated use AlertProps */ + export interface IAlertProps extends IOverlayLifecycleProps, Props { ++ children?: React.ReactNode; + /** + * Whether pressing escape when focused on the Alert should cancel the alert. + * If this prop is enabled, then either `onCancel` or `onClose` must also be defined. +diff --git a/node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts b/node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts +index e90ee31..3e4f4ef 100644 +--- a/node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts ++++ b/node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts +@@ -6,6 +6,7 @@ import { IBackdropProps, OverlayableProps } from "../overlay/overlay"; + export declare type DialogProps = IDialogProps; + /** @deprecated use DialogProps */ + export interface IDialogProps extends OverlayableProps, IBackdropProps, Props { ++ children?: React.ReactNode; + /** + * Toggles the visibility of the overlay and its children. + * This prop is required because the component is controlled. +diff --git a/node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts b/node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts +index 2ca5fe5..870a32e 100644 +--- a/node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts ++++ b/node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts +@@ -6,6 +6,7 @@ export declare const Expander: React.FunctionComponent; + export declare type TabsProps = ITabsProps; + /** @deprecated use TabsProps */ + export interface ITabsProps extends Props { ++ children?: React.ReactNode; + /** + * Whether the selected tab indicator should animate its movement. + * +diff --git a/node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts b/node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts +index 94f4af9..4db48a9 100644 +--- a/node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts ++++ b/node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts +@@ -6,6 +6,7 @@ import { IPopoverSharedProps } from "../popover/popoverSharedProps"; + export declare type TooltipProps = ITooltipProps; + /** @deprecated use TooltipProps */ + export interface ITooltipProps extends IPopoverSharedProps, IntentProps { ++ children?: React.ReactNode; + /** + * The content that will be displayed inside of the tooltip. + */ diff --git a/patches/@blueprintjs+select+3.18.6.patch b/patches/@blueprintjs+select+3.18.6.patch new file mode 100644 index 0000000..0c55db3 --- /dev/null +++ b/patches/@blueprintjs+select+3.18.6.patch @@ -0,0 +1,12 @@ +diff --git a/node_modules/@blueprintjs/select/lib/esm/components/select/select.d.ts b/node_modules/@blueprintjs/select/lib/esm/components/select/select.d.ts +index f8b9bc6..ee0b6da 100644 +--- a/node_modules/@blueprintjs/select/lib/esm/components/select/select.d.ts ++++ b/node_modules/@blueprintjs/select/lib/esm/components/select/select.d.ts +@@ -4,6 +4,7 @@ import { IListItemsProps } from "../../common"; + export declare type SelectProps = ISelectProps; + /** @deprecated use SelectProps */ + export interface ISelectProps extends IListItemsProps { ++ children?: React.ReactNode; + /** + * Whether the component should take up the full width of its container. + * This overrides `popoverProps.fill`. You also have to ensure that the child diff --git a/src/components.tsx b/src/components.tsx index 7423902..a65372a 100644 --- a/src/components.tsx +++ b/src/components.tsx @@ -12,6 +12,7 @@ import runExtension from "./util/runExtension"; import { createBlock } from "./writes"; import MenuItemSelect from "./components/MenuItemSelect"; +import TimePanel from "./components/ConfigPanels/TimePanel"; // const blockRender = (Component: React.FC) => { // const block = window.roamAlphaAPI.ui.getFocusedBlock(); @@ -214,6 +215,47 @@ const components = [ }), label: "PageInput", }, + { + callback: () => + rootRender(() => { + const [value] = useState(new Date()); + const [uid, setUid] = useState(""); + + React.useEffect(() => { + const createUid = async () => { + const currentPageUid = + (await window.roamAlphaAPI.ui.mainWindow.getOpenPageOrBlockUid()) || + window.roamAlphaAPI.util.dateToPageUid(new Date()); + + if (!currentPageUid) throw new Error("No current page uid"); + console.log(currentPageUid); + const newUid = await createBlock({ + parentUid: currentPageUid, + node: { text: "time-field" }, + }); + setUid(newUid); + }; + createUid(); + }, []); + + if (!uid) return
Loading...
; + + return ( + <> +
Selected time: {value.toLocaleTimeString()}
+ + + ); + }), + label: "TimePanel", + }, ]; export default runExtension(async (args) => { @@ -229,6 +271,7 @@ export default runExtension(async (args) => { FormDialog, PageInput, renderToast, + TimePanel, }, util: { renderOverlay, diff --git a/src/components/BlockErrorBoundary.tsx b/src/components/BlockErrorBoundary.tsx index fe50cf0..eb95567 100644 --- a/src/components/BlockErrorBoundary.tsx +++ b/src/components/BlockErrorBoundary.tsx @@ -1,7 +1,11 @@ import React from "react"; import createBlock from "../writes/createBlock"; -type BlockErrorBoundaryProps = { blockUid: string; message: string }; +type BlockErrorBoundaryProps = { + blockUid: string; + message: string; + children: React.ReactNode; +}; type BlockErrorBoundaryState = { hasError: boolean }; class BlockErrorBoundary extends React.Component< diff --git a/src/components/ComponentContainer.tsx b/src/components/ComponentContainer.tsx index f956f37..4b62218 100644 --- a/src/components/ComponentContainer.tsx +++ b/src/components/ComponentContainer.tsx @@ -8,6 +8,7 @@ import { OnloadArgs } from "../types/native"; const ComponentContainer: React.FunctionComponent<{ blockId?: string; className?: string; + children?: React.ReactNode; }> = ({ blockId, className, children }) => { const [showIcons, setShowIcons] = useState(false); const appear = useCallback(() => setShowIcons(true), [setShowIcons]); diff --git a/src/components/ConfigPanels/OauthPanel.tsx b/src/components/ConfigPanels/OauthPanel.tsx index 9530774..a0992f5 100644 --- a/src/components/ConfigPanels/OauthPanel.tsx +++ b/src/components/ConfigPanels/OauthPanel.tsx @@ -27,7 +27,7 @@ const OauthPanel: FieldPanel = ({ uid, parentUid, options }) => { : [] ); const onCheck = useCallback( - (e) => { + (e: React.ChangeEvent) => { const checked = (e.target as HTMLInputElement).checked; setUseLocal(checked); if (checked) { diff --git a/src/components/CursorMenu.tsx b/src/components/CursorMenu.tsx index 3085877..6b6e702 100644 --- a/src/components/CursorMenu.tsx +++ b/src/components/CursorMenu.tsx @@ -147,7 +147,7 @@ const CursorMenu = >({ [filter, initialItems] ); const onSelect = useCallback( - (item) => { + (item: { text: string; id: string } & T) => { if (menuRef.current) { onItemSelect(item); onClose(); diff --git a/src/components/MenuItemSelect.tsx b/src/components/MenuItemSelect.tsx index 87e0016..1134c26 100644 --- a/src/components/MenuItemSelect.tsx +++ b/src/components/MenuItemSelect.tsx @@ -1,5 +1,10 @@ import { Button, ButtonProps, MenuItem } from "@blueprintjs/core"; -import { SelectProps, Select, ICreateNewItem } from "@blueprintjs/select"; +import { + SelectProps, + Select, + ICreateNewItem, + isCreateNewItem, +} from "@blueprintjs/select"; import React, { ReactText, ButtonHTMLAttributes, ReactNode } from "react"; type ActiveItem = T | ICreateNewItem | null | undefined; @@ -38,7 +43,7 @@ const MenuItemSelect = ( const defaultButton = (