/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { createContext, useContext, useState } from 'react' import { getCookie, setCookie } from '@/lib/cookies' export type Collapsible = 'offcanvas' | 'icon' | 'none' export type Variant = 'inset' | 'sidebar' | 'floating' // Cookie constants following the pattern from sidebar.tsx const LAYOUT_COLLAPSIBLE_COOKIE_NAME = 'layout_collapsible' const LAYOUT_VARIANT_COOKIE_NAME = 'layout_variant' const LAYOUT_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 // 7 days // Default values const DEFAULT_VARIANT = 'inset' const DEFAULT_COLLAPSIBLE = 'icon' type LayoutContextType = { resetLayout: () => void defaultCollapsible: Collapsible collapsible: Collapsible setCollapsible: (collapsible: Collapsible) => void defaultVariant: Variant variant: Variant setVariant: (variant: Variant) => void } const LayoutContext = createContext(null) type LayoutProviderProps = { children: React.ReactNode } export function LayoutProvider({ children }: LayoutProviderProps) { const [collapsible, _setCollapsible] = useState(() => { const saved = getCookie(LAYOUT_COLLAPSIBLE_COOKIE_NAME) return (saved as Collapsible) || DEFAULT_COLLAPSIBLE }) const [variant, _setVariant] = useState(() => { const saved = getCookie(LAYOUT_VARIANT_COOKIE_NAME) return (saved as Variant) || DEFAULT_VARIANT }) const setCollapsible = (newCollapsible: Collapsible) => { _setCollapsible(newCollapsible) setCookie( LAYOUT_COLLAPSIBLE_COOKIE_NAME, newCollapsible, LAYOUT_COOKIE_MAX_AGE ) } const setVariant = (newVariant: Variant) => { _setVariant(newVariant) setCookie(LAYOUT_VARIANT_COOKIE_NAME, newVariant, LAYOUT_COOKIE_MAX_AGE) } const resetLayout = () => { setCollapsible(DEFAULT_COLLAPSIBLE) setVariant(DEFAULT_VARIANT) } const contextValue: LayoutContextType = { resetLayout, defaultCollapsible: DEFAULT_COLLAPSIBLE, collapsible, setCollapsible, defaultVariant: DEFAULT_VARIANT, variant, setVariant, } return {children} } // Define the hook for the provider // eslint-disable-next-line react-refresh/only-export-components export function useLayout() { const context = useContext(LayoutContext) if (!context) { throw new Error('useLayout must be used within a LayoutProvider') } return context }