import {Box, Spinner} from '@cloudscape-design/components' import React from 'react' import {GetAppConfig, GetIdentity, GetVersion} from '../model' import {AxiosError} from 'axios' import {BoxProps} from '@cloudscape-design/components/box/interfaces' import {useState} from '../store' import {AppConfig} from '../app-config/types' import {UserIdentity} from '../auth/types' import {PCVersion} from '../types/base' const loadingSpinnerMargin: BoxProps.Spacing = {top: 'xxxl'} function LoadingSpinnerContent() { return ( ) } interface UseLoadingStateResponse { loading: boolean content: React.ReactNode } function useLoadingState( wrappedComponents: React.ReactNode, ): UseLoadingStateResponse { const identity: UserIdentity | null = useState(['identity']) const appConfig: AppConfig | null = useState(['app', 'appConfig']) const version: PCVersion | null = useState(['app', 'version', 'full']) const shouldLoadData = !identity || !appConfig || !version const [loading, setLoading] = React.useState(shouldLoadData) React.useEffect(() => { const getPreliminaryInfo = async () => { setLoading(true) await Promise.all([GetAppConfig(), GetVersion()]) try { await GetIdentity() setLoading(false) } catch (error: any) { const status = (error as AxiosError)?.response?.status if (status != 403 && status != 401) { setLoading(false) throw error // rethrow in case error is not authn/z related } } } if (shouldLoadData) { getPreliminaryInfo() } }, [shouldLoadData]) return { loading, content: loading ? : wrappedComponents, } } export {useLoadingState, LoadingSpinnerContent}