import gradio as gr # shared state token_received = {"status": False, "token": "", "client_id": ""} # 1) this will be called by POST def receive_token(accessToken: str, client_id: str): token_received["status"] = True token_received["token"] = accessToken token_received["client_id"] = client_id return {"status": "ok"} # 2) this just drives your UI def check_status(): return "✅ Code received" if token_received["status"] else "❌ Code not received" def show_token(): return token_received["token"] if token_received["status"] else "" def show_client_id(): return token_received["client_id"] if token_received["status"] else "" def reset_status(): token_received["status"] = False token_received["token"] = "" token_received["client_id"] = "" return "❌ Code not received", "", "" with gr.Blocks() as demo: hidden_token = gr.Textbox(visible=False, elem_id="hidden_token") hidden_client_id = gr.Textbox(visible=False, elem_id="hidden_client_id") hidden_btn = gr.Button(visible=False, elem_id="hidden_btn") hidden_btn.click(fn=receive_token, inputs=[hidden_token, hidden_client_id], outputs=[]) status_box = gr.Textbox(value=check_status(), label="Token Status", interactive=False) token_display = gr.Textbox(value=show_token(), label="Received Token", interactive=False) client_id_display = gr.Textbox(value=show_client_id(), label="Client ID", interactive=False) with gr.Row(): refresh = gr.Button("Refresh").click(fn=check_status, outputs=status_box) reset = gr.Button("Reset Status").click(fn=reset_status, outputs=[status_box, token_display, client_id_display]) # ✅ Correct usage of Timer timer = gr.Timer(1.0) timer.tick(fn=show_token, outputs=token_display) timer.tick(fn=show_client_id, outputs=client_id_display) demo.launch(server_name="0.0.0.0", server_port=7860)