Skip to content

Commit be95692

Browse files
committed
Move dark mode to context provider
1 parent 2fd0f8d commit be95692

File tree

8 files changed

+87
-65
lines changed

8 files changed

+87
-65
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"ext-imagick": "*",
99
"bacon/bacon-qr-code": "^3.0",
1010
"guzzlehttp/guzzle": "^7.8",
11-
"inertiajs/inertia-laravel": "2.x-dev",
11+
"inertiajs/inertia-laravel": "v2.0.0",
1212
"intervention/image": "^3.9",
1313
"laravel/framework": "^11.0",
1414
"laravel/horizon": "^v5.23",

composer.lock

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

package-lock.json

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { useDarkMode as useDarkModeCore, usePreferredDark } from '@reactuses/core'
2+
import { createContext, PropsWithChildren, useContext } from 'react'
3+
4+
type DarkModeProviderState = {
5+
isDarkMode: boolean
6+
setDarkMode: (darkMode: boolean) => void
7+
}
8+
9+
const initialState = {
10+
isDarkMode: false,
11+
setDarkMode: () => null,
12+
}
13+
14+
const DarkModeProviderContext = createContext<DarkModeProviderState>(initialState)
15+
16+
export function DarkModeProvider({ children, ...props }: PropsWithChildren) {
17+
const [isDarkMode, toggleDarkMode] = useDarkModeCore({
18+
classNameDark: 'dark',
19+
classNameLight: '',
20+
defaultValue: usePreferredDark(false),
21+
})
22+
23+
function setDarkMode(darkMode: boolean) {
24+
if (darkMode !== isDarkMode) {
25+
toggleDarkMode()
26+
}
27+
}
28+
29+
return (
30+
<DarkModeProviderContext.Provider {...props} value={{ isDarkMode: !!isDarkMode, setDarkMode }}>
31+
{children}
32+
</DarkModeProviderContext.Provider>
33+
)
34+
}
35+
36+
export function useDarkMode() {
37+
const context = useContext(DarkModeProviderContext)
38+
39+
if (context === undefined) {
40+
throw new Error('useDarkMode must be used within a DarkModeProvider')
41+
}
42+
43+
return context
44+
}

resources/js/Hooks/useTheme.ts

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

resources/js/Layouts/DefaultLayout.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { Toaster } from '@/Components/UI/Toaster'
22
import { useLocale } from '@/Hooks/useLocale'
3-
import { useTheme } from '@/Hooks/useTheme'
43
import { PropsWithChildren } from 'react'
54

65
export function DefaultLayout({ children }: PropsWithChildren) {
76
useLocale()
8-
useTheme()
97

108
return (
119
<>

resources/js/Pages/Account/Partials/PreferencesForm.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { IconFlagFR } from '@/Components/Icons/IconFlagFR'
22
import { IconFlagGB } from '@/Components/Icons/IconFlagGB'
3+
import { useDarkMode } from '@/Components/Providers/DarkModeProvider'
34
import { SettingsGrid } from '@/Components/SettingsGrid'
45
import { Button } from '@/Components/UI/Button'
56
import {
@@ -21,7 +22,6 @@ import {
2122
import { Switch } from '@/Components/UI/Switch'
2223
import { useFormValidation } from '@/Hooks/useFormValidation'
2324
import { useLocale } from '@/Hooks/useLocale'
24-
import { useTheme } from '@/Hooks/useTheme'
2525
import { useToast } from '@/Hooks/useToast'
2626
import { zodResolver } from '@hookform/resolvers/zod'
2727
import { router } from '@inertiajs/react'
@@ -35,27 +35,27 @@ const formSchema = z.object({
3535
language: z.string(),
3636
})
3737

38-
export function ThemeForm() {
38+
export function DarkModeForm() {
3939
const { t } = useLaravelReactI18n()
4040

41-
const { isDarkTheme, toggleTheme } = useTheme()
41+
const { isDarkMode, setDarkMode } = useDarkMode()
4242

4343
const form = useForm({
4444
defaultValues: {
45-
use_dark_theme: isDarkTheme,
45+
use_dark_mode: isDarkMode,
4646
},
4747
})
4848

49-
function handleThemeChange() {
50-
toggleTheme()
49+
function handleDarkModeChange(useDarkMode: boolean) {
50+
setDarkMode(useDarkMode)
5151
}
5252

5353
return (
5454
<Form {...form}>
5555
<form className="mt-6 space-y-6">
5656
<FormField
5757
control={form.control}
58-
name="use_dark_theme"
58+
name="use_dark_mode"
5959
render={({ field }) => (
6060
<FormItem className="flex justify-between space-x-4">
6161
<div className="space-y-2">
@@ -65,10 +65,10 @@ export function ThemeForm() {
6565

6666
<FormControl>
6767
<Switch
68-
checked={isDarkTheme}
68+
checked={isDarkMode}
6969
onCheckedChange={(e) => {
7070
field.onChange(e)
71-
handleThemeChange()
71+
handleDarkModeChange(e)
7272
}}
7373
/>
7474
</FormControl>
@@ -144,7 +144,7 @@ export function PreferencesForm() {
144144
description={t('account.preferences_description')}
145145
title={t('account.preferences')}
146146
>
147-
<ThemeForm />
147+
<DarkModeForm />
148148

149149
<Form {...form}>
150150
<form onSubmit={form.handleSubmit(onSubmit)} className="mt-6 space-y-6">

resources/js/app.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DarkModeProvider } from '@/Components/Providers/DarkModeProvider'
12
import { DefaultLayout } from '@/Layouts/DefaultLayout'
23
import { createInertiaApp } from '@inertiajs/react'
34
import { LaravelReactI18nProvider } from 'laravel-react-i18n'
@@ -26,7 +27,9 @@ createInertiaApp({
2627
setup({ el, App, props }) {
2728
createRoot(el).render(
2829
<LaravelReactI18nProvider files={import.meta.glob('/lang/*.json')}>
29-
<App {...props} />
30+
<DarkModeProvider>
31+
<App {...props} />
32+
</DarkModeProvider>
3033
</LaravelReactI18nProvider>
3134
)
3235
},

0 commit comments

Comments
 (0)