2023-11-23 15:25:24 +00:00
|
|
|
import React from "react";
|
|
|
|
|
|
|
|
let ID = 0;
|
2023-11-24 07:43:45 +00:00
|
|
|
const genId = () => {
|
|
|
|
ID += 1;
|
|
|
|
};
|
2023-11-23 15:25:24 +00:00
|
|
|
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-23 15:25:24 +00:00
|
|
|
|
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,
|
|
|
|
);
|
2023-11-23 15:25:24 +00:00
|
|
|
|
|
|
|
usePassiveLayoutEffect(() => {
|
2023-11-24 07:43:45 +00:00
|
|
|
if (id === undefined) {
|
|
|
|
ID += 1;
|
|
|
|
setId(ID);
|
2023-11-23 15:25:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
serverHandoffComplete = true;
|
|
|
|
}, []);
|
|
|
|
|
2023-11-24 07:43:45 +00:00
|
|
|
const calcId = id === undefined ? id : prefix + id;
|
|
|
|
|
|
|
|
return fallbackId || calcId;
|
2023-11-23 15:25:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export default useId;
|