Compare commits

..

2 Commits

Author SHA1 Message Date
Masen Furer
98f50811f9
Override react-is@19.0.0 for recharts compatibility (#4857)
See https://github.com/recharts/recharts/issues/4558 for details.
2025-02-21 16:11:40 -08:00
Khaleel Al-Adhami
ee03415894
fix autoscroll on stateful children (#4858) 2025-02-21 15:09:25 -08:00
5 changed files with 18 additions and 58 deletions

View File

@ -15,7 +15,13 @@
"devDependencies": {
{% for package, version in dev_dependencies.items() %}
"{{ package }}": "{{ version }}"{% if not loop.last %},{% endif %}
{% endfor %}
},
"overrides": {
{% for package, version in overrides.items() %}
"{{ package }}": "{{ version }}"{% if not loop.last %},{% endif %}
{% endfor %}
}
}

View File

@ -11,7 +11,9 @@ from reflex.vars.base import Var, get_unique_variable_name
class AutoScroll(Div):
"""A div that automatically scrolls to the bottom when new content is added."""
_memoization_mode = MemoizationMode(disposition=MemoizationDisposition.ALWAYS)
_memoization_mode = MemoizationMode(
disposition=MemoizationDisposition.ALWAYS, recursive=False
)
@classmethod
def create(cls, *children, **props):
@ -44,7 +46,6 @@ class AutoScroll(Div):
"""
ref_name = self.get_ref()
return [
"const containerRef = useRef(null);",
"const wasNearBottom = useRef(false);",
"const hadScrollbar = useRef(false);",
f"""
@ -85,6 +86,8 @@ useEffect(() => {{
const container = {ref_name}.current;
if (!container) return;
scrollToBottomIfNeeded();
// Create ResizeObserver to detect height changes
const resizeObserver = new ResizeObserver(() => {{
scrollToBottomIfNeeded();

View File

@ -195,3 +195,7 @@ class PackageJson(SimpleNamespace):
"postcss": "8.5.1",
"postcss-import": "16.1.0",
}
OVERRIDES = {
# This should always match the `react` version in DEPENDENCIES for recharts compatibility.
"react-is": "19.0.0"
}

View File

@ -846,6 +846,7 @@ def _compile_package_json():
},
dependencies=constants.PackageJson.DEPENDENCIES,
dev_dependencies=constants.PackageJson.DEV_DEPENDENCIES,
overrides=constants.PackageJson.OVERRIDES,
)

View File

@ -17,11 +17,7 @@ from typing import (
)
from reflex.constants.base import Dirs
from reflex.utils.exceptions import (
PrimitiveUnserializableToJSONError,
VarTypeError,
VarValueError,
)
from reflex.utils.exceptions import PrimitiveUnserializableToJSONError, VarTypeError
from reflex.utils.imports import ImportDict, ImportVar
from .base import (
@ -534,56 +530,6 @@ class NumberVar(Var[NUMBER_T], python_types=(int, float)):
"""
return issubclass(self._var_type, int)
def __format__(self, format_spec: str) -> str:
"""Format the number.
Args:
format_spec: The format specifier.
Returns:
The formatted number.
Raises:
VarValueError: If the format specifier is not supported.
"""
if (
format_spec
and format_spec[-1] == "f"
and format_spec[0] == "."
and format_spec[1:-1].isdigit()
):
how_many_decimals = int(format_spec[1:-1])
return (
f"{get_decimal_string_operation(self, Var.create(how_many_decimals))}"
)
if format_spec:
raise VarValueError(
(
"Unknown format code '{}' for object of type 'NumberVar'. It is only supported to use '.f' for float numbers."
"If possible, use computed variables instead: https://reflex.dev/docs/vars/computed-vars/"
).format(format_spec)
)
return super().__format__(format_spec)
@var_operation
def get_decimal_string_operation(value: NumberVar, decimals: NumberVar):
"""Get the decimal string of the number.
Args:
value: The number.
decimals: The number of decimals.
Returns:
The decimal string of the number.
"""
return var_operation_return(
js_expression=f"({value}.toFixed({decimals}))",
var_type=str,
)
def binary_number_operation(
func: Callable[[NumberVar, NumberVar], str],