diff --git a/editor.planx.uk/src/pages/layout/LoadingLayout.tsx b/editor.planx.uk/src/pages/layout/LoadingLayout.tsx new file mode 100644 index 0000000000..3198b87999 --- /dev/null +++ b/editor.planx.uk/src/pages/layout/LoadingLayout.tsx @@ -0,0 +1,10 @@ +import DelayedLoadingIndicator from "components/DelayedLoadingIndicator"; +import React from "react"; +import { useLoadingRoute, View } from "react-navi"; + +export const loadingView = () => ; + +export const LoadingLayout = () => { + const isLoading = useLoadingRoute(); + return isLoading ? : ; +}; diff --git a/editor.planx.uk/src/routes/index.tsx b/editor.planx.uk/src/routes/index.tsx index 831a73be98..c1cad20ee9 100644 --- a/editor.planx.uk/src/routes/index.tsx +++ b/editor.planx.uk/src/routes/index.tsx @@ -1,4 +1,5 @@ -import { lazy, map, mount, redirect, route } from "navi"; +import { compose, lazy, map, mount, redirect, route, withView } from "navi"; +import { loadingView } from "pages/layout/LoadingLayout"; import * as React from "react"; import { client } from "../lib/graphql"; @@ -58,27 +59,36 @@ const editorRoutes = mount({ const mountPayRoutes = () => map(async () => { + compose(withView(loadingView)); return lazy(() => import("./pay")); }); export default isPreviewOnlyDomain - ? mount({ - "/:team/:flow/published": lazy(() => import("./published")), // XXX: keeps old URL working, but only for the team listed in the domain. - "/:flow": lazy(() => import("./published")), - "/:flow/pay": mountPayRoutes(), - // XXX: We're not sure where to redirect `/` to so for now we'll just return the default 404 - // "/": redirect("somewhere?"), - }) - : mount({ - "/:team/:flow/published": lazy(() => import("./published")), // loads current published flow if exists, or throws Not Found if unpublished - "/canterbury/find-out-if-you-need-planning-permission/preview": map( - async (req) => - redirect( - `/canterbury/find-out-if-you-need-planning-permission/published${req?.search}`, - ), - ), // temporary redirect while Canterbury works with internal IT to update advertised service links - "/:team/:flow/preview": lazy(() => import("./preview")), // loads current draft flow and latest published external portals, or throws Not Found if any external portal is unpublished - "/:team/:flow/draft": lazy(() => import("./draft")), // loads current draft flow and draft external portals - "/:team/:flow/pay": mountPayRoutes(), - "*": editorRoutes, - }); + ? compose( + withView(loadingView), + + mount({ + "/:team/:flow/published": lazy(() => import("./published")), // XXX: keeps old URL working, but only for the team listed in the domain. + "/:flow": lazy(() => import("./published")), + "/:flow/pay": mountPayRoutes(), + // XXX: We're not sure where to redirect `/` to so for now we'll just return the default 404 + // "/": redirect("somewhere?"), + }), + ) + : compose( + withView(loadingView), + + mount({ + "/:team/:flow/published": lazy(() => import("./published")), // loads current published flow if exists, or throws Not Found if unpublished + "/canterbury/find-out-if-you-need-planning-permission/preview": map( + async (req) => + redirect( + `/canterbury/find-out-if-you-need-planning-permission/published${req?.search}`, + ), + ), // temporary redirect while Canterbury works with internal IT to update advertised service links + "/:team/:flow/preview": lazy(() => import("./preview")), // loads current draft flow and latest published external portals, or throws Not Found if any external portal is unpublished + "/:team/:flow/draft": lazy(() => import("./draft")), // loads current draft flow and draft external portals + "/:team/:flow/pay": mountPayRoutes(), + "*": editorRoutes, + }), + );