diff --git a/reflex/.templates/web/utils/state.js b/reflex/.templates/web/utils/state.js index 417032912..dbd914cf0 100644 --- a/reflex/.templates/web/utils/state.js +++ b/reflex/.templates/web/utils/state.js @@ -40,7 +40,7 @@ const upload_controllers = {}; * Taken from: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid * @returns A UUID. */ -const generateUUID = () => { +export const generateUUID = () => { let d = new Date().getTime(), d2 = (performance && performance.now && performance.now() * 1000) || 0; return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { diff --git a/reflex/components/radix/primitives/accordion.py b/reflex/components/radix/primitives/accordion.py index 4394f1f30..607a9b8c0 100644 --- a/reflex/components/radix/primitives/accordion.py +++ b/reflex/components/radix/primitives/accordion.py @@ -15,7 +15,7 @@ from reflex.style import ( format_as_emotion, ) from reflex.utils import imports -from reflex.vars import BaseVar, Var, VarData, get_unique_variable_name +from reflex.vars import BaseVar, Var, VarData, get_uuid_string_var LiteralAccordionType = Literal["single", "multiple"] LiteralAccordionDir = Literal["ltr", "rtl"] @@ -515,7 +515,7 @@ class AccordionItem(AccordionComponent): The accordion item. """ # The item requires a value to toggle (use a random unique name if not provided). - value = props.pop("value", get_unique_variable_name()) + value = props.pop("value", get_uuid_string_var()) if "AccordionItem" not in ( cls_name := props.pop("class_name", "AccordionItem") diff --git a/reflex/components/radix/primitives/accordion.pyi b/reflex/components/radix/primitives/accordion.pyi index 457e53ee0..ec8fd1a91 100644 --- a/reflex/components/radix/primitives/accordion.pyi +++ b/reflex/components/radix/primitives/accordion.pyi @@ -19,7 +19,7 @@ from reflex.style import ( format_as_emotion, ) from reflex.utils import imports -from reflex.vars import BaseVar, Var, VarData, get_unique_variable_name +from reflex.vars import BaseVar, Var, VarData, get_uuid_string_var LiteralAccordionType = Literal["single", "multiple"] LiteralAccordionDir = Literal["ltr", "rtl"] diff --git a/reflex/vars.py b/reflex/vars.py index 83cdbcc7e..2bc0fc572 100644 --- a/reflex/vars.py +++ b/reflex/vars.py @@ -2003,3 +2003,20 @@ class CallableVar(BaseVar): The Var returned from calling the function. """ return self.fn(*args, **kwargs) + + +def get_uuid_string_var() -> Var: + """Return a var that generates UUIDs via .web/utils/state.js. + + Returns: + the var to generate UUIDs at runtime. + """ + from reflex.utils.imports import ImportVar + + unique_uuid_var_data = VarData( + imports={f"/{constants.Dirs.STATE_PATH}": {ImportVar(tag="generateUUID")}} # type: ignore + ) + + return BaseVar( + _var_name="generateUUID()", _var_type=str, _var_data=unique_uuid_var_data + ) diff --git a/reflex/vars.pyi b/reflex/vars.pyi index 80f4ad25f..048c99f40 100644 --- a/reflex/vars.pyi +++ b/reflex/vars.pyi @@ -157,3 +157,5 @@ def cached_var(fget: Callable[[Any], Any]) -> ComputedVar: ... class CallableVar(BaseVar): def __init__(self, fn: Callable[..., BaseVar]): ... def __call__(self, *args, **kwargs) -> BaseVar: ... + +def get_uuid_string_var() -> Var: ...