You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
1 year ago
|
/**
|
||
|
* @param func handler taking at most single parameter (event).
|
||
|
*/
|
||
|
|
||
|
import { unstable_batchedUpdates } from "react-dom";
|
||
|
import { version as ReactVersion } from "react";
|
||
|
import { throttleRAF } from "./utils";
|
||
|
|
||
|
export const withBatchedUpdates = <
|
||
|
TFunction extends ((event: any) => void) | (() => void),
|
||
|
>(
|
||
|
func: Parameters<TFunction>["length"] extends 0 | 1 ? TFunction : never,
|
||
|
) =>
|
||
|
((event) => {
|
||
|
unstable_batchedUpdates(func as TFunction, event);
|
||
|
}) as TFunction;
|
||
|
|
||
|
/**
|
||
|
* barches React state updates and throttles the calls to a single call per
|
||
|
* animation frame
|
||
|
*/
|
||
|
export const withBatchedUpdatesThrottled = <
|
||
|
TFunction extends ((event: any) => void) | (() => void),
|
||
|
>(
|
||
|
func: Parameters<TFunction>["length"] extends 0 | 1 ? TFunction : never,
|
||
|
) => {
|
||
|
// @ts-ignore
|
||
|
return throttleRAF<Parameters<TFunction>>(((event) => {
|
||
|
unstable_batchedUpdates(func, event);
|
||
|
}) as TFunction);
|
||
|
};
|
||
|
|
||
|
export const isRenderThrottlingEnabled = (() => {
|
||
|
// we don't want to throttle in react < 18 because of #5439 and it was
|
||
|
// getting more complex to maintain the fix
|
||
|
let IS_REACT_18_AND_UP: boolean;
|
||
|
try {
|
||
|
const version = ReactVersion.split(".");
|
||
|
IS_REACT_18_AND_UP = Number(version[0]) > 17;
|
||
|
} catch {
|
||
|
IS_REACT_18_AND_UP = false;
|
||
|
}
|
||
|
|
||
|
let hasWarned = false;
|
||
|
|
||
|
return () => {
|
||
|
if (window.EXCALIDRAW_THROTTLE_RENDER === true) {
|
||
|
if (!IS_REACT_18_AND_UP) {
|
||
|
if (!hasWarned) {
|
||
|
hasWarned = true;
|
||
|
console.warn(
|
||
|
"Excalidraw: render throttling is disabled on React versions < 18.",
|
||
|
);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
})();
|