* feat: enhance github stars button to be better looking and more compact to make mobile compatibility easier in the future * feat: introduce a new Button component
37 lines
767 B
TypeScript
37 lines
767 B
TypeScript
import * as React from "react";
|
|
|
|
function getStrictContext<T>(
|
|
name?: string,
|
|
): readonly [
|
|
({
|
|
value,
|
|
children,
|
|
}: {
|
|
value: T;
|
|
children?: React.ReactNode;
|
|
}) => React.JSX.Element,
|
|
() => T,
|
|
] {
|
|
const Context = React.createContext<T | undefined>(undefined);
|
|
|
|
const Provider = ({
|
|
value,
|
|
children,
|
|
}: {
|
|
value: T;
|
|
children?: React.ReactNode;
|
|
}) => <Context.Provider value={value}>{children}</Context.Provider>;
|
|
|
|
const useSafeContext = () => {
|
|
const ctx = React.useContext(Context);
|
|
if (ctx === undefined) {
|
|
throw new Error(`useContext must be used within ${name ?? "a Provider"}`);
|
|
}
|
|
return ctx;
|
|
};
|
|
|
|
return [Provider, useSafeContext] as const;
|
|
}
|
|
|
|
export { getStrictContext };
|