Skip to content

Commit 8f2cbb5

Browse files
[REF-2588]Clear color mode local storage for dev mode (#3548)
* Clear color mode local storage * use the last compiled time logic to determine when to clear local storage * precommit fix * app harness fix * run prettier on reflex/.templates/web/utils/helpers/color_mode.js * make sure last_compiled_time is updated for stateless apps as well. * set the chkara-ui-color-mode cookie instead of clearing it, so it is integrated in the app's useEffect cycle * fix CI * fix import formatting --------- Co-authored-by: Masen Furer <[email protected]>
1 parent a6bdaf1 commit 8f2cbb5

File tree

5 files changed

+30
-4
lines changed

5 files changed

+30
-4
lines changed

integration/test_client_storage.py

+2
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ def set_sub_sub(var: str, value: str):
311311
assert not driver.get_cookies()
312312
local_storage_items = local_storage.items()
313313
local_storage_items.pop("chakra-ui-color-mode", None)
314+
local_storage_items.pop("last_compiled_time", None)
314315
assert not local_storage_items
315316

316317
# set some cookies and local storage values
@@ -426,6 +427,7 @@ def set_sub_sub(var: str, value: str):
426427

427428
local_storage_items = local_storage.items()
428429
local_storage_items.pop("chakra-ui-color-mode", None)
430+
local_storage_items.pop("last_compiled_time", None)
429431
assert (
430432
local_storage_items.pop("state.client_side_state.client_side_sub_state.l1")
431433
== "l1 value"

reflex/.templates/jinja/web/pages/_app.js.jinja2

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import '/styles/styles.css'
88
import { EventLoopProvider, StateProvider, defaultColorMode } from "/utils/context.js";
99
import { ThemeProvider } from 'next-themes'
1010

11-
1211
{% for custom_code in custom_codes %}
1312
{{custom_code}}
1413
{% endfor %}

reflex/.templates/jinja/web/utils/context.js.jinja2

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ export const initialEvents = () => []
6464

6565
export const isDevMode = {{ is_dev_mode|json_dumps }}
6666

67+
export const lastCompiledTimeStamp = {{ last_compiled_time|json_dumps }}
68+
6769
export function UploadFilesProvider({ children }) {
6870
const [filesById, setFilesById] = useState({})
6971
refs["__clear_selected_files"] = (id) => setFilesById(filesById => {

reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
import { useTheme } from "next-themes";
22
import { useEffect, useState } from "react";
3-
import { ColorModeContext, defaultColorMode } from "/utils/context.js";
3+
import {
4+
ColorModeContext,
5+
defaultColorMode,
6+
isDevMode,
7+
lastCompiledTimeStamp
8+
} from "/utils/context.js";
49

510
export default function RadixThemesColorModeProvider({ children }) {
611
const { theme, resolvedTheme, setTheme } = useTheme();
712
const [rawColorMode, setRawColorMode] = useState(defaultColorMode);
813
const [resolvedColorMode, setResolvedColorMode] = useState("dark");
914

1015
useEffect(() => {
16+
if (isDevMode) {
17+
const lastCompiledTimeInLocalStorage =
18+
localStorage.getItem("last_compiled_time");
19+
if (
20+
lastCompiledTimeInLocalStorage &&
21+
lastCompiledTimeInLocalStorage !== lastCompiledTimeStamp
22+
) {
23+
// on app startup, make sure the application color mode is persisted correctly.
24+
setTheme(defaultColorMode);
25+
localStorage.setItem("last_compiled_time", lastCompiledTimeStamp);
26+
return;
27+
}
28+
}
1129
setRawColorMode(theme);
1230
setResolvedColorMode(resolvedTheme);
1331
}, [theme, resolvedTheme]);
@@ -19,7 +37,7 @@ export default function RadixThemesColorModeProvider({ children }) {
1937
const allowedModes = ["light", "dark", "system"];
2038
if (!allowedModes.includes(mode)) {
2139
console.error(
22-
`Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`
40+
`Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`,
2341
);
2442
mode = defaultColorMode;
2543
}

reflex/compiler/compiler.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import os
6+
from datetime import datetime
67
from pathlib import Path
78
from typing import Dict, Iterable, Optional, Type, Union
89

@@ -79,20 +80,24 @@ def _compile_contexts(state: Optional[Type[BaseState]], theme: Component | None)
7980
The compiled context file.
8081
"""
8182
appearance = getattr(theme, "appearance", None)
82-
if appearance is None:
83+
if appearance is None or Var.create_safe(appearance)._var_name == "inherit":
8384
appearance = SYSTEM_COLOR_MODE
85+
86+
last_compiled_time = str(datetime.now())
8487
return (
8588
templates.CONTEXT.render(
8689
initial_state=utils.compile_state(state),
8790
state_name=state.get_name(),
8891
client_storage=utils.compile_client_storage(state),
8992
is_dev_mode=not is_prod_mode(),
93+
last_compiled_time=last_compiled_time,
9094
default_color_mode=appearance,
9195
)
9296
if state
9397
else templates.CONTEXT.render(
9498
is_dev_mode=not is_prod_mode(),
9599
default_color_mode=appearance,
100+
last_compiled_time=last_compiled_time,
96101
)
97102
)
98103

0 commit comments

Comments
 (0)