{"version":3,"file":"UserContext-82zQR061.js","sources":["../../../node_modules/@mantine/core/esm/core/MantineProvider/color-functions/get-auto-contrast-value/get-auto-contrast-value.mjs","../../../app/frontend/src/context/UserContext.tsx"],"sourcesContent":["'use client';\nfunction getAutoContrastValue(autoContrast, theme) {\n return typeof autoContrast === \"boolean\" ? autoContrast : theme.autoContrast;\n}\n\nexport { getAutoContrastValue };\n//# sourceMappingURL=get-auto-contrast-value.mjs.map\n","import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';\n\n// ✅ Define User Type\ninterface User {\n id: number;\n email: string;\n username: string;\n avatar_url: string | null;\n roles: string[];\n organizer_ids: number[];\n}\n\n// ✅ Context Type\ninterface UserContextType {\n user: User | null;\n setUser: (user: User | null) => void;\n logout: () => Promise;\n refreshUser: () => Promise;\n}\n\n// ✅ Declare UserContext ONLY ONCE\nexport const UserContext = createContext(null);\n\nconst getCSRFToken = (): string => {\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\n if (metaTag) return metaTag.getAttribute('content') || '';\n\n const name = 'XSRF-TOKEN=';\n const decodedCookie = decodeURIComponent(document.cookie);\n const cookieArray = decodedCookie.split(';');\n\n for (let cookie of cookieArray) {\n cookie = cookie.trim();\n if (cookie.startsWith(name)) return cookie.substring(name.length);\n }\n\n console.warn('⚠️ No CSRF token found in meta tag or cookie');\n return '';\n};\n\n// ✅ Provider Component\nexport const UserProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [user, setUser] = useState(null);\n const [isLoading, setIsLoading] = useState(true); // ✅ Add a loading state\n\n // ✅ Function to fetch user data\n const fetchUser = async () => {\n try {\n const csrfToken = getCSRFToken();\n const response = await fetch('/api/v1/users/current', {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken },\n credentials: 'include',\n });\n\n if (!response.ok) throw new Error('Failed to fetch user data.');\n\n const data = await response.json();\n\n setUser(data.user || null);\n } catch (error) {\n console.error('⚠️ Fetch Error:', error);\n setUser(null);\n } finally {\n setIsLoading(false); // ✅ Ensure loading state is updated\n }\n };\n\n // ✅ Logout function - Ensures session is properly cleared\n const logout = async () => {\n try {\n const csrfToken = getCSRFToken();\n await fetch('/logout', {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken },\n credentials: 'include',\n });\n } catch (error) {\n console.error('⚠️ Logout error:', error);\n } finally {\n setUser(null);\n window.location.href = '/'; // ✅ Redirect to home page after logout\n }\n };\n\n // ✅ Fetch user on mount\n useEffect(() => {\n fetchUser();\n }, []);\n\n // console.log('🔄 User Context Updated After Fetch UCTXT: ', user);\n\n // ✅ Prevent children from rendering until user data is loaded\n if (isLoading) {\n return

;\n }\n\n return (\n {children}\n );\n};\n\n// ✅ Custom Hook for Consuming User Context\nexport const useUser = () => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error('❌ useUser must be used within a ');\n }\n\n return context;\n};\n"],"names":["getAutoContrastValue","autoContrast","theme","UserContext","createContext","getCSRFToken","metaTag","name","cookieArray","cookie","UserProvider","children","user","setUser","useState","isLoading","setIsLoading","fetchUser","csrfToken","response","data","error","logout","useEffect","jsx","useUser","context","useContext"],"mappings":"yDACA,SAASA,EAAqBC,EAAcC,EAAO,CACjD,OAAO,OAAOD,GAAiB,UAAYA,EAAeC,EAAM,YAClE,CCkBa,MAAAC,EAAcC,gBAAsC,IAAI,EAE/DC,EAAe,IAAc,CAC3B,MAAAC,EAAU,SAAS,cAAc,yBAAyB,EAChE,GAAIA,EAAS,OAAOA,EAAQ,aAAa,SAAS,GAAK,GAEvD,MAAMC,EAAO,cAEPC,EADgB,mBAAmB,SAAS,MAAM,EACtB,MAAM,GAAG,EAE3C,QAASC,KAAUD,EAEb,GADJC,EAASA,EAAO,KAAK,EACjBA,EAAO,WAAWF,CAAI,SAAUE,EAAO,UAAUF,EAAK,MAAM,EAGlE,eAAQ,KAAK,8CAA8C,EACpD,EACT,EAGaG,EAAkD,CAAC,CAAE,SAAAC,KAAe,CAC/E,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAsB,IAAI,EAC5C,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAI,EAGzCG,EAAY,SAAY,CACxB,GAAA,CACF,MAAMC,EAAYb,EAAa,EACzBc,EAAW,MAAM,MAAM,wBAAyB,CACpD,OAAQ,MACR,QAAS,CAAE,eAAgB,mBAAoB,eAAgBD,CAAU,EACzE,YAAa,SAAA,CACd,EAED,GAAI,CAACC,EAAS,GAAU,MAAA,IAAI,MAAM,4BAA4B,EAExD,MAAAC,EAAO,MAAMD,EAAS,KAAK,EAEzBN,EAAAO,EAAK,MAAQ,IAAI,QAClBC,EAAO,CACN,QAAA,MAAM,kBAAmBA,CAAK,EACtCR,EAAQ,IAAI,CAAA,QACZ,CACAG,EAAa,EAAK,CAAA,CAEtB,EAGMM,EAAS,SAAY,CACrB,GAAA,CACF,MAAMJ,EAAYb,EAAa,EAC/B,MAAM,MAAM,UAAW,CACrB,OAAQ,SACR,QAAS,CAAE,eAAgB,mBAAoB,eAAgBa,CAAU,EACzE,YAAa,SAAA,CACd,QACMG,EAAO,CACN,QAAA,MAAM,mBAAoBA,CAAK,CAAA,QACvC,CACAR,EAAQ,IAAI,EACZ,OAAO,SAAS,KAAO,GAAA,CAE3B,EAUA,OAPAU,EAAAA,UAAU,IAAM,CACJN,EAAA,CACZ,EAAG,EAAE,EAKDF,QACM,IAAE,EAAA,EAITS,EAAA,IAAArB,EAAY,SAAZ,CAAqB,MAAO,CAAE,KAAAS,EAAM,QAAAC,EAAS,YAAaI,EAAW,OAAAK,CAAO,EAAI,SAAAX,CAAS,CAAA,CAE9F,EAGac,EAAU,IAAM,CACrB,MAAAC,EAAUC,aAAWxB,CAAW,EAEtC,GAAI,CAACuB,EACG,MAAA,IAAI,MAAM,gDAAgD,EAG3D,OAAAA,CACT","x_google_ignoreList":[0]}