reflex/pynecone/components/layout/cond.py
Nikhil Rao 7ec4b3f8fe
Improve component docs (#35)
* Update component docstrings
* Remove transitions libs
* Add span component
* Add lock files
2022-12-07 15:04:49 -08:00

76 lines
2.0 KiB
Python

"""Create a list of components from an iterable."""
from __future__ import annotations
from typing import Optional
import pydantic
from pynecone.components.component import Component
from pynecone.components.layout.box import Box
from pynecone.components.tags import CondTag, Tag
from pynecone.var import Var
class Cond(Component):
"""Render one of two components based on a condition."""
# The cond to determine which component to render.
cond: Var[bool]
# The component to render if the cond is true.
comp1: Component
# The component to render if the cond is false.
comp2: Component
# Whether the cond is within another cond.
is_nested: bool = False
@pydantic.validator("cond")
def validate_cond(cls, cond: Var) -> Var:
"""Validate that the cond is a boolean.
Args:
cond: The cond to validate.
Returns:
The validated cond.
"""
assert issubclass(cond.type_, bool), "The var must be a boolean."
return cond
@classmethod
def create(
cls, cond: Var, comp1: Component, comp2: Optional[Component] = None
) -> Cond:
"""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.
"""
if comp2 is None:
comp2 = Box.create()
if isinstance(comp1, Cond):
comp1.is_nested = True
if isinstance(comp2, Cond):
comp2.is_nested = True
return cls(
cond=cond,
comp1=comp1,
comp2=comp2,
children=[comp1, comp2],
) # type: ignore
def _render(self) -> Tag:
return CondTag(
cond=self.cond,
true_value=self.comp1.render(),
false_value=self.comp2.render(),
is_nested=self.is_nested,
)