Skip to content

Commit c61cae0

Browse files
committed
fix: deep merge floatingUIOptions using nested spread operators
Use nested object spreads instead of lodash.merge to properly merge floatingUIOptions properties. This prevents user-provided options like `useFloatingOptions: { strategy: "fixed" }` from overwriting internal settings such as `open`, `onOpenChange`, `placement`, and `middleware`. Also fixes the type of floatingUIOptions in SuggestionMenuController from UseFloatingOptions to FloatingUIOptions. Closes #2308
1 parent c3315bc commit c61cae0

File tree

9 files changed

+32
-17
lines changed

9 files changed

+32
-17
lines changed

packages/react/src/components/Comments/FloatingComposerController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export default function FloatingComposerController<
4747

4848
const floatingUIOptions = useMemo<FloatingUIOptions>(
4949
() => ({
50+
...props.floatingUIOptions,
5051
useFloatingOptions: {
5152
open: !!pendingComment,
5253
// Needed as hooks like `useDismiss` call `onOpenChange` to change the
@@ -59,13 +60,14 @@ export default function FloatingComposerController<
5960
},
6061
placement: "bottom",
6162
middleware: [offset(10), shift(), flip()],
63+
...props.floatingUIOptions?.useFloatingOptions,
6264
},
6365
elementProps: {
6466
style: {
6567
zIndex: 60,
6668
},
69+
...props.floatingUIOptions?.elementProps,
6770
},
68-
...props.floatingUIOptions,
6971
}),
7072
[comments, editor, pendingComment, props.floatingUIOptions],
7173
);

packages/react/src/components/Comments/FloatingThreadController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export default function FloatingThreadController(props: {
4040

4141
const floatingUIOptions = useMemo<FloatingUIOptions>(
4242
() => ({
43+
...props.floatingUIOptions,
4344
useFloatingOptions: {
4445
open: !!selectedThread,
4546
// Needed as hooks like `useDismiss` call `onOpenChange` to change the
@@ -55,13 +56,14 @@ export default function FloatingThreadController(props: {
5556
},
5657
placement: "bottom",
5758
middleware: [offset(10), shift(), flip()],
59+
...props.floatingUIOptions?.useFloatingOptions,
5860
},
5961
elementProps: {
6062
style: {
6163
zIndex: 30,
6264
},
65+
...props.floatingUIOptions?.elementProps,
6366
},
64-
...props.floatingUIOptions,
6567
}),
6668
[comments, editor, props.floatingUIOptions, selectedThread],
6769
);

packages/react/src/components/FilePanel/FilePanelController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const FilePanelController = (props: {
2020

2121
const floatingUIOptions = useMemo<FloatingUIOptions>(
2222
() => ({
23+
...props.floatingUIOptions,
2324
useFloatingOptions: {
2425
open: !!blockId,
2526
// Needed as hooks like `useDismiss` call `onOpenChange` to change the
@@ -34,13 +35,14 @@ export const FilePanelController = (props: {
3435
}
3536
},
3637
middleware: [offset(10), flip()],
38+
...props.floatingUIOptions?.useFloatingOptions,
3739
},
3840
elementProps: {
3941
style: {
4042
zIndex: 90,
4143
},
44+
...props.floatingUIOptions?.elementProps,
4245
},
43-
...props.floatingUIOptions,
4446
}),
4547
[blockId, editor, filePanel, props.floatingUIOptions],
4648
);

packages/react/src/components/FormattingToolbar/FormattingToolbarController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export const FormattingToolbarController = (props: {
7979

8080
const floatingUIOptions = useMemo<FloatingUIOptions>(
8181
() => ({
82+
...props.floatingUIOptions,
8283
useFloatingOptions: {
8384
open: show,
8485
// Needed as hooks like `useDismiss` call `onOpenChange` to change the
@@ -92,13 +93,14 @@ export const FormattingToolbarController = (props: {
9293
},
9394
placement,
9495
middleware: [offset(10), shift(), flip()],
96+
...props.floatingUIOptions?.useFloatingOptions,
9597
},
9698
elementProps: {
9799
style: {
98100
zIndex: 40,
99101
},
102+
...props.floatingUIOptions?.elementProps,
100103
},
101-
...props.floatingUIOptions,
102104
}),
103105
[show, placement, props.floatingUIOptions, formattingToolbar.store, editor],
104106
);

packages/react/src/components/LinkToolbar/LinkToolbarController.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export const LinkToolbarController = (props: {
111111

112112
const floatingUIOptions = useMemo<FloatingUIOptions>(
113113
() => ({
114+
...props.floatingUIOptions,
114115
useFloatingOptions: {
115116
open: toolbarOpen,
116117
onOpenChange: (open, _event, reason) => {
@@ -136,6 +137,7 @@ export const LinkToolbarController = (props: {
136137
},
137138
placement: "top-start",
138139
middleware: [offset(10), flip()],
140+
...props.floatingUIOptions?.useFloatingOptions,
139141
},
140142
useHoverProps: {
141143
// `useHover` hook only enabled when a link is hovered with the
@@ -146,13 +148,14 @@ export const LinkToolbarController = (props: {
146148
close: 250,
147149
},
148150
handleClose: safePolygon(),
151+
...props.floatingUIOptions?.useHoverProps,
149152
},
150153
elementProps: {
151154
style: {
152155
zIndex: 50,
153156
},
157+
...props.floatingUIOptions?.elementProps,
154158
},
155-
...props.floatingUIOptions,
156159
}),
157160
[editor, link, props.floatingUIOptions, toolbarOpen, toolbarPositionFrozen],
158161
);

packages/react/src/components/SideMenu/SideMenuController.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,22 @@ export const SideMenuController = (props: {
2626

2727
const floatingUIOptions = useMemo<FloatingUIOptions>(
2828
() => ({
29+
...props.floatingUIOptions,
2930
useFloatingOptions: {
3031
open: show,
3132
placement: "left-start",
33+
...props.floatingUIOptions?.useFloatingOptions,
3234
},
3335
useDismissProps: {
3436
enabled: false,
37+
...props.floatingUIOptions?.useDismissProps,
3538
},
3639
elementProps: {
3740
style: {
3841
zIndex: 20,
3942
},
43+
...props.floatingUIOptions?.elementProps,
4044
},
41-
...props.floatingUIOptions,
4245
}),
4346
[props.floatingUIOptions, show],
4447
);

packages/react/src/components/SuggestionMenu/GridSuggestionMenu/GridSuggestionMenuController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export function GridSuggestionMenuController<
106106

107107
const floatingUIOptions = useMemo<FloatingUIOptions>(
108108
() => ({
109+
...props.floatingUIOptions,
109110
useFloatingOptions: {
110111
open: state?.show && state?.triggerCharacter === triggerCharacter,
111112
onOpenChange: (open) => {
@@ -130,15 +131,16 @@ export function GridSuggestionMenuController<
130131
padding: 10,
131132
}),
132133
],
134+
...props.floatingUIOptions?.useFloatingOptions,
133135
},
134136
elementProps: {
135137
// Prevents editor blurring when clicking the scroll bar.
136138
onMouseDownCapture: (event) => event.preventDefault(),
137139
style: {
138140
zIndex: 70,
139141
},
142+
...props.floatingUIOptions?.elementProps,
140143
},
141-
...props.floatingUIOptions,
142144
}),
143145
[
144146
props.floatingUIOptions,

packages/react/src/components/SuggestionMenu/SuggestionMenuController.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,7 @@ import {
33
SuggestionMenu as SuggestionMenuExtension,
44
filterSuggestionItems,
55
} from "@blocknote/core/extensions";
6-
import {
7-
UseFloatingOptions,
8-
autoPlacement,
9-
offset,
10-
shift,
11-
size,
12-
} from "@floating-ui/react";
6+
import { autoPlacement, offset, shift, size } from "@floating-ui/react";
137
import { FC, useEffect, useMemo } from "react";
148

159
import { useBlockNoteEditor } from "../../hooks/useBlockNoteEditor.js";
@@ -37,7 +31,7 @@ export function SuggestionMenuController<
3731
triggerCharacter: string;
3832
getItems?: GetItemsType;
3933
minQueryLength?: number;
40-
floatingUIOptions?: UseFloatingOptions;
34+
floatingUIOptions?: FloatingUIOptions;
4135
} & (ItemType<GetItemsType> extends DefaultReactSuggestionItem
4236
? {
4337
// can be undefined
@@ -107,6 +101,7 @@ export function SuggestionMenuController<
107101

108102
const floatingUIOptions = useMemo<FloatingUIOptions>(
109103
() => ({
104+
...props.floatingUIOptions,
110105
useFloatingOptions: {
111106
open: state?.show && state?.triggerCharacter === triggerCharacter,
112107
onOpenChange: (open) => {
@@ -131,15 +126,16 @@ export function SuggestionMenuController<
131126
padding: 10,
132127
}),
133128
],
129+
...props.floatingUIOptions?.useFloatingOptions,
134130
},
135131
elementProps: {
136132
// Prevents editor blurring when clicking the scroll bar.
137133
onMouseDownCapture: (event) => event.preventDefault(),
138134
style: {
139135
zIndex: 80,
140136
},
137+
...props.floatingUIOptions?.elementProps,
141138
},
142-
...props.floatingUIOptions,
143139
}),
144140
[
145141
props.floatingUIOptions,

packages/xl-ai/src/components/AIMenu/AIMenuController.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const AIMenuController = (props: {
2727

2828
const floatingUIOptions = useMemo<FloatingUIOptions>(
2929
() => ({
30+
...props.floatingUIOptions,
3031
useFloatingOptions: {
3132
open: aiMenuState !== "closed",
3233
placement: "bottom",
@@ -60,6 +61,7 @@ export const AIMenuController = (props: {
6061
animationFrame: true,
6162
});
6263
},
64+
...props.floatingUIOptions?.useFloatingOptions,
6365
},
6466
useDismissProps: {
6567
enabled:
@@ -80,13 +82,14 @@ export const AIMenuController = (props: {
8082

8183
return true;
8284
},
85+
...props.floatingUIOptions?.useDismissProps,
8386
},
8487
elementProps: {
8588
style: {
8689
zIndex: 100,
8790
},
91+
...props.floatingUIOptions?.elementProps,
8892
},
89-
...props.floatingUIOptions,
9093
}),
9194
[ai, aiMenuState, blockId, props.floatingUIOptions],
9295
);

0 commit comments

Comments
 (0)