Skip to content

Commit 0e9664e

Browse files
JoeyMckenzietnyleataylorotwell
authored
Use shadcn built-in check for sidebar state (#82)
* fix: use sidebar cookie for state * chore: rename sidebar cookie * Adding update to have sidebar open by default * Update HandleInertiaRequests.php --------- Co-authored-by: Tony Lea <[email protected]> Co-authored-by: Taylor Otwell <[email protected]>
1 parent bac572c commit 0e9664e

File tree

5 files changed

+8
-14
lines changed

5 files changed

+8
-14
lines changed

app/Http/Middleware/HandleInertiaRequests.php

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function share(Request $request): array
5050
...(new Ziggy)->toArray(),
5151
'location' => $request->url(),
5252
],
53+
'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true',
5354
];
5455
}
5556
}

bootstrap/app.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
health: '/up',
1515
)
1616
->withMiddleware(function (Middleware $middleware) {
17-
$middleware->encryptCookies(except: ['appearance']);
17+
$middleware->encryptCookies(except: ['appearance', 'sidebar_state']);
1818

1919
$middleware->web(append: [
2020
HandleAppearance::class,

resources/js/components/AppShell.vue

+4-12
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,22 @@
11
<script setup lang="ts">
22
import { SidebarProvider } from '@/components/ui/sidebar';
3-
import { onMounted, ref } from 'vue';
3+
import { usePage } from '@inertiajs/vue3';
4+
import { SharedData } from '@/types';
45
56
interface Props {
67
variant?: 'header' | 'sidebar';
78
}
89
910
defineProps<Props>();
1011
11-
const isOpen = ref(true);
12-
13-
onMounted(() => {
14-
isOpen.value = localStorage.getItem('sidebar') !== 'false';
15-
});
16-
17-
const handleSidebarChange = (open: boolean) => {
18-
isOpen.value = open;
19-
localStorage.setItem('sidebar', String(open));
20-
};
12+
const isOpen = usePage<SharedData>().props.sidebarOpen;
2113
</script>
2214

2315
<template>
2416
<div v-if="variant === 'header'" class="flex min-h-screen w-full flex-col">
2517
<slot />
2618
</div>
27-
<SidebarProvider v-else :default-open="isOpen" :open="isOpen" @update:open="handleSidebarChange">
19+
<SidebarProvider v-else :default-open="isOpen">
2820
<slot />
2921
</SidebarProvider>
3022
</template>

resources/js/components/ui/sidebar/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createContext } from 'radix-vue';
22
import type { ComputedRef, Ref } from 'vue';
33

4-
export const SIDEBAR_COOKIE_NAME = 'sidebar:state';
4+
export const SIDEBAR_COOKIE_NAME = 'sidebar_state';
55
export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
66
export const SIDEBAR_WIDTH = '16rem';
77
export const SIDEBAR_WIDTH_MOBILE = '18rem';

resources/js/types/index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface SharedData extends PageProps {
2323
quote: { message: string; author: string };
2424
auth: Auth;
2525
ziggy: Config & { location: string };
26+
sidebarOpen: boolean;
2627
}
2728

2829
export interface User {

0 commit comments

Comments
 (0)