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,
},
},
};
};
|