Skip to content

Commit 3504643

Browse files
committed
refactor: move useColorModes
1 parent 307e9f5 commit 3504643

File tree

3 files changed

+22
-50
lines changed

3 files changed

+22
-50
lines changed

src/App.js

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,9 @@
11
import React, { Suspense, useEffect } from 'react'
22
import { HashRouter, Route, Routes } from 'react-router-dom'
3-
import { useDispatch, useSelector } from 'react-redux'
43

5-
import { CSpinner } from '@coreui/react'
4+
import { CSpinner, useColorModes } from '@coreui/react'
65
import './scss/style.scss'
76

8-
const loading = (
9-
<div className="pt-3 text-center">
10-
<CSpinner color="primary" variant="grow" />
11-
</div>
12-
)
13-
14-
const getPreferredTheme = (storedTheme) => {
15-
if (storedTheme) {
16-
return storedTheme
17-
}
18-
19-
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
20-
}
21-
22-
const setTheme = (theme) => {
23-
document.documentElement.dataset.coreuiTheme =
24-
theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : theme
25-
}
26-
277
// Containers
288
const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout'))
299

@@ -34,29 +14,24 @@ const Page404 = React.lazy(() => import('./views/pages/page404/Page404'))
3414
const Page500 = React.lazy(() => import('./views/pages/page500/Page500'))
3515

3616
const App = () => {
37-
const dispatch = useDispatch()
38-
const theme = useSelector((state) => state.theme)
17+
const { setColorMode } = useColorModes('coreui-free-react-admin-template-theme')
3918
const urlParams = new URLSearchParams(window.location.href.split('?')[1])
4019

4120
useEffect(() => {
4221
if (urlParams.get('theme')) {
43-
dispatch({ type: 'setTheme', theme: urlParams.get('theme') })
22+
setColorMode(urlParams.get('theme'))
4423
}
45-
46-
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
47-
if (theme !== 'light' || theme !== 'dark') {
48-
setTheme(getPreferredTheme(theme))
49-
}
50-
})
5124
}, [])
5225

53-
useEffect(() => {
54-
setTheme(getPreferredTheme(theme))
55-
}, [theme])
56-
5726
return (
5827
<HashRouter>
59-
<Suspense fallback={loading}>
28+
<Suspense
29+
fallback={
30+
<div className="pt-3 text-center">
31+
<CSpinner color="primary" variant="grow" />
32+
</div>
33+
}
34+
>
6035
<Routes>
6136
<Route exact path="/login" name="Login Page" element={<Login />} />
6237
<Route exact path="/register" name="Register Page" element={<Register />} />

src/components/AppHeader.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
CHeaderToggler,
1515
CNavLink,
1616
CNavItem,
17+
useColorModes,
1718
} from '@coreui/react'
1819
import CIcon from '@coreui/icons-react'
1920
import {
@@ -31,9 +32,11 @@ import { AppHeaderDropdown } from './header/index'
3132
import { logo } from 'src/assets/brand/logo'
3233

3334
const AppHeader = () => {
35+
const { getColorMode, setColorMode } = useColorModes('coreui-free-react-admin-template-theme')
36+
const colorMode = getColorMode()
37+
3438
const dispatch = useDispatch()
3539
const sidebarShow = useSelector((state) => state.sidebarShow)
36-
const theme = useSelector((state) => state.theme)
3740

3841
return (
3942
<CHeader position="sticky" className="mb-4">
@@ -81,39 +84,39 @@ const AppHeader = () => {
8184
</li>
8285
<CDropdown variant="nav-item" placement="bottom-end">
8386
<CDropdownToggle caret={false}>
84-
{theme === 'dark' ? (
87+
{colorMode === 'dark' ? (
8588
<CIcon icon={cilMoon} size="xl" />
86-
) : theme === 'auto' ? (
89+
) : colorMode === 'auto' ? (
8790
<CIcon icon={cilContrast} size="xl" />
8891
) : (
8992
<CIcon icon={cilSun} size="xl" />
9093
)}
9194
</CDropdownToggle>
9295
<CDropdownMenu>
9396
<CDropdownItem
94-
active={theme === 'light'}
97+
active={colorMode === 'light'}
9598
className="d-flex align-items-center"
9699
component="button"
97100
type="button"
98-
onClick={() => dispatch({ type: 'setTheme', theme: 'light' })}
101+
onClick={() => setColorMode('light')}
99102
>
100103
<CIcon className="me-2" icon={cilSun} size="lg" /> Light
101104
</CDropdownItem>
102105
<CDropdownItem
103-
active={theme === 'dark'}
106+
active={colorMode === 'dark'}
104107
className="d-flex align-items-center"
105108
component="button"
106109
type="button"
107-
onClick={() => dispatch({ type: 'setTheme', theme: 'dark' })}
110+
onClick={() => setColorMode('dark')}
108111
>
109112
<CIcon className="me-2" icon={cilMoon} size="lg" /> Dark
110113
</CDropdownItem>
111114
<CDropdownItem
112-
active={theme === 'auto'}
115+
active={colorMode === 'auto'}
113116
className="d-flex align-items-center"
114117
component="button"
115118
type="button"
116-
onClick={() => dispatch({ type: 'setTheme', theme: 'auto' })}
119+
onClick={() => setColorMode('auto')}
117120
>
118121
<CIcon className="me-2" icon={cilContrast} size="lg" /> Auto
119122
</CDropdownItem>

src/store.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,10 @@ import { createStore } from 'redux'
22

33
const initialState = {
44
sidebarShow: true,
5-
theme: localStorage.getItem('coreui-free-react-admin-template-theme') ?? 'light',
65
}
76

87
const changeState = (state = initialState, { type, ...rest }) => {
98
switch (type) {
10-
case 'setTheme':
11-
const event = new Event('ColorSchemeChange')
12-
document.documentElement.dispatchEvent(event)
13-
localStorage.setItem('coreui-free-react-admin-template-theme', rest.theme)
14-
return { ...state, ...rest }
159
case 'set':
1610
return { ...state, ...rest }
1711
default:

0 commit comments

Comments
 (0)