Skip to content

Commit dce5e65

Browse files
MadinventorZerojonocrbuddhajjigaexkevinparkwilliamdyoon
committed
Redesigned the Save Project useEffect. Mixture of throttle and global flags. Includes a check for legacy projects to add in config object.
Co-authored-by: jonocr <[email protected]> Co-authored-by: buddhajjigae <[email protected]> Co-authored-by: xkevinpark <[email protected]> Co-authored-by: williamdyoon <[email protected]>
1 parent b3781e1 commit dce5e65

File tree

3 files changed

+45
-36
lines changed

3 files changed

+45
-36
lines changed

app/src/components/App.tsx

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export const App = (): JSX.Element => {
1919
} else {
2020
state.isLoggedIn = false;
2121
}
22-
22+
23+
2324
// following useEffect runs on first mount
2425
useEffect(() => {
2526
// if user is a guest, see if a project exists in localforage and retrieve it
@@ -51,43 +52,46 @@ export const App = (): JSX.Element => {
5152
} else {
5253
console.log(
5354
'No user project found in localforage, setting initial state blank'
54-
);
55-
}
56-
});
57-
}
58-
}, []);
59-
60-
// Caret this useEffect was triggering a save after every state change, which is bad for performance
61-
// useEffect(() => {
62-
// let userId;
63-
// if (Cookies.get('ssid')) {
64-
// userId = Cookies.get('ssid');
65-
// } else {
66-
// userId = window.localStorage.getItem('ssid');
67-
// }
68-
// if (state.isLoggedIn === false) {
69-
// localforage.setItem('guestProject', state);
70-
// } else if (state.name !== '') {
71-
// saveProject(state.name, state);
72-
// localforage.setItem(userId, state);
73-
// }
74-
// }, [state]);
75-
76-
// Caret setInterval alternative for 15 seconds between saves
77-
setInterval(() => {
78-
let userId;
79-
if (Cookies.get('ssid')) {
80-
userId = Cookies.get('ssid');
81-
} else {
82-
userId = window.localStorage.getItem('ssid');
55+
);
56+
}
57+
});
58+
}
59+
}, []);
60+
61+
// Caret Start Updated save cycle
62+
useEffect(() => {
63+
console.log('Legacy state', state);
64+
// provide config properties to legacy projects so new edits can be auto saved
65+
if (state.config === undefined) {
66+
state.config = {saveFlag:true, saveTimer:false};
67+
};
68+
console.log('Updated state for legacy projects', state);
69+
// New project save configuration to optimize server load and minimize Ajax requests
70+
if (state.config.saveFlag) {
71+
state.config.saveFlag = false;
72+
state.config.saveTimer = true;
73+
let userId;
74+
if (Cookies.get('ssid')) {
75+
userId = Cookies.get('ssid');
76+
} else {
77+
userId = window.localStorage.getItem('ssid');
78+
}
79+
if (state.isLoggedIn === false) {
80+
localforage.setItem('guestProject', state);
81+
} else if (state.name !== '') {
82+
saveProject(state.name, state);
83+
localforage.setItem(userId, state);
84+
}
8385
}
84-
if (state.isLoggedIn === false) {
85-
localforage.setItem('guestProject', state);
86-
} else if (state.name !== '') {
87-
saveProject(state.name, state);
88-
localforage.setItem(userId, state);
86+
if (state.config.saveTimer) {
87+
state.config.saveTimer = false;
88+
setTimeout(() => {
89+
state.config.saveFlag = true;
90+
}, 15000);
8991
}
90-
}, 15000)
92+
}, [state])
93+
// Caret End
94+
9195

9296
return (
9397
<div className="app">

app/src/context/initialState.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import HTMLTypes from './HTMLTypes';
55
const initialState: State = {
66
name: '',
77
isLoggedIn: false,
8+
// CARET
9+
config: { saveFlag: true, saveTimer: false },
10+
// END CARET
811
components: [
912
{
1013
id: 1,

app/src/interfaces/Interfaces.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export interface State {
66
components: Component[];
77
rootComponents: number[];
88
projectType: string;
9+
// Caret
10+
config?: {};
911
separator: ChildElement;
1012
canvasFocus: { componentId: number; childId: number | null };
1113
nextComponentId: number;

0 commit comments

Comments
 (0)