2023-10-06 13:44:06 +11:00
|
|
|
import { ReactNode } from 'react';
|
|
|
|
|
|
2024-05-31 19:49:46 +05:30
|
|
|
export type EventRenderer<T extends unknown[]> = (...args: T) => ReactNode;
|
2023-10-06 13:44:06 +11:00
|
|
|
|
2024-05-31 19:49:46 +05:30
|
|
|
export type EventRendererOpts<T extends unknown[]> = Record<string, EventRenderer<T>>;
|
2023-10-06 13:44:06 +11:00
|
|
|
|
|
|
|
|
export type RenderMatrixEvent<T extends unknown[]> = (
|
2024-05-31 19:49:46 +05:30
|
|
|
eventType: string,
|
|
|
|
|
isStateEvent: boolean,
|
2023-10-06 13:44:06 +11:00
|
|
|
...args: T
|
|
|
|
|
) => ReactNode;
|
|
|
|
|
|
|
|
|
|
export const useMatrixEventRenderer =
|
2024-05-31 19:49:46 +05:30
|
|
|
<T extends unknown[]>(
|
|
|
|
|
typeToRenderer: EventRendererOpts<T>,
|
|
|
|
|
renderStateEvent?: EventRenderer<T>,
|
|
|
|
|
renderEvent?: EventRenderer<T>
|
|
|
|
|
): RenderMatrixEvent<T> =>
|
|
|
|
|
(eventType, isStateEvent, ...args) => {
|
|
|
|
|
const renderer = typeToRenderer[eventType];
|
|
|
|
|
if (typeToRenderer[eventType]) return renderer(...args);
|
2023-10-06 13:44:06 +11:00
|
|
|
|
2024-05-31 19:49:46 +05:30
|
|
|
if (isStateEvent && renderStateEvent) {
|
|
|
|
|
return renderStateEvent(...args);
|
2023-10-06 13:44:06 +11:00
|
|
|
}
|
|
|
|
|
|
2024-05-31 19:49:46 +05:30
|
|
|
if (!isStateEvent && renderEvent) {
|
|
|
|
|
return renderEvent(...args);
|
2023-10-06 13:44:06 +11:00
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
};
|