why not, remove cond

This commit is contained in:
Khaleel Al-Adhami 2025-01-17 16:27:30 -08:00
parent 392c5b5a69
commit b7579f4d8d
8 changed files with 9 additions and 124 deletions

View File

@ -932,7 +932,6 @@ class Component(BaseComponent, ABC):
"""
from reflex.components.base.bare import Bare
from reflex.components.base.fragment import Fragment
from reflex.components.core.cond import Cond
from reflex.components.core.foreach import Foreach
no_valid_parents_defined = all(child._valid_parents == [] for child in children)
@ -944,7 +943,7 @@ class Component(BaseComponent, ABC):
return
comp_name = type(self).__name__
allowed_components = [comp.__name__ for comp in (Fragment, Foreach, Cond)]
allowed_components = [comp.__name__ for comp in (Fragment, Foreach)]
def validate_child(child):
child_name = type(child).__name__
@ -954,10 +953,6 @@ class Component(BaseComponent, ABC):
for c in child.children:
validate_child(c)
if isinstance(child, Cond):
validate_child(child.comp1)
validate_child(child.comp2)
if (
isinstance(child, Bare)
and child.contents is not None
@ -2063,13 +2058,10 @@ class StatefulComponent(BaseComponent):
The Var from the child component or the child itself (for regular cases).
"""
from reflex.components.base.bare import Bare
from reflex.components.core.cond import Cond
from reflex.components.core.foreach import Foreach
if isinstance(child, Bare):
return child.contents
if isinstance(child, Cond):
return child.cond
if isinstance(child, Foreach):
return child.iterable
return child

View File

@ -21,7 +21,7 @@ _SUBMOD_ATTRS: dict[str, list[str]] = {
"colors": [
"color",
],
"cond": ["Cond", "color_mode_cond", "cond"],
"cond": ["color_mode_cond", "cond"],
"debounce": ["DebounceInput", "debounce_input"],
"foreach": [
"foreach",

View File

@ -17,7 +17,6 @@ from .breakpoints import set_breakpoints as set_breakpoints
from .clipboard import Clipboard as Clipboard
from .clipboard import clipboard as clipboard
from .colors import color as color
from .cond import Cond as Cond
from .cond import color_mode_cond as color_mode_cond
from .cond import cond as cond
from .debounce import DebounceInput as DebounceInput

View File

@ -2,115 +2,16 @@
from __future__ import annotations
from typing import Any, Dict, Optional, overload
from typing import Any, overload
from reflex.components.base.fragment import Fragment
from reflex.components.component import BaseComponent, Component, MemoizationLeaf
from reflex.components.tags import CondTag, Tag
from reflex.constants import Dirs
from reflex.components.component import BaseComponent, Component
from reflex.style import LIGHT_COLOR_MODE, resolved_color_mode
from reflex.utils.imports import ImportDict, ImportVar
from reflex.utils.types import infallible_issubclass
from reflex.vars import VarData
from reflex.vars.base import LiteralVar, ReflexCallable, Var
from reflex.vars.function import ArgsFunctionOperation
from reflex.vars.number import ternary_operation
_IS_TRUE_IMPORT: ImportDict = {
f"$/{Dirs.STATE_PATH}": [ImportVar(tag="isTrue")],
}
class Cond(MemoizationLeaf):
"""Render one of two components based on a condition."""
# The cond to determine which component to render.
cond: Var[Any]
# The component to render if the cond is true.
comp1: BaseComponent = None # type: ignore
# The component to render if the cond is false.
comp2: BaseComponent = None # type: ignore
@classmethod
def create(
cls,
cond: Var,
comp1: BaseComponent,
comp2: Optional[BaseComponent] = None,
) -> Component:
"""Create a conditional component.
Args:
cond: The cond to determine which component to render.
comp1: The component to render if the cond is true.
comp2: The component to render if the cond is false.
Returns:
The conditional component.
"""
# Wrap everything in fragments.
if type(comp1).__name__ != "Fragment":
comp1 = Fragment.create(comp1)
if comp2 is None or type(comp2).__name__ != "Fragment":
comp2 = Fragment.create(comp2) if comp2 else Fragment.create()
return Fragment.create(
cls(
cond=cond,
comp1=comp1,
comp2=comp2,
children=[comp1, comp2],
)
)
def _get_props_imports(self):
"""Get the imports needed for component's props.
Returns:
The imports for the component's props of the component.
"""
return []
def _render(self) -> Tag:
return CondTag(
cond=self.cond,
true_value=self.comp1.render(),
false_value=self.comp2.render(),
)
def render(self) -> Dict:
"""Render the component.
Returns:
The dictionary for template of component.
"""
tag = self._render()
return dict(
tag.add_props(
**self.event_triggers,
key=self.key,
sx=self.style,
id=self.id,
class_name=self.class_name,
).set(
props=tag.format_props(),
),
cond_state=f"isTrue({self.cond!s})",
)
def add_imports(self) -> ImportDict:
"""Add imports for the Cond component.
Returns:
The import dict for the component.
"""
var_data = VarData.merge(self.cond._get_all_var_data())
imports = var_data.old_school_imports() if var_data else {}
return {**imports, **_IS_TRUE_IMPORT}
@overload
def cond(condition: Any, c1: Component, c2: Any = None) -> Component: ...

View File

@ -40,7 +40,7 @@ DEFAULT_LIGHT_ICON: Icon = Icon.create(tag="sun")
DEFAULT_DARK_ICON: Icon = Icon.create(tag="moon")
def icon(
def color_mode_icon(
light_component: BaseComponent | None = None,
dark_component: BaseComponent | None = None,
):
@ -145,7 +145,7 @@ class ColorModeIconButton(IconButton):
return dropdown_menu.root(
dropdown_menu.trigger(
super().create(
icon(),
color_mode_icon(),
),
**props,
),
@ -156,7 +156,7 @@ class ColorModeIconButton(IconButton):
),
)
return IconButton.create(
icon(),
color_mode_icon(),
on_click=toggle_color_mode,
**props,
)
@ -190,7 +190,7 @@ class ColorModeSwitch(Switch):
class ColorModeNamespace(Var):
"""Namespace for color mode components."""
icon = icon
icon = color_mode_icon
button = staticmethod(ColorModeIconButton.create)
switch = staticmethod(ColorModeSwitch.create)

View File

@ -114,7 +114,6 @@ class IterTag(Tag):
"""
# Import here to avoid circular imports.
from reflex.components.base.fragment import Fragment
from reflex.components.core.cond import Cond
from reflex.components.core.foreach import Foreach
# Get the render function arguments.
@ -132,7 +131,7 @@ class IterTag(Tag):
component = self.render_fn(arg, index)
# Nested foreach components or cond must be wrapped in fragments.
if isinstance(component, (Foreach, Cond, Var)):
if isinstance(component, (Foreach, Var)):
component = Fragment.create(component)
# Set the component key.

View File

@ -1445,7 +1445,6 @@ def test_instantiate_all_components():
# These components all have required arguments and cannot be trivially instantiated.
untested_components = {
"Card",
"Cond",
"DebounceInput",
"Foreach",
"FormControl",

View File

@ -31,7 +31,6 @@ from reflex.app import (
)
from reflex.components import Component
from reflex.components.base.fragment import Fragment
from reflex.components.core.cond import Cond
from reflex.components.radix.themes.typography.text import Text
from reflex.event import Event, EventHandler
from reflex.middleware import HydrateMiddleware
@ -1228,10 +1227,6 @@ def test_overlay_component(
assert app.overlay_component is not None
generated_component = app._generate_component(app.overlay_component) # type: ignore
assert isinstance(generated_component, OverlayFragment)
assert isinstance(
generated_component.children[0],
Cond, # ConnectionModal is a Cond under the hood
)
else:
assert app.overlay_component is not None
assert isinstance(