diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 990403d6c..2a35f81bd 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -11,10 +11,6 @@ import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefau import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; -import SplitPane from '@components/splitPane/splitPane.jsx'; -import Editor from '../../editor/editor.jsx'; -import BrewRenderer from '../../brewRenderer/brewRenderer.jsx'; - import Nav from '@navbar/nav.jsx'; import Navbar from '@navbar/navbar.jsx'; import NewBrewItem from '@navbar/newbrew.navitem.jsx'; @@ -27,14 +23,11 @@ import RecentNavItems from '@navbar/recent.navitem.jsx'; const { both: RecentNavItem } = RecentNavItems; // Page specific imports -import Headtags from '../../../../vitreum/headtags.js'; -const Meta = Headtags.Meta; import { md5 } from 'hash-wasm'; import { gzipSync, strToU8 } from 'fflate'; import { makePatches, stringifyPatches } from '@sanity/diff-match-patch'; import ShareNavItem from '@navbar/share.navitem.jsx'; -import LockNotification from './lockNotification/lockNotification.jsx'; import { updateHistory, versionHistoryGarbageCollection } from '../../utils/versionHistory.js'; import googleDriveIcon from '../../googleDrive.svg'; @@ -43,8 +36,11 @@ const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; const METAKEY = 'HB_newPage_meta'; -const useLocalStorage = false; -const sandbox = false; +const useLocalStorage = false; +const sandbox = false; +const showFloatingButtons = false; +const showEditorButtons = true; +const pageName = "editPage"; const EditPage = (props)=>{ props = { @@ -55,26 +51,13 @@ const EditPage = (props)=>{ const [currentBrew, setCurrentBrew] = useState(props.brew); const [saveGoogle, setSaveGoogle] = useState(!!props.brew.googleId); const [error, setError] = useState(null); - const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(props.brew.text)); - const [currentEditorViewPageNum, setCurrentEditorViewPageNum] = useState(1); - const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); - const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); - const [themeBundle, setThemeBundle] = useState({}); const [alertTrashedGoogleBrew, setAlertTrashedGoogleBrew] = useState(props.brew.trashed); const [alertNoGoogleToTransfer, setAlertNoGoogleToTransfer] = useState(false); const [alertOwnershipToTransfer, setAlertOwnershipToTransfer] = useState(false); const [confirmGoogleTransfer, setConfirmGoogleTransfer] = useState(false); - const editorRef = useRef(null); const lastSavedBrew = useRef(_.cloneDeep(props.brew)); - const updateBrew = (newData)=>setCurrentBrew((prevBrew)=>({ - ...prevBrew, - style : newData.style, - text : newData.text, - snippets : newData.snippets - })); - const handleGoogleClick = ()=>{ if(currentBrew.authors.length > 0 && global.account?.username !== currentBrew.authors[0]) { setAlertOwnershipToTransfer(true); @@ -106,8 +89,6 @@ const EditPage = (props)=>{ }; const save = async (brew, saveToGoogle)=>{ - setHTMLErrors(hbfm.validate(brew.text)); - await updateHistory(brew).catch(console.error); await versionHistoryGarbageCollection().catch(console.error); @@ -233,19 +214,16 @@ const EditPage = (props)=>{ }; const { - handleSplitMove, - handleBrewChange, toggleAutoSave, clearError, renderSaveButton, + renderPanels, autoSaveEnabled, - trySave + trySave, + currentBrewRendererPageNum } = useCommonEditPageFunctions({ saveGoogle, setError, - setThemeBundle, - HTMLErrors, - setHTMLErrors, currentBrew, setCurrentBrew, useLocalStorage, @@ -255,51 +233,16 @@ const EditPage = (props)=>{ METAKEY, hbfm, sandbox, + showFloatingButtons, lastSavedBrew, - editorRef, save, + renderNavbar, + pageName, + showEditorButtons, + userThemes: props.userThemes }); - return ( -
- - - {renderNavbar()} - - {currentBrew.lock && } - -
- - - - -
-
- ); + return renderPanels(); }; export default EditPage; diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index af4c4cbf5..f3b734bfb 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -11,10 +11,6 @@ import { DEFAULT_BREW } from '../../../../server/brewDefau import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; -import SplitPane from '@components/splitPane/splitPane.jsx'; -import Editor from '../../editor/editor.jsx'; -import BrewRenderer from '../../brewRenderer/brewRenderer.jsx'; - import Nav from '@navbar/nav.jsx'; import Navbar from '@navbar/navbar.jsx'; import NewBrewItem from '@navbar/newbrew.navitem.jsx'; @@ -28,16 +24,18 @@ const { both: RecentNavItem } = RecentNavItems; // Page specific imports -import Headtags from '@vitreum/headtags.js'; -const Meta = Headtags.Meta; + const BREWKEY = 'HB_newPage_content'; const STYLEKEY = 'HB_newPage_style'; const SNIPKEY = 'HB_newPage_snippets'; const METAKEY = 'HB_newPage_meta'; -const useLocalStorage = false; -const sandbox = true; +const useLocalStorage = false; +const sandbox = true; +const showFloatingButtons = true; +const showEditorButtons = false; +const pageName = "homePage"; const HomePage =(props)=>{ props = { @@ -48,13 +46,7 @@ const HomePage =(props)=>{ const [currentBrew, setCurrentBrew] = useState(props.brew); const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(undefined); - const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(props.brew.text)); - const [currentEditorViewPageNum, setCurrentEditorViewPageNum] = useState(1); - const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); - const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); - const [themeBundle, setThemeBundle] = useState({}); - const editorRef = useRef(null); const lastSavedBrew = useRef(_.cloneDeep(props.brew)); const save = async (brew, saveToGoogle)=>{ @@ -89,18 +81,12 @@ const HomePage =(props)=>{ }; const { - handleSplitMove, - handleBrewChange, clearError, renderSaveButton, - unsavedChanges, - trySave + renderPanels } = useCommonEditPageFunctions({ saveGoogle, setError, - setThemeBundle, - HTMLErrors, - setHTMLErrors, currentBrew, setCurrentBrew, useLocalStorage, @@ -110,49 +96,16 @@ const HomePage =(props)=>{ METAKEY, hbfm, sandbox, + showFloatingButtons, lastSavedBrew, - editorRef, save, + renderNavbar, + pageName, + showEditorButtons, + userThemes: {} }); - return ( -
- - {renderNavbar()} -
- - - - -
-
trySave(true, true, saveGoogle)}> - Save current -
- - - Create your own - -
- ); + return renderPanels(); }; export default HomePage; diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index b7f8fb7cd..ca65c17bb 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -12,10 +12,6 @@ import { printCurrentBrew, fetchThemeBundle, splitTextStyleAndMetadata } from '@ import useCommonEditPageFunctions from '../../utils/commonEditPageFunctions.jsx'; -import SplitPane from '@components/splitPane/splitPane.jsx'; -import Editor from '../../editor/editor.jsx'; -import BrewRenderer from '../../brewRenderer/brewRenderer.jsx'; - import Nav from '@navbar/nav.jsx'; import Navbar from '@navbar/navbar.jsx'; import NewBrewItem from '@navbar/newbrew.navitem.jsx'; @@ -35,8 +31,11 @@ const METAKEY = 'HB_newPage_meta'; const SAVEKEYPREFIX = 'HB_editor_defaultSave_'; -const useLocalStorage = true; -const sandbox = true; +const useLocalStorage = true; +const sandbox = true; +const showFloatingButtons = false; +const showEditorButtons = true; +const pageName = "newPage"; const NewPage = (props)=>{ props = { @@ -47,13 +46,7 @@ const NewPage = (props)=>{ const [currentBrew, setCurrentBrew] = useState(props.brew); const [saveGoogle, setSaveGoogle] = useState(global.account?.googleId ? true : false); const [error, setError] = useState(null); - const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(props.brew.text)); - const [currentEditorViewPageNum, setCurrentEditorViewPageNum] = useState(1); - const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); - const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); - const [themeBundle, setThemeBundle] = useState({}); - const editorRef = useRef(null); const lastSavedBrew = useRef(_.cloneDeep(props.brew)); useEffect(()=>{ @@ -137,16 +130,12 @@ const NewPage = (props)=>{ ); const { - handleSplitMove, - handleBrewChange, clearError, - renderSaveButton + renderSaveButton, + renderPanels } = useCommonEditPageFunctions({ saveGoogle, setError, - setThemeBundle, - HTMLErrors, - setHTMLErrors, currentBrew, setCurrentBrew, useLocalStorage, @@ -156,44 +145,16 @@ const NewPage = (props)=>{ METAKEY, hbfm, sandbox, + showFloatingButtons, lastSavedBrew, - editorRef, save, + renderNavbar, + pageName, + showEditorButtons, + userThemes: props.userThemes }); - return ( -
- {renderNavbar()} -
- - - - -
-
- ); + return renderPanels(); }; export default NewPage; diff --git a/client/homebrew/utils/commonEditPageFunctions.jsx b/client/homebrew/utils/commonEditPageFunctions.jsx index b4d3022b4..ac7d804bc 100644 --- a/client/homebrew/utils/commonEditPageFunctions.jsx +++ b/client/homebrew/utils/commonEditPageFunctions.jsx @@ -3,6 +3,13 @@ import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; import _ from 'lodash'; import Nav from '@navbar/nav.jsx'; +import Headtags from '@vitreum/headtags.js'; +import SplitPane from '@components/splitPane/splitPane.jsx'; +import Editor from '../editor/editor.jsx'; +import BrewRenderer from '../brewRenderer/brewRenderer.jsx'; +import LockNotification from '../pages/editPage/lockNotification/lockNotification.jsx'; +const Meta = Headtags.Meta; + const AUTOSAVE_KEY = 'HB_editor_autoSaveOn'; const SAVE_TIMEOUT = 10000; //Autosave 10 seconds after last change @@ -13,9 +20,6 @@ export default function useCommonEditPageFunctions(dependencies) { const { saveGoogle, setError, - setThemeBundle, - HTMLErrors, - setHTMLErrors, currentBrew, setCurrentBrew, useLocalStorage, @@ -25,27 +29,37 @@ export default function useCommonEditPageFunctions(dependencies) { METAKEY, hbfm, sandbox, + showFloatingButtons, lastSavedBrew, - editorRef, save, + renderNavbar, + pageName, + showEditorButtons, + userThemes = {} } = dependencies; - const [isSaving, setIsSaving] = useState(false); - const [lastSavedTime, setLastSavedTime] = useState(new Date()); - const [autoSaveEnabled, setAutoSaveEnabled] = useState(!sandbox); + const [isSaving, setIsSaving] = useState(false); + const [lastSavedTime, setLastSavedTime] = useState(new Date()); + const [autoSaveEnabled, setAutoSaveEnabled] = useState(!sandbox); const [warnUnsavedChanges, setWarnUnsavedChanges] = useState(true); - const [unsavedChanges, setUnsavedChanges] = useState(false); + const [unsavedChanges, setUnsavedChanges] = useState(false); + const [themeBundle, setThemeBundle] = useState({}); + const [HTMLErrors, setHTMLErrors] = useState(hbfm.validate(currentBrew.text)); + + const [currentEditorViewPageNum, setCurrentEditorViewPageNum] = useState(1); + const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1); + const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); 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 saveTimeout = useRef(null); + const editorRef = useRef(null); //==--------- Page setup ----------==// 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)=>{ @@ -132,6 +146,7 @@ export default function useCommonEditPageFunctions(dependencies) { saveTimeout.current = setTimeout(async ()=>{ setIsSaving(true); setError(null); + setHTMLErrors(hbfm.validate(currentBrew.text)); await save(currentBrew, saveToGoogle) .catch((err)=>{ setError(err); @@ -171,6 +186,67 @@ export default function useCommonEditPageFunctions(dependencies) { return saved; }; + //TODO: Candidate for removal; only used in editPage, so may not be necessary + const updateBrew = (newData)=>setCurrentBrew((prevBrew)=>({ + ...prevBrew, + style : newData.style, + text : newData.text, + snippets : newData.snippets + })); + + const renderFloatingSaveButtons = ()=>( + <> +
trySave(true, true, saveGoogle)}> + Save current +
+ + + Create your own + + + ); + + const renderPanels = ()=>( +
+ + {(pageName == 'editPage') && } + {renderNavbar()} + {currentBrew.lock && } +
+ + + + +
+ {showFloatingButtons && renderFloatingSaveButtons()} +
+ ); + return { handleSplitMove, handleBrewChange, @@ -178,7 +254,9 @@ export default function useCommonEditPageFunctions(dependencies) { clearError, trySave, renderSaveButton, + renderPanels, autoSaveEnabled, unsavedChanges, + currentBrewRendererPageNum }; } \ No newline at end of file diff --git a/robots.txt b/robots.txt index 9abbfb965..03ccfb57f 100644 --- a/robots.txt +++ b/robots.txt @@ -2,3 +2,17 @@ User-agent: * Disallow: /edit/ +# AI / LLM training crawlers + +User-agent: GPTBot +User-agent: ClaudeBot +User-agent: CCBot +User-agent: Google-Extended +User-agent: Bytespider +User-agent: Applebot-Extended +User-agent: Meta-ExternalAgent +User-agent: Amazonbot +Disallow: /share/ +Disallow: /download/ +Disallow: /print/ +Disallow: /edit/ diff --git a/vitePlugins/generateAssetsPlugin.js b/vitePlugins/generateAssetsPlugin.js index 64f564146..7eef8bda5 100644 --- a/vitePlugins/generateAssetsPlugin.js +++ b/vitePlugins/generateAssetsPlugin.js @@ -12,7 +12,10 @@ export function generateAssetsPlugin(isDev = false) { // Copy favicon await fs.copy('./client/homebrew/favicon.ico', `${buildDir}/assets/favicon.ico`); - //hopefully temporary to fix 406 flood coming from editor + //Copy this image into multiple paths to avoid server spam where browser requests an image + //at the wrong path, gets a 406, then in response requests broken-image which also fails. Error handler + //used the wrong path for this image causing an infinite request loop. Should be able to remove + //in some time once all users haver refreshed their browser await fs.copy('./client/icons/broken-image.jpg', `${buildDir}/edit/client/icons/broken-image.jpg`); await fs.copy('./client/icons/broken-image.jpg', `${buildDir}/new/client/icons/broken-image.jpg`); await fs.copy('./client/icons/broken-image.jpg', `${buildDir}/client/icons/broken-image.jpg`);