mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-09-20 14:32:57 +00:00
Merge pull request #5014 from naturalcrit/new/edit/Home-Move-unsavedChange-checker-to-common-hook
New/edit/home move unsaved change checker to common hook
This commit is contained in:
@@ -78,15 +78,6 @@ const EditPage = (props)=>{
|
|||||||
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
||||||
const saveTimeout = useRef(null);
|
const saveTimeout = useRef(null);
|
||||||
const warnUnsavedTimeout = useRef(null);
|
const warnUnsavedTimeout = useRef(null);
|
||||||
const unsavedChangesRef = useRef(unsavedChanges); // Similarly, onBeforeUnload lives outside React and needs ref to unsavedChanges
|
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
unsavedChangesRef.current = unsavedChanges;
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleSplitMove = ()=>{
|
|
||||||
editorRef.current?.update();
|
|
||||||
};
|
|
||||||
|
|
||||||
const updateBrew = (newData)=>setCurrentBrew((prevBrew)=>({
|
const updateBrew = (newData)=>setCurrentBrew((prevBrew)=>({
|
||||||
...prevBrew,
|
...prevBrew,
|
||||||
@@ -326,6 +317,7 @@ const EditPage = (props)=>{
|
|||||||
};
|
};
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
handleSplitMove,
|
||||||
handleBrewChange
|
handleBrewChange
|
||||||
} = useCommonEditPageFunctions({
|
} = useCommonEditPageFunctions({
|
||||||
saveGoogle,
|
saveGoogle,
|
||||||
@@ -344,11 +336,12 @@ const EditPage = (props)=>{
|
|||||||
autoSaveEnabled,
|
autoSaveEnabled,
|
||||||
setAutoSaveEnabled,
|
setAutoSaveEnabled,
|
||||||
setWarnUnsavedChanges,
|
setWarnUnsavedChanges,
|
||||||
unsavedChangesRef,
|
unsavedChanges,
|
||||||
setUnsavedChanges,
|
setUnsavedChanges,
|
||||||
trySave,
|
trySave,
|
||||||
sandbox,
|
sandbox,
|
||||||
lastSavedBrew
|
lastSavedBrew,
|
||||||
|
editorRef
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -62,14 +62,9 @@ const HomePage =(props)=>{
|
|||||||
const [autoSaveEnabled, setAutoSaveEnabled] = useState(false);
|
const [autoSaveEnabled, setAutoSaveEnabled] = useState(false);
|
||||||
const [warnUnsavedChanges, setWarnUnsavedChanges] = useState(true);
|
const [warnUnsavedChanges, setWarnUnsavedChanges] = useState(true);
|
||||||
|
|
||||||
const editorRef = useRef(null);
|
const editorRef = useRef(null);
|
||||||
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
||||||
const warnUnsavedTimeout = useRef(null);
|
const warnUnsavedTimeout = useRef(null);
|
||||||
const unsavedChangesRef = useRef(unsavedChanges);
|
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
unsavedChangesRef.current = unsavedChanges;
|
|
||||||
}, [unsavedChanges]);
|
|
||||||
|
|
||||||
const save = ()=>{
|
const save = ()=>{
|
||||||
request.post('/api')
|
request.post('/api')
|
||||||
@@ -84,10 +79,6 @@ const HomePage =(props)=>{
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSplitMove = ()=>{
|
|
||||||
editorRef.current.update();
|
|
||||||
};
|
|
||||||
|
|
||||||
const resetWarnUnsavedTimer = ()=>{
|
const resetWarnUnsavedTimer = ()=>{
|
||||||
setTimeout(()=>setWarnUnsavedChanges(false), UNSAVED_WARNING_POPUP_TIMEOUT); // Hide the warning after 4 seconds
|
setTimeout(()=>setWarnUnsavedChanges(false), UNSAVED_WARNING_POPUP_TIMEOUT); // Hide the warning after 4 seconds
|
||||||
clearTimeout(warnUnsavedTimeout.current);
|
clearTimeout(warnUnsavedTimeout.current);
|
||||||
@@ -150,7 +141,8 @@ const HomePage =(props)=>{
|
|||||||
</Navbar>;
|
</Navbar>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
handleSplitMove,
|
||||||
handleBrewChange
|
handleBrewChange
|
||||||
} = useCommonEditPageFunctions({
|
} = useCommonEditPageFunctions({
|
||||||
setError,
|
setError,
|
||||||
@@ -168,10 +160,11 @@ const HomePage =(props)=>{
|
|||||||
autoSaveEnabled,
|
autoSaveEnabled,
|
||||||
setAutoSaveEnabled,
|
setAutoSaveEnabled,
|
||||||
setWarnUnsavedChanges,
|
setWarnUnsavedChanges,
|
||||||
unsavedChangesRef,
|
unsavedChanges,
|
||||||
setUnsavedChanges,
|
setUnsavedChanges,
|
||||||
sandbox,
|
sandbox,
|
||||||
lastSavedBrew
|
lastSavedBrew,
|
||||||
|
editorRef
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -62,11 +62,10 @@ const NewPage = (props)=>{
|
|||||||
const [autoSaveEnabled, setAutoSaveEnabled] = useState(false);
|
const [autoSaveEnabled, setAutoSaveEnabled] = useState(false);
|
||||||
const [warnUnsavedChanges, setWarnUnsavedChanges] = useState(true);
|
const [warnUnsavedChanges, setWarnUnsavedChanges] = useState(true);
|
||||||
|
|
||||||
const editorRef = useRef(null);
|
const editorRef = useRef(null);
|
||||||
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
const lastSavedBrew = useRef(_.cloneDeep(props.brew));
|
||||||
// const saveTimeout = useRef(null);
|
// const saveTimeout = useRef(null);
|
||||||
const warnUnsavedTimeout = useRef(null);
|
const warnUnsavedTimeout = useRef(null);
|
||||||
const unsavedChangesRef = useRef(unsavedChanges); // Similarly, onBeforeUnload lives outside React and needs ref to unsavedChanges
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
loadBrew();
|
loadBrew();
|
||||||
@@ -101,14 +100,6 @@ const NewPage = (props)=>{
|
|||||||
window.history.replaceState({}, window.location.title, '/new/');
|
window.history.replaceState({}, window.location.title, '/new/');
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
unsavedChangesRef.current = unsavedChanges;
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleSplitMove = ()=>{
|
|
||||||
editorRef.current.update();
|
|
||||||
};
|
|
||||||
|
|
||||||
const resetWarnUnsavedTimer = ()=>{
|
const resetWarnUnsavedTimer = ()=>{
|
||||||
setTimeout(()=>setWarnUnsavedChanges(false), UNSAVED_WARNING_POPUP_TIMEOUT); // Hide the warning after 4 seconds
|
setTimeout(()=>setWarnUnsavedChanges(false), UNSAVED_WARNING_POPUP_TIMEOUT); // Hide the warning after 4 seconds
|
||||||
clearTimeout(warnUnsavedTimeout.current);
|
clearTimeout(warnUnsavedTimeout.current);
|
||||||
@@ -204,7 +195,8 @@ const NewPage = (props)=>{
|
|||||||
</Navbar>
|
</Navbar>
|
||||||
);
|
);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
handleSplitMove,
|
||||||
handleBrewChange
|
handleBrewChange
|
||||||
} = useCommonEditPageFunctions({
|
} = useCommonEditPageFunctions({
|
||||||
setError,
|
setError,
|
||||||
@@ -222,11 +214,12 @@ const NewPage = (props)=>{
|
|||||||
autoSaveEnabled,
|
autoSaveEnabled,
|
||||||
setAutoSaveEnabled,
|
setAutoSaveEnabled,
|
||||||
setWarnUnsavedChanges,
|
setWarnUnsavedChanges,
|
||||||
unsavedChangesRef,
|
unsavedChanges,
|
||||||
setUnsavedChanges,
|
setUnsavedChanges,
|
||||||
trySave,
|
trySave,
|
||||||
sandbox,
|
sandbox,
|
||||||
lastSavedBrew
|
lastSavedBrew,
|
||||||
|
editorRef
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -24,16 +24,18 @@ export default function useCommonEditPageFunctions(dependencies) {
|
|||||||
trySave = ()=>{},
|
trySave = ()=>{},
|
||||||
sandbox,
|
sandbox,
|
||||||
saveGoogle = false,
|
saveGoogle = false,
|
||||||
unsavedChangesRef,
|
unsavedChanges,
|
||||||
setUnsavedChanges,
|
setUnsavedChanges,
|
||||||
lastSavedBrew
|
lastSavedBrew,
|
||||||
|
editorRef
|
||||||
} = dependencies;
|
} = dependencies;
|
||||||
|
|
||||||
|
const unsavedChangesRef = useRef(unsavedChanges); // onBeforeUnload lives outside React and needs ref to unsavedChanges
|
||||||
|
|
||||||
//==--------- Page setup ----------==//
|
//==--------- Page setup ----------==//
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true);
|
const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true);
|
||||||
setAutoSaveEnabled(autoSavePref);
|
setAutoSaveEnabled(autoSavePref);
|
||||||
console.log(autoSavePref)
|
|
||||||
setWarnUnsavedChanges(!autoSavePref);
|
setWarnUnsavedChanges(!autoSavePref);
|
||||||
setHTMLErrors(hbfm.validate(currentBrew.text));
|
setHTMLErrors(hbfm.validate(currentBrew.text));
|
||||||
fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme);
|
fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme);
|
||||||
@@ -63,10 +65,14 @@ export default function useCommonEditPageFunctions(dependencies) {
|
|||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
const hasChange = !_.isEqual(currentBrew, lastSavedBrew.current);
|
const hasChange = !_.isEqual(currentBrew, lastSavedBrew.current);
|
||||||
setUnsavedChanges(hasChange);
|
setUnsavedChanges(hasChange);
|
||||||
|
unsavedChangesRef.current = hasChange;
|
||||||
|
|
||||||
if(autoSaveEnabled) trySave(false, hasChange, saveGoogle);
|
if(autoSaveEnabled) trySave(false, hasChange, saveGoogle);
|
||||||
}, [currentBrew]);
|
}, [currentBrew]);
|
||||||
|
|
||||||
|
const handleSplitMove = ()=>{
|
||||||
|
editorRef.current.update();
|
||||||
|
};
|
||||||
|
|
||||||
const handleBrewChange = (field)=>(value, subfield)=>{ //'text', 'style', 'snippets', 'metadata'
|
const handleBrewChange = (field)=>(value, subfield)=>{ //'text', 'style', 'snippets', 'metadata'
|
||||||
if(subfield == 'renderer' || subfield == 'theme')
|
if(subfield == 'renderer' || subfield == 'theme')
|
||||||
@@ -92,6 +98,7 @@ export default function useCommonEditPageFunctions(dependencies) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
handleSplitMove,
|
||||||
handleBrewChange
|
handleBrewChange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user