index.tsx

 1import * as React from 'react';
 2import { v4 } from 'uuid';
 3
 4export interface ServerTime {
 5    setOffset: (v: number) => void;
 6    now: () => number;
 7}
 8
 9const Context = React.createContext<ServerTime>(Object.seal({ setOffset: () => {}, now: Date.now }));
10
11export const ServerTimeProvider = (props: React.PropsWithChildren<{}>) => {
12    const [offset, setOffset] = React.useState(0);
13    const value = React.useMemo(() => Object.seal({ setOffset, now: () => Date.now() + offset }), [offset]);
14    return <Context.Provider value={value}>{props.children}</Context.Provider>;
15};
16
17export function useServerTime() {
18    return React.useContext(Context);
19}
20
21export function useStableUUID(): string {
22    const id = React.useRef<string | undefined>();
23    id.current = id.current ?? v4();
24    return id.current;
25}