Handle Var passed to rx.toast
(#4405)
* Handle Var passed to `rx.toast` If the user provides a `Var` for `message` then apply it as `props["title"]` to avoid a var operations error. * remove unnecessary parentheses * remove weird hacks * get it right pyright --------- Co-authored-by: Khaleel Al-Adhami <khaleel.aladhami@gmail.com>
This commit is contained in:
parent
d4b197b517
commit
bbfbc82c9d
@ -15,6 +15,8 @@ from reflex.utils.imports import ImportVar
|
||||
from reflex.utils.serializers import serializer
|
||||
from reflex.vars import VarData
|
||||
from reflex.vars.base import LiteralVar, Var
|
||||
from reflex.vars.function import FunctionVar
|
||||
from reflex.vars.object import ObjectVar
|
||||
|
||||
LiteralPosition = Literal[
|
||||
"top-left",
|
||||
@ -232,7 +234,9 @@ class Toaster(Component):
|
||||
return [hook]
|
||||
|
||||
@staticmethod
|
||||
def send_toast(message: str = "", level: str | None = None, **props) -> EventSpec:
|
||||
def send_toast(
|
||||
message: str | Var = "", level: str | None = None, **props
|
||||
) -> EventSpec:
|
||||
"""Send a toast message.
|
||||
|
||||
Args:
|
||||
@ -250,20 +254,27 @@ class Toaster(Component):
|
||||
raise ValueError(
|
||||
"Toaster component must be created before sending a toast. (use `rx.toast.provider()`)"
|
||||
)
|
||||
toast_command = f"{toast_ref}.{level}" if level is not None else toast_ref
|
||||
if message == "" and ("title" not in props or "description" not in props):
|
||||
raise ValueError("Toast message or title or description must be provided.")
|
||||
if props:
|
||||
args = LiteralVar.create(ToastProps(component_name="rx.toast", **props)) # type: ignore
|
||||
toast = f"{toast_command}(`{message}`, {str(args)})"
|
||||
else:
|
||||
toast = f"{toast_command}(`{message}`)"
|
||||
|
||||
toast_action = Var(_js_expr=toast)
|
||||
return run_script(toast_action)
|
||||
toast_command = (
|
||||
ObjectVar.__getattr__(toast_ref.to(dict), level) if level else toast_ref
|
||||
).to(FunctionVar)
|
||||
|
||||
if isinstance(message, Var):
|
||||
props.setdefault("title", message)
|
||||
message = ""
|
||||
elif message == "" and "title" not in props and "description" not in props:
|
||||
raise ValueError("Toast message or title or description must be provided.")
|
||||
|
||||
if props:
|
||||
args = LiteralVar.create(ToastProps(component_name="rx.toast", **props)) # pyright: ignore [reportCallIssue, reportGeneralTypeIssues]
|
||||
toast = toast_command.call(message, args)
|
||||
else:
|
||||
toast = toast_command.call(message)
|
||||
|
||||
return run_script(toast)
|
||||
|
||||
@staticmethod
|
||||
def toast_info(message: str = "", **kwargs):
|
||||
def toast_info(message: str | Var = "", **kwargs):
|
||||
"""Display an info toast message.
|
||||
|
||||
Args:
|
||||
@ -276,7 +287,7 @@ class Toaster(Component):
|
||||
return Toaster.send_toast(message, level="info", **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def toast_warning(message: str = "", **kwargs):
|
||||
def toast_warning(message: str | Var = "", **kwargs):
|
||||
"""Display a warning toast message.
|
||||
|
||||
Args:
|
||||
@ -289,7 +300,7 @@ class Toaster(Component):
|
||||
return Toaster.send_toast(message, level="warning", **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def toast_error(message: str = "", **kwargs):
|
||||
def toast_error(message: str | Var = "", **kwargs):
|
||||
"""Display an error toast message.
|
||||
|
||||
Args:
|
||||
@ -302,7 +313,7 @@ class Toaster(Component):
|
||||
return Toaster.send_toast(message, level="error", **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def toast_success(message: str = "", **kwargs):
|
||||
def toast_success(message: str | Var = "", **kwargs):
|
||||
"""Display a success toast message.
|
||||
|
||||
Args:
|
||||
|
@ -59,16 +59,16 @@ class Toaster(Component):
|
||||
def add_hooks(self) -> list[Var | str]: ...
|
||||
@staticmethod
|
||||
def send_toast(
|
||||
message: str = "", level: str | None = None, **props
|
||||
message: str | Var = "", level: str | None = None, **props
|
||||
) -> EventSpec: ...
|
||||
@staticmethod
|
||||
def toast_info(message: str = "", **kwargs): ...
|
||||
def toast_info(message: str | Var = "", **kwargs): ...
|
||||
@staticmethod
|
||||
def toast_warning(message: str = "", **kwargs): ...
|
||||
def toast_warning(message: str | Var = "", **kwargs): ...
|
||||
@staticmethod
|
||||
def toast_error(message: str = "", **kwargs): ...
|
||||
def toast_error(message: str | Var = "", **kwargs): ...
|
||||
@staticmethod
|
||||
def toast_success(message: str = "", **kwargs): ...
|
||||
def toast_success(message: str | Var = "", **kwargs): ...
|
||||
@staticmethod
|
||||
def toast_dismiss(id: Var | str | None = None): ...
|
||||
@overload
|
||||
@ -176,7 +176,7 @@ class ToastNamespace(ComponentNamespace):
|
||||
|
||||
@staticmethod
|
||||
def __call__(
|
||||
message: str = "", level: Optional[str] = None, **props
|
||||
message: Union[str, Var] = "", level: Optional[str] = None, **props
|
||||
) -> "Optional[EventSpec]":
|
||||
"""Send a toast message.
|
||||
|
||||
|
@ -576,6 +576,10 @@ def _isinstance(obj: Any, cls: GenericType, nested: bool = False) -> bool:
|
||||
return does_obj_satisfy_typed_dict(obj, cls)
|
||||
return isinstance(obj, dict)
|
||||
|
||||
# cls is a float
|
||||
if cls is float:
|
||||
return isinstance(obj, (float, int))
|
||||
|
||||
# cls is a simple class
|
||||
return isinstance(obj, cls)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user