overlay-visible-context.tsx 933 B

123456789101112131415161718192021222324252627282930313233
  1. import type { Dispatch, SetStateAction } from "react";
  2. import { createContext, useCallback, use } from "react";
  3. export const OverlayVisibleContext = createContext<
  4. [boolean, Dispatch<SetStateAction<boolean>>] | undefined
  5. >(undefined);
  6. const useOverlayVisible = () => {
  7. const overlayVisible = use(OverlayVisibleContext);
  8. if (overlayVisible === undefined) {
  9. throw new NotInitiializedError();
  10. }
  11. return overlayVisible;
  12. };
  13. export const useSetOverlayVisible = () => {
  14. const setOverlayVisible = useOverlayVisible()[1];
  15. return {
  16. showOverlay: useCallback(() => {
  17. setOverlayVisible(true);
  18. }, [setOverlayVisible]),
  19. hideOverlay: useCallback(() => {
  20. setOverlayVisible(false);
  21. }, [setOverlayVisible]),
  22. };
  23. };
  24. class NotInitiializedError extends Error {
  25. constructor() {
  26. super("This component must be a child of <OverlayVisibleContextProvider>");
  27. this.name = "NotInitiializedError";
  28. }
  29. }