All files / stores selectedLanguageMenuStore.ts

91.66% Statements 11/12
75% Branches 3/4
100% Functions 3/3
91.66% Lines 11/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67  2x 2x 2x     2x                                         2x     2x               2x 2x 2x                       1x       1x                    
'use client';
import { parseCookies, setCookie } from 'nookies';
import { create } from 'zustand';
import { persist, devtools } from 'zustand/middleware';
import { type SelectedLanguageMenuState } from '../types/index';
 
const COOKIE_PATH = '/';
/**
 * @module SelectedLanguageMenuStore
 * @author Munir Mardinli
 *
 * Zustand store for managing the selected language in the application menu.
 * Persists the selection between sessions using cookies and localStorage.
 *
 * @property {string} selectedLanguage - Currently selected language code
 * @property {Function} setSelectedLanguage - Updates the selected language
 *
 * @example
 * // Access the store in a React component
 * import { useSelectedLanguageMenuStore } from './selectedLanguageMenuStore';
 * const lang = useSelectedLanguageMenuStore(state => state.selectedLanguage);
 *
 * @example
 * // Change the selected language
 * const setSelectedLanguage = useSelectedLanguageMenuStore(state => state.setSelectedLanguage);
 * setSelectedLanguage('en');
 */
export const useSelectedLanguageMenuStore = create<SelectedLanguageMenuState>()(
	devtools(
		persist(
			(set) => ({
				/**
				 * Currently selected language code
				 * @type {string}
				 * @default 'de'
				 */
				selectedLanguage: (() => {
					// Server-side rendering fallback
					Eif (typeof window !== 'undefined') {
						const cookies = parseCookies();
						return cookies?.["languageMenu"] || 'de';
					}
					return 'de';
				})(),
 
				/**
				 * Updates the selected language and persists it
				 * @param {string} language - Language code to set (e.g. 'en', 'de')
				 * @returns {void}
				 */
				setSelectedLanguage: (language: string) => {
					// Set cookie for server-side access
					setCookie(null, 'languageMenu', language, {
						path: COOKIE_PATH, // Typically '/'
					});
					// Update local state
					set({ selectedLanguage: language });
				},
			}),
			{
				name: 'selected-language', // localStorage key
			},
		),
		{ name: 'selectedLanguageStore' }, // DevTools name
	),
);