Skip to content

Commit 908d9d9

Browse files
committed
Slightly less flaky on reload
1 parent 76069a5 commit 908d9d9

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

src/ProjectPageRouting.tsx

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,32 @@
1-
import { ReactNode } from "react"
2-
import { useRouterState } from "./router-hooks"
1+
import { ReactNode, useEffect } from "react";
2+
import { useRouterState } from "./router-hooks";
33
import ProjectBrowser from "./project/ProjectBrowser";
4+
import { useProjectStorage } from "./project-persistence/ProjectStorageProvider";
45

56
interface ProjectPageRoutingProps {
6-
children: ReactNode
7+
children: ReactNode;
78
}
8-
const ProjectPageRouting = ({children} : ProjectPageRoutingProps) => {
9-
const [{tab}] = useRouterState();
10-
if (typeof tab === "undefined") {
11-
return <ProjectBrowser />
9+
const ProjectPageRouting = ({ children }: ProjectPageRoutingProps) => {
10+
const [{ tab }, navigate] = useRouterState();
11+
const { projectId, restoreMostRecentProject } = useProjectStorage();
12+
13+
useEffect(() => {
14+
if (!projectId) {
15+
const restoreState = async () => {
16+
const restoredProject = await restoreMostRecentProject();
17+
if (!restoredProject && typeof tab !== "undefined") {
18+
history.replaceState(null, "", "/");
19+
window.dispatchEvent(new PopStateEvent("popstate"));
20+
}
21+
};
22+
void restoreState();
1223
}
13-
return children;
14-
}
24+
}, []);
25+
26+
if (typeof tab === "undefined") {
27+
return <ProjectBrowser />;
28+
}
29+
return children;
30+
};
1531

1632
export default ProjectPageRouting;

src/project-persistence/ProjectStorageProvider.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ interface ProjectContextValue {
2626
projectList: ProjectList | null;
2727
newStoredProject: () => Promise<NewStoredDoc>;
2828
restoreStoredProject: (id: string) => Promise<RestoredStoredDoc>;
29+
restoreMostRecentProject: () => Promise<RestoredStoredDoc | null>;
2930
deleteProject: (id: string) => Promise<void>;
3031
ydoc: Y.Doc | null;
3132
awareness: Awareness | null;
@@ -44,6 +45,7 @@ export function ProjectStorageProvider({
4445
const [projectStore, setProjectStoreImpl] = useState<ProjectStore | null>(
4546
null
4647
);
48+
4749
const setProjectStore = (newProjectStore: ProjectStore) => {
4850
if (projectStore) {
4951
projectStore.destroy();
@@ -69,6 +71,18 @@ export function ProjectStorageProvider({
6971
[projectList]
7072
);
7173

74+
const restoreMostRecentProject: () => Promise<RestoredStoredDoc | null> =
75+
useCallback(async () => {
76+
let localProjectList = projectList;
77+
if (!localProjectList) {
78+
localProjectList = await refreshProjects();
79+
}
80+
if (!localProjectList || localProjectList.length === 0) {
81+
return null;
82+
}
83+
return restoreStoredProject(localProjectList[0].id);
84+
}, [restoreStoredProject, projectList]);
85+
7286
const newStoredProject: () => Promise<NewStoredDoc> =
7387
useCallback(async () => {
7488
const newProjectId = makeUID();
@@ -106,13 +120,14 @@ export function ProjectStorageProvider({
106120

107121
const refreshProjects = async () => {
108122
const projectList = await withProjectDb("readonly", async (store) => {
109-
const projectList = await new Promise((res, rej) => {
123+
const projectList = await new Promise<ProjectList>((res, rej) => {
110124
const query = store.index("modifiedDate").getAll();
111125
query.onsuccess = () => res(query.result);
112126
});
113127
return projectList;
114128
});
115-
setProjectList((projectList as ProjectList).reverse());
129+
setProjectList(projectList.reverse());
130+
return projectList;
116131
};
117132

118133
useEffect(() => {
@@ -176,6 +191,7 @@ export function ProjectStorageProvider({
176191
getFile,
177192
newStoredProject,
178193
restoreStoredProject,
194+
restoreMostRecentProject,
179195
deleteProject,
180196
setProjectName,
181197
}}

0 commit comments

Comments
 (0)