chore(react): proper legacy widget injection & event handling

This commit is contained in:
Elian Doran 2025-08-22 23:33:02 +03:00
parent 4bd25a0d4a
commit df3aa04787
No known key found for this signature in database
2 changed files with 27 additions and 12 deletions

View File

@ -302,6 +302,8 @@ export class ReactWrappedWidget extends BasicWidget {
for (const listener of this.listeners[name]) {
listener(data);
}
super.handleEvent(name, data);
}
registerHandler<T extends EventNames>(name: T, handler: EventHandler) {

View File

@ -418,26 +418,39 @@ export function useLegacyWidget(widgetFactory: () => BasicWidget, { noteContext
noteContext?: NoteContext;
} = {}) {
const ref = useRef<HTMLDivElement>(null);
const widget = useMemo(widgetFactory, []);
const parentComponent = useContext(ParentComponent);
useEffect(() => {
if (!ref.current) return;
// Render the widget once.
const [ widget, renderedWidget ] = useMemo(() => {
const widget = widgetFactory();
const $container = $(ref.current);
$container.empty();
widget.render().appendTo($container);
if (parentComponent) {
parentComponent.child(widget);
}
if (noteContext && widget instanceof NoteContextAwareWidget) {
console.log("Injecting note context", noteContext);
widget.setNoteContextEvent({ noteContext });
}
const renderedWidget = widget.render();
return [ widget, renderedWidget ];
}, [widgetFactory]);
// Attach the widget to the parent.
useEffect(() => {
if (ref.current) {
ref.current.innerHTML = "";
renderedWidget.appendTo(ref.current);
}
}, [ renderedWidget ]);
// Inject the note context.
useEffect(() => {
console.log("Injecting note context");
if (noteContext && widget instanceof NoteContextAwareWidget) {
widget.activeContextChangedEvent({ noteContext });
}
}, [ widget ]);
if (parentComponent) {
parentComponent.child(widget);
}
}, [ noteContext ]);
return <div ref={ref} />
}