diff --git a/tldraw/apps/tldraw-logseq/package.json b/tldraw/apps/tldraw-logseq/package.json
index c996944156..b374ecd644 100644
--- a/tldraw/apps/tldraw-logseq/package.json
+++ b/tldraw/apps/tldraw-logseq/package.json
@@ -33,6 +33,7 @@
"postcss": "^8.4.17",
"react": "^17.0.0",
"react-dom": "^17.0.0",
+ "react-virtuoso": "^3.1.0",
"rimraf": "3.0.2",
"shadow-cljs": "^2.19.5",
"tsup": "^6.2.3",
diff --git a/tldraw/apps/tldraw-logseq/src/lib/shapes/LogseqPortalShape.tsx b/tldraw/apps/tldraw-logseq/src/lib/shapes/LogseqPortalShape.tsx
index 1296b59f11..8e8c21f7e0 100644
--- a/tldraw/apps/tldraw-logseq/src/lib/shapes/LogseqPortalShape.tsx
+++ b/tldraw/apps/tldraw-logseq/src/lib/shapes/LogseqPortalShape.tsx
@@ -7,6 +7,7 @@ import {
TLResizeInfo,
validUUID,
} from '@tldraw/core'
+import { Virtuoso } from 'react-virtuoso'
import { HTMLContainer, TLComponentProps, useApp } from '@tldraw/react'
import { useDebouncedValue } from '@tldraw/react'
import Vec from '@tldraw/vec'
@@ -71,11 +72,7 @@ const LogseqTypeTag = ({
const LogseqPortalShapeHeader = observer(
({ type, children }: { type: 'P' | 'B'; children: React.ReactNode }) => {
- return (
-
- {children}
-
- )
+ return {children}
}
)
@@ -628,30 +625,35 @@ export class LogseqPortalShape extends TLBoxShape {
/>
- {options.map(({ actionIcon, onChosen, element }, index) => {
- return (
-
{
- setPrefixIcon(actionIcon)
- setFocusedOptionIdx(index)
- }}
- // we have to use mousedown && stop propagation EARLY, otherwise some
- // default behavior of clicking the rendered elements will happen
- onMouseDownCapture={e => {
- if (onChosen()) {
- e.stopPropagation()
- e.preventDefault()
- }
- }}
- >
- {element}
-
- )
- })}
+
{
+ const { actionIcon, onChosen, element } = options[index]
+ return (
+ {
+ setPrefixIcon(actionIcon)
+ setFocusedOptionIdx(index)
+ }}
+ // we have to use mousedown && stop propagation EARLY, otherwise some
+ // default behavior of clicking the rendered elements will happen
+ onMouseDownCapture={e => {
+ if (onChosen()) {
+ e.stopPropagation()
+ e.preventDefault()
+ }
+ }}
+ >
+ {element}
+
+ )
+ }}
+ />
)
diff --git a/tldraw/packages/react/src/hooks/useDebounced.ts b/tldraw/packages/react/src/hooks/useDebounced.ts
index 5c5517bb99..878eab48f3 100644
--- a/tldraw/packages/react/src/hooks/useDebounced.ts
+++ b/tldraw/packages/react/src/hooks/useDebounced.ts
@@ -3,10 +3,16 @@ import { useState, useEffect } from 'react'
export function useDebouncedValue(value: T, ms = 0) {
const [debouncedValue, setDebouncedValue] = useState(value)
useEffect(() => {
+ let canceled = false
const handler = setTimeout(() => {
- setDebouncedValue(value)
+ requestIdleCallback(() => {
+ if (!canceled) {
+ setDebouncedValue(value)
+ }
+ })
}, ms)
return () => {
+ canceled = true
clearTimeout(handler)
}
}, [value, ms])
diff --git a/tldraw/yarn.lock b/tldraw/yarn.lock
index d3e69e2a20..124e286838 100644
--- a/tldraw/yarn.lock
+++ b/tldraw/yarn.lock
@@ -1077,6 +1077,18 @@
dependencies:
"@use-gesture/core" "10.2.20"
+"@virtuoso.dev/react-urx@^0.2.12":
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4"
+ integrity sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA==
+ dependencies:
+ "@virtuoso.dev/urx" "^0.2.13"
+
+"@virtuoso.dev/urx@^0.2.12", "@virtuoso.dev/urx@^0.2.13":
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/@virtuoso.dev/urx/-/urx-0.2.13.tgz#a65e7e8d923cb03397ac876bfdd45c7f71c8edf1"
+ integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw==
+
"@vitejs/plugin-basic-ssl@^0.1.2":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.2.tgz#7177f9adc5384f1377b9b91b17ce7cdb8f422abd"
@@ -3779,6 +3791,14 @@ react-style-singleton@^2.2.1:
invariant "^2.2.4"
tslib "^2.0.0"
+react-virtuoso@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-3.1.0.tgz#e358a39b9fd99895bcc72671a585091b756a1c92"
+ integrity sha512-Rur0d7xiZthRxy3f7Z217Q+U6k1sTsPZZU/kKT73GPB3ROtJCr4Y0Qehg/WxeKhochQPnSuT8VfcsAasdpX2ig==
+ dependencies:
+ "@virtuoso.dev/react-urx" "^0.2.12"
+ "@virtuoso.dev/urx" "^0.2.12"
+
react@^17, react@^17.0.0:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"