1919
2020
2121@component
22- def session_manager (child : Any ):
22+ def root_manager (child : Any ):
23+ scope = hooks .use_connection ().scope
24+ _ , set_rerender = hooks .use_state (uuid4 )
25+
26+ @hooks .use_effect (dependencies = [])
27+ def setup_asgi_scope ():
28+ """Store trigger functions in the websocket scope so that ReactPy-Django's hooks can command
29+ any relevant actions."""
30+ scope ["reactpy" ]["rerender" ] = rerender
31+
32+ async def rerender ():
33+ """Event that can force a rerender of the entire component tree."""
34+ set_rerender (uuid4 ())
35+
36+ return child
37+
38+
39+ @component
40+ def session_manager ():
2341 """This component can force the client (browser) to switch HTTP sessions,
2442 making it match the websocket session.
2543
2644 Used to force persistent authentication between Django's websocket and HTTP stack."""
2745 from reactpy_django import config
2846
2947 synchronize_requested , set_synchronize_requested = hooks .use_state (False )
30- _ , set_rerender = hooks .use_state (uuid4 )
3148 uuid = hooks .use_ref ("" )
3249 scope = hooks .use_connection ().scope
3350
3451 @hooks .use_effect (dependencies = [])
3552 def setup_asgi_scope ():
3653 """Store trigger functions in the websocket scope so that ReactPy-Django's hooks can command
3754 any relevant actions."""
38- scope .setdefault ("reactpy" , {})
3955 scope ["reactpy" ]["synchronize_session" ] = synchronize_session
40- scope ["reactpy" ]["rerender" ] = rerender
4156
4257 @hooks .use_effect (dependencies = [synchronize_requested ])
4358 async def synchronize_session_watchdog ():
@@ -86,15 +101,10 @@ async def synchronize_session_callback(status_code: int, response: str):
86101 f"Client returned unexpected HTTP status code ({ status_code } ) while trying to sychronize sessions." ,
87102 )
88103
89- async def rerender ():
90- """Event that can force a rerender of the entire component tree."""
91- set_rerender (uuid4 ())
92-
93104 # If needed, synchronize sessions by configuring all relevant session cookies.
94105 # This is achieved by commanding the client to perform a HTTP request to our session manager endpoint.
95- http_request = None
96106 if synchronize_requested :
97- http_request = HttpRequest (
107+ return HttpRequest (
98108 {
99109 "method" : "GET" ,
100110 "url" : reverse ("reactpy:session_manager" , args = [uuid .current ]),
@@ -103,4 +113,4 @@ async def rerender():
103113 },
104114 )
105115
106- return html . _ ( child , http_request )
116+ return None
0 commit comments