diff --git a/src/app/(authed)/(project-doc)/[...slug]/layout.tsx b/src/app/(authed)/(project-doc)/[...slug]/layout.tsx index 62f1ab7e..98306516 100644 --- a/src/app/(authed)/(project-doc)/[...slug]/layout.tsx +++ b/src/app/(authed)/(project-doc)/[...slug]/layout.tsx @@ -4,44 +4,33 @@ import { Box, Stack } from "@mui/material" import { useTheme } from "@mui/material/styles" import TrailingToolbarItem from "@/features/projects/view/toolbar/TrailingToolbarItem" import MobileToolbar from "@/features/projects/view/toolbar/MobileToolbar" -import { useProjectSelection } from "@/features/projects/data" -import NotFound from "@/features/projects/view/NotFound" -import dynamic from "next/dynamic" import SecondaryHeaderPlaceholder from "@/features/sidebar/view/SecondarySplitHeaderPlaceholder" - -const SecondarySplitHeader = dynamic(() => import("@/features/sidebar/view/SecondarySplitHeader"), - { - loading: () => , - ssr: false, - } -) +import { useContext } from "react" +import { ProjectsContext } from "@/common" +import LoadingIndicator from "@/common/ui/LoadingIndicator" +import SecondarySplitHeader from "@/features/sidebar/view/SecondarySplitHeader" export default function Page({ children }: { children: React.ReactNode }) { - const { project } = useProjectSelection() + const { refreshed } = useContext(ProjectsContext) + const theme = useTheme() + return ( - {!project && - <> - - - -
- -
- - } - {project && <> - }> - - + {!refreshed ? : + }> + + + } -
- {children} -
+ {refreshed ? +
+ {children} +
: + + } - }
) } \ No newline at end of file diff --git a/src/app/(authed)/(project-doc)/[...slug]/page.tsx b/src/app/(authed)/(project-doc)/[...slug]/page.tsx index 7e2635e4..9cb06eb9 100644 --- a/src/app/(authed)/(project-doc)/[...slug]/page.tsx +++ b/src/app/(authed)/(project-doc)/[...slug]/page.tsx @@ -5,6 +5,7 @@ import ErrorMessage from "@/common/ui/ErrorMessage" import { updateWindowTitle } from "@/features/projects/domain" import { useProjectSelection } from "@/features/projects/data" import Documentation from "@/features/projects/view/Documentation" +import NotFound from "@/features/projects/view/NotFound" export default function Page() { const { project, version, specification, navigateToSelectionIfNeeded } = useProjectSelection() @@ -23,17 +24,16 @@ export default function Page() { specification }) }, [project, version, specification]) + return ( <> {project && version && specification && } - {project && !version && - - } - {project && !specification && - + {project && (!version || !specification) && + } + {!project && } ) } diff --git a/src/common/context/ProjectsContext.ts b/src/common/context/ProjectsContext.ts index c5484722..cc0fe966 100644 --- a/src/common/context/ProjectsContext.ts +++ b/src/common/context/ProjectsContext.ts @@ -6,11 +6,13 @@ import { Project } from "@/features/projects/domain" export const SidebarTogglableContext = createContext(true) type ProjectsContextValue = { + refreshed: boolean, projects: Project[], setProjects: (projects: Project[]) => void } export const ProjectsContext = createContext({ + refreshed: false, projects: [], setProjects: () => {} }) diff --git a/src/features/projects/view/ProjectsContextProvider.tsx b/src/features/projects/view/ProjectsContextProvider.tsx index cd3725e9..93213d75 100644 --- a/src/features/projects/view/ProjectsContextProvider.tsx +++ b/src/features/projects/view/ProjectsContextProvider.tsx @@ -11,9 +11,26 @@ const ProjectsContextProvider = ({ initialProjects?: Project[], children?: React.ReactNode }) => { + const [refreshed, setRefreshed] = useState(false) const [projects, setProjects] = useState(initialProjects || []) + + const hasProjectChanged = (value: Project[]) => value.some((project, index) => { + // Compare by project id and version (or any other key fields) + return project.id !== projects[index]?.id || project.versions !== projects[index]?.versions + }) + + const setProjectsAndRefreshed = (value: Project[]) => { + setProjects(value) + // If any project has changed, update the state and mark as refreshed + if (hasProjectChanged(value)) setRefreshed(true) + + } return ( - + {children} )