@mikestraczek/cms-auth
Version:
Authentication and user management for the CMS template
1 lines • 3.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/context/auth.tsx"],"sourcesContent":["\"use client\";\n\nimport { useSession } from \"next-auth/react\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nimport { Roles, type User, type Role } from \"../types/user\";\n\ntype ExtendedUser = {\n id: string;\n name?: string | null;\n email?: string | null;\n role: Role;\n};\n\ntype AuthContextType = {\n user: User | null;\n isSignedIn: boolean;\n isLoading: boolean;\n isAdmin: boolean;\n};\n\nconst AuthContext = createContext<AuthContextType>({\n user: null,\n isSignedIn: false,\n isLoading: true,\n isAdmin: false,\n});\n\nexport const useAuth = () => useContext(AuthContext);\n\ntype AuthProviderProps = {\n children: React.ReactNode;\n};\n\nfunction isExtendedUser(user: unknown): user is ExtendedUser {\n if (user === null || typeof user !== \"object\") {\n return false;\n }\n\n const userObj = user as Record<string, unknown>;\n\n return typeof userObj.id === \"string\" && typeof userObj.role === \"string\";\n}\n\nexport function AuthProvider({ children }: AuthProviderProps) {\n const { data: session, status } = useSession();\n const [user, setUser] = useState<User | null>(null);\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [isAdmin, setIsAdmin] = useState(false);\n\n useEffect(() => {\n const isAuthenticated = status === \"authenticated\";\n const isStillLoading = status === \"loading\";\n\n setIsSignedIn(isAuthenticated);\n setIsLoading(isStillLoading);\n\n if (isAuthenticated && session?.user && isExtendedUser(session.user)) {\n const userData = session.user;\n const userObject: User = {\n id: userData.id,\n name: userData.name ?? \"\",\n email: userData.email ?? \"\",\n role: userData.role,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n setUser(userObject);\n\n setIsAdmin(\n userData.role === Roles.ADMIN || userData.role === Roles.SUPERADMIN,\n );\n } else if (status === \"unauthenticated\") {\n setUser(null);\n setIsSignedIn(false);\n setIsAdmin(false);\n }\n }, [session, status]);\n\n return (\n <AuthContext.Provider\n value={{\n user,\n isSignedIn,\n isLoading,\n isAdmin,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n}\n"],"mappings":";AAEA,SAAS,kBAAkB;AAC3B,SAAS,eAAe,YAAY,WAAW,gBAAgB;AA+E3D;AA7DJ,IAAM,cAAc,cAA+B;AAAA,EACjD,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AACX,CAAC;AAEM,IAAM,UAAU,MAAM,WAAW,WAAW;AAMnD,SAAS,eAAe,MAAqC;AAC3D,MAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAEhB,SAAO,OAAO,QAAQ,OAAO,YAAY,OAAO,QAAQ,SAAS;AACnE;AAEO,SAAS,aAAa,EAAE,SAAS,GAAsB;AAC5D,QAAM,EAAE,MAAM,SAAS,OAAO,IAAI,WAAW;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsB,IAAI;AAClD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,YAAU,MAAM;AACd,UAAM,kBAAkB,WAAW;AACnC,UAAM,iBAAiB,WAAW;AAElC,kBAAc,eAAe;AAC7B,iBAAa,cAAc;AAE3B,QAAI,mBAAmB,SAAS,QAAQ,eAAe,QAAQ,IAAI,GAAG;AACpE,YAAM,WAAW,QAAQ;AACzB,YAAM,aAAmB;AAAA,QACvB,IAAI,SAAS;AAAA,QACb,MAAM,SAAS,QAAQ;AAAA,QACvB,OAAO,SAAS,SAAS;AAAA,QACzB,MAAM,SAAS;AAAA,QACf,WAAW,oBAAI,KAAK;AAAA,QACpB,WAAW,oBAAI,KAAK;AAAA,MACtB;AAEA,cAAQ,UAAU;AAElB;AAAA,QACE,SAAS,gCAAwB,SAAS;AAAA,MAC5C;AAAA,IACF,WAAW,WAAW,mBAAmB;AACvC,cAAQ,IAAI;AACZ,oBAAc,KAAK;AACnB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,SACE;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}