
* use serializer system * add checks for unsupported operands * and and or are now supported * format * remove unnecessary call to JSON * put base before rest * fix failing testcase * add hinting to get static analysis to complain * damn * big changes * get typeguard from extensions * please darglint * dangit darglint * remove one from vars * add without data and use it in plotly * DARGLINT * change format for special props * add pyi * delete instances of Var.create * modify client state to work * fixed so much * remove every Var.create * delete all basevar stuff * checkpoint * fix pyi * get older python to work * dangit darglint * add simple fix to last failing testcase * remove var name unwrapped and put client state on immutable var * fix older python * fox event issues * change forms pyi * make test less strict * use rx state directly * add typeignore to page_id * implement foreach * delete .web states folder silly * update reflex chakra * fix issue when on mount or on unmount is not set * nuke Var * run pyi * import immutablevar in critical location * delete unwrap vars * bring back array ref * fix style props in app * /health endpoint for K8 Liveness and Readiness probes (#3855) * Added API Endpoint * Added API Endpoint * Added Unit Tests * Added Unit Tests * main * Apply suggestions from Code Review * Fix Ruff Formatting * Update Socket Events * Async Functions * Update find_replace (#3886) * [REF-3592]Promote `rx.progress` from radix themes (#3878) * Promote `rx.progress` from radix themes * fix pyi * add warning when accessing `rx._x.progress` * Use correct flexgen backend URL (#3891) * Remove demo template (#3888) * gitignore .web (#3885) * update overflowY in AUTO_HEIGHT_JS from hidden to scroll (#3882) * Retain mutability inside `async with self` block (#3884) When emitting a state update, restore `_self_mutable` to the value it had previously so that `yield` in the middle of `async with self` does not result in an immutable StateProxy. Fix #3869 * Include child imports in markdown component_map (#3883) If a component in the markdown component_map contains children components, use `_get_all_imports` to recursively enumerate them. Fix #3880 * [REF-3570] Remove deprecated REDIS_URL syntax (#3892) * mixin computed vars should only be applied to highest level state (#3833) * improve state hierarchy validation, drop old testing special case (#3894) * fix var dependency dicts (#3842) * Adding array to array pluck operation. (#3868) * fix initial state without cv fallback (#3670) * add fragment to foreach (#3877) * Update docker-example (#3324) * /health endpoint for K8 Liveness and Readiness probes (#3855) * Added API Endpoint * Added API Endpoint * Added Unit Tests * Added Unit Tests * main * Apply suggestions from Code Review * Fix Ruff Formatting * Update Socket Events * Async Functions * /health endpoint for K8 Liveness and Readiness probes (#3855) * Added API Endpoint * Added API Endpoint * Added Unit Tests * Added Unit Tests * main * Apply suggestions from Code Review * Fix Ruff Formatting * Update Socket Events * Async Functions * Merge branch 'main' into use-old-serializer-in-literalvar * [REF-3570] Remove deprecated REDIS_URL syntax (#3892) * /health endpoint for K8 Liveness and Readiness probes (#3855) * Added API Endpoint * Added API Endpoint * Added Unit Tests * Added Unit Tests * main * Apply suggestions from Code Review * Fix Ruff Formatting * Update Socket Events * Async Functions * [REF-3570] Remove deprecated REDIS_URL syntax (#3892) * remove extra var Co-authored-by: Masen Furer <m_github@0x26.net> * resolve typo * write better doc for var.create * return var value when we know it's literal var * fix unit test * less bloat for ToOperations * simplify ImmutableComputedVar.__get__ (#3902) * simplify ImmutableComputedVar.__get__ * ruff it --------- Co-authored-by: Samarth Bhadane <samarthbhadane119@gmail.com> Co-authored-by: Elijah Ahianyo <elijahahianyo@gmail.com> Co-authored-by: Masen Furer <m_github@0x26.net> Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Co-authored-by: Vishnu Deva <vishnu.deva12@gmail.com> Co-authored-by: abulvenz <a.eismann@senbax.de>
71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
"""Handle dynamic routes in static exports via client-side routing.
|
|
|
|
Works with /utils/client_side_routing.js to handle the redirect and state.
|
|
|
|
When the user hits a 404 accessing a route, redirect them to the same page,
|
|
setting a reactive state var "routeNotFound" to true if the redirect fails. The
|
|
`wait_for_client_redirect` function will render the component only after
|
|
routeNotFound becomes true.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from reflex import constants
|
|
from reflex.components.component import Component
|
|
from reflex.components.core.cond import cond
|
|
from reflex.ivars.base import ImmutableVar
|
|
from reflex.vars import Var
|
|
|
|
route_not_found: Var = ImmutableVar.create_safe(constants.ROUTE_NOT_FOUND)
|
|
|
|
|
|
class ClientSideRouting(Component):
|
|
"""The client-side routing component."""
|
|
|
|
library = "/utils/client_side_routing"
|
|
tag = "useClientSideRouting"
|
|
|
|
def add_hooks(self) -> list[str]:
|
|
"""Get the hooks to render.
|
|
|
|
Returns:
|
|
The useClientSideRouting hook.
|
|
"""
|
|
return [f"const {constants.ROUTE_NOT_FOUND} = {self.tag}()"]
|
|
|
|
def render(self) -> str:
|
|
"""Render the component.
|
|
|
|
Returns:
|
|
Empty string, because this component is only used for its hooks.
|
|
"""
|
|
return ""
|
|
|
|
|
|
def wait_for_client_redirect(component) -> Component:
|
|
"""Wait for a redirect to occur before rendering a component.
|
|
|
|
This prevents the 404 page from flashing while the redirect is happening.
|
|
|
|
Args:
|
|
component: The component to render after the redirect.
|
|
|
|
Returns:
|
|
The conditionally rendered component.
|
|
"""
|
|
return cond(
|
|
condition=route_not_found,
|
|
c1=component,
|
|
c2=ClientSideRouting.create(),
|
|
)
|
|
|
|
|
|
class Default404Page(Component):
|
|
"""The NextJS default 404 page."""
|
|
|
|
library = "next/error"
|
|
tag = "Error"
|
|
is_default = True
|
|
|
|
status_code: Var[int] = 404 # type: ignore
|