Skip to content

Commit 81c263d

Browse files
committed
cleaning up and fixing light/dark mode
1 parent a97c32d commit 81c263d

File tree

5 files changed

+42
-56
lines changed

5 files changed

+42
-56
lines changed

resources/js/app.tsx

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import '../css/app.css';
2-
import './bootstrap';
32

43
import {
54
createInertiaApp
@@ -10,27 +9,9 @@ import {
109
import {
1110
createRoot
1211
} from 'react-dom/client';
12+
import { initializeTheme } from './hooks/use-appearance';
1313

14-
const appName =
15-
import.meta.env.VITE_APP_NAME || 'Laravel';
16-
17-
18-
/*
19-
* Dark/Light Mode Initialization
20-
* - This needs to be added to every page so that way the correct appearance is loaded
21-
*/
22-
(function() {
23-
const savedAppearance = localStorage.getItem('appearance') || 'system';
24-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
25-
26-
const isDark =
27-
savedAppearance === 'dark' ||
28-
(savedAppearance === 'system' && prefersDark);
29-
30-
if (isDark) {
31-
document.documentElement.classList.add('dark');
32-
}
33-
})();
14+
const appName = import.meta.env.VITE_APP_NAME || 'Laravel';
3415

3516
createInertiaApp({
3617
title: (title) => `${title} - ${appName}`,
@@ -39,11 +20,7 @@ createInertiaApp({
3920
`./pages/${name}.tsx`,
4021
import.meta.glob('./pages/**/*.tsx'),
4122
),
42-
setup({
43-
el,
44-
App,
45-
props
46-
}) {
23+
setup({ el, App, props }) {
4724
const root = createRoot(el);
4825

4926
root.render(<App {
@@ -54,4 +31,7 @@ createInertiaApp({
5431
progress: {
5532
color: '#4B5563',
5633
},
57-
});
34+
});
35+
36+
// This will set dark/light mode on load
37+
initializeTheme();

resources/js/bootstrap.js

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

resources/js/hooks/use-appearance.tsx

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,43 @@ import { useState, useEffect } from 'react';
22

33
export type Appearance = 'light' | 'dark' | 'system';
44

5-
export function useAppearance() {
6-
const [appearance, setAppearance] = useState<Appearance>('system');
7-
8-
const prefersDark = () =>
5+
const prefersDark = () =>
96
window.matchMedia('(prefers-color-scheme: dark)').matches;
107

11-
const applyTheme = (mode: Appearance) => {
12-
const isDark = mode === 'dark' || (mode === 'system' && prefersDark());
8+
const applyTheme = (appearance: Appearance) => {
9+
const isDark =
10+
appearance === 'dark' ||
11+
(appearance === 'system' && prefersDark());
12+
1313
document.documentElement.classList.toggle('dark', isDark);
14-
};
14+
}
1515

16-
const updateAppearance = (mode: Appearance) => {
17-
setAppearance(mode);
18-
localStorage.setItem('appearance', mode);
19-
applyTheme(mode);
20-
};
16+
export function initializeTheme() {
17+
const savedAppearance = localStorage.getItem('appearance') as Appearance || 'system';
18+
applyTheme(savedAppearance);
19+
}
2120

22-
useEffect(() => {
23-
const savedAppearance = localStorage.getItem('appearance') as Appearance;
24-
updateAppearance(savedAppearance || 'system');
21+
export function useAppearance() {
22+
const [appearance, setAppearance] = useState<Appearance>('system');
2523

26-
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
27-
const handleChange = () => {
28-
if (appearance === 'system') applyTheme('system');
24+
const updateAppearance = (mode: Appearance) => {
25+
setAppearance(mode);
26+
localStorage.setItem('appearance', mode);
27+
applyTheme(mode);
2928
};
3029

31-
mediaQuery.addEventListener('change', handleChange);
32-
return () => mediaQuery.removeEventListener('change', handleChange);
33-
}, []);
30+
useEffect(() => {
31+
const savedAppearance = localStorage.getItem('appearance') as Appearance;
32+
updateAppearance(savedAppearance || 'system');
33+
34+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
35+
const handleChange = () => {
36+
if (appearance === 'system') applyTheme('system');
37+
};
38+
39+
mediaQuery.addEventListener('change', handleChange);
40+
return () => mediaQuery.removeEventListener('change', handleChange);
41+
}, []);
3442

35-
return { appearance, updateAppearance };
43+
return { appearance, updateAppearance };
3644
}

resources/js/pages/auth/confirm-password.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ export default function ConfirmPassword() {
2222
};
2323

2424
return (
25-
<AuthLayout title="Confirm Your Password" description="This is a secure area of the application. Please confirm your
26-
password before continuing">
25+
<AuthLayout
26+
title="Confirm Your Password"
27+
description="This is a secure area of the application. Please confirm your password before continuing"
28+
>
2729
<Head title="Confirm Password" />
2830

2931

resources/js/pages/auth/login.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export default function Login({
5151
<Head title="Log in" />
5252

5353
{status && (
54-
<div className="mb-4 text-sm font-medium text-green-600">
54+
<div className="mb-4 text-sm font-medium text-center text-green-600">
5555
{status}
5656
</div>
5757
)}

0 commit comments

Comments
 (0)