diff --git a/apps/client/src/widgets/dialogs/bulk_actions.tsx b/apps/client/src/widgets/dialogs/bulk_actions.tsx index 4930b010e..2df26926c 100644 --- a/apps/client/src/widgets/dialogs/bulk_actions.tsx +++ b/apps/client/src/widgets/dialogs/bulk_actions.tsx @@ -15,6 +15,7 @@ import RenameNoteBulkAction from "../bulk_actions/note/rename_note"; import { RawHtmlBlock } from "../react/RawHtml"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; +import useTriliumEvent from "../react/hooks"; interface BulkActionProps { bulkActionNote?: FNote | null; @@ -42,6 +43,10 @@ function BulkActionComponent({ selectedOrActiveNoteIds, bulkActionNote }: BulkAc setExistingActions(bulk_action.parseActions(bulkActionNote)); }, []); + useTriliumEvent("entitiesReloaded", () => { + console.log("Got entities reloaded."); + }); + return ( selectedOrActiveNoteIds && ) { - // only refreshing deleted attrs, otherwise components update themselves - if (loadResults.getAttributeRows().find((row) => row.type === "label" && row.name === "action" && row.noteId === "_bulkAction" && row.isDeleted)) { - // this may be triggered from e.g., sync without open widget, then no need to refresh the widget - if (this.props.selectedOrActiveNoteIds && this.$widget.is(":visible")) { - this.doRender(); - } - } - } - } \ No newline at end of file diff --git a/apps/client/src/widgets/react/ReactBasicWidget.ts b/apps/client/src/widgets/react/ReactBasicWidget.ts deleted file mode 100644 index c55564857..000000000 --- a/apps/client/src/widgets/react/ReactBasicWidget.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { JSX, render } from "preact"; -import BasicWidget from "../basic_widget.js"; - -export default abstract class ReactBasicWidget extends BasicWidget { - - abstract get component(): JSX.Element; - - doRender() { - const renderContainer = new DocumentFragment(); - render(this.component, renderContainer); - this.$widget = $(renderContainer.firstChild as HTMLElement); - } - -} diff --git a/apps/client/src/widgets/react/ReactBasicWidget.tsx b/apps/client/src/widgets/react/ReactBasicWidget.tsx new file mode 100644 index 000000000..db8a3f1d4 --- /dev/null +++ b/apps/client/src/widgets/react/ReactBasicWidget.tsx @@ -0,0 +1,21 @@ +import { createContext, JSX, render } from "preact"; +import BasicWidget from "../basic_widget.js"; +import Component from "../../components/component.js"; + +export const ParentComponent = createContext(null); + +export default abstract class ReactBasicWidget extends BasicWidget { + + abstract get component(): JSX.Element; + + doRender() { + const renderContainer = new DocumentFragment(); + render(( + + {this.component} + + ), renderContainer); + this.$widget = $(renderContainer.firstChild as HTMLElement); + } + +} diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx new file mode 100644 index 000000000..96ee36dc5 --- /dev/null +++ b/apps/client/src/widgets/react/hooks.tsx @@ -0,0 +1,32 @@ +import { useContext, useEffect, useState } from "preact/hooks"; +import { EventData, EventNames } from "../../components/app_context"; +import { ParentComponent } from "./ReactBasicWidget"; + +export default function useTriliumEvent(eventName: T, handler: (data: EventData) => void) { + const parentWidget = useContext(ParentComponent); + useEffect(() => { + if (!parentWidget) { + console.warn("useTriliumEvent: No widget context found"); + return; + } + + // Create a unique handler name for this specific event listener + const handlerName = `${eventName}Event`; + const originalHandler = parentWidget[handlerName]; + + // Override the event handler to call our handler + parentWidget[handlerName] = async function(data: EventData) { + // Call original handler if it exists + if (originalHandler) { + await originalHandler.call(parentWidget, data); + } + // Call our React component's handler + handler(data); + }; + + // Cleanup: restore original handler on unmount + return () => { + parentWidget[handlerName] = originalHandler; + }; + }, [parentWidget]); +} \ No newline at end of file