From 82efff8ce52952d2d37fae2a3ad70e4386daebc6 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 9 Sep 2026 20:10:17 -0400 Subject: [PATCH 1/3] Move setup effects to common functions --- client/homebrew/pages/editPage/editPage.jsx | 30 ------------------- client/homebrew/pages/homePage/homePage.jsx | 30 ------------------- client/homebrew/pages/newPage/newPage.jsx | 30 ------------------- .../homebrew/utils/commonEditPageFunctions.js | 29 ++++++++++++++++++ 4 files changed, 29 insertions(+), 90 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 5f369e7c5..f88b3877f 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -100,36 +100,6 @@ const EditPage = (props)=>{ hbfm }); - useEffect(()=>{ - const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); - - setAutoSaveEnabled(autoSavePref); - setWarnUnsavedChanges(!autoSavePref); - setHTMLErrors(hbfm.validate(currentBrew.text)); - fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); - - const handleControlKeys = (e)=>{ - if(!(e.ctrlKey || e.metaKey)) return; - if(e.keyCode === 83) trySaveRef.current(true, true, saveGoogle); - if(e.keyCode === 80) printCurrentBrew(); - if([83, 80].includes(e.keyCode)) { - e.stopPropagation(); - e.preventDefault(); - } - }; - - document.addEventListener('keydown', handleControlKeys); - window.onbeforeunload = ()=>{ - if(unsavedChangesRef.current) - return 'You have unsaved changes!'; - }; - - return ()=>{ - document.removeEventListener('keydown', handleControlKeys); - window.onbeforeunload = null; - }; - }, []); - useEffect(()=>{ trySaveRef.current = trySave; unsavedChangesRef.current = unsavedChanges; diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 2e4137049..b15787d48 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -86,36 +86,6 @@ const HomePage =(props)=>{ hbfm }); - useEffect(()=>{ - const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); - - setAutoSaveEnabled(autoSavePref); - setWarnUnsavedChanges(!autoSavePref); - setHTMLErrors(hbfm.validate(currentBrew.text)); - fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); - - const handleControlKeys = (e)=>{ - if(!(e.ctrlKey || e.metaKey)) return; - if(e.keyCode === 83) trySaveRef.current(true); - if(e.keyCode === 80) printCurrentBrew(); - if([83, 80].includes(e.keyCode)) { - e.stopPropagation(); - e.preventDefault(); - } - }; - - document.addEventListener('keydown', handleControlKeys); - window.onbeforeunload = ()=>{ - if(unsavedChangesRef.current) - return 'You have unsaved changes!'; - }; - - return ()=>{ - document.removeEventListener('keydown', handleControlKeys); - window.onbeforeunload = null; - }; - }, []); - useEffect(()=>{ unsavedChangesRef.current = unsavedChanges; }, [unsavedChanges]); diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index f0c9ac323..2b3c9e4d3 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -91,36 +91,6 @@ const NewPage = (props)=>{ hbfm }); - useEffect(()=>{ - const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); - - setAutoSaveEnabled(autoSavePref); - setWarnUnsavedChanges(!autoSavePref); - setHTMLErrors(hbfm.validate(currentBrew.text)); - fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); - - const handleControlKeys = (e)=>{ - if(!(e.ctrlKey || e.metaKey)) return; - if(e.keyCode === 83) trySaveRef.current(true); - if(e.keyCode === 80) printCurrentBrew(); - if([83, 80].includes(e.keyCode)) { - e.stopPropagation(); - e.preventDefault(); - } - }; - - document.addEventListener('keydown', handleControlKeys); - window.onbeforeunload = ()=>{ - if(unsavedChangesRef.current) - return 'You have unsaved changes!'; - }; - - return ()=>{ - document.removeEventListener('keydown', handleControlKeys); - window.onbeforeunload = null; - }; - }, []); - const loadBrew = ()=>{ const brew = { ...currentBrew }; if(!brew.shareId && typeof window !== 'undefined') { //Load from localStorage if in client browser diff --git a/client/homebrew/utils/commonEditPageFunctions.js b/client/homebrew/utils/commonEditPageFunctions.js index bf397e334..4536cc1c5 100644 --- a/client/homebrew/utils/commonEditPageFunctions.js +++ b/client/homebrew/utils/commonEditPageFunctions.js @@ -14,6 +14,35 @@ export default function useCommonEditPageFunctions(dependencies) { hbfm } = dependencies; + //==--------- Page setup ----------==// + useEffect(()=>{ + const autoSavePref = JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); + setAutoSaveEnabled(autoSavePref); + setWarnUnsavedChanges(!autoSavePref); + setHTMLErrors(hbfm.validate(currentBrew.text)); + fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); + + const handleControlKeys = (e)=>{ + if(!(e.ctrlKey || e.metaKey)) return; + if(e.keyCode === 83) trySaveRef.current(true, true, saveGoogle); + if(e.keyCode === 80) printCurrentBrew(); + if([83, 80].includes(e.keyCode)) { + e.stopPropagation(); + e.preventDefault(); + } + }; + + document.addEventListener('keydown', handleControlKeys); + window.onbeforeunload = ()=>{ + if(unsavedChangesRef.current) + return 'You have unsaved changes!'; + }; + return ()=>{ + document.removeEventListener('keydown', handleControlKeys); + window.onBeforeUnload = null; + }; + }, []); + const handleBrewChange = (field)=>(value, subfield)=>{ //'text', 'style', 'snippets', 'metadata' if(subfield == 'renderer' || subfield == 'theme') fetchThemeBundle(setError, setThemeBundle, value.renderer, value.theme); From e6bf0e28c5bcf8288aaab348272a35162949c12a Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 11 Sep 2026 22:28:19 -0400 Subject: [PATCH 2/3] Pass in the remaining missing dependencies --- client/homebrew/pages/editPage/editPage.jsx | 13 +++++++++---- client/homebrew/pages/homePage/homePage.jsx | 13 +++++++++---- client/homebrew/pages/newPage/newPage.jsx | 11 ++++++++--- .../homebrew/utils/commonEditPageFunctions.js | 19 ++++++++++++++++--- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index f8c99f531..088f13765 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -8,7 +8,6 @@ import { hbfm } from 'hbmarkedwrapper'; import _ from 'lodash'; import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js'; -import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.js' @@ -43,7 +42,6 @@ const SAVE_TIMEOUT = 10000; const UNSAVED_WARNING_TIMEOUT = 900000; //Warn user afer 15 minutes of unsaved changes const UNSAVED_WARNING_POPUP_TIMEOUT = 4000; //Show the warning for 4 seconds -const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const BREWKEY = 'HB_newPage_content'; const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; @@ -90,14 +88,21 @@ const EditPage = (props)=>{ setThemeBundle, HTMLErrors, setHTMLErrors, + currentBrew, setCurrentBrew, useLocalStorage, BREWKEY, STYLEKEY, SNIPKEY, METAKEY, - fetchThemeBundle, - hbfm + hbfm, + autoSaveEnabled, + setAutoSaveEnabled, + setWarnUnsavedChanges, + trySaveRef, + unsavedChangesRef, + sandbox, + saveGoogle }); useEffect(()=>{ diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index b15787d48..29e5b70e2 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -8,7 +8,6 @@ import { hbfm } from 'hbmarkedwrapper'; import _ from 'lodash'; import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; -import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.js' @@ -36,7 +35,6 @@ const SAVE_TIMEOUT = 10000; const UNSAVED_WARNING_TIMEOUT = 900000; //Warn user afer 15 minutes of unsaved changes const UNSAVED_WARNING_POPUP_TIMEOUT = 4000; //Show the warning for 4 seconds -const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const BREWKEY = 'HB_newPage_content'; const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; @@ -67,6 +65,7 @@ const HomePage =(props)=>{ const editorRef = useRef(null); const lastSavedBrew = useRef(_.cloneDeep(props.brew)); const warnUnsavedTimeout = useRef(null); + const trySaveRef = useRef(null); // CTRL+S listener lives outside React and needs ref to use trySave with latest copy of brew const unsavedChangesRef = useRef(unsavedChanges); const { @@ -76,14 +75,20 @@ const HomePage =(props)=>{ setThemeBundle, HTMLErrors, setHTMLErrors, + currentBrew, setCurrentBrew, useLocalStorage, BREWKEY, STYLEKEY, SNIPKEY, METAKEY, - fetchThemeBundle, - hbfm + hbfm, + autoSaveEnabled, + setAutoSaveEnabled, + setWarnUnsavedChanges, + trySaveRef, + unsavedChangesRef, + sandbox }); useEffect(()=>{ diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index e4f30e7d5..3208af496 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -32,7 +32,6 @@ const SAVE_TIMEOUT = 10000; const UNSAVED_WARNING_TIMEOUT = 900000; //Warn user afer 15 minutes of unsaved changes const UNSAVED_WARNING_POPUP_TIMEOUT = 4000; //Show the warning for 4 seconds -const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const BREWKEY = 'HB_newPage_content'; const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; @@ -81,14 +80,20 @@ const NewPage = (props)=>{ setThemeBundle, HTMLErrors, setHTMLErrors, + currentBrew, setCurrentBrew, useLocalStorage, BREWKEY, STYLEKEY, SNIPKEY, METAKEY, - fetchThemeBundle, - hbfm + hbfm, + autoSaveEnabled, + setAutoSaveEnabled, + setWarnUnsavedChanges, + trySaveRef, + unsavedChangesRef, + sandbox }); const loadBrew = ()=>{ diff --git a/client/homebrew/utils/commonEditPageFunctions.js b/client/homebrew/utils/commonEditPageFunctions.js index 4536cc1c5..10327bf2a 100644 --- a/client/homebrew/utils/commonEditPageFunctions.js +++ b/client/homebrew/utils/commonEditPageFunctions.js @@ -1,23 +1,36 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; + +const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; + export default function useCommonEditPageFunctions(dependencies) { const { setError, setThemeBundle, HTMLErrors, setHTMLErrors, + currentBrew, setCurrentBrew, useLocalStorage, BREWKEY, STYLEKEY, SNIPKEY, METAKEY, - fetchThemeBundle, - hbfm + hbfm, + autoSaveEnabled, + setAutoSaveEnabled, + setWarnUnsavedChanges, + trySaveRef, + sandbox, + saveGoogle = false, + unsavedChangesRef } = dependencies; //==--------- Page setup ----------==// useEffect(()=>{ - const autoSavePref = JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); + const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); setAutoSaveEnabled(autoSavePref); + console.log(autoSavePref) setWarnUnsavedChanges(!autoSavePref); setHTMLErrors(hbfm.validate(currentBrew.text)); fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); From bfb119e62dfabd1a4d177536bb245160a592546d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 11 Sep 2026 22:37:46 -0400 Subject: [PATCH 3/3] Spaces to tabs --- .../homebrew/utils/commonEditPageFunctions.js | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/client/homebrew/utils/commonEditPageFunctions.js b/client/homebrew/utils/commonEditPageFunctions.js index 10327bf2a..8f41ce421 100644 --- a/client/homebrew/utils/commonEditPageFunctions.js +++ b/client/homebrew/utils/commonEditPageFunctions.js @@ -4,33 +4,33 @@ import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; export default function useCommonEditPageFunctions(dependencies) { - const { - setError, - setThemeBundle, - HTMLErrors, - setHTMLErrors, - currentBrew, - setCurrentBrew, - useLocalStorage, - BREWKEY, - STYLEKEY, - SNIPKEY, - METAKEY, - hbfm, - autoSaveEnabled, - setAutoSaveEnabled, - setWarnUnsavedChanges, - trySaveRef, - sandbox, - saveGoogle = false, - unsavedChangesRef - } = dependencies; + const { + setError, + setThemeBundle, + HTMLErrors, + setHTMLErrors, + currentBrew, + setCurrentBrew, + useLocalStorage, + BREWKEY, + STYLEKEY, + SNIPKEY, + METAKEY, + hbfm, + autoSaveEnabled, + setAutoSaveEnabled, + setWarnUnsavedChanges, + trySaveRef, + sandbox, + saveGoogle = false, + unsavedChangesRef + } = dependencies; - //==--------- Page setup ----------==// - useEffect(()=>{ + //==--------- Page setup ----------==// + useEffect(()=>{ const autoSavePref = !sandbox && JSON.parse(localStorage.getItem(AUTOSAVE_KEY) ?? true); setAutoSaveEnabled(autoSavePref); - console.log(autoSavePref) + console.log(autoSavePref) setWarnUnsavedChanges(!autoSavePref); setHTMLErrors(hbfm.validate(currentBrew.text)); fetchThemeBundle(setError, setThemeBundle, currentBrew.renderer, currentBrew.theme); @@ -56,30 +56,30 @@ export default function useCommonEditPageFunctions(dependencies) { }; }, []); - const handleBrewChange = (field)=>(value, subfield)=>{ //'text', 'style', 'snippets', 'metadata' - if(subfield == 'renderer' || subfield == 'theme') - fetchThemeBundle(setError, setThemeBundle, value.renderer, value.theme); + const handleBrewChange = (field)=>(value, subfield)=>{ //'text', 'style', 'snippets', 'metadata' + if(subfield == 'renderer' || subfield == 'theme') + fetchThemeBundle(setError, setThemeBundle, value.renderer, value.theme); - //If there are HTML errors, run the validator on every change to give quick feedback - if(HTMLErrors.length && (field == 'text' || field == 'snippets')) - setHTMLErrors(hbfm.validate(value)); + //If there are HTML errors, run the validator on every change to give quick feedback + if(HTMLErrors.length && (field == 'text' || field == 'snippets')) + setHTMLErrors(hbfm.validate(value)); - if(field == 'metadata') setCurrentBrew((prev)=>({ ...prev, ...value })); - else setCurrentBrew((prev)=>({ ...prev, [field]: value })); + if(field == 'metadata') setCurrentBrew((prev)=>({ ...prev, ...value })); + else setCurrentBrew((prev)=>({ ...prev, [field]: value })); - if(useLocalStorage) { - if(field == 'text') localStorage.setItem(BREWKEY, value); - if(field == 'style') localStorage.setItem(STYLEKEY, value); - if(field == 'snippets') localStorage.setItem(SNIPKEY, value); - if(field == 'metadata') localStorage.setItem(METAKEY, JSON.stringify({ - renderer : value.renderer, - theme : value.theme, - lang : value.lang - })); - } - }; + if(useLocalStorage) { + if(field == 'text') localStorage.setItem(BREWKEY, value); + if(field == 'style') localStorage.setItem(STYLEKEY, value); + if(field == 'snippets') localStorage.setItem(SNIPKEY, value); + if(field == 'metadata') localStorage.setItem(METAKEY, JSON.stringify({ + renderer : value.renderer, + theme : value.theme, + lang : value.lang + })); + } + }; - return { - handleBrewChange - } + return { + handleBrewChange + } } \ No newline at end of file