Skip to content

Commit 4023ff6

Browse files
authored
Merge pull request #45 from react18-tools/alpha
Optimize, and minify
2 parents 3f6b994 + 94e0b7d commit 4023ff6

File tree

10 files changed

+64
-73
lines changed

10 files changed

+64
-73
lines changed

.github/workflows/docs.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,11 @@ jobs:
2929
git pull
3030
- run: npm i -g pnpm && pnpm i --no-frozen-lockfile
3131
name: Install dependencies
32-
- name: Test
33-
run: npm test
3432
- run: git stash --include-untracked
3533
name: clean up working directory
3634
- run: npx @turbo/codemod update . && pnpm update --latest -r
3735
name: Update dependencies
38-
- run: pnpm build
36+
- run: pnpm build --filter @examples/app
3937
name: Build all apps to make sure it is not broken due to dependency upgrades
4038
- name: Run unit tests
4139
run: pnpm test

lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@
134134
"vitest": "^2.1.8"
135135
},
136136
"dependencies": {
137-
"r18gs": "3.0.1"
137+
"r18gs": "2.0.2"
138138
},
139139
"peerDependencies": {
140140
"@types/react": "16.8 - 19",

lib/src/client/force-color-scheme/force-color-scheme.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"use client";
22
import { useEffect } from "react";
3-
import { useForcedStore } from "../../store";
3+
import { useThemeStore } from "../../store";
44
import { ColorSchemeType } from "../../types";
55

66
/** Force color scheme on a page */
77
export const ForceColorScheme = (props: {
88
colorScheme: ColorSchemeType;
99
targetSelector?: string;
1010
}) => {
11-
const [_, setState] = useForcedStore(props.targetSelector);
11+
const [_, setState] = useThemeStore(props.targetSelector);
1212
useEffect(() => {
1313
setState(state => ({ ...state, fc: props.colorScheme }));
1414
return () => {

lib/src/client/force-theme/force-theme.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"use client";
22
import { useEffect } from "react";
3-
import { useForcedStore } from "../../store";
3+
import { useThemeStore } from "../../store";
44

55
/** Force theme on a page */
66
export const ForceTheme = (props: { theme: string; targetSelector?: string }) => {
7-
const [_, setState] = useForcedStore(props.targetSelector);
7+
const [_, setState] = useThemeStore(props.targetSelector);
88
useEffect(() => {
99
setState(state => ({ ...state, f: props.theme }));
1010
return () => {

lib/src/client/switcher/switcher.tsx

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import { useEffect } from "react";
21
import { ThemeSwitcherProps } from "../theme-switcher";
32
import { DARK, DEFAULT_ID, LIGHT } from "../../constants";
4-
import { useForcedStore, useThemeStore } from "../../store";
3+
import { UNDEFINED, useThemeStore } from "../../store";
54
import type { ResolveFunc, UpdateDOMFunc, UpdateForcedPropsFunc } from "../theme-switcher/no-fouc";
65

76
let media: MediaQueryList;
87
let updateDOM: UpdateDOMFunc;
98
let resolveTheme: ResolveFunc;
109
let updateForcedProps: UpdateForcedPropsFunc;
11-
let updateForcedState: UpdateForcedPropsFunc;
1210

1311
/** disable transition while switching theme */
1412
const modifyTransition = (themeTransition = "none") => {
@@ -44,35 +42,24 @@ export const Switcher = ({
4442
const k = targetSelector || "#" + DEFAULT_ID;
4543

4644
const [state, setState] = useThemeStore(targetSelector);
47-
const [forced] = useForcedStore(targetSelector);
4845

49-
useEffect(() => {
50-
if (typeof m !== "undefined")
51-
[media, updateDOM, resolveTheme, updateForcedProps, updateForcedState] = [m, u, r, f, g];
46+
if (typeof m != UNDEFINED && !updateForcedProps) {
47+
[media, updateDOM, resolveTheme, updateForcedProps] = [m, u, r, f];
5248

5349
media.addEventListener("change", () =>
5450
setState(state => ({ ...state, s: media.matches ? DARK : LIGHT })),
5551
);
5652
addEventListener("storage", e => {
5753
if (e.key === k) setState(state => ({ ...state, ...JSON.parse(e.newValue || "{}") }));
5854
});
59-
}, []);
60-
61-
useEffect(() => {
55+
}
56+
if (updateForcedProps) {
57+
updateForcedProps(forcedTheme, forcedColorScheme);
6258
const restoreThansitions = modifyTransition(themeTransition);
6359
updateDOM(resolveTheme(state), k);
6460
restoreThansitions();
65-
localStorage.setItem(k, JSON.stringify(state));
66-
}, [state]);
67-
68-
useEffect(() => {
69-
updateForcedProps(forcedTheme, forcedColorScheme);
70-
updateDOM(resolveTheme(state), k);
71-
}, [forcedColorScheme, forcedTheme]);
72-
73-
useEffect(() => {
74-
updateForcedState(forced.f, forced.fc);
75-
updateDOM(resolveTheme(state), k);
76-
}, [forced]);
61+
const { f, fc, ...others } = state;
62+
localStorage.setItem(k, JSON.stringify(others));
63+
}
7764
return null;
7865
};

lib/src/client/theme-switcher/no-fouc.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ declare global {
2020
var r: ResolveFunc;
2121
// skipcq: JS-0102, JS-C1002, JS-0239
2222
var f: UpdateForcedPropsFunc;
23-
// skipcq: JS-0102, JS-C1002, JS-0239 update forcedState
24-
var g: UpdateForcedPropsFunc;
2523
}
2624

2725
export type ScriptArgs = [
@@ -70,13 +68,10 @@ export const noFOUCScript = (
7068
forcedColorScheme = forcedColorSchemeProp_ = forcedColorSchemeProp;
7169
};
7270

73-
window.g = (forcedThemeState, forcedColorSchemeState) => {
74-
forcedTheme = forcedThemeProps_ ?? forcedThemeState;
75-
forcedColorScheme = forcedColorSchemeProp_ ?? forcedColorSchemeState;
76-
};
77-
7871
f(forcedTheme_, forcedColorScheme_);
7972
window.r = (store: ThemeStoreType) => {
73+
forcedTheme = forcedThemeProps_ ?? store.f;
74+
forcedColorScheme = forcedColorSchemeProp_ ?? store.fc;
8075
const colorSchemePref = forcedColorScheme ?? store.c;
8176
const colorScheme = colorSchemePref === initialState.c ? store.s : colorSchemePref;
8277
const theme = colorScheme === "" ? store.t : colorScheme === initialState.d ? store.d : store.l;

lib/src/client/theme-switcher/theme-switcher.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ColorSchemeType } from "../../types";
22
import { noFOUCScript, type ScriptArgs } from "./no-fouc";
3-
import { initialState } from "../../store";
3+
import { initialState, UNDEFINED } from "../../store";
44
import { DEFAULT_ID } from "../../constants";
55
import { Switcher } from "../switcher";
66

@@ -53,7 +53,7 @@ const Script = ({
5353
forcedColorScheme,
5454
] as ScriptArgs;
5555
// handle client side exceptions when script is not run. <- for client side apps like vite or CRA
56-
typeof window !== "undefined" && noFOUCScript(...args);
56+
typeof window != UNDEFINED && noFOUCScript(...args);
5757
return (
5858
<script
5959
// skipcq: JS-0440

lib/src/hooks/use-theme.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { useEffect } from "react";
2-
import { useForcedStore, useThemeStore } from "../store";
1+
import { UNDEFINED, useThemeStore } from "../store";
32
import { ResolveFunc } from "../client/theme-switcher/no-fouc";
43
import { ColorSchemeType, ResolvedColorSchemeType } from "../types";
54
import { DARK, LIGHT, SYSTEM } from "../constants";
@@ -37,10 +36,7 @@ export interface UseThemeYield {
3736

3837
export const useTheme = (targetSelector?: string): UseThemeYield => {
3938
const [state, setState] = useThemeStore(targetSelector);
40-
const [_, setForcedState] = useForcedStore(targetSelector);
41-
useEffect(() => {
42-
resolveTheme = window.r;
43-
}, []);
39+
if (!resolveTheme && typeof window != UNDEFINED) resolveTheme = window.r;
4440

4541
/** helper */
4642
const setter =
@@ -67,8 +63,8 @@ export const useTheme = (targetSelector?: string): UseThemeYield => {
6763
if (index === -1 || (skipSystem && index === len - 1)) index = 0;
6864
setter("c")(colorSchemes[(index + 1) % len]);
6965
},
70-
setForcedColorScheme: fc => setForcedState(state => ({ ...state, fc })),
71-
setForcedTheme: f => setForcedState(state => ({ ...state, f })),
66+
setForcedColorScheme: setter<ColorSchemeType>("fc"),
67+
setForcedTheme: setter<string>("f"),
7268
};
7369

7470
if (resolveTheme) {

lib/src/store.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ export interface ThemeStoreType {
1414
c: ColorSchemeType;
1515
/** systemColorScheme */
1616
s: ResolvedColorSchemeType;
17+
18+
/** forced theme */
19+
f?: string;
20+
/** forced colorScheme */
21+
fc?: ColorSchemeType;
1722
}
1823

1924
/** @internal */
@@ -25,23 +30,13 @@ export const initialState: ThemeStoreType = {
2530
s: LIGHT,
2631
};
2732

33+
export const UNDEFINED = "undefined";
34+
2835
/** @internal store */
2936
export const useThemeStore = (targetSelector?: string) => {
3037
const key = targetSelector ?? "#" + DEFAULT_ID;
3138
return useRGS<ThemeStoreType>(key, () => {
32-
const str = typeof m !== "undefined" && localStorage.getItem(key);
39+
const str = typeof m !== UNDEFINED && localStorage.getItem(key);
3340
return str ? { ...JSON.parse(str), s: m.matches ? DARK : LIGHT } : initialState;
3441
});
3542
};
36-
37-
/** @internal */
38-
export interface ForcedStoreType {
39-
/** forced theme */ f?: string;
40-
/** forced colorScheme */ fc?: ColorSchemeType;
41-
}
42-
43-
/** @internal */
44-
export const useForcedStore = (targetSelector?: string) => {
45-
const key = `${targetSelector ?? `#${DEFAULT_ID}`}-`;
46-
return useRGS<ForcedStoreType>(key, {});
47-
};

pnpm-lock.yaml

Lines changed: 33 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)