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}
)