mirror of
https://github.com/zadam/trilium.git
synced 2025-11-06 22:48:58 +01:00
refactor(react/ribbon): use effects for event handling
This commit is contained in:
parent
6cab47fb55
commit
5a17075eef
@ -15,14 +15,31 @@ import { RefObject, VNode } from "preact";
|
|||||||
import { Tooltip } from "bootstrap";
|
import { Tooltip } from "bootstrap";
|
||||||
import { CSSProperties } from "preact/compat";
|
import { CSSProperties } from "preact/compat";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows a React component to listen to Trilium's legacy event system.
|
||||||
|
*
|
||||||
|
* The handler works by registering the event listener on the parent legacy component.
|
||||||
|
*
|
||||||
|
* @param eventName the event to listen on.
|
||||||
|
* @param handler the callback to be invoked when the event is triggered.
|
||||||
|
*/
|
||||||
export function useTriliumEvent<T extends EventNames>(eventName: T, handler: (data: EventData<T>) => void) {
|
export function useTriliumEvent<T extends EventNames>(eventName: T, handler: (data: EventData<T>) => void) {
|
||||||
const parentComponent = useContext(ParentComponent)!;
|
const parentComponent = useContext(ParentComponent)!;
|
||||||
|
useEffect(() => {
|
||||||
parentComponent.registerHandler(eventName, handler);
|
parentComponent.registerHandler(eventName, handler);
|
||||||
return (() => parentComponent.removeHandler(eventName, handler));
|
return (() => parentComponent.removeHandler(eventName, handler));
|
||||||
|
}, [ eventName, handler, parentComponent ])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to {@link useTriliumEvent}, but listens to multiple events at once.
|
||||||
|
*
|
||||||
|
* @param eventNames the events to listen on.
|
||||||
|
* @param handler the callback to be invoked when one of the events is triggered. The name of the event is provided as the second argument.
|
||||||
|
*/
|
||||||
export function useTriliumEvents<T extends EventNames>(eventNames: T[], handler: (data: EventData<T>, eventName: T) => void) {
|
export function useTriliumEvents<T extends EventNames>(eventNames: T[], handler: (data: EventData<T>, eventName: T) => void) {
|
||||||
const parentComponent = useContext(ParentComponent)!;
|
const parentComponent = useContext(ParentComponent)!;
|
||||||
|
useEffect(() => {
|
||||||
const handlers: ({ eventName: T, callback: (data: EventData<T>) => void })[] = [];
|
const handlers: ({ eventName: T, callback: (data: EventData<T>) => void })[] = [];
|
||||||
|
|
||||||
for (const eventName of eventNames) {
|
for (const eventName of eventNames) {
|
||||||
@ -40,6 +57,7 @@ export function useTriliumEvents<T extends EventNames>(eventNames: T[], handler:
|
|||||||
parentComponent.removeHandler(eventName, callback);
|
parentComponent.removeHandler(eventName, callback);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}, [ eventNames, handler, parentComponent ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useSpacedUpdate(callback: () => void | Promise<void>, interval = 1000) {
|
export function useSpacedUpdate(callback: () => void | Promise<void>, interval = 1000) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user