Skip to content

Commit 3e4e0de

Browse files
Add gr.BrowserState change event (#10245)
* changes * changes * add changeset * format * changes --------- Co-authored-by: gradio-pr-bot <[email protected]>
1 parent 3f19210 commit 3e4e0de

File tree

7 files changed

+35
-4
lines changed

7 files changed

+35
-4
lines changed

.changeset/solid-moments-mate.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@gradio/browserstate": minor
3+
"gradio": minor
4+
---
5+
6+
feat:Add `gr.BrowserState` change event

demo/browserstate/run.ipynb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: browserstate"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import random\n", "import string\n", "import gradio as gr\n", "\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"Your Username and Password will get saved in the browser's local storage. \"\n", " \"If you refresh the page, the values will be retained.\")\n", " username = gr.Textbox(label=\"Username\")\n", " password = gr.Textbox(label=\"Password\", type=\"password\")\n", " btn = gr.Button(\"Generate Randomly\")\n", " local_storage = gr.BrowserState([\"\", \"\"])\n", "\n", " @btn.click(outputs=[username, password])\n", " def generate_randomly():\n", " u = \"\".join(random.choices(string.ascii_letters + string.digits, k=10))\n", " p = \"\".join(random.choices(string.ascii_letters + string.digits, k=10))\n", " return u, p\n", "\n", " @demo.load(inputs=[local_storage], outputs=[username, password])\n", " def load_from_local_storage(saved_values):\n", " print(\"loading from local storage\", saved_values)\n", " return saved_values[0], saved_values[1]\n", "\n", " @gr.on([username.change, password.change], inputs=[username, password], outputs=[local_storage])\n", " def save_to_local_storage(username, password):\n", " return [username, password]\n", "\n", "demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
1+
{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: browserstate"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import random\n", "import string\n", "import gradio as gr\n", "import time\n", "with gr.Blocks() as demo:\n", " gr.Markdown(\"Your Username and Password will get saved in the browser's local storage. \"\n", " \"If you refresh the page, the values will be retained.\")\n", " username = gr.Textbox(label=\"Username\")\n", " password = gr.Textbox(label=\"Password\", type=\"password\")\n", " btn = gr.Button(\"Generate Randomly\")\n", " local_storage = gr.BrowserState([\"\", \"\"])\n", " saved_message = gr.Markdown(\"\u2705 Saved to local storage\", visible=False)\n", "\n", " @btn.click(outputs=[username, password])\n", " def generate_randomly():\n", " u = \"\".join(random.choices(string.ascii_letters + string.digits, k=10))\n", " p = \"\".join(random.choices(string.ascii_letters + string.digits, k=10))\n", " return u, p\n", "\n", " @demo.load(inputs=[local_storage], outputs=[username, password])\n", " def load_from_local_storage(saved_values):\n", " print(\"loading from local storage\", saved_values)\n", " return saved_values[0], saved_values[1]\n", "\n", " @gr.on([username.change, password.change], inputs=[username, password], outputs=[local_storage])\n", " def save_to_local_storage(username, password):\n", " return [username, password]\n", "\n", " @gr.on(local_storage.change, outputs=[saved_message])\n", " def show_saved_message():\n", " timestamp = time.strftime(\"%I:%M:%S %p\")\n", " return gr.Markdown(\n", " f\"\u2705 Saved to local storage at {timestamp}\",\n", " visible=True\n", " )\n", "\n", "demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}

demo/browserstate/run.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import random
22
import string
33
import gradio as gr
4-
4+
import time
55
with gr.Blocks() as demo:
66
gr.Markdown("Your Username and Password will get saved in the browser's local storage. "
77
"If you refresh the page, the values will be retained.")
88
username = gr.Textbox(label="Username")
99
password = gr.Textbox(label="Password", type="password")
1010
btn = gr.Button("Generate Randomly")
1111
local_storage = gr.BrowserState(["", ""])
12+
saved_message = gr.Markdown("✅ Saved to local storage", visible=False)
1213

1314
@btn.click(outputs=[username, password])
1415
def generate_randomly():
@@ -25,4 +26,12 @@ def load_from_local_storage(saved_values):
2526
def save_to_local_storage(username, password):
2627
return [username, password]
2728

29+
@gr.on(local_storage.change, outputs=[saved_message])
30+
def show_saved_message():
31+
timestamp = time.strftime("%I:%M:%S %p")
32+
return gr.Markdown(
33+
f"✅ Saved to local storage at {timestamp}",
34+
visible=True
35+
)
36+
2837
demo.launch()

gradio/components/browser_state.py

+2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
from gradio_client.documentation import document
1010

1111
from gradio.components.base import Component
12+
from gradio.events import Events
1213

1314

1415
@document()
1516
class BrowserState(Component):
17+
EVENTS = [Events.change]
1618
"""
1719
Special component that stores state in the browser's localStorage in an encrypted format.
1820
"""

js/browserstate/Index.svelte

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import { beforeUpdate } from "svelte";
55
import { encrypt, decrypt } from "./crypto";
66
import { dequal } from "dequal/lite";
7+
import type { Gradio } from "@gradio/utils";
78
89
export let storage_key: string;
910
export let secret: string;
1011
export let default_value: any;
1112
export let value = default_value;
1213
let initialized = false;
1314
let old_value = value;
15+
export let gradio: Gradio<{
16+
change: never;
17+
}>;
1418
1519
function load_value(): void {
1620
const stored = localStorage.getItem(storage_key);
@@ -40,7 +44,13 @@
4044
}
4145
}
4246
43-
$: value && !dequal(value, old_value) && save_value();
47+
$: value &&
48+
(() => {
49+
if (!dequal(value, old_value)) {
50+
save_value();
51+
gradio.dispatch("change");
52+
}
53+
})();
4454
4555
beforeUpdate(() => {
4656
if (!initialized) {

js/browserstate/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
},
1818
"dependencies": {
1919
"dequal": "^2.0.2",
20-
"crypto-js": "^4.1.1"
20+
"crypto-js": "^4.1.1",
21+
"@gradio/utils": "workspace:^"
2122
},
2223
"peerDependencies": {
2324
"svelte": "^4.0.0"

pnpm-lock.yaml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)