@@ -21,7 +21,6 @@ import {
2121 Outlet ,
2222 Scripts ,
2323 ScrollRestoration ,
24- data ,
2524 useLoaderData ,
2625 useNavigate
2726} from '@remix-run/react' ;
@@ -31,6 +30,7 @@ import env from '../env-resolver/env';
3130import { Container } from './components/container' ;
3231import { DesktopNavigation } from './components/desktop-navigation' ;
3332import { GeneralErrorBoundary } from './components/error-boundary' ;
33+ import { ErrorContainer } from './components/error-container' ;
3434import { Footer } from './components/footer' ;
3535import { MobileNavigation } from './components/mobile-navigation' ;
3636import { ThemeSwitch , useTheme } from './routes/resources.theme-switch' ;
@@ -41,7 +41,7 @@ import { type Theme, getTheme } from './utils/theme.server';
4141
4242export const meta : MetaFunction < typeof loader > = ( { data } ) => [
4343 {
44- title : data ?. siteSettings . general . appName
44+ title : data ?. siteSettings ? .general ? .appName ?? ''
4545 }
4646] ;
4747
@@ -60,15 +60,15 @@ export const links: LinksFunction = () => [
6060] ;
6161
6262export async function loader ( { context, request } : LoaderFunctionArgs ) {
63+ /** Error message to display to the user when we have e.g. API issues */
64+ let loaderErrorMessage = '' ;
65+
6366 try {
6467 // Get the theme before fetching pages in case it fails
6568 const theme = await getTheme ( request ) ;
6669
67- /** Error message to display to the user when we have e.g. API issues */
68- let displayError = '' ;
69-
7070 let navigationTree : Array < NavigationItem > = [ ] ;
71- let siteSettings = { } as SiteSetting ;
71+ let siteSettings : SiteSetting | null = null ;
7272
7373 // Fetch layout data but don't propagate the exception to the error boundary
7474 try {
@@ -77,21 +77,18 @@ export async function loader({ context, request }: LoaderFunctionArgs) {
7777 context ,
7878 request . headers
7979 ) ;
80- const gss = await getSiteSettings ( requestOptions ) ;
81- if ( ! gss ) {
82- throw new Error ( 'Site settings not found' ) ;
83- }
84- siteSettings = gss ;
8580 navigationTree = await getNavigationTree ( requestOptions ) ;
81+ siteSettings = await getSiteSettings ( requestOptions ) ;
8682 } catch ( e ) {
8783 const error = e as Error ;
8884 console . error ( `Failed to load data: ${ error . message } ` ) ;
89- displayError = 'Unable to load content. Please try again later.' ;
85+ loaderErrorMessage =
86+ 'Unable to load application content. Please try again later.' ;
9087 }
9188
9289 return {
93- displayError,
9490 env,
91+ loaderErrorMessage,
9592 navigationTree,
9693 requestInfo : {
9794 hints : getHints ( request ) ,
@@ -104,10 +101,8 @@ export async function loader({ context, request }: LoaderFunctionArgs) {
104101 } ;
105102 } catch ( error ) {
106103 console . error ( 'Failed to load root data:\n' , error ) ;
107- throw data (
108- { message : 'Failed to load application. Please try again later.' } ,
109- { status : 500 }
110- ) ;
104+ // Delegate to error boundary
105+ throw error ;
111106 }
112107}
113108
@@ -226,12 +221,12 @@ export default function App() {
226221 </ div >
227222 </ header >
228223 < main className = "flex-auto" >
229- < Outlet />
230- { loaderData . displayError && (
231- < div className = "flex items-center justify-center p-4 ">
232- < p className = "text-red-500" > { loaderData . displayError } </ p >
233- </ div >
234- ) }
224+ { /* Display loader error message if it exists instead of the outlet */ }
225+ { ( loaderData . loaderErrorMessage && (
226+ < ErrorContainer severity = "error ">
227+ { loaderData . loaderErrorMessage }
228+ </ ErrorContainer >
229+ ) ) || < Outlet /> }
235230 </ main >
236231 < Footer />
237232 </ div >
0 commit comments