hooks.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """Add standard Hooks wrapper for React."""
  2. from __future__ import annotations
  3. from reflex.utils.imports import ImportVar
  4. from reflex.vars import Var, VarData
  5. def _compose_react_imports(tags: list[str]) -> dict[str, list[ImportVar]]:
  6. return {"react": [ImportVar(tag=tag, install=False) for tag in tags]}
  7. def const(name, value) -> Var:
  8. """Create a constant Var.
  9. Args:
  10. name: The name of the constant.
  11. value: The value of the constant.
  12. Returns:
  13. The constant Var.
  14. """
  15. if isinstance(name, list):
  16. return Var.create_safe(
  17. f"const [{', '.join(name)}] = {value}", _var_is_string=False
  18. )
  19. return Var.create_safe(f"const {name} = {value}", _var_is_string=False)
  20. def useCallback(func, deps) -> Var:
  21. """Create a useCallback hook with a function and dependencies.
  22. Args:
  23. func: The function to wrap.
  24. deps: The dependencies of the function.
  25. Returns:
  26. The useCallback hook.
  27. """
  28. return Var.create_safe(
  29. f"useCallback({func}, {deps})" if deps else f"useCallback({func})",
  30. _var_is_string=False,
  31. _var_data=VarData(imports=_compose_react_imports(["useCallback"])),
  32. )
  33. def useContext(context) -> Var:
  34. """Create a useContext hook with a context.
  35. Args:
  36. context: The context to use.
  37. Returns:
  38. The useContext hook.
  39. """
  40. return Var.create_safe(
  41. f"useContext({context})",
  42. _var_is_string=False,
  43. _var_data=VarData(imports=_compose_react_imports(["useContext"])),
  44. )
  45. def useRef(default) -> Var:
  46. """Create a useRef hook with a default value.
  47. Args:
  48. default: The default value of the ref.
  49. Returns:
  50. The useRef hook.
  51. """
  52. return Var.create_safe(
  53. f"useRef({default})",
  54. _var_is_string=False,
  55. _var_data=VarData(imports=_compose_react_imports(["useRef"])),
  56. )
  57. def useState(var_name, default=None) -> Var:
  58. """Create a useState hook with a variable name and setter name.
  59. Args:
  60. var_name: The name of the variable.
  61. default: The default value of the variable.
  62. Returns:
  63. A useState hook.
  64. """
  65. return const(
  66. [var_name, f"set{var_name.capitalize()}"],
  67. Var.create_safe(
  68. f"useState({default})",
  69. _var_is_string=False,
  70. _var_data=VarData(imports=_compose_react_imports(["useState"])),
  71. ),
  72. )