From 87bdafb6a32e4fd801141cb39a5f15b579e2568b Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Tue, 18 Nov 2025 16:05:27 +0530 Subject: [PATCH] cleaner view for Blog --- src/blog/Blog.tsx | 152 ++++++++++++---------------------------- src/blog/types/props.ts | 2 +- 2 files changed, 46 insertions(+), 108 deletions(-) diff --git a/src/blog/Blog.tsx b/src/blog/Blog.tsx index 3705462..5e5554d 100644 --- a/src/blog/Blog.tsx +++ b/src/blog/Blog.tsx @@ -21,136 +21,74 @@ export default function Blog(props: { disableCustomTheme?: boolean }) { const { articles, loading, error } = useArticles(); const { currentUser } = useAuth(); - const [selectedArticle, setSelectedArticle] = React.useState(null); - const [showLogin, setShowLogin] = React.useState(false); - const [showRegister, setShowRegister] = React.useState(false); - const [showProfile, setShowProfile] = React.useState(false); - const [showEditor, setShowEditor] = React.useState(false); + const [ui, setUI] = React.useState({ + selectedArticle: null as number | null, + view: "home" as View, + }); + const show = (view: View) => { + setUI(prev => ({ ...prev, view })); + window.scrollTo({ top: 0, behavior: "smooth" }); + }; + const openLogin = () => show("login"); + const openRegister = () => show("register"); + const openProfile = () => show("profile"); + const openEditor = () => show("editor"); - const handleSelectArticle = (index: number) => { - setSelectedArticle(index); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }; - const handleShowLogin = () => { - setShowLogin(true); - setShowRegister(false); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }; - const handleShowRegister = () => { - setShowRegister(true); - setShowLogin(false); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }; - const handleHideAuth = () => { - setShowLogin(false); - setShowRegister(false); - }; - const handleShowProfile = () => { - setShowProfile(true); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }; - const handleHideProfile = () => { - setShowProfile(false); - }; - const handleShowEditor = () => { - setShowEditor(true); - }; - const handleHideEditor = () => { - setShowEditor(false); - }; - const handleArticleViewBack = () => setSelectedArticle(null); - const handleArticleEditorBack = () => { - handleHideEditor() - window.scrollTo({ top: 0, behavior: 'smooth' }); + const openArticle = (index: number) => { + setUI({ selectedArticle: index, view: "article" }); + window.scrollTo({ top: 0, behavior: "smooth" }); }; - // derive a single source of truth for view - const view: View = React.useMemo(() => { - if (selectedArticle !== null && !showEditor) return 'article'; - if (showRegister) return 'register'; - if (showLogin) return 'login'; - if (showProfile) return 'profile'; - if (showEditor) return 'editor'; - return 'home'; - }, [selectedArticle, showLogin, showRegister, showProfile, showEditor]); + const goHome = () => setUI({ selectedArticle: null, view: "home" }); - // render function keeps JSX tidy const renderView = () => { - switch (view) { - case 'register': - return ; - case 'login': + switch (ui.view) { + case "login": + return ; + + case "register": + return ; + + case "profile": + return ; + + case "article": return ( - { - handleShowRegister(); - }} + ); - case 'profile': + + case "editor": return ( - ); - case 'article': - if (selectedArticle == null || !articles[selectedArticle]) return null; - return ; - case 'editor': - if (selectedArticle == null || !articles[selectedArticle]) - return - return - case 'home': + default: return ( <> - + {!currentUser ? ( - <> - - + ) : ( <> - - )} - - {}} - /> + + ); } @@ -210,13 +148,13 @@ export default function Blog(props: { disableCustomTheme?: boolean }) { flexDirection: 'column', my: 4, gap: 4, - pb: view === 'home' ? 24 : 0, + pb: ui.view === 'home' ? 24 : 0, }} > {renderView()} - {view === 'home' && ( + {ui.view === 'home' && ( void; }