8686from reflex .utils import codespaces , console , exceptions , format , prerequisites , types
8787from reflex .utils .exec import is_prod_mode , is_testing_env , should_skip_compile
8888from reflex .utils .imports import ImportVar
89+ from sitemap import serve_sitemap
8990
9091# Define custom types.
9192ComponentCallable = Callable [[], Component ]
@@ -270,6 +271,7 @@ def __init__(self, **kwargs):
270271 )
271272 super ().__init__ (** kwargs )
272273 base_state_subclasses = BaseState .__subclasses__ ()
274+ self .add_sitemap ()
273275
274276 # Special case to allow test cases have multiple subclasses of rx.BaseState.
275277 if not is_testing_env () and len (base_state_subclasses ) > 1 :
@@ -302,6 +304,11 @@ def __init__(self, **kwargs):
302304 from reflex .utils .compat import windows_hot_reload_lifespan_hack
303305
304306 self .register_lifespan_task (windows_hot_reload_lifespan_hack )
307+
308+ def add_sitemap (self ):
309+ @self .api .get ("/sitemap.xml" )
310+ async def sitemap ():
311+ return await serve_sitemap (self )
305312
306313 def _enable_state (self ) -> None :
307314 """Enable state for the app."""
@@ -462,6 +469,8 @@ def add_page(
462469 EventHandler | EventSpec | list [EventHandler | EventSpec ] | None
463470 ) = None ,
464471 meta : list [dict [str , str ]] = constants .DefaultPage .META_LIST ,
472+ sitemap_priority : Optional [float ] = None ,
473+ sitemap_changefreq : Optional [str ] = None ,
465474 ):
466475 """Add a page to the app.
467476
@@ -476,6 +485,8 @@ def add_page(
476485 image: The image to display on the page.
477486 on_load: The event handler(s) that will be called each time the page load.
478487 meta: The metadata of the page.
488+ sitemap_priority: sitemap priority
489+ sitemap_changefreq: sitemap change frequency
479490
480491 Raises:
481492 ValueError: When the specified route name already exists.
@@ -522,6 +533,19 @@ def add_page(
522533 if isinstance (component , tuple ):
523534 component = Fragment .create (* component )
524535
536+ # Set explicit sitemap attributes if provided
537+ if sitemap_priority is not None :
538+ component .sitemap_priority = sitemap_priority
539+ if sitemap_changefreq is not None :
540+ component .sitemap_changefreq = sitemap_changefreq
541+
542+ # Auto-detect priority if not explicitly set
543+ if not hasattr (component , 'sitemap_priority' ):
544+ component .sitemap_priority = self ._auto_detect_priority (route )
545+
546+ # Set default changefreq if not explicitly set
547+ if not hasattr (component , 'sitemap_changefreq' ):
548+ component .sitemap_changefreq = "weekly"
525549 # Ensure state is enabled if this page uses state.
526550 if self .state is None :
527551 if on_load or component ._has_stateful_event_triggers ():
@@ -567,6 +591,14 @@ def add_page(
567591 on_load = [on_load ]
568592 self .load_events [route ] = on_load
569593
594+
595+ def _auto_detect_priority (self , route : Optional [str ]) -> float :
596+ """Auto detect sitemap priority"""
597+ if route is None or route == "/" or route == "index" :
598+ return 1.0
599+ depth = route .count ("/" )
600+ return max (0.1 , 1.0 - (depth * 0.2 ))
601+
570602 def get_load_events (self , route : str ) -> list [EventHandler | EventSpec ]:
571603 """Get the load events for a route.
572604
0 commit comments