Skip to content

Commit

Permalink
chore: fix storybook switch theme hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
naporin0624 committed Feb 20, 2025
1 parent 851cd28 commit 58f5578
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 20 deletions.
2 changes: 1 addition & 1 deletion .storybook/theme-decorator.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useLayoutEffect } from 'react'
import { ThemeProvider } from 'styled-components'
import { useDarkMode } from './use-dark-mode'
import { light, dark } from '@charcoal-ui/theme'
import { useDarkMode } from './use-dark-mode'
import { TokenInjector, themeSelector, themeSetter } from '@charcoal-ui/styled'

import '../packages/theme/src/unstable-css/_variables_dark.css'
Expand Down
27 changes: 8 additions & 19 deletions .storybook/use-dark-mode.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,23 @@
import { useState, useEffect } from 'react'
import { useEffect, useState } from 'react'
import { addons } from '@storybook/preview-api'

const DARK_MODE_EVENT_NAME = 'DARK_MODE'

// https://github.com/storybookjs/storybook/issues/28758
export const useDarkMode = () => {
const [isDark, setIsDark] = useState(
document.documentElement.classList.contains('dark')
addons.getChannel().last(DARK_MODE_EVENT_NAME).at(0) ?? false

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > theme/Token v2 Demo > Styled

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > theme/Token v2 Demo > Tailwind

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Default

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Primary

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Navigation

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Overlay

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Danger

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Small

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > FullWidth

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22

Check failure on line 9 in .storybook/use-dark-mode.ts

View workflow job for this annotation

GitHub Actions / test

.storybook/storybook.test.ts > Storybook Tests > react/Button > Disabled

TypeError: Cannot read properties of undefined (reading 'at') ❯ Module.useDarkMode .storybook/use-dark-mode.ts:9:50 ❯ Theme .storybook/theme-decorator.tsx:14:22 ❯ renderWithHooks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:5608:18 ❯ mountIndeterminateComponent node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:9884:13 ❯ beginWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11351:16 ❯ performUnitOfWork node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15850:12 ❯ workLoopSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15784:5 ❯ renderRootSync node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15756:7 ❯ performSyncWorkOnRoot node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:15461:20 ❯ flushSyncCallbacks node_modules/.pnpm/react-test-renderer@18.3.1_react@18.3.1/node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2597:22
)

// document の class 属性の変化を監視してダークモード状態を更新
useEffect(() => {
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.attributeName === 'class') {
setIsDark(document.documentElement.classList.contains('dark'))
break
}
}
})
observer.observe(document.documentElement, { attributes: true })
return () => observer.disconnect()
}, [])

// Storybook の DARK_MODE イベントを監視
useEffect(() => {
const chan = addons.getChannel()
chan.on(DARK_MODE_EVENT_NAME, setIsDark)
const handler = (isDark: boolean) => {
setIsDark(isDark)
}

chan.on(DARK_MODE_EVENT_NAME, handler)
return () => {
chan.off(DARK_MODE_EVENT_NAME, setIsDark)
chan.off(DARK_MODE_EVENT_NAME, handler)
}
}, [])

Expand Down

0 comments on commit 58f5578

Please sign in to comment.