From b5945ac39519599be05a4354a3636989460c0523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 00:32:29 +0200 Subject: [PATCH 1/7] add two comments for my own peace of mind. --- server/homebrew.api.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 90543ceaa..11c573db2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -577,9 +577,9 @@ const api = { router.use(dbCheck); router.post('/api', checkClientVersion, asyncHandler(api.newBrew)); -router.put('/api/:id', checkClientVersion, asyncHandler(api.getBrew('edit', false)), asyncHandler(api.updateBrew)); +router.put('/api/:id', checkClientVersion, asyncHandler(api.getBrew('edit', false)), asyncHandler(api.updateBrew)); //alt endpoint, unused router.put('/api/update/:id', checkClientVersion, asyncHandler(api.getBrew('edit', false)), asyncHandler(api.updateBrew)); -router.delete('/api/:id', checkClientVersion, asyncHandler(api.deleteBrew)); +router.delete('/api/:id', checkClientVersion, asyncHandler(api.deleteBrew)); //alt endpoint, unused router.get('/api/remove/:id', checkClientVersion, asyncHandler(api.deleteBrew)); router.get('/api/theme/:renderer/:id', asyncHandler(api.getThemeBundle)); From 057125aa17273c53b57835ccc6c841be8e068128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 00:32:43 +0200 Subject: [PATCH 2/7] add api endpoint --- server/app.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/app.js b/server/app.js index 714c4beba..49767c09d 100644 --- a/server/app.js +++ b/server/app.js @@ -14,6 +14,7 @@ import express from 'express'; import config from './config.js'; import path from 'path'; import fs from 'fs-extra'; +import { splitTextStyleAndMetadata } from '../shared/helpers.js'; import api from './homebrew.api.js'; const { homebrewApi, getBrew, getCSS } = api; @@ -135,6 +136,15 @@ export default async function createApp(vite) { app.get('/robots.txt', (req, res)=>{ return res.sendFile(`robots.txt`, { root: process.cwd() }); }); + //serve brew for sharepage rerender + app.get('/api/fetch/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res) => { + const { brew } = req; + brew.authors.includes(req.account?.username) + ? sanitizeBrew(brew, 'shareAuthor') + : sanitizeBrew(brew, 'share'); + splitTextStyleAndMetadata(brew); + res.json({ brew }); + })); //Serve brew metadata app.get('/metadata/:id', asyncHandler(getBrew('share')), (req, res)=>{ From 24d05f837a281900193a14fc5538c3cf336106f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 00:33:04 +0200 Subject: [PATCH 3/7] add brew fetching --- client/homebrew/pages/sharePage/sharePage.jsx | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 7a14234a7..8d2a5b0f0 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -12,6 +12,8 @@ const { both: RecentNavItem } = RecentNavItems; import Account from '@navbar/account.navitem.jsx'; import BrewRenderer from '../../brewRenderer/brewRenderer.jsx'; +import request from '../../utils/request-middleware.js'; + import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js'; import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; @@ -36,19 +38,43 @@ const SharePage = (props)=>{ } }; + const fetchUpdatedBrew = async ()=>{ + const response = await request + .get(`/api/fetch/${currentBrew.shareId}`) + .catch((error)=>{ + console.log('error at fetching updated brew: ', error); + }); + if(response.ok && !!response.body.brew) { + const updatedBrew = response.body.brew; + + setCurrentBrew((prev)=>{ + const changed = Object.keys(updatedBrew).filter((key)=>{ + if(key === 'text' || key === 'textBin') { + return prev[key] !== updatedBrew[key]; + } + return JSON.stringify(prev[key]) !== JSON.stringify(updatedBrew[key]); + }); + return { + ...prev, + ...updatedBrew + }; + }); + } + }; + useEffect(()=>{ document.addEventListener('keydown', handleControlKeys); fetchThemeBundle(undefined, setThemeBundle, currentBrew.renderer, currentBrew.theme); - // listen for changes in the brew version + // listen for changes in the brew version const eventSource = new EventSource('/stream'); eventSource.addEventListener('message', (evt)=>{ const messageData = JSON.parse(evt.data); if(messageData.eventType == 'brewUpdated'){ if(messageData.shareId == currentBrew.shareId && messageData.version != currentBrew.version) { - console.log(`brew has been updated, viewing ${currentBrew.version}, new version is ${messageData.version}`); console.log('should fetch brew'); + fetchUpdatedBrew(); } } }); From dd863c92192272faf8027e49257d03b804af0ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 11:22:28 +0200 Subject: [PATCH 4/7] track changes to pages in brewrenderer --- client/homebrew/brewRenderer/brewRenderer.jsx | 20 +++++++++++++++---- client/homebrew/pages/editPage/editPage.jsx | 1 + client/homebrew/pages/homePage/homePage.jsx | 1 + client/homebrew/pages/newPage/newPage.jsx | 1 + client/homebrew/pages/sharePage/sharePage.jsx | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 75a07c7d1..a37671219 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -85,6 +85,7 @@ const BrewPage = (props)=>{ //v=====--------------------< Brew Renderer Component >-------------------=====v// let renderedPages = []; +let renderedPageTexts = []; const pageTemplates = []; let rawPages = []; @@ -92,6 +93,7 @@ const BrewRenderer = (props)=>{ props = { text : '', style : '', + version : 1, renderer : 'legacy', lang : '', errors : [], @@ -230,12 +232,15 @@ const BrewRenderer = (props)=>{ if(rawPages.length != renderedPages.length) { // Re-render all pages when page count changes renderedPages.length = 0; + renderedPageTexts.length = 0; pageTemplates.length = 0; } // Render currently-edited page first so cross-page effects (variables, links) can propagate out first - if(rawPages.length > props.currentEditorCursorPageNum -1) + if(rawPages.length > props.currentEditorCursorPageNum -1) { renderedPages[props.currentEditorCursorPageNum - 1] = renderPage(rawPages[props.currentEditorCursorPageNum - 1], props.currentEditorCursorPageNum - 1); + renderedPageTexts[props.currentEditorCursorPageNum - 1] = rawPages[props.currentEditorCursorPageNum - 1]; + } _.forEach(rawPages, (page, index)=>{ const varsOnPageRegex = /([!$]?)\[((?!\s*\])(?:\\.|[^\[\]\\])+)\]/g; // Find out if there are any vars on the page. @@ -243,8 +248,12 @@ const BrewRenderer = (props)=>{ !props.hoisted && (page.match(varsOnPageRegex)); // forceRender forces pages outside of the PPR range to render if true. // This is necessary on the first load to fully populate the variable table. - if((isInView(index) || !renderedPages[index] || forceRender) && typeof window !== 'undefined'){ - renderedPages[index] = renderPage(page, index); // Render any page not yet rendered, but only re-render those in PPR range + + const pageTextChanged = renderedPageTexts[index] !== page; + + if(((isInView(index) && pageTextChanged) || !renderedPages[index] || forceRender) && typeof window !== 'undefined') { + renderedPages[index] = renderPage(page, index); // Render any page not yet rendered, but only re-render changed pages in PPR range + renderedPageTexts[index] = page; } }); if(!props.hoisted) { props.hoisted = true; } // Only fully hoist once. @@ -313,7 +322,10 @@ const BrewRenderer = (props)=>{ }; const renderedStyle = useMemo(()=>renderStyle(), [props.style, props.themeBundle]); - renderedPages = useMemo(()=>renderPages(), [props.text, displayOptions]); + renderedPages = useMemo( + ()=>renderPages(), + [props.version, props.currentBrewRendererPageNum, props.currentEditorCursorPageNum, displayOptions] + ); return ( <> diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 57667ca6e..c0ed712f9 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -289,6 +289,7 @@ const EditPage = (props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} + version={currentBrew.version} themeBundle={themeBundle} errors={HTMLErrors} lang={currentBrew.lang} diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 0ac78f0e1..477934506 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -138,6 +138,7 @@ const HomePage =(props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} + version={currentBrew.version} themeBundle={themeBundle} onPageChange={setCurrentBrewRendererPageNum} currentEditorCursorPageNum={currentEditorCursorPageNum} diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index c7b6c7160..92fda514a 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -183,6 +183,7 @@ const NewPage = (props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} + version={currentBrew.version} themeBundle={themeBundle} errors={HTMLErrors} lang={currentBrew.lang} diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 8d2a5b0f0..a8a6802fd 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -159,6 +159,7 @@ const SharePage = (props)=>{ style={currentBrew.style} lang={currentBrew.lang} renderer={currentBrew.renderer} + version={currentBrew.version} theme={currentBrew.theme} themeBundle={themeBundle} onPageChange={handleBrewRendererPageChange} From e0e5b9e26ab7c997fd5284fbc4cf03deeb5bea61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 19:34:03 +0200 Subject: [PATCH 5/7] Revert "track changes to pages in brewrenderer" This reverts commit dd863c92192272faf8027e49257d03b804af0ba9. --- client/homebrew/brewRenderer/brewRenderer.jsx | 20 ++++--------------- client/homebrew/pages/editPage/editPage.jsx | 1 - client/homebrew/pages/homePage/homePage.jsx | 1 - client/homebrew/pages/newPage/newPage.jsx | 1 - client/homebrew/pages/sharePage/sharePage.jsx | 1 - 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index a37671219..75a07c7d1 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -85,7 +85,6 @@ const BrewPage = (props)=>{ //v=====--------------------< Brew Renderer Component >-------------------=====v// let renderedPages = []; -let renderedPageTexts = []; const pageTemplates = []; let rawPages = []; @@ -93,7 +92,6 @@ const BrewRenderer = (props)=>{ props = { text : '', style : '', - version : 1, renderer : 'legacy', lang : '', errors : [], @@ -232,15 +230,12 @@ const BrewRenderer = (props)=>{ if(rawPages.length != renderedPages.length) { // Re-render all pages when page count changes renderedPages.length = 0; - renderedPageTexts.length = 0; pageTemplates.length = 0; } // Render currently-edited page first so cross-page effects (variables, links) can propagate out first - if(rawPages.length > props.currentEditorCursorPageNum -1) { + if(rawPages.length > props.currentEditorCursorPageNum -1) renderedPages[props.currentEditorCursorPageNum - 1] = renderPage(rawPages[props.currentEditorCursorPageNum - 1], props.currentEditorCursorPageNum - 1); - renderedPageTexts[props.currentEditorCursorPageNum - 1] = rawPages[props.currentEditorCursorPageNum - 1]; - } _.forEach(rawPages, (page, index)=>{ const varsOnPageRegex = /([!$]?)\[((?!\s*\])(?:\\.|[^\[\]\\])+)\]/g; // Find out if there are any vars on the page. @@ -248,12 +243,8 @@ const BrewRenderer = (props)=>{ !props.hoisted && (page.match(varsOnPageRegex)); // forceRender forces pages outside of the PPR range to render if true. // This is necessary on the first load to fully populate the variable table. - - const pageTextChanged = renderedPageTexts[index] !== page; - - if(((isInView(index) && pageTextChanged) || !renderedPages[index] || forceRender) && typeof window !== 'undefined') { - renderedPages[index] = renderPage(page, index); // Render any page not yet rendered, but only re-render changed pages in PPR range - renderedPageTexts[index] = page; + if((isInView(index) || !renderedPages[index] || forceRender) && typeof window !== 'undefined'){ + renderedPages[index] = renderPage(page, index); // Render any page not yet rendered, but only re-render those in PPR range } }); if(!props.hoisted) { props.hoisted = true; } // Only fully hoist once. @@ -322,10 +313,7 @@ const BrewRenderer = (props)=>{ }; const renderedStyle = useMemo(()=>renderStyle(), [props.style, props.themeBundle]); - renderedPages = useMemo( - ()=>renderPages(), - [props.version, props.currentBrewRendererPageNum, props.currentEditorCursorPageNum, displayOptions] - ); + renderedPages = useMemo(()=>renderPages(), [props.text, displayOptions]); return ( <> diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index c0ed712f9..57667ca6e 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -289,7 +289,6 @@ const EditPage = (props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} - version={currentBrew.version} themeBundle={themeBundle} errors={HTMLErrors} lang={currentBrew.lang} diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index 477934506..0ac78f0e1 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -138,7 +138,6 @@ const HomePage =(props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} - version={currentBrew.version} themeBundle={themeBundle} onPageChange={setCurrentBrewRendererPageNum} currentEditorCursorPageNum={currentEditorCursorPageNum} diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 92fda514a..c7b6c7160 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -183,7 +183,6 @@ const NewPage = (props)=>{ text={currentBrew.text} style={currentBrew.style} renderer={currentBrew.renderer} - version={currentBrew.version} themeBundle={themeBundle} errors={HTMLErrors} lang={currentBrew.lang} diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index a8a6802fd..8d2a5b0f0 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -159,7 +159,6 @@ const SharePage = (props)=>{ style={currentBrew.style} lang={currentBrew.lang} renderer={currentBrew.renderer} - version={currentBrew.version} theme={currentBrew.theme} themeBundle={themeBundle} onPageChange={handleBrewRendererPageChange} From 40d64bffab7d070bc1a4756f010ed896b079fd78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 20:02:35 +0200 Subject: [PATCH 6/7] simpler answer --- client/homebrew/brewRenderer/brewRenderer.jsx | 4 ++-- client/homebrew/pages/sharePage/sharePage.jsx | 15 +-------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 75a07c7d1..0d44d3e49 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -312,8 +312,8 @@ const BrewRenderer = (props)=>{ rowGap : `${displayOptions.rowGap}px` }; - const renderedStyle = useMemo(()=>renderStyle(), [props.style, props.themeBundle]); - renderedPages = useMemo(()=>renderPages(), [props.text, displayOptions]); + const renderedStyle = useMemo(()=>renderStyle(), [props.style, centerPage, props.themeBundle]); + renderedPages = useMemo(()=>renderPages(), [props.text, centerPage, displayOptions]); return ( <> diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 8d2a5b0f0..99ef3e35c 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -45,20 +45,7 @@ const SharePage = (props)=>{ console.log('error at fetching updated brew: ', error); }); if(response.ok && !!response.body.brew) { - const updatedBrew = response.body.brew; - - setCurrentBrew((prev)=>{ - const changed = Object.keys(updatedBrew).filter((key)=>{ - if(key === 'text' || key === 'textBin') { - return prev[key] !== updatedBrew[key]; - } - return JSON.stringify(prev[key]) !== JSON.stringify(updatedBrew[key]); - }); - return { - ...prev, - ...updatedBrew - }; - }); + setCurrentBrew(response.body.brew); } }; From 91f42f99c1b5fa5426870cd633f48874e9840275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 22 Sep 2026 20:06:14 +0200 Subject: [PATCH 7/7] remove unnecessary load --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 0d44d3e49..0fa661ae7 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -312,7 +312,7 @@ const BrewRenderer = (props)=>{ rowGap : `${displayOptions.rowGap}px` }; - const renderedStyle = useMemo(()=>renderStyle(), [props.style, centerPage, props.themeBundle]); + const renderedStyle = useMemo(()=>renderStyle(), [props.style, props.themeBundle]); renderedPages = useMemo(()=>renderPages(), [props.text, centerPage, displayOptions]); return (