Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
import { useTheme } from "$/utils/react-theme";
import { createElement, useEffect } from "react";
import { createElement, useCallback, useEffect, useMemo } from "react";
import { ColorModeContext, defaultColorMode } from "$/utils/context";

export default function RadixThemesColorModeProvider({ children }) {
const { theme, resolvedTheme, setTheme } = useTheme();

const toggleColorMode = () => {
const toggleColorMode = useCallback(() => {
setTheme(resolvedTheme === "light" ? "dark" : "light");
};
}, [resolvedTheme, setTheme]);

const setColorMode = (mode) => {
const allowedModes = ["light", "dark", "system"];
if (!allowedModes.includes(mode)) {
console.error(
`Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`,
);
mode = defaultColorMode;
}
setTheme(mode);
};
const setColorMode = useCallback(
(mode) => {
const allowedModes = ["light", "dark", "system"];
if (!allowedModes.includes(mode)) {
console.error(
`Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`,
);
mode = defaultColorMode;
}
setTheme(mode);
},
[setTheme],
);

useEffect(() => {
const radixRoot = document.querySelector(
Expand All @@ -30,16 +33,20 @@ export default function RadixThemesColorModeProvider({ children }) {
}
}, [resolvedTheme]);

return createElement(
ColorModeContext.Provider,
{
value: {
rawColorMode: theme,
resolvedColorMode: resolvedTheme,
toggleColorMode,
setColorMode,
},
},
children,
return useMemo(
() =>
createElement(
ColorModeContext.Provider,
{
value: {
rawColorMode: theme,
resolvedColorMode: resolvedTheme,
toggleColorMode,
setColorMode,
},
},
children,
),
[theme, resolvedTheme, toggleColorMode, setColorMode, children],
);
}
2 changes: 1 addition & 1 deletion reflex/.templates/web/utils/react-theme.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
return () => {
mediaQuery.removeEventListener("change", handleChange);
};
});
}, []);

// Save theme to localStorage whenever it changes
// Skip saving only if theme key already exists and we haven't initialized yet
Expand Down
2 changes: 1 addition & 1 deletion reflex/.templates/web/utils/state.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import JSON5 from "json5";
import env from "$/env.json";
import reflexEnvironment from "$/reflex.json";
import Cookies from "universal-cookie";
import { useCallback, useEffect, useRef, useState } from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused useMemo import

useMemo was added to this import but is never used anywhere in state.js. The useMemo usage for EventLoopProvider lives in the generated context template (templates.py), not in this file. This will cause lint warnings for unused imports.

Suggested change
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useCallback, useEffect, useRef, useState } from "react";

import {
useLocation,
useNavigate,
Expand Down
13 changes: 9 additions & 4 deletions reflex/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,15 @@ def default_error_boundary(*children: Component, **props) -> Component:
The default error_boundary, which is an ErrorBoundary.

"""
return ErrorBoundary.create(
*children,
**props,
)
from reflex.components.component import memo

def memoized_error_boundary():
return ErrorBoundary.create(
*children,
**props,
)

return Fragment.create(memo(memoized_error_boundary)())


@dataclasses.dataclass(frozen=True)
Expand Down
4 changes: 2 additions & 2 deletions reflex/compiler/templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,11 +395,11 @@ def context_template(
initialEvents,
clientStorage,
)
return createElement(
return useMemo(() => createElement(
EventLoopContext.Provider,
{{ value: [addEvents, connectErrors] }},
children
);
), [addEvents, connectErrors, children]);
}}

export function StateProvider({{ children }}) {{
Expand Down
Loading