Skip to content

Commit aeca4e3

Browse files
committed
Autosave System Updated and Improved
1 parent f6ba6b2 commit aeca4e3

File tree

6 files changed

+111
-40
lines changed

6 files changed

+111
-40
lines changed

index.html

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,6 @@
2323
<meta name="twitter:image" content="https://github.com/GraphScript-Labs/.github/blob/main/Banner.png?raw=true">
2424

2525
<script src="/pwv.js"></script>
26-
27-
<script defer>
28-
if (!window.hasPWV) {
29-
const element = document.querySelector(".pywebview-drag-region");
30-
element.remove();
31-
}
32-
</script>
3326

3427
<script>
3528
document.addEventListener("contextmenu", (event) => {
@@ -55,5 +48,11 @@
5548
<span class="pywebview-drag-region"></span>
5649
<div id="root"></div>
5750
<script type="module" src="/src/main.tsx"></script>
51+
<script>
52+
if (!window.hasPWV) {
53+
const element = document.querySelector(".pywebview-drag-region");
54+
element.remove();
55+
}
56+
</script>
5857
</body>
5958
</html>

src/components/engine/Node/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55

66
import type { NodeModel } from "@defs/Node";
77

8+
import { useUnsavedChangesContext } from "@utils/unsavedChanges";
9+
810
import { DynamicIcon } from "@components/commons/DynamicIcon";
911
import { Glass } from "@components/commons/Glass";
1012
import { Input } from "@components/commons/Input";
@@ -16,6 +18,9 @@ export function Node({
1618
}: {
1719
node: NodeModel;
1820
}) {
21+
const {
22+
setUnsavedChanges,
23+
} = useUnsavedChangesContext()!;
1924
const [active, setActive] = useState(false);
2025

2126
const handleClick: () => void = useCallback(() => {
@@ -71,6 +76,7 @@ export function Node({
7176
defaultValue={node.value || ""}
7277
onChange={(event) => {
7378
node.value = event.target.value;
79+
setUnsavedChanges(true);
7480
}}
7581
/>
7682
</div>

src/utils/appData.tsx

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import { usePalleteContext } from "@utils/pallete";
1717
import { useVariablesContext } from "@utils/variables";
1818
import { loadProject, saveProject } from "@utils/engineTools";
1919
import { packProject } from "@utils/packerTools";
20-
import { backupProject, getRestoredProject } from "@utils/desktopTools";
20+
import { backupProject, getRestoredProject, isDesktop } from "@utils/desktopTools";
2121
import { saveData } from "@utils/persistentTools";
22+
import { useUnsavedChangesContext } from "@utils/unsavedChanges";
2223
import {
2324
getBreadcrumb,
2425
getWindowTools,
@@ -78,6 +79,11 @@ const createAppDataContext = () => {
7879
requestPrompt,
7980
} = usePromptContext()!;
8081

82+
const {
83+
unsavedChanges,
84+
setUnsavedChanges,
85+
} = useUnsavedChangesContext()!;
86+
8187
const [
8288
windowTools,
8389
setWindowTools,
@@ -97,6 +103,8 @@ const createAppDataContext = () => {
97103
projectId,
98104
setProjectId,
99105
] = useState<string | null>(null);
106+
107+
const [loaded, setLoaded] = useState<boolean>(false);
100108

101109
useEffect(() => {
102110
setWindowTools(
@@ -157,24 +165,31 @@ const createAppDataContext = () => {
157165

158166
useEffect(() => {
159167
(async () => {
168+
if (loaded) return;
169+
160170
const existingId = await loadExistingId();
161-
const restoredProject = await getRestoredProject();
162-
saveData(`p:${existingId}`, restoredProject);
163171
setProjectId(existingId);
172+
if (isDesktop()) {
173+
const restoredProject = await getRestoredProject();
174+
saveData(`p:${existingId}`, restoredProject);
175+
}
164176

165-
loadProject(
177+
await loadProject(
166178
existingId,
167179
overrideNodeSystem,
168180
overrideVariables,
169181
openNode,
170182
removeNode,
171183
);
184+
185+
setLoaded(true);
172186
})();
173187
}, [
174188
openNode,
175189
overrideNodeSystem,
176190
overrideVariables,
177191
removeNode,
192+
loaded,
178193
]);
179194

180195
useEffect(() => {
@@ -198,6 +213,21 @@ const createAppDataContext = () => {
198213
]);
199214

200215
useEffect(() => {
216+
if (!loaded) return;
217+
if (!projectId) return;
218+
if (!unsavedChanges) return;
219+
220+
const project = packProject(
221+
projectId!,
222+
nodeSystem,
223+
entries,
224+
{
225+
states: statesList,
226+
customComponents,
227+
}
228+
);
229+
230+
backupProject(JSON.stringify(project, null, 2));
201231
saveProject(
202232
projectId!,
203233
nodeSystem,
@@ -207,33 +237,12 @@ const createAppDataContext = () => {
207237
customComponents,
208238
},
209239
);
210-
}, [
211-
projectId,
212-
entries,
213-
nodeSystem,
214-
statesList,
215-
customComponents,
216-
]);
217-
218-
useEffect(() => {
219-
const backupInterval = setInterval(() => {
220-
const project = packProject(
221-
projectId!,
222-
nodeSystem,
223-
entries,
224-
{
225-
states: statesList,
226-
customComponents,
227-
}
228-
);
229-
230-
backupProject(JSON.stringify(project, null, 2));
231-
}, 5000);
232240

233-
return () => {
234-
clearInterval(backupInterval);
235-
}
241+
setUnsavedChanges(false);
236242
}, [
243+
loaded,
244+
unsavedChanges,
245+
setUnsavedChanges,
237246
customComponents,
238247
entries,
239248
nodeSystem,

src/utils/nodeSystem.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import type {
1111
NodeSystem,
1212
} from "@defs/Node";
1313

14+
import { useUnsavedChangesContext } from "@utils/unsavedChanges";
15+
1416
const createNodeSystemContext = () => {
1517
const NodeSystemContext = createContext<{
1618
nodeSystem: NodeSystem;
@@ -28,6 +30,10 @@ const createNodeSystemContext = () => {
2830
const NodeSystemProvider = ({ children }: {
2931
children: ReactNode;
3032
}) => {
33+
const {
34+
setUnsavedChanges,
35+
} = useUnsavedChangesContext()!;
36+
3137
const [entries, setEntries] = useState<string[]>([
3238
"ENTRY",
3339
]);
@@ -54,14 +60,15 @@ const createNodeSystemContext = () => {
5460
isEntry: true,
5561
}
5662

63+
setUnsavedChanges(true);
5764
return { ...prev };
5865
});
5966

6067
setEntries(prev => {
6168
if (prev.includes(entryName)) return prev;
6269
return [...prev, entryName];
6370
});
64-
}, []);
71+
}, [setUnsavedChanges]);
6572

6673
const addNode = useCallback((
6774
baseId: string,
@@ -80,10 +87,11 @@ const createNodeSystemContext = () => {
8087
};
8188
}
8289

90+
setUnsavedChanges(true);
8391
prev[baseId].nodes.push(node);
8492
return { ...prev };
8593
});
86-
}, []);
94+
}, [setUnsavedChanges]);
8795

8896
const removeNode = useCallback((nodeId: string) => {
8997
setNodeSystem(prev => {
@@ -94,17 +102,19 @@ const createNodeSystemContext = () => {
94102
n => n.id !== nodeId
95103
);
96104

105+
setUnsavedChanges(true);
97106
return { ...prev };
98107
});
99-
}, []);
108+
}, [setUnsavedChanges]);
100109

101110
const overrideNodeSystem = useCallback((
102111
system: NodeSystem,
103112
entries: string[],
104113
) => {
114+
setUnsavedChanges(true);
105115
setNodeSystem(system);
106116
setEntries(entries);
107-
}, []);
117+
}, [setUnsavedChanges]);
108118

109119
const exposed = {
110120
nodeSystem,

src/utils/rootProvider.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { NodeSystemProvider } from "@utils/nodeSystem";
77
import { NodeHistoryProvider } from "@utils/nodeHistory";
88
import { NodeFactoryProvider } from "@utils/nodeFactory";
99
import { AppDataProvider } from "@utils/appData";
10+
import { UnsavedChangesProvider } from "./unsavedChanges";
1011

1112
type ProviderType = ({ children }: {
1213
children: ReactNode;
@@ -16,6 +17,7 @@ export function RootProvider({ children }: {
1617
children: ReactNode;
1718
}) {
1819
const providers: ProviderType[] = [
20+
UnsavedChangesProvider,
1921
PromptProvider,
2022
PalleteProvider,
2123
VariablesProvider,

src/utils/unsavedChanges.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {
2+
createContext,
3+
useContext,
4+
useState,
5+
type ReactNode,
6+
} from "react"
7+
8+
const createUnsavedChangesContext = () => {
9+
const UnsavedChangesContext = createContext<{
10+
unsavedChanges: boolean;
11+
setUnsavedChanges: (value: boolean) => void;
12+
} | undefined>(undefined);
13+
14+
const UnsavedChangesProvider = ({ children }: {
15+
children: ReactNode
16+
}) => {
17+
const [unsavedChanges, setUnsavedChanges] = useState(false);
18+
19+
const exposed = {
20+
unsavedChanges,
21+
setUnsavedChanges,
22+
};
23+
24+
return (
25+
<UnsavedChangesContext.Provider value={exposed}>
26+
{children}
27+
</UnsavedChangesContext.Provider>
28+
);
29+
};
30+
31+
const useUnsavedChangesContext = () => {
32+
return useContext(UnsavedChangesContext);
33+
};
34+
35+
return {
36+
UnsavedChangesProvider,
37+
useUnsavedChangesContext,
38+
}
39+
}
40+
41+
export const {
42+
UnsavedChangesProvider,
43+
useUnsavedChangesContext,
44+
} = createUnsavedChangesContext();
45+

0 commit comments

Comments
 (0)