From 09365d828aeada81142c8f519849f27296a8b54c Mon Sep 17 00:00:00 2001 From: Timothy Pidashev Date: Tue, 12 Mar 2024 12:35:50 -0700 Subject: [PATCH] fix page reloads --- src/web/.gitignore | 4 ++ src/web/.web/bun.lockb | Bin 120868 -> 120171 bytes src/web/.web/package.json | 2 +- src/web/.web/pages/404.js | 88 +++++++++++++++++-------------- src/web/.web/pages/index.js | 88 +++++++++++++++++-------------- src/web/.web/reflex.json | 2 +- src/web/.web/utils/context.js | 12 ++--- src/web/web/components/navbar.py | 21 +++----- src/web/web/pages/__init__.py | 1 + src/web/web/pages/about.py | 14 +++++ src/web/web/pages/page404.py | 13 ++--- src/web/web/templates/webpage.py | 15 ++---- 12 files changed, 140 insertions(+), 120 deletions(-) create mode 100644 src/web/.gitignore create mode 100644 src/web/web/pages/about.py diff --git a/src/web/.gitignore b/src/web/.gitignore new file mode 100644 index 0000000..eab0d4b --- /dev/null +++ b/src/web/.gitignore @@ -0,0 +1,4 @@ +*.db +*.py[cod] +.web +__pycache__/ \ No newline at end of file diff --git a/src/web/.web/bun.lockb b/src/web/.web/bun.lockb index 2a35965c16545996a86f22624f7cddc7faf9207d..8f3012bedeada90f32782d45a77ea31488aeccae 100755 GIT binary patch delta 19059 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 ar^Z}1v(BD%TUnz - {isTrue(((!state.is_hydrated) || (connectErrors.length > 0))) ? ( - - - {`wifi_off`} - - -) : ( - -)} - - ) -} - - import { useIsPresent } from "framer-motion"; - - export function Fragment_14636cc997c0546c0967a25d8e600f96 () { const [addEvents, connectErrors] = useContext(EventLoopContext); @@ -66,15 +53,28 @@ export function Fragment_14636cc997c0546c0967a25d8e600f96 () { ) } -const pulse = keyframes` - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -` + import { useIsPresent } from "framer-motion"; + +export function Fragment_e9a05c105aa9215aeba52aeec8fe2e76 () { + const state = useContext(StateContexts.state) + const [addEvents, connectErrors] = useContext(EventLoopContext); + + + return ( + + {isTrue(((!state.is_hydrated) || (connectErrors.length > 0))) ? ( + + + {`wifi_off`} + + +) : ( + +)} + + ) +} export default function Component() { @@ -92,38 +92,48 @@ export default function Component() { - - + + + {`About`} + - - + + + {`Projects`} + - - + + + {`Resume`} + - - + + + {`Blog`} + - - + + + {`Shop`} + diff --git a/src/web/.web/pages/index.js b/src/web/.web/pages/index.js index 11b104b..1c74427 100644 --- a/src/web/.web/pages/index.js +++ b/src/web/.web/pages/index.js @@ -14,29 +14,16 @@ import NextHead from "next/head" -export function Fragment_e9a05c105aa9215aeba52aeec8fe2e76 () { - const state = useContext(StateContexts.state) - const [addEvents, connectErrors] = useContext(EventLoopContext); +const pulse = keyframes` + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +` - return ( - - {isTrue(((!state.is_hydrated) || (connectErrors.length > 0))) ? ( - - - {`wifi_off`} - - -) : ( - -)} - - ) -} - - import { useIsPresent } from "framer-motion"; - - export function Fragment_14636cc997c0546c0967a25d8e600f96 () { const [addEvents, connectErrors] = useContext(EventLoopContext); @@ -66,15 +53,28 @@ export function Fragment_14636cc997c0546c0967a25d8e600f96 () { ) } -const pulse = keyframes` - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -` + import { useIsPresent } from "framer-motion"; + +export function Fragment_e9a05c105aa9215aeba52aeec8fe2e76 () { + const state = useContext(StateContexts.state) + const [addEvents, connectErrors] = useContext(EventLoopContext); + + + return ( + + {isTrue(((!state.is_hydrated) || (connectErrors.length > 0))) ? ( + + + {`wifi_off`} + + +) : ( + +)} + + ) +} export default function Component() { @@ -92,38 +92,48 @@ export default function Component() { - - + + + {`About`} + - - + + + {`Projects`} + - - + + + {`Resume`} + - - + + + {`Blog`} + - - + + + {`Shop`} + diff --git a/src/web/.web/reflex.json b/src/web/.web/reflex.json index 64b666f..91555a1 100644 --- a/src/web/.web/reflex.json +++ b/src/web/.web/reflex.json @@ -1 +1 @@ -{"version": "0.4.3", "project_hash": 133404493286750418693195899744043836434, "last_version_check_datetime": "2024-03-12 00:10:35.074745"} \ No newline at end of file +{"version": "0.4.3", "project_hash": 76742530442461448999350655539571039381, "last_version_check_datetime": "2024-03-12 10:19:00.533460"} \ No newline at end of file diff --git a/src/web/.web/utils/context.js b/src/web/.web/utils/context.js index 333bc3e..6c1194e 100644 --- a/src/web/.web/utils/context.js +++ b/src/web/.web/utils/context.js @@ -1,7 +1,7 @@ import { createContext, useContext, useMemo, useReducer, useState } from "react" import { applyDelta, Event, hydrateClientStorage, useEventLoop, refs } from "/utils/state.js" -export const initialState = {"state": {"is_hydrated": false, "router": {"session": {"client_token": "", "client_ip": "", "session_id": ""}, "headers": {"host": "", "origin": "", "upgrade": "", "connection": "", "pragma": "", "cache_control": "", "user_agent": "", "sec_websocket_version": "", "sec_websocket_key": "", "sec_websocket_extensions": "", "accept_encoding": "", "accept_language": ""}, "page": {"host": "", "path": "", "raw_path": "", "full_path": "", "full_raw_path": "", "params": {}}}}, "state.on_load_internal_state": {}, "state.state": {}, "state.state.theme_state": {"current_theme": 0, "theme": {"background_color": "#282828"}, "themes": {"0": {"background_color": "#282828"}, "1": {"background_color": "#000000"}}}, "state.update_vars_internal_state": {}} +export const initialState = {"state": {"is_hydrated": false, "router": {"session": {"client_token": "", "client_ip": "", "session_id": ""}, "headers": {"host": "", "origin": "", "upgrade": "", "connection": "", "pragma": "", "cache_control": "", "user_agent": "", "sec_websocket_version": "", "sec_websocket_key": "", "sec_websocket_extensions": "", "accept_encoding": "", "accept_language": ""}, "page": {"host": "", "path": "", "raw_path": "", "full_path": "", "full_raw_path": "", "params": {}}}}, "state.state": {}, "state.state.theme_state": {"current_theme": 0, "theme": {"background_color": "#282828"}, "themes": {"0": {"background_color": "#282828"}, "1": {"background_color": "#000000"}}}, "state.update_vars_internal_state": {}, "state.on_load_internal_state": {}} export const defaultColorMode = "light" export const ColorModeContext = createContext(null); @@ -9,10 +9,10 @@ export const UploadFilesContext = createContext(null); export const DispatchContext = createContext(null); export const StateContexts = { state: createContext(null), - state__on_load_internal_state: createContext(null), state__state: createContext(null), state__state__theme_state: createContext(null), state__update_vars_internal_state: createContext(null), + state__on_load_internal_state: createContext(null), } export const EventLoopContext = createContext(null); export const clientStorage = {"cookies": {}, "local_storage": {}} @@ -80,33 +80,33 @@ export function EventLoopProvider({ children }) { export function StateProvider({ children }) { const [state, dispatch_state] = useReducer(applyDelta, initialState["state"]) - const [state__on_load_internal_state, dispatch_state__on_load_internal_state] = useReducer(applyDelta, initialState["state.on_load_internal_state"]) const [state__state, dispatch_state__state] = useReducer(applyDelta, initialState["state.state"]) const [state__state__theme_state, dispatch_state__state__theme_state] = useReducer(applyDelta, initialState["state.state.theme_state"]) const [state__update_vars_internal_state, dispatch_state__update_vars_internal_state] = useReducer(applyDelta, initialState["state.update_vars_internal_state"]) + const [state__on_load_internal_state, dispatch_state__on_load_internal_state] = useReducer(applyDelta, initialState["state.on_load_internal_state"]) const dispatchers = useMemo(() => { return { "state": dispatch_state, - "state.on_load_internal_state": dispatch_state__on_load_internal_state, "state.state": dispatch_state__state, "state.state.theme_state": dispatch_state__state__theme_state, "state.update_vars_internal_state": dispatch_state__update_vars_internal_state, + "state.on_load_internal_state": dispatch_state__on_load_internal_state, } }, []) return ( - + {children} + - ) } \ No newline at end of file diff --git a/src/web/web/components/navbar.py b/src/web/web/components/navbar.py index 87be852..293c69f 100644 --- a/src/web/web/components/navbar.py +++ b/src/web/web/components/navbar.py @@ -1,33 +1,24 @@ import reflex as rx +from web.state import * from web.style import * def navbar(): return rx.box( rx.center( rx.flex( - rx.link( - rx.text("About", href="/about") - ) + rx.link("About", href="/about") ), rx.flex( - rx.link( - rx.text("Projects", href="/projects") - ) + rx.link("Projects", href="/projects") ), rx.flex( - rx.link( - rx.text("Resume", href="/resume") - ) + rx.link("Resume", href="/resume") ), rx.flex( - rx.link( - rx.text("Blog", href="/blog") - ) + rx.link("Blog", href="/blog") ), rx.flex( - rx.link( - rx.text("Shop", href="shop") - ) + rx.link("Shop", href="/shop") ), spacing="7", ) diff --git a/src/web/web/pages/__init__.py b/src/web/web/pages/__init__.py index 126ce4b..995fd3c 100644 --- a/src/web/web/pages/__init__.py +++ b/src/web/web/pages/__init__.py @@ -1,6 +1,7 @@ from web.route import Route from .index import index +from .about import about from .page404 import page404 routes = [ diff --git a/src/web/web/pages/about.py b/src/web/web/pages/about.py new file mode 100644 index 0000000..a7719a3 --- /dev/null +++ b/src/web/web/pages/about.py @@ -0,0 +1,14 @@ +import reflex as rx +from web.templates import webpage + +@webpage(path="/about", title="About") +def about(): + return rx.box( + rx.center( + rx.vstack( + rx.heading("About", sixe="9"), + align="center" + ), + height="100vh", + ) + ) diff --git a/src/web/web/pages/page404.py b/src/web/web/pages/page404.py index 0c65a96..baa5355 100644 --- a/src/web/web/pages/page404.py +++ b/src/web/web/pages/page404.py @@ -1,6 +1,5 @@ import reflex as rx from web.templates import webpage -from web.motion import motion # TODO: Add a go back here link @@ -9,14 +8,10 @@ def page404(): return rx.box( rx.center( rx.vstack( - motion( - rx.heading( - "Whoops, this page doesn't exist...", size="9" - ), - initial={"opacity": 0, "y": -50}, # Initial state: transparent and above the screen - animate={"opacity": 1, "y": 0, "transition": {"duration": 0.5, "ease": "easeInOut"}}, # Animate opacity to 1 and move down into view - while_hover={"scale": 1.1}, # Enlarge on hover - ) + rx.heading( + "Whoops, this page doesn't exist...", size="9" + ), + align="center" ), height="100vh", width="100%", diff --git a/src/web/web/templates/webpage.py b/src/web/web/templates/webpage.py index 02a3122..23527d3 100644 --- a/src/web/web/templates/webpage.py +++ b/src/web/web/templates/webpage.py @@ -1,7 +1,6 @@ from typing import Callable import reflex as rx from web.route import Route -from web.motion import motion def webpage(path: str, title: str = "Timothy Pidashev", props=None) -> Callable: """This template wraps the webpage with the navbar and footer. @@ -42,15 +41,11 @@ def webpage(path: str, title: str = "Timothy Pidashev", props=None) -> Callable: # Declare the entire page content return rx.box( - motion( - rx.box( - navbar(), - contents(*children, **props), - footer(), - **props - ), - initial={"opacity": 0, "y": -50}, # Initial state: transparent and above the screen - animate={"opacity": 1, "y": 0, "transition": {"duration": 0.5, "ease": "easeInOut"}}, # Animate opacity to 1 and move down into view + rx.box( + navbar(), + contents(*children, **props), + footer(), + **props ) )