All files / apps/maintenance/src/screens/Maintenance runtime.tsx

100% Statements 23/23
100% Branches 18/18
100% Functions 6/6
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109                1x 1x                                                       1x   1x             1x             1x 3x   3x 2x         1x     1x     7x 7x 7x   7x         7x 4x 4x   3x 1x     3x       7x                                      
import React, { createContext, useContext } from 'react';
 
import { HttpService } from '@repo/services/httpClients';
 
import { isHttpError } from '@repo/utils/error';
 
import { MaintenanceRemoteProps } from './types';
 
const defaultGetAccessToken = async () => null;
const noop = () => {};
 
export interface MaintenanceRuntimeActions {
  getAccessToken: () => Promise<string | null>;
  onUnauthorized?: () => void;
  onClose: () => void;
  onSubmitSuccess: () => void;
  onSubmitError: (error: unknown) => void;
  onSubmittingChange?: (isSubmitting: boolean) => void;
  setFabOffset?: (offset: number) => void;
}
 
export interface MaintenanceRuntimeApi {
  mainHttp: HttpService;
  requestWithAuthGuard: <T>(requestFn: () => Promise<T>) => Promise<T>;
}
 
export interface MaintenanceRuntimeMeta {
  featureFlags: Record<string, boolean>;
  api: MaintenanceRuntimeApi;
}
 
export interface MaintenanceRuntimeContextValue {
  actions: MaintenanceRuntimeActions;
  meta: MaintenanceRuntimeMeta;
}
 
const MaintenanceRuntimeContext =
  createContext<MaintenanceRuntimeContextValue | null>(null);
 
export const MaintenanceRuntimeProvider = ({
  value,
  children,
}: {
  value: MaintenanceRuntimeContextValue;
  children: React.ReactNode;
}) => {
  return (
    <MaintenanceRuntimeContext.Provider value={value}>
      {children}
    </MaintenanceRuntimeContext.Provider>
  );
};
 
export const useMaintenanceRuntime = () => {
  const context = useContext(MaintenanceRuntimeContext);
 
  if (!context) {
    throw new Error(
      'useMaintenanceRuntime must be used within MaintenanceRuntimeProvider',
    );
  }
 
  return context;
};
 
export const createMaintenanceRuntimeValue = (
  props: MaintenanceRemoteProps,
): MaintenanceRuntimeContextValue => {
  const baseApiUrl = props.env?.baseApiUrl ?? '';
  const getAccessToken = props.auth?.getAccessToken ?? defaultGetAccessToken;
  const onUnauthorized = props.auth?.onUnauthorized;
 
  const mainHttp = new HttpService(baseApiUrl, {
    getToken: getAccessToken,
    auth: { type: 'bearer' },
  });
 
  const requestWithAuthGuard = async <T,>(requestFn: () => Promise<T>) => {
    try {
      return await requestFn();
    } catch (error) {
      if (isHttpError(error) && error.status === 401) {
        onUnauthorized?.();
      }
 
      throw error;
    }
  };
 
  return {
    actions: {
      getAccessToken,
      onUnauthorized,
      onClose: props.onClose ?? noop,
      onSubmitSuccess: props.onSubmitSuccess ?? noop,
      onSubmitError: props.onSubmitError ?? noop,
      onSubmittingChange: props.onSubmittingChange,
      setFabOffset: props.setFabOffset,
    },
    meta: {
      featureFlags: props.featureFlags ?? {},
      api: {
        mainHttp,
        requestWithAuthGuard,
      },
    },
  };
};