From 732459c9d2f8a6e12111f48aa55afcafbc075c8e Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 10 Dec 2024 09:47:56 -0800 Subject: [PATCH] If a Var is Optional, iterate over it as if it is not This is potentially dangerous because it will cause frontend exception if the value actually is null. --- reflex/components/core/foreach.py | 2 +- reflex/components/tags/iter_tag.py | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/reflex/components/core/foreach.py b/reflex/components/core/foreach.py index c9fbe5bc54a..ddca029801a 100644 --- a/reflex/components/core/foreach.py +++ b/reflex/components/core/foreach.py @@ -129,7 +129,7 @@ def render(self): iterable_state=str(tag.iterable), arg_name=tag.arg_var_name, arg_index=tag.get_index_var_arg(), - iterable_type=tag.iterable._var_type.mro()[0].__name__, + iterable_type=tag.get_iterable_var_type().__name__, ) diff --git a/reflex/components/tags/iter_tag.py b/reflex/components/tags/iter_tag.py index 38ecaf81c79..d68e9c9aae5 100644 --- a/reflex/components/tags/iter_tag.py +++ b/reflex/components/tags/iter_tag.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any, Callable, Iterable, Tuple, Type, Union, get_args from reflex.components.tags.tag import Tag +from reflex.utils.types import is_optional from reflex.vars import LiteralArrayVar, Var, get_unique_variable_name if TYPE_CHECKING: @@ -38,15 +39,18 @@ def get_iterable_var_type(self) -> Type: The type of the iterable var. """ iterable = self.iterable + var_type = iterable._var_type + if is_optional(var_type): + var_type = get_args(var_type)[0] try: - if iterable._var_type.mro()[0] is dict: + if var_type.mro()[0] is dict: # Arg is a tuple of (key, value). - return Tuple[get_args(iterable._var_type)] # type: ignore - elif iterable._var_type.mro()[0] is tuple: + return Tuple[get_args(var_type)] # type: ignore + elif var_type.mro()[0] is tuple: # Arg is a union of any possible values in the tuple. - return Union[get_args(iterable._var_type)] # type: ignore + return Union[get_args(var_type)] # type: ignore else: - return get_args(iterable._var_type)[0] + return get_args(var_type)[0] except Exception: return Any