Spaces:
Runtime error
Runtime error
/** | |
* Copyright (c) Meta Platforms, Inc. and affiliates. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import ErrorFallback from '@/common/error/ErrorFallback'; | |
import LoadingMessage from '@/common/loading/LoadingMessage'; | |
import {createEnvironment} from '@/graphql/RelayEnvironment'; | |
import { | |
ComponentType, | |
PropsWithChildren, | |
ReactNode, | |
Suspense, | |
useMemo, | |
useState, | |
} from 'react'; | |
import {ErrorBoundary, FallbackProps} from 'react-error-boundary'; | |
import {RelayEnvironmentProvider} from 'react-relay'; | |
type Props = PropsWithChildren<{ | |
suspenseFallback?: ReactNode; | |
errorFallback?: ComponentType<FallbackProps>; | |
endpoint: string; | |
}>; | |
export default function OnevisionRelayEnvironmentProvider({ | |
suspenseFallback, | |
errorFallback = ErrorFallback, | |
endpoint, | |
children, | |
}: Props) { | |
const [retryKey, setRetryKey] = useState<number>(0); | |
const environment = useMemo(() => { | |
return createEnvironment(endpoint); | |
// The retryKey is needed to force a new Relay Environment | |
// instance when the user retries after an error occurred. | |
// eslint-disable-next-line react-hooks/exhaustive-deps | |
}, [endpoint, retryKey]); | |
// Force re-creating Relay Environment | |
function handleReset() { | |
setRetryKey(k => k + 1); | |
} | |
return ( | |
<ErrorBoundary onReset={handleReset} FallbackComponent={errorFallback}> | |
<RelayEnvironmentProvider environment={environment}> | |
<Suspense fallback={suspenseFallback ?? <LoadingMessage />}> | |
{children} | |
</Suspense> | |
</RelayEnvironmentProvider> | |
</ErrorBoundary> | |
); | |
} | |