Skip to content

Commit fbbec2a

Browse files
authored
chore: refactor theme and layout
1 parent 23daaec commit fbbec2a

File tree

17 files changed

+75
-143
lines changed

17 files changed

+75
-143
lines changed

src/App.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import './App.css'
22
import { routes } from './App.routes'
33
import { RouterProvider, createBrowserRouter } from 'react-router-dom'
4-
import { ThemeProvider } from './features/theme/context/theme-provider'
5-
import { LayoutProvider } from './features/layout/context/layout-provider'
64
import { TooltipProvider } from './features/common/components/tooltip'
75
import { SettingsProvider } from './features/settings/components/settings-provider'
86

97
const router = createBrowserRouter(routes)
108

119
function App() {
1210
return (
13-
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
11+
<SettingsProvider>
1412
<TooltipProvider>
15-
<SettingsProvider>
16-
<LayoutProvider>
17-
<RouterProvider router={router} />
18-
</LayoutProvider>
19-
</SettingsProvider>
13+
<RouterProvider router={router} />
2014
</TooltipProvider>
21-
</ThemeProvider>
15+
</SettingsProvider>
2216
)
2317
}
2418

src/features/layout/components/header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { cn } from '@/features/common/utils'
2-
import { ThemeToggle } from '@/features/theme/components/theme-toggle'
2+
import { ThemeToggle } from '@/features/settings/components/theme-toggle'
33
import { ConnectWallet } from './connect-wallet'
44
import { Search } from '@/features/search/components/search'
55
import { useNetworkConfig } from '@/features/settings/data'

src/features/layout/components/left-side-bar-menu.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import SvgHome from '@/features/common/components/icons/home'
88
import { Button } from '@/features/common/components/button'
99
import SvgChevronLeft from '@/features/common/components/icons/chevron-left'
1010
import { useCallback } from 'react'
11-
import { useLayout } from '../hooks/use-layout'
1211
import SvgChevronRight from '@/features/common/components/icons/chevron-right'
1312
import SvgCog from '@/features/common/components/icons/cog'
13+
import { useLayout } from '@/features/settings/data'
1414

1515
type Props = {
1616
className?: string
@@ -23,19 +23,21 @@ export function LeftSideBarMenu({ className }: Props) {
2323
{ urlTemplate: Urls.AppStudio, icon: <SvgCodeBlock />, text: 'App Studio' },
2424
{ urlTemplate: Urls.Settings, icon: <SvgCog />, text: 'Settings' },
2525
]
26-
const { isLeftSideBarExpanded, setIsLeftSideBarExpanded } = useLayout()
26+
const [layout, setLayout] = useLayout()
2727

2828
const toggleLeftSideBar = useCallback(
29-
() => setIsLeftSideBarExpanded(!isLeftSideBarExpanded),
30-
[isLeftSideBarExpanded, setIsLeftSideBarExpanded]
29+
() => setLayout((prev) => ({ ...prev, isLeftSideBarExpanded: !prev.isLeftSideBarExpanded })),
30+
[setLayout]
3131
)
3232

3333
return (
34-
<NavigationMenu className={cn('bg-card transition-all duration-300 min-h-screen', className, isLeftSideBarExpanded ? 'w-52' : 'w-10')}>
34+
<NavigationMenu
35+
className={cn('bg-card transition-all duration-300 min-h-screen', className, layout.isLeftSideBarExpanded ? 'w-52' : 'w-10')}
36+
>
3537
<NavigationMenuList className={cn('flex-col items-start')}>
3638
<NavigationMenuItem className={cn('flex justify-end')}>
3739
<Button variant="outline" size="icon" className={cn('text-primary')} onClick={toggleLeftSideBar}>
38-
{isLeftSideBarExpanded ? <SvgChevronLeft /> : <SvgChevronRight />}
40+
{layout.isLeftSideBarExpanded ? <SvgChevronLeft /> : <SvgChevronRight />}
3941
</Button>
4042
</NavigationMenuItem>
4143
{menuItems.map((menuItem, index) => (
@@ -46,7 +48,7 @@ export function LeftSideBarMenu({ className }: Props) {
4648
className={cn('[&.active]:text-primary flex items-center p-2 gap-2 min-h-10 pl-3 whitespace-nowrap')}
4749
>
4850
<div className={cn('text-primary')}>{menuItem.icon}</div>
49-
<div className={cn(isLeftSideBarExpanded ? 'visible delay-100' : 'invisible delay-100')}>{menuItem.text}</div>
51+
<div className={cn(layout.isLeftSideBarExpanded ? 'visible delay-100' : 'invisible delay-100')}>{menuItem.text}</div>
5052
</TemplatedNavLink>
5153
</NavigationMenuLink>
5254
</NavigationMenuItem>

src/features/layout/context/layout-provider.tsx

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/features/layout/hooks/use-layout.tsx

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/features/settings/components/settings-provider.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Provider, createStore } from 'jotai'
22
import { useNetworkConfig } from '../data/network'
33
import { useEffect } from 'react'
44
import { setNetwork } from '../../common/data'
5+
import { useTheme } from '../data'
56

67
type Props = {
78
children: React.ReactNode
@@ -11,12 +12,28 @@ export let dataStore = createStore()
1112

1213
export function SettingsProvider({ children }: Props) {
1314
const networkConfig = useNetworkConfig()
15+
const [theme] = useTheme()
1416

1517
useEffect(() => {
1618
setNetwork(networkConfig)
1719
dataStore = createStore()
1820
}, [networkConfig])
1921

22+
useEffect(() => {
23+
const root = window.document.documentElement
24+
25+
root.classList.remove('light', 'dark')
26+
27+
if (theme === 'system') {
28+
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
29+
30+
root.classList.add(systemTheme)
31+
return
32+
}
33+
34+
root.classList.add(theme)
35+
}, [theme])
36+
2037
return (
2138
<Provider key={networkConfig.id} store={dataStore}>
2239
{children}

src/features/settings/components/settings.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NetworkSelect } from '@/features/layout/components/network-select'
1+
import { NetworkSelect } from '@/features/settings/components/network-select'
22

33
export function Settings() {
44
return <NetworkSelect />

src/features/theme/components/theme-toggle.test.tsx renamed to src/features/settings/components/theme-toggle.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect } from 'vitest'
22
import { render, waitFor } from '@/tests/testing-library'
3-
import { ThemeToggle, themeTogglelabel } from '@/features/theme/components/theme-toggle'
3+
import { ThemeToggle, themeTogglelabel } from '@/features/settings/components/theme-toggle'
44
import { executeComponentTest } from '@/tests/test-component'
55

66
describe('when the theme is toggled to dark', () => {

0 commit comments

Comments
 (0)