DocSpace-client/packages/shared/utils/useId.ts

36 lines
732 B
TypeScript
Raw Normal View History

import React from "react";
let ID = 0;
2023-11-24 07:43:45 +00:00
const genId = () => {
ID += 1;
};
let serverHandoffComplete = false;
2023-11-24 07:43:45 +00:00
const hook =
typeof document !== "undefined" && document.createElement !== undefined
? "useLayoutEffect"
: "useEffect";
const usePassiveLayoutEffect = React[hook];
2023-11-24 07:43:45 +00:00
const useId = (fallbackId?: string | number, prefix = "prefix") => {
const [id, setId] = React.useState<number | void | undefined>(
serverHandoffComplete ? genId : undefined,
);
usePassiveLayoutEffect(() => {
2023-11-24 07:43:45 +00:00
if (id === undefined) {
ID += 1;
setId(ID);
}
serverHandoffComplete = true;
}, []);
2023-11-24 07:43:45 +00:00
const calcId = id === undefined ? id : prefix + id;
return fallbackId || calcId;
};
export default useId;