[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 <m_github@0x26.net>
This commit is contained in:
Elijah Ahianyo 2024-06-28 13:57:34 -07:00 committed by GitHub
parent a6bdaf1bbe
commit 8f2cbb5ea1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 30 additions and 4 deletions

View File

@ -311,6 +311,7 @@ async def test_client_side_state(
assert not driver.get_cookies() assert not driver.get_cookies()
local_storage_items = local_storage.items() local_storage_items = local_storage.items()
local_storage_items.pop("chakra-ui-color-mode", None) local_storage_items.pop("chakra-ui-color-mode", None)
local_storage_items.pop("last_compiled_time", None)
assert not local_storage_items assert not local_storage_items
# set some cookies and local storage values # set some cookies and local storage values
@ -426,6 +427,7 @@ async def test_client_side_state(
local_storage_items = local_storage.items() local_storage_items = local_storage.items()
local_storage_items.pop("chakra-ui-color-mode", None) local_storage_items.pop("chakra-ui-color-mode", None)
local_storage_items.pop("last_compiled_time", None)
assert ( assert (
local_storage_items.pop("state.client_side_state.client_side_sub_state.l1") local_storage_items.pop("state.client_side_state.client_side_sub_state.l1")
== "l1 value" == "l1 value"

View File

@ -8,7 +8,6 @@ import '/styles/styles.css'
import { EventLoopProvider, StateProvider, defaultColorMode } from "/utils/context.js"; import { EventLoopProvider, StateProvider, defaultColorMode } from "/utils/context.js";
import { ThemeProvider } from 'next-themes' import { ThemeProvider } from 'next-themes'
{% for custom_code in custom_codes %} {% for custom_code in custom_codes %}
{{custom_code}} {{custom_code}}
{% endfor %} {% endfor %}

View File

@ -64,6 +64,8 @@ export const initialEvents = () => []
export const isDevMode = {{ is_dev_mode|json_dumps }} export const isDevMode = {{ is_dev_mode|json_dumps }}
export const lastCompiledTimeStamp = {{ last_compiled_time|json_dumps }}
export function UploadFilesProvider({ children }) { export function UploadFilesProvider({ children }) {
const [filesById, setFilesById] = useState({}) const [filesById, setFilesById] = useState({})
refs["__clear_selected_files"] = (id) => setFilesById(filesById => { refs["__clear_selected_files"] = (id) => setFilesById(filesById => {

View File

@ -1,6 +1,11 @@
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { ColorModeContext, defaultColorMode } from "/utils/context.js"; import {
ColorModeContext,
defaultColorMode,
isDevMode,
lastCompiledTimeStamp
} from "/utils/context.js";
export default function RadixThemesColorModeProvider({ children }) { export default function RadixThemesColorModeProvider({ children }) {
const { theme, resolvedTheme, setTheme } = useTheme(); const { theme, resolvedTheme, setTheme } = useTheme();
@ -8,6 +13,19 @@ export default function RadixThemesColorModeProvider({ children }) {
const [resolvedColorMode, setResolvedColorMode] = useState("dark"); const [resolvedColorMode, setResolvedColorMode] = useState("dark");
useEffect(() => { useEffect(() => {
if (isDevMode) {
const lastCompiledTimeInLocalStorage =
localStorage.getItem("last_compiled_time");
if (
lastCompiledTimeInLocalStorage &&
lastCompiledTimeInLocalStorage !== lastCompiledTimeStamp
) {
// on app startup, make sure the application color mode is persisted correctly.
setTheme(defaultColorMode);
localStorage.setItem("last_compiled_time", lastCompiledTimeStamp);
return;
}
}
setRawColorMode(theme); setRawColorMode(theme);
setResolvedColorMode(resolvedTheme); setResolvedColorMode(resolvedTheme);
}, [theme, resolvedTheme]); }, [theme, resolvedTheme]);
@ -19,7 +37,7 @@ export default function RadixThemesColorModeProvider({ children }) {
const allowedModes = ["light", "dark", "system"]; const allowedModes = ["light", "dark", "system"];
if (!allowedModes.includes(mode)) { if (!allowedModes.includes(mode)) {
console.error( console.error(
`Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".` `Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`,
); );
mode = defaultColorMode; mode = defaultColorMode;
} }

View File

@ -3,6 +3,7 @@
from __future__ import annotations from __future__ import annotations
import os import os
from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Dict, Iterable, Optional, Type, Union from typing import Dict, Iterable, Optional, Type, Union
@ -79,20 +80,24 @@ def _compile_contexts(state: Optional[Type[BaseState]], theme: Component | None)
The compiled context file. The compiled context file.
""" """
appearance = getattr(theme, "appearance", None) appearance = getattr(theme, "appearance", None)
if appearance is None: if appearance is None or Var.create_safe(appearance)._var_name == "inherit":
appearance = SYSTEM_COLOR_MODE appearance = SYSTEM_COLOR_MODE
last_compiled_time = str(datetime.now())
return ( return (
templates.CONTEXT.render( templates.CONTEXT.render(
initial_state=utils.compile_state(state), initial_state=utils.compile_state(state),
state_name=state.get_name(), state_name=state.get_name(),
client_storage=utils.compile_client_storage(state), client_storage=utils.compile_client_storage(state),
is_dev_mode=not is_prod_mode(), is_dev_mode=not is_prod_mode(),
last_compiled_time=last_compiled_time,
default_color_mode=appearance, default_color_mode=appearance,
) )
if state if state
else templates.CONTEXT.render( else templates.CONTEXT.render(
is_dev_mode=not is_prod_mode(), is_dev_mode=not is_prod_mode(),
default_color_mode=appearance, default_color_mode=appearance,
last_compiled_time=last_compiled_time,
) )
) )