From 2dc088cd803e5a4454c8b9fb0d6d05930e213e58 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 16:07:15 +0000 Subject: [PATCH 1/3] Make "brewToSave" prep (patch/hash/pageCount) common, and move into common hook. --- client/homebrew/pages/editPage/editPage.jsx | 18 ++---------------- client/homebrew/pages/homePage/homePage.jsx | 3 --- client/homebrew/pages/newPage/newPage.jsx | 13 +------------ .../homebrew/utils/commonEditPageFunctions.jsx | 15 +++++++++++++-- 4 files changed, 16 insertions(+), 33 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 71dfdbdf2..d894627b7 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -40,8 +40,6 @@ const EditPage = (props)=>{ const [alertOwnershipToTransfer, setAlertOwnershipToTransfer] = useState(false); const [confirmGoogleTransfer, setConfirmGoogleTransfer] = useState(false); - const lastSavedBrew = useRef(_.cloneDeep(props.brew)); - const handleGoogleClick = ()=>{ if(currentBrew.authors.length > 0 && global.account?.username !== currentBrew.authors[0]) { setAlertOwnershipToTransfer(true); @@ -76,23 +74,12 @@ const EditPage = (props)=>{ await updateHistory(brew).catch(console.error); await versionHistoryGarbageCollection().catch(console.error); - //Prepare content to send to server - const brewToSave = { - ...brew, - text : brew.text.normalize('NFC'), - pageCount : ((brew.renderer === 'legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^(?=\\page(?:break)?(?: *{[^\n{}]*})?$)/gm)) || []).length + 1, - patches : stringifyPatches(makePatches(encodeURI(lastSavedBrew.current.text.normalize('NFC')), encodeURI(brew.text.normalize('NFC')))), - hash : await md5(lastSavedBrew.current.text.normalize('NFC')), - textBin : undefined, - version : lastSavedBrew.current.version - }; - - const compressedBrew = gzipSync(strToU8(JSON.stringify(brewToSave))); + const compressedBrew = gzipSync(strToU8(JSON.stringify(brew))); const transfer = saveToGoogle === _.isNil(brew.googleId); const params = transfer ? `?${saveToGoogle ? 'saveToGoogle' : 'removeFromGoogle'}=true` : ''; const res = await request - .put(`/api/update/${brewToSave.editId}${params}`) + .put(`/api/update/${brew.editId}${params}`) .set('Content-Encoding', 'gzip') .set('Content-Type', 'application/json') .send(compressedBrew) @@ -173,7 +160,6 @@ const EditPage = (props)=>{ useLocalStorage, sandbox, showFloatingButtons, - lastSavedBrew, save, onSaveSuccess, pageName, diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 20b75b486..02e9fbd1e 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -26,8 +26,6 @@ const HomePage =(props)=>{ const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(undefined); - const lastSavedBrew = useRef(_.cloneDeep(props.brew)); - const save = async (brew, saveToGoogle)=>{ const res = await request .post(`/api${saveGoogle ? '?saveToGoogle=true' : ''}`) @@ -58,7 +56,6 @@ const HomePage =(props)=>{ useLocalStorage, sandbox, showFloatingButtons, - lastSavedBrew, save, onSaveSuccess, pageName, diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 8606cc752..d8e719eef 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -26,20 +26,10 @@ const NewPage = (props)=>{ const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(null); - const lastSavedBrew = useRef(_.cloneDeep(props.brew)); - const save = async (brew, saveToGoogle)=>{ - //Prepare content to send to server - const brewToSave = { - ...brew, - text : brew.text.normalize('NFC'), - pageCount : ((brew.renderer === 'legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^(?=\\page(?:break)?(?: *{[^\n{}]*})?$)/gm)) || []).length + 1, - textBin : undefined - }; - const res = await request .post(`/api${saveGoogle ? '?saveToGoogle=true' : ''}`) - .send(brewToSave) + .send(brew) .catch((err)=>{ console.error('Error Updating Local Brew'); setError(err); @@ -66,7 +56,6 @@ const NewPage = (props)=>{ useLocalStorage, sandbox, showFloatingButtons, - lastSavedBrew, save, onSaveSuccess, pageName, diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index 701680ecf..f69d85317 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -45,7 +45,6 @@ export default function useCommonEditPageFunctions(dependencies) { useLocalStorage, sandbox, showFloatingButtons, - lastSavedBrew, save, onSaveSuccess, pageName, @@ -68,6 +67,7 @@ export default function useCommonEditPageFunctions(dependencies) { const unsavedChangesRef = useRef(unsavedChanges); // onBeforeUnload lives outside React and needs ref to unsavedChanges const warnUnsavedTimeout = useRef(null); // timers live outside React and need ref to consistently track time + const lastSavedBrew = useRef(_.cloneDeep(currentBrew)); const saveTimeout = useRef(null); const editorRef = useRef(null); @@ -202,7 +202,18 @@ export default function useCommonEditPageFunctions(dependencies) { setIsSaving(true); setError(null); setHTMLErrors(hbfm.validate(currentBrew.text)); - const brewToSave = currentBrew; + + //Prepare content to send to server + const brewToSave = { + ...currentBrew, + text : currentBrew.text.normalize('NFC'), + pageCount : ((currentBrew.renderer === 'legacy' ? currentBrew.text.match(/\\page/g) : currentBrew.text.match(/^(?=\\page(?:break)?(?: *{[^\n{}]*})?$)/gm)) || []).length + 1, + patches : stringifyPatches(makePatches(encodeURI(lastSavedBrew.current.text.normalize('NFC')), encodeURI(currentBrew.text.normalize('NFC')))), + hash : await md5(lastSavedBrew.current.text.normalize('NFC')), + textBin : undefined, + version : lastSavedBrew.current.version + }; + let savedBrew = await save(brewToSave, saveToGoogle) .catch((err)=>{setError(err);}); if(savedBrew) { From f88f865130f008fb717862353f82d3bb71ee6a2f Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 16:14:33 +0000 Subject: [PATCH 2/3] Remove unused imports --- client/homebrew/pages/editPage/editPage.jsx | 4 +--- client/homebrew/pages/homePage/homePage.jsx | 2 +- client/homebrew/pages/newPage/newPage.jsx | 2 +- client/homebrew/utils/commonEditPageFunctions.jsx | 4 +++- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d894627b7..d3ffbbb34 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -1,7 +1,7 @@ import './editPage.less'; // Common imports -import React, { useState, useEffect, useRef, useEffectEvent } from 'react'; +import React, { useState } from 'react'; import request from '../../utils/request-middleware.js'; import _ from 'lodash'; @@ -13,9 +13,7 @@ import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx' import Nav from '@navbar/nav.jsx'; // Page specific imports -import { md5 } from 'hash-wasm'; import { gzipSync, strToU8 } from 'fflate'; -import { makePatches, stringifyPatches } from '@sanity/diff-match-patch'; import { updateHistory, versionHistoryGarbageCollection } from '../../utils/versionHistory.js'; import googleDriveIcon from '../../googleDrive.svg'; diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 02e9fbd1e..85552bfd3 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -1,7 +1,7 @@ import './homePage.less'; // Common imports -import React, { useState, useEffect, useRef, useEffectEvent } from 'react'; +import React, { useState } from 'react'; import request from '../../utils/request-middleware.js'; import _ from 'lodash'; diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index d8e719eef..ba272507e 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -1,7 +1,7 @@ import './newPage.less'; // Common imports -import React, { useState, useEffect, useRef, useEffectEvent } from 'react'; +import React, { useState } from 'react'; import request from '../../utils/request-middleware.js'; import _ from 'lodash'; diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index f69d85317..f379b9c2b 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -2,6 +2,8 @@ import React, { useState, useEffect, useEffectEvent, useRef } from 'react'; import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; import _ from 'lodash'; import { hbfm } from 'marked-hbfm'; +import { md5 } from 'hash-wasm'; +import { makePatches, stringifyPatches } from '@sanity/diff-match-patch'; import Headtags from '@vitreum/headtags.js'; import SplitPane from '@components/splitPane/splitPane.jsx'; @@ -214,7 +216,7 @@ export default function useCommonEditPageFunctions(dependencies) { version : lastSavedBrew.current.version }; - let savedBrew = await save(brewToSave, saveToGoogle) + const savedBrew = await save(brewToSave, saveToGoogle) .catch((err)=>{setError(err);}); if(savedBrew) { lastSavedBrew.current = { From 029e5db6a8dea100620cb80f4f397cf103e59f85 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 16:33:47 +0000 Subject: [PATCH 3/3] Need to snapshot brew before save without hash/patch metadata --- client/homebrew/utils/commonEditPageFunctions.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index f379b9c2b..48048c619 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -206,6 +206,7 @@ export default function useCommonEditPageFunctions(dependencies) { setHTMLErrors(hbfm.validate(currentBrew.text)); //Prepare content to send to server + const snapshotBrewBeforeSave = currentBrew; const brewToSave = { ...currentBrew, text : currentBrew.text.normalize('NFC'), @@ -220,7 +221,7 @@ export default function useCommonEditPageFunctions(dependencies) { .catch((err)=>{setError(err);}); if(savedBrew) { lastSavedBrew.current = { - ...brewToSave, + ...snapshotBrewBeforeSave, ...savedBrew };