From ea4f9f5451a482f0e2c38312bb5a5fcc9ff1d489 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 03:23:13 +0000 Subject: [PATCH 01/11] Bump mongoose Bumps the prod-dependencies group with 1 update in the / directory: [mongoose](https://github.com/Automattic/mongoose). Updates `mongoose` from 9.10.2 to 9.10.4 - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/9.10.2...9.10.4) --- updated-dependencies: - dependency-name: mongoose dependency-version: 9.10.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-dependencies ... Signed-off-by: dependabot[bot] --- package-lock.json | 33 ++++----------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index be79fc6b9..5f1f63af2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "marked-hbfm": "^1.0.1", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.31.0", - "mongoose": "^9.10.2", + "mongoose": "^9.10.4", "nanoid": "6.0.1", "nconf": "^0.13.0", "node": "^26.10.0", @@ -11858,9 +11858,9 @@ } }, "node_modules/mongoose": { - "version": "9.10.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.10.2.tgz", - "integrity": "sha512-oFcFL3dsX5tDzMwBD+GGoDqKIj6RNG3bu3oqlvcUIgPulHP14/6N7c07j3s0XgbrlT7U/lbiXOD89hmPtEXnfQ==", + "version": "9.10.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.10.4.tgz", + "integrity": "sha512-p1hx2MSD4B+4shFTpRcd/uTwD6DtZeDJ+YxM9ja8/VBDH7vqqLynwGLA6rWa/tD7voOBoGqQR1wM3+/LcUoEfA==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", @@ -11879,31 +11879,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mongoose/node_modules/google-logging-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.2.0.tgz", - "integrity": "sha512-WE9av4wKDZgRjBwgVUabocx8T6/7o3Ca1Fat46FXDhXVAFibzNadedcOXrdgd1Kzmk8tsk/9ZH89Wyf/SqeZ3A==", - "extraneous": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.6.0.tgz", diff --git a/package.json b/package.json index 726664122..9dfd27b94 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "marked-hbfm": "^1.0.1", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.31.0", - "mongoose": "^9.10.2", + "mongoose": "^9.10.4", "nanoid": "6.0.1", "nconf": "^0.13.0", "node": "^26.10.0", From 17688937c17956070f805fc37cea4e2eaade8384 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 03:23:28 +0000 Subject: [PATCH 02/11] Bump the dev-dependencies group across 1 directory with 4 updates Bumps the dev-dependencies group with 4 updates in the / directory: [@stylistic/stylelint-plugin](https://github.com/stylelint-stylistic/stylelint-stylistic), [stylelint](https://github.com/stylelint/stylelint), [supertest](https://github.com/ladjs/supertest) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `@stylistic/stylelint-plugin` from 5.3.0 to 5.3.1 - [Release notes](https://github.com/stylelint-stylistic/stylelint-stylistic/releases) - [Changelog](https://github.com/stylelint-stylistic/stylelint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint-stylistic/stylelint-stylistic/compare/v5.3.0...v5.3.1) Updates `stylelint` from 17.15.0 to 17.16.0 - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/17.15.0...17.16.0) Updates `supertest` from 7.3.0 to 7.3.1 - [Release notes](https://github.com/ladjs/supertest/releases) - [Commits](https://github.com/ladjs/supertest/compare/v7.3.0...v7.3.1) Updates `vite` from 8.3.1 to 8.3.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.3.2/packages/vite) --- updated-dependencies: - dependency-name: "@stylistic/stylelint-plugin" dependency-version: 5.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: stylelint dependency-version: 17.16.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: supertest dependency-version: 7.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: vite dependency-version: 8.3.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] --- package-lock.json | 59 ++++++++++++++--------------------------------- package.json | 8 +++---- 2 files changed, 21 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index be79fc6b9..91130c75e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "superagent": "^10.4.1" }, "devDependencies": { - "@stylistic/stylelint-plugin": "^5.3.0", + "@stylistic/stylelint-plugin": "^5.3.1", "babel-jest": "^30.5.2", "babel-plugin-transform-import-meta": "^3.0.0", "eslint": "9.7", @@ -77,11 +77,11 @@ "jsdom": "^30.1.1", "jsdom-global": "^3.0.2", "postcss-less": "^6.0.0", - "stylelint": "^17.15.0", + "stylelint": "^17.16.0", "stylelint-config-recess-order": "^7.7.0", "stylelint-config-recommended": "^18.0.0", - "supertest": "^7.3.0", - "vite": "^8.3.1" + "supertest": "^7.3.1", + "vite": "^8.3.2" }, "engines": { "node": ">=26.4.0", @@ -4339,9 +4339,9 @@ "license": "MIT" }, "node_modules/@stylistic/stylelint-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-5.3.0.tgz", - "integrity": "sha512-xbyxPeaO9Vns6A8/0MQV6PzZ5nNZCoGV4q1ERaNd5EBAKlWt+YcpaPapNYNUkZaiQg98+xPbikdA58ehquJG3g==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-5.3.1.tgz", + "integrity": "sha512-w6WFLYzQS6nhbcoq8pwYP+OJYYhsdGEiCxY+eINi2+ouDwRLXTucXZj6IrDzkY4di+vsGOPVvJ4/gXChSeOtlw==", "dev": true, "license": "MIT", "dependencies": { @@ -11879,31 +11879,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mongoose/node_modules/google-logging-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.2.0.tgz", - "integrity": "sha512-WE9av4wKDZgRjBwgVUabocx8T6/7o3Ca1Fat46FXDhXVAFibzNadedcOXrdgd1Kzmk8tsk/9ZH89Wyf/SqeZ3A==", - "extraneous": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.6.0.tgz", @@ -14103,9 +14078,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "17.15.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.15.0.tgz", - "integrity": "sha512-mWIkesYQvQjf4Kvdeu9ns0IL8/K/wtjaGxPqsPd6DlLZvaQxGysJsocxUDrBcyHQ5VleAk4uSMat4yMrVED7PA==", + "version": "17.16.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.16.0.tgz", + "integrity": "sha512-ejlWnbJ13x1GU32+zZXa6sYQJsKKkwSdv2B4rAdO3OWdEmvhSJKcXi5pOphQYSzyaj1kXpuGJr7pcMBNfDIuPw==", "dev": true, "funding": [ { @@ -14305,9 +14280,9 @@ } }, "node_modules/supertest": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.3.0.tgz", - "integrity": "sha512-UwwmWq3xLhyU96c521wYNaBg7IqX78Wpj4FKs6Katp6vdklX42zU5ESvX3KeZRLFyO44RwFp4yvxYMNZzCcX9g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.3.1.tgz", + "integrity": "sha512-vNaNCFoCR/edDbErQZp5KLNT8R4dSPHX7rlDLoE8hWLAm/878j6ShMbe8HK/E6RwwuhlSXVelXAIg9AxR5WWPw==", "dev": true, "license": "MIT", "dependencies": { @@ -15104,15 +15079,15 @@ } }, "node_modules/vite": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", - "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.2.tgz", + "integrity": "sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", - "rolldown": "~1.2.9", + "rolldown": "~1.2.11", "tinyglobby": "^0.2.17" }, "bin": { diff --git a/package.json b/package.json index 726664122..b8cf908a1 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,7 @@ "superagent": "^10.4.1" }, "devDependencies": { - "@stylistic/stylelint-plugin": "^5.3.0", + "@stylistic/stylelint-plugin": "^5.3.1", "babel-jest": "^30.5.2", "babel-plugin-transform-import-meta": "^3.0.0", "eslint": "9.7", @@ -154,10 +154,10 @@ "jsdom": "^30.1.1", "jsdom-global": "^3.0.2", "postcss-less": "^6.0.0", - "stylelint": "^17.15.0", + "stylelint": "^17.16.0", "stylelint-config-recess-order": "^7.7.0", "stylelint-config-recommended": "^18.0.0", - "supertest": "^7.3.0", - "vite": "^8.3.1" + "supertest": "^7.3.1", + "vite": "^8.3.2" } } From b0edeb61d4c282a22dfed367b64eccec521c004e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2026 03:23:12 +0000 Subject: [PATCH 03/11] Bump @googleapis/drive Bumps the prod-dependencies group with 1 update: [@googleapis/drive](https://github.com/googleapis/google-api-nodejs-client). Updates `@googleapis/drive` from 26.0.1 to 26.0.2 - [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases) - [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/v26.0.1...drive-v26.0.2) --- updated-dependencies: - dependency-name: "@googleapis/drive" dependency-version: 26.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-dependencies ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd29703b6..f32eb977b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@codemirror/search": "^6.6.0", "@codemirror/state": "^6.7.6", "@codemirror/view": "^6.43.13", - "@googleapis/drive": "^26.0.1", + "@googleapis/drive": "^26.0.2", "@lezer/highlight": "^1.2.4", "@oddbird/css-anchor-positioning": "^0.10.2", "@sanity/diff-match-patch": "^3.2.1", @@ -2516,9 +2516,9 @@ "license": "MIT" }, "node_modules/@googleapis/drive": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-26.0.1.tgz", - "integrity": "sha512-q1U+WNS2OPAS3Prn3FD0otYNudnv+feXX9DP8qrDqGGwIVU90OBnP6NV66aTc0qJrqeJvnrCYcnjddjm4h23iQ==", + "version": "26.0.2", + "resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-26.0.2.tgz", + "integrity": "sha512-VeKVZvzgH4ioczJZrZ5sy73RJbHrYLI1XZIZ3ZqGKQhC4U03XsOOOiBHKqvH4F9vbXrxR2LawmktoIJuTJhzYg==", "license": "Apache-2.0", "dependencies": { "googleapis-common": "^9.0.0" diff --git a/package.json b/package.json index d6b99c4a7..55a0dc29c 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "@codemirror/search": "^6.6.0", "@codemirror/state": "^6.7.6", "@codemirror/view": "^6.43.13", - "@googleapis/drive": "^26.0.1", + "@googleapis/drive": "^26.0.2", "@lezer/highlight": "^1.2.4", "@oddbird/css-anchor-positioning": "^0.10.2", "@sanity/diff-match-patch": "^3.2.1", From 6d7ce28d48e4518cfd3f9a01915456e88d5b56e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2026 14:52:33 +0000 Subject: [PATCH 04/11] Bump source-map-js from 1.2.1 to 1.2.2 Bumps [source-map-js](https://github.com/7rulnik/source-map-js) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/7rulnik/source-map-js/releases) - [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md) - [Commits](https://github.com/7rulnik/source-map-js/compare/v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: source-map-js dependency-version: 1.2.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f32eb977b..57553c211 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13740,9 +13740,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" From 2dc088cd803e5a4454c8b9fb0d6d05930e213e58 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 16:07:15 +0000 Subject: [PATCH 05/11] 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 06/11] 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 07/11] 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 }; From 0281e4e309609fcb17b55bd31911e01456d5851d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 17:58:04 +0000 Subject: [PATCH 08/11] Move googleDrive button into common hook --- client/homebrew/pages/editPage/editPage.jsx | 87 ------------------ client/homebrew/pages/homePage/homePage.jsx | 5 +- client/homebrew/pages/newPage/newPage.jsx | 5 +- .../utils/commonEditPageFunctions.jsx | 88 ++++++++++++++++++- 4 files changed, 86 insertions(+), 99 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d3ffbbb34..e71c610c2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -10,13 +10,9 @@ import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefau import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; -import Nav from '@navbar/nav.jsx'; - // Page specific imports import { gzipSync, strToU8 } from 'fflate'; - import { updateHistory, versionHistoryGarbageCollection } from '../../utils/versionHistory.js'; -import googleDriveIcon from '../../googleDrive.svg'; const useLocalStorage = false; const sandbox = false; @@ -31,42 +27,7 @@ const EditPage = (props)=>{ }; const [currentBrew, setCurrentBrew] = useState(props.brew); - const [saveGoogle, setSaveGoogle] = useState(!!props.brew.googleId); const [error, setError] = useState(null); - const [alertTrashedGoogleBrew, setAlertTrashedGoogleBrew] = useState(props.brew.trashed); - const [alertNoGoogleToTransfer, setAlertNoGoogleToTransfer] = useState(false); - const [alertOwnershipToTransfer, setAlertOwnershipToTransfer] = useState(false); - const [confirmGoogleTransfer, setConfirmGoogleTransfer] = useState(false); - - const handleGoogleClick = ()=>{ - if(currentBrew.authors.length > 0 && global.account?.username !== currentBrew.authors[0]) { - setAlertOwnershipToTransfer(true); - return; - } - if(!global.account?.googleId) { - setAlertNoGoogleToTransfer(true); - return; - } - - setConfirmGoogleTransfer((prev)=>!prev); - setError(null); - }; - - const closeAlerts = (e)=>{ - e.stopPropagation(); //Only handle click once so alert doesn't reopen - setAlertTrashedGoogleBrew(false); - setAlertNoGoogleToTransfer(false); - setConfirmGoogleTransfer(false); - setAlertOwnershipToTransfer(false); - }; - - const toggleGoogleStorage = (e)=>{ - closeAlerts(e); - const newSaveGoogle = !saveGoogle; - setSaveGoogle((prev)=>!prev); - setError(null); - trySave(true, true, newSaveGoogle); - }; const save = async (brew, saveToGoogle)=>{ await updateHistory(brew).catch(console.error); @@ -101,56 +62,9 @@ const EditPage = (props)=>{ history.replaceState(null, null, `/edit/${savedBrew.editId}`);; }; - const renderGoogleDriveIcon = ()=>( - - Google Drive icon - - {alertOwnershipToTransfer && ( -
- You must be the Owner to transfer between the Homebrewery and Google Drive! - The owner of this file is {currentBrew.authors[0]}. -

-
Okay
-
- )} - - {alertNoGoogleToTransfer && ( -
- You must be signed in to a Google account to transfer between the Homebrewery and Google Drive! - -
Sign In
-
-
Not Now
-
- )} - - {alertTrashedGoogleBrew && ( -
- This brew is currently in your Trash folder on Google Drive!
- If you want to keep it, make sure to move it before it is deleted permanently!
-
Save my brew
-
- )} - - {confirmGoogleTransfer && ( -
- {saveGoogle - ? 'Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?' - : 'Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?'} -
-
Yes
-
No
-
- )} -
- ); - const { renderPanels, - trySave, } = useCommonEditPageFunctions({ - saveGoogle, - setSaveGoogle, error, setError, currentBrew, @@ -162,7 +76,6 @@ const EditPage = (props)=>{ onSaveSuccess, pageName, showEditorButtons, - renderGoogleDriveIcon, userThemes : props.userThemes }); diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 85552bfd3..94f824fd5 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -23,12 +23,11 @@ const HomePage =(props)=>{ }; const [currentBrew, setCurrentBrew] = useState(props.brew); - const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(undefined); const save = async (brew, saveToGoogle)=>{ const res = await request - .post(`/api${saveGoogle ? '?saveToGoogle=true' : ''}`) + .post(`/api${saveToGoogle ? '?saveToGoogle=true' : ''}`) .send(brew) .catch((err)=>{ console.error('Error Updating Local Brew'); @@ -47,8 +46,6 @@ const HomePage =(props)=>{ const { renderPanels } = useCommonEditPageFunctions({ - saveGoogle, - setSaveGoogle, error, setError, currentBrew, diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index ba272507e..238ac3965 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -23,12 +23,11 @@ const NewPage = (props)=>{ }; const [currentBrew, setCurrentBrew] = useState(props.brew); - const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(null); const save = async (brew, saveToGoogle)=>{ const res = await request - .post(`/api${saveGoogle ? '?saveToGoogle=true' : ''}`) + .post(`/api${saveToGoogle ? '?saveToGoogle=true' : ''}`) .send(brew) .catch((err)=>{ console.error('Error Updating Local Brew'); @@ -47,8 +46,6 @@ const NewPage = (props)=>{ const { renderPanels } = useCommonEditPageFunctions({ - saveGoogle, - setSaveGoogle, error, setError, currentBrew, diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index 48048c619..1a37a2a23 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -24,6 +24,7 @@ import PrintNavItem from '@navbar/print.navitem.jsx'; import ShareNavItem from '@navbar/share.navitem.jsx'; import RecentNavItems from '@navbar/recent.navitem.jsx'; const { both: RecentNavItem } = RecentNavItems; +import googleDriveIcon from '../../googleDrive.svg'; const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const BREWKEY = 'HB_newPage_content'; @@ -38,8 +39,6 @@ const UNSAVED_WARNING_POPUP_TIMEOUT = 4000; //Show the warning for 4 seconds export default function useCommonEditPageFunctions(dependencies) { const { - saveGoogle, - setSaveGoogle, error, setError, currentBrew, @@ -50,7 +49,6 @@ export default function useCommonEditPageFunctions(dependencies) { save, onSaveSuccess, pageName, - renderGoogleDriveIcon = ()=>{}, showEditorButtons, userThemes = {} } = dependencies; @@ -62,6 +60,12 @@ export default function useCommonEditPageFunctions(dependencies) { const [unsavedChanges, setUnsavedChanges] = useState(false); const [themeBundle, setThemeBundle] = useState({}); const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(currentBrew.text)); + const [saveGoogle, setSaveGoogle] = useState(currentBrew.googleId); + + const [alertTrashedGoogleBrew, setAlertTrashedGoogleBrew] = useState(currentBrew.trashed); + const [alertNoGoogleToTransfer, setAlertNoGoogleToTransfer] = useState(false); + const [alertOwnershipToTransfer, setAlertOwnershipToTransfer] = useState(false); + const [confirmGoogleTransfer, setConfirmGoogleTransfer] = useState(false); const [currentEditorViewPageNum, setCurrentEditorViewPageNum] = useState(1); const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); @@ -276,13 +280,89 @@ export default function useCommonEditPageFunctions(dependencies) { snippets : newData.snippets })); + //======----- Google Toggle Button -----====== + const closeAlerts = (e)=>{ + e.stopPropagation(); //Only handle click once so alert doesn't reopen + setAlertTrashedGoogleBrew(false); + setAlertNoGoogleToTransfer(false); + setConfirmGoogleTransfer(false); + setAlertOwnershipToTransfer(false); + }; + + const handleGoogleClick = ()=>{ + if(currentBrew.authors.length > 0 && global.account?.username !== currentBrew.authors[0]) { + setAlertOwnershipToTransfer(true); + return; + } + if(!global.account?.googleId) { + setAlertNoGoogleToTransfer(true); + return; + } + + setConfirmGoogleTransfer((prev)=>!prev); + setError(null); + }; + + const toggleGoogleStorage = (e)=>{ + closeAlerts(e); + const newSaveGoogle = !saveGoogle; + setSaveGoogle((prev)=>!prev); + setError(null); + trySave(true, true, newSaveGoogle); + }; + + const renderGoogleDriveIcon = ()=>( + + Google Drive icon + + {alertOwnershipToTransfer && ( +
+ You must be the Owner to transfer between the Homebrewery and Google Drive! + The owner of this file is {currentBrew.authors[0]}. +

+
Okay
+
+ )} + + {alertNoGoogleToTransfer && ( +
+ You must be signed in to a Google account to transfer between the Homebrewery and Google Drive! + +
Sign In
+
+
Not Now
+
+ )} + + {alertTrashedGoogleBrew && ( +
+ This brew is currently in your Trash folder on Google Drive!
+ If you want to keep it, make sure to move it before it is deleted permanently!
+
Save my brew
+
+ )} + + {confirmGoogleTransfer && ( +
+ {saveGoogle + ? 'Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?' + : 'Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?'} +
+
Yes
+
No
+
+ )} +
+ ); + + //======----- Navbar -----====== const renderNavbar = ()=>( {currentBrew.title} - {renderGoogleDriveIcon()} + {(pageName = 'editPage') && renderGoogleDriveIcon()} {error ? : From 5dac4aa208ff3c3717e4f544754b4cbb21119539 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 18:01:09 +0000 Subject: [PATCH 09/11] Fix typo --- client/homebrew/utils/commonEditPageFunctions.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index 1a37a2a23..a84af2e18 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -362,12 +362,12 @@ export default function useCommonEditPageFunctions(dependencies) { {currentBrew.title} - {(pageName = 'editPage') && renderGoogleDriveIcon()} + {(pageName == 'editPage') && renderGoogleDriveIcon()} {error ? : {renderSaveButton()} - {pageName == 'editPage' && renderAutoSaveButton()} + {(pageName == 'editPage') && renderAutoSaveButton()} } From c282d5e5bc11389ae584063c032c3cab8b689161 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 18:59:53 +0000 Subject: [PATCH 10/11] Fix path to googleDrive.svg --- client/homebrew/utils/commonEditPageFunctions.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index a84af2e18..af9ac370d 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -24,7 +24,7 @@ import PrintNavItem from '@navbar/print.navitem.jsx'; import ShareNavItem from '@navbar/share.navitem.jsx'; import RecentNavItems from '@navbar/recent.navitem.jsx'; const { both: RecentNavItem } = RecentNavItems; -import googleDriveIcon from '../../googleDrive.svg'; +import googleDriveIcon from '../googleDrive.svg'; const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const BREWKEY = 'HB_newPage_content'; From 9fb7a79047cae819076b0fc3bff1ed529bcf3ae5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 7 Oct 2026 19:24:52 +0000 Subject: [PATCH 11/11] Move remaining state to common hook --- client/homebrew/pages/editPage/editPage.jsx | 44 +++++-------------- client/homebrew/pages/homePage/homePage.jsx | 44 +++++-------------- client/homebrew/pages/newPage/newPage.jsx | 44 +++++-------------- .../utils/commonEditPageFunctions.jsx | 16 ++++--- 4 files changed, 45 insertions(+), 103 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index e71c610c2..ab614b39d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -1,34 +1,22 @@ import './editPage.less'; // Common imports -import React, { useState } from 'react'; -import request from '../../utils/request-middleware.js'; - -import _ from 'lodash'; - -import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js'; - +import React from 'react'; +import request from '../../utils/request-middleware.js'; +import _ from 'lodash'; import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; +import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js'; // Page specific imports import { gzipSync, strToU8 } from 'fflate'; import { updateHistory, versionHistoryGarbageCollection } from '../../utils/versionHistory.js'; -const useLocalStorage = false; -const sandbox = false; -const showFloatingButtons = false; -const showEditorButtons = true; -const pageName = 'editPage'; - const EditPage = (props)=>{ props = { brew : DEFAULT_BREW_LOAD, ...props }; - const [currentBrew, setCurrentBrew] = useState(props.brew); - const [error, setError] = useState(null); - const save = async (brew, saveToGoogle)=>{ await updateHistory(brew).catch(console.error); await versionHistoryGarbageCollection().catch(console.error); @@ -41,12 +29,7 @@ const EditPage = (props)=>{ .put(`/api/update/${brew.editId}${params}`) .set('Content-Encoding', 'gzip') .set('Content-Type', 'application/json') - .send(compressedBrew) - .catch((err)=>{ - console.error('Error Updating Local Brew'); - setError(err); - }); - if(!res) return; + .send(compressedBrew); const updatedFields = { googleId : res.body.googleId ?? null, //TODO: investigate if we can set googleId:null in server/update instead of undefined @@ -65,18 +48,15 @@ const EditPage = (props)=>{ const { renderPanels, } = useCommonEditPageFunctions({ - error, - setError, - currentBrew, - setCurrentBrew, - useLocalStorage, - sandbox, - showFloatingButtons, + useLocalStorage : false, + sandbox : false, + showFloatingButtons : false, + showEditorButtons : true, + pageName : 'newPage', + brew : props.brew, + userThemes : props.userThemes, save, onSaveSuccess, - pageName, - showEditorButtons, - userThemes : props.userThemes }); return renderPanels(); diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 94f824fd5..014cc8e42 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -1,20 +1,11 @@ import './homePage.less'; // Common imports -import React, { useState } from 'react'; -import request from '../../utils/request-middleware.js'; -import _ from 'lodash'; - -import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; - +import React from 'react'; +import request from '../../utils/request-middleware.js'; +import _ from 'lodash'; import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; - -// Page specific imports -const useLocalStorage = false; -const sandbox = true; -const showFloatingButtons = true; -const showEditorButtons = false; -const pageName = 'homePage'; +import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; const HomePage =(props)=>{ props = { @@ -22,18 +13,10 @@ const HomePage =(props)=>{ ...props }; - const [currentBrew, setCurrentBrew] = useState(props.brew); - const [error, setError] = useState(undefined); - const save = async (brew, saveToGoogle)=>{ const res = await request .post(`/api${saveToGoogle ? '?saveToGoogle=true' : ''}`) - .send(brew) - .catch((err)=>{ - console.error('Error Updating Local Brew'); - setError(err); - }); - if(!res) return; + .send(brew); return res.body; }; @@ -46,18 +29,15 @@ const HomePage =(props)=>{ const { renderPanels } = useCommonEditPageFunctions({ - error, - setError, - currentBrew, - setCurrentBrew, - useLocalStorage, - sandbox, - showFloatingButtons, + useLocalStorage : false, + sandbox : true, + showFloatingButtons : true, + showEditorButtons : false, + pageName : 'homePage', + brew : props.brew, + userThemes : {}, save, onSaveSuccess, - pageName, - showEditorButtons, - userThemes : {} }); return renderPanels(); diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 238ac3965..9ce022d0d 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -1,20 +1,11 @@ import './newPage.less'; // Common imports -import React, { useState } from 'react'; -import request from '../../utils/request-middleware.js'; -import _ from 'lodash'; - -import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; - +import React from 'react'; +import request from '../../utils/request-middleware.js'; +import _ from 'lodash'; import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; - -// Page specific imports -const useLocalStorage = true; -const sandbox = true; -const showFloatingButtons = false; -const showEditorButtons = true; -const pageName = 'newPage'; +import { DEFAULT_BREW } from '../../../../server/brewDefaults.js'; const NewPage = (props)=>{ props = { @@ -22,18 +13,10 @@ const NewPage = (props)=>{ ...props }; - const [currentBrew, setCurrentBrew] = useState(props.brew); - const [error, setError] = useState(null); - const save = async (brew, saveToGoogle)=>{ const res = await request .post(`/api${saveToGoogle ? '?saveToGoogle=true' : ''}`) - .send(brew) - .catch((err)=>{ - console.error('Error Updating Local Brew'); - setError(err); - }); - if(!res) return; + .send(brew); return res.body; }; @@ -46,18 +29,15 @@ const NewPage = (props)=>{ const { renderPanels } = useCommonEditPageFunctions({ - error, - setError, - currentBrew, - setCurrentBrew, - useLocalStorage, - sandbox, - showFloatingButtons, + useLocalStorage : true, + sandbox : true, + showFloatingButtons : false, + showEditorButtons : true, + pageName : 'newPage', + brew : props.brew, + userThemes : props.userThemes, save, onSaveSuccess, - pageName, - showEditorButtons, - userThemes : props.userThemes }); return renderPanels(); diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index af9ac370d..b65ce34c1 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -39,10 +39,7 @@ const UNSAVED_WARNING_POPUP_TIMEOUT = 4000; //Show the warning for 4 seconds export default function useCommonEditPageFunctions(dependencies) { const { - error, - setError, - currentBrew, - setCurrentBrew, + brew, useLocalStorage, sandbox, showFloatingButtons, @@ -53,6 +50,7 @@ export default function useCommonEditPageFunctions(dependencies) { userThemes = {} } = dependencies; + const [currentBrew, setCurrentBrew] = useState(brew); const [isSaving, setIsSaving] = useState(false); const [lastSavedTime, setLastSavedTime] = useState(new Date()); const [autoSaveEnabled, setAutoSaveEnabled] = useState(!sandbox); @@ -61,6 +59,7 @@ export default function useCommonEditPageFunctions(dependencies) { const [themeBundle, setThemeBundle] = useState({}); const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(currentBrew.text)); const [saveGoogle, setSaveGoogle] = useState(currentBrew.googleId); + const [error, setError] = useState(null); const [alertTrashedGoogleBrew, setAlertTrashedGoogleBrew] = useState(currentBrew.trashed); const [alertNoGoogleToTransfer, setAlertNoGoogleToTransfer] = useState(false); @@ -222,7 +221,10 @@ export default function useCommonEditPageFunctions(dependencies) { }; const savedBrew = await save(brewToSave, saveToGoogle) - .catch((err)=>{setError(err);}); + .catch((err)=>{ + console.error('Error Updating Local Brew'); + setError(err); + }); if(savedBrew) { lastSavedBrew.current = { ...snapshotBrewBeforeSave, @@ -235,11 +237,11 @@ export default function useCommonEditPageFunctions(dependencies) { })); if(useLocalStorage) clearLocalStorage(); + setLastSavedTime(new Date()); + if(!autoSaveEnabled) resetWarnUnsavedTimer(); onSaveSuccess(savedBrew); } setIsSaving(false); - setLastSavedTime(new Date()); - if(!autoSaveEnabled) resetWarnUnsavedTimer(); }, newTimeout); });