| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import { FC, useEffect, useState } from 'react'
- import LoadingBranded from '@/shared/components/loading-branded'
- import useWaitForI18n from '@/shared/hooks/use-wait-for-i18n'
- import getMeta from '@/utils/meta'
- import { useConnectionContext } from '../context/connection-context'
- import { useIdeReactContext } from '@/features/ide-react/context/ide-react-context'
- import { LoadingError, LoadingErrorProps } from './loading-error'
- import useThemedPage from '@/shared/hooks/use-themed-page'
- type Part = 'initial' | 'render' | 'connection' | 'translations' | 'project'
- const initialParts = new Set<Part>(['initial'])
- const totalParts = new Set<Part>([
- 'initial',
- 'render',
- 'connection',
- 'translations',
- 'project',
- ])
- export const Loading: FC<{
- setLoaded: (value: boolean) => void
- }> = ({ setLoaded }) => {
- const [loadedParts, setLoadedParts] = useState(initialParts)
- useThemedPage()
- const progress = (loadedParts.size / totalParts.size) * 100
- useEffect(() => {
- setLoaded(progress === 100)
- }, [progress, setLoaded])
- const { connectionState, isConnected } = useConnectionContext()
- const i18n = useWaitForI18n()
- const { projectJoined } = useIdeReactContext()
- useEffect(() => {
- setLoadedParts(value => new Set(value).add('render'))
- }, [])
- useEffect(() => {
- if (isConnected) {
- setLoadedParts(value => new Set(value).add('connection'))
- }
- }, [isConnected])
- useEffect(() => {
- if (i18n.isReady) {
- setLoadedParts(value => new Set(value).add('translations'))
- }
- }, [i18n.isReady])
- useEffect(() => {
- if (projectJoined) {
- setLoadedParts(value => new Set(value).add('project'))
- }
- }, [projectJoined])
- // Use loading text from the server, because i18n will not be ready initially
- const label = getMeta('ol-loadingText')
- const errorCode = connectionState.error ?? (i18n.error ? 'i18n-error' : '')
- return <LoadingUI progress={progress} label={label} errorCode={errorCode} />
- }
- type LoadingUiProps = {
- progress: number
- label: string
- errorCode: LoadingErrorProps['errorCode']
- }
- export const LoadingUI: FC<LoadingUiProps> = ({
- progress,
- label,
- errorCode,
- }) => {
- return (
- <div className="loading-screen">
- <LoadingBranded
- loadProgress={progress}
- label={label}
- hasError={Boolean(errorCode)}
- />
- {Boolean(errorCode) && <LoadingError errorCode={errorCode} />}
- </div>
- )
- }
|