Skip to content

Commit 0bbc043

Browse files
authored
Merge pull request #8 from react18-tools/patch/update-rgs
Patch/update rgs
2 parents 9139366 + 807465c commit 0bbc043

File tree

12 files changed

+100
-33
lines changed

12 files changed

+100
-33
lines changed

lib/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# nextjs-darkmode
22

3+
## 0.1.1
4+
5+
### Patch Changes
6+
7+
- 70a2236: Fix: FOUC
8+
39
## 0.1.0
410

511
### Minor Changes

lib/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "nextjs-darkmode",
33
"author": "Mayank Kumar Chaudhari <https://mayank-chaudhari.vercel.app>",
44
"private": false,
5-
"version": "0.1.0",
5+
"version": "0.1.1",
66
"description": "Unleash the Power of React Server Components! Use dark/light mode on your site with confidence, without losing any advantages of React Server Components",
77
"license": "MPL-2.0",
88
"main": "./dist/index.js",
@@ -67,7 +67,7 @@
6767
"vitest": "^1.6.0"
6868
},
6969
"dependencies": {
70-
"r18gs": "^1.0.2"
70+
"r18gs": "^1.1.0"
7171
},
7272
"peerDependencies": {
7373
"@types/react": "16.8 - 19",

lib/src/client/core/core.test.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { act, cleanup, fireEvent, render, renderHook } from "@testing-library/react";
22
import { afterEach, beforeEach, describe, test } from "vitest";
3-
import { ServerTarget } from "../../server";
43
import { Core } from "./core";
54
import { useMode } from "../../hooks";
6-
import { COOKIE_KEY, DARK, LIGHT, SYSTEM } from "../../constants";
5+
import { COOKIE_KEY, DARK, LIGHT, MEDIA } from "../../constants";
76

87
describe("theme-switcher", () => {
98
afterEach(cleanup);
@@ -35,5 +34,13 @@ describe("theme-switcher", () => {
3534
expect(hook.result.current.mode).toBe(DARK);
3635
});
3736

38-
test.todo("test media change event -- not supported by fireEvent");
37+
test("test media change event", async ({ expect }) => {
38+
const hook = renderHook(() => useMode());
39+
await act(() => {
40+
// globalThis.window.media = LIGHT as ResolvedScheme;
41+
// @ts-expect-error -- ok
42+
matchMedia(MEDIA).onchange?.();
43+
});
44+
expect(hook.result.current.mode).toBe(DARK);
45+
});
3946
});

lib/src/client/core/core.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { COOKIE_KEY, DARK, LIGHT, SYSTEM, modes } from "../../constants";
1+
import { COOKIE_KEY, DARK, LIGHT, MEDIA, SYSTEM, modes } from "../../constants";
22
import { ColorSchemePreference, Store, useStore } from "../../utils";
33
import { useEffect } from "react";
44

@@ -41,17 +41,11 @@ export const Core = ({ t, nonce }: CoreProps) => {
4141
const resolvedMode = mode === SYSTEM ? systemMode : mode; // resolvedMode is the actual mode that will be used
4242

4343
useEffect(() => {
44-
const media = matchMedia(`(prefers-color-scheme: ${DARK})`);
44+
const media = matchMedia(MEDIA);
4545
/** Updating media: prefers-color-scheme*/
4646
const updateSystemColorScheme = () =>
4747
setThemeState(state => ({ ...state, s: media.matches ? DARK : LIGHT }) as Store);
48-
updateSystemColorScheme();
4948
media.addEventListener("change", updateSystemColorScheme);
50-
51-
setThemeState(state => ({
52-
...state,
53-
m: (localStorage.getItem(COOKIE_KEY) ?? SYSTEM) as ColorSchemePreference,
54-
}));
5549
/** Sync the tabs */
5650
const storageListener = (e: StorageEvent): void => {
5751
if (e.key === COOKIE_KEY)

lib/src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ export const LIGHT: ColorSchemePreference = "light";
66

77
export const COOKIE_KEY = "gx";
88
export const modes: ColorSchemePreference[] = [SYSTEM, DARK, LIGHT];
9+
10+
export const MEDIA = `(prefers-color-scheme: ${DARK})`;

lib/src/utils.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import useRGS from "r18gs";
2-
import { DARK, SYSTEM } from "./constants";
2+
import { COOKIE_KEY, DARK, LIGHT, MEDIA, SYSTEM } from "./constants";
33

44
export type ColorSchemePreference = "system" | "dark" | "light";
55
export type ResolvedScheme = "dark" | "light";
@@ -14,4 +14,13 @@ const DEFAULT_STORE_VAL: Store = {
1414
};
1515

1616
/** local abstaction of RGS to avoid multiple imports */
17-
export const useStore = () => useRGS<Store>("ndm", DEFAULT_STORE_VAL);
17+
export const useStore = () =>
18+
useRGS<Store>("ndm", () =>
19+
typeof localStorage === "undefined"
20+
? /* v8 ignore next */
21+
DEFAULT_STORE_VAL
22+
: {
23+
m: (localStorage.getItem(COOKIE_KEY) ?? SYSTEM) as ColorSchemePreference,
24+
s: (matchMedia(MEDIA).matches ? DARK : LIGHT) as ResolvedScheme,
25+
},
26+
);

lib/vitest.setup.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { vi } from "vitest";
22

3+
const mediaListeners: (() => void)[] = [];
34
// mock matchMedia
45
Object.defineProperty(window, "matchMedia", {
56
writable: true,
67
value: vi.fn().mockImplementation((query: string) => ({
78
matches: query.includes(window.media),
89
media: query,
9-
onchange: null,
10-
addEventListener: vi.fn(),
11-
removeEventListener: vi.fn(),
10+
onchange() {
11+
this.matches = query.includes(window.media);
12+
mediaListeners.forEach(listener => listener());
13+
},
14+
addEventListener: (_: string, listener: () => void) => mediaListeners.push(listener),
15+
removeEventListener: (_: string, listener: () => void) =>
16+
mediaListeners.splice(mediaListeners.indexOf(listener), 1),
1217
dispatchEvent: vi.fn(),
1318
})),
1419
});

packages/shared/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# @repo/shared
22

3+
## 0.0.5
4+
5+
### Patch Changes
6+
7+
- Updated dependencies [70a2236]
8+
- nextjs-darkmode@0.1.1
9+
310
## 0.0.4
411

512
### Patch Changes

packages/shared/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@repo/shared",
3-
"version": "0.0.4",
3+
"version": "0.0.5",
44
"private": true,
55
"sideEffects": false,
66
"main": "./dist/index.js",
@@ -42,7 +42,7 @@
4242
"@repo/scripts": "workspace:*",
4343
"nextjs-darkmode": "workspace:*",
4444
"nextjs-themes": "^3.1.1",
45-
"r18gs": "^1.0.2",
45+
"r18gs": "^1.1.0",
4646
"react-live": "^4.1.6",
4747
"react18-loaders": "^1.1.1"
4848
},

packages/shared/vitest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default defineConfig({
88
test: {
99
environment: "jsdom",
1010
globals: true,
11-
setupFiles: [],
11+
setupFiles: ["vitest.setup.ts"],
1212
coverage: {
1313
include: ["src/**"],
1414
exclude: ["src/**/index.ts", "src/**/declaration.d.ts"],

0 commit comments

Comments
 (0)