"use client"; import { useRef } from "react"; import { Provider } from "react-redux"; import { z } from "zod"; import type { ProviderProps } from "@/@types/types/provider-props.types"; import { cookieHelper } from "@/libs/helpers/cookie-helper"; import { appActions } from "@/store/app-store/app.slice"; import { authActions } from "@/store/auth-store/auth.slice"; import { localizationActions } from "@/store/localization-store/localization.slice"; import type { AppStore } from "@/store/store"; import { makeStore } from "@/store/store"; interface StoreProviderProps extends ProviderProps { authTokenInfo?: any; appData?: any; localizationData?: { language: string; currency: string; }; } // Globalization definitions for language and currency const LanguageValues = ["tr-TR", "en-US", "de-DE", "en", "tr", "de"] as const; const LanguageEnums = z.enum(LanguageValues); const CurrencyValues = ["TRY", "USD", "EUR"] as const; const CurrencyEnums = z.enum(CurrencyValues); const RegionValues = ["TR"] as const; // const RegionEnums = z.enum(RegionValues); const StoreProvider = (props: StoreProviderProps) => { const storeRef = useRef(); const urlParams = new URLSearchParams( typeof window !== "undefined" ? window.location.search : "", ); const language = urlParams.get("lng"); const currency = urlParams.get("cur"); const localizationData = { region: RegionValues[0], language: LanguageEnums.safeParse(language).success ? language : props.localizationData?.language || LanguageValues[0], currency: CurrencyEnums.safeParse(currency).success ? currency : props.localizationData?.currency || CurrencyValues[0], }; if (!storeRef.current) { // Create the store instance the first time this renders storeRef.current = makeStore(); if (props.authTokenInfo) { storeRef.current.dispatch( authActions.setAuthData({ tokenInfo: { accessToken: props.authTokenInfo.token, }, user: null, }), ); } else { storeRef.current.dispatch(authActions.setStatus("done")); } if (localizationData.language) { cookieHelper.setStr("lng", localizationData.language); storeRef.current.dispatch( localizationActions.setLocalizationData(localizationData), ); } if (localizationData.currency) { cookieHelper.setStr("currency", localizationData.currency); storeRef.current.dispatch( localizationActions.setLocalizationData(localizationData), ); } if (localizationData.region) { cookieHelper.setStr("rgn", localizationData.region); storeRef.current.dispatch( localizationActions.setLocalizationData(localizationData), ); } if (props.appData) { storeRef.current.dispatch(appActions.setData(props.appData)); } } return {props.children}; }; export default StoreProvider;