11import { createContext , useContext , useState , useEffect , ReactNode } from 'react' ;
2- import { useLazyQuery , gql } from '@apollo/client' ;
2+ import { useLazyQuery , useMutation , gql } from '@apollo/client' ;
33import { User , Team , AuthContextType } from '../types/auth' ;
44
55const ME_QUERY = gql `
@@ -23,17 +23,41 @@ const ME_QUERY = gql`
2323 }
2424` ;
2525
26+ const GUEST_LOGIN_MUTATION = gql `
27+ mutation GuestLogin {
28+ guestLogin {
29+ token
30+ user {
31+ id
32+ email
33+ username
34+ name
35+ avatar
36+ role
37+ isActive
38+ isEmailVerified
39+ team {
40+ id
41+ name
42+ description
43+ }
44+ }
45+ }
46+ }
47+ ` ;
48+
2649const AuthContext = createContext < AuthContextType | undefined > ( undefined ) ;
2750
2851interface AuthProviderProps {
2952 children : ReactNode ;
53+ autoGuestLogin ?: boolean ;
3054}
3155
32- export function AuthProvider ( { children } : AuthProviderProps ) {
56+ export function AuthProvider ( { children, autoGuestLogin = false } : AuthProviderProps ) {
3357 const [ currentUser , setCurrentUser ] = useState < User | null > ( null ) ;
3458 const [ currentTeam , setCurrentTeam ] = useState < Team | null > ( null ) ;
3559 const [ isInitializing , setIsInitializing ] = useState ( true ) ;
36-
60+
3761 const [ getMe ] = useLazyQuery ( ME_QUERY , {
3862 onCompleted : ( data ) => {
3963 if ( data . me ) {
@@ -58,11 +82,27 @@ export function AuthProvider({ children }: AuthProviderProps) {
5882 }
5983 } ) ;
6084
85+ const [ performGuestLogin ] = useMutation ( GUEST_LOGIN_MUTATION , {
86+ onCompleted : ( data ) => {
87+ if ( data . guestLogin ) {
88+ setCurrentUser ( data . guestLogin . user ) ;
89+ setCurrentTeam ( data . guestLogin . user . team || null ) ;
90+ localStorage . setItem ( 'authToken' , data . guestLogin . token ) ;
91+ localStorage . setItem ( 'currentUser' , JSON . stringify ( data . guestLogin . user ) ) ;
92+ }
93+ setIsInitializing ( false ) ;
94+ } ,
95+ onError : ( error ) => {
96+ console . error ( 'Auto guest login failed:' , error ) ;
97+ setIsInitializing ( false ) ;
98+ }
99+ } ) ;
100+
61101 // Load saved user from localStorage and validate token on mount
62102 useEffect ( ( ) => {
63103 const token = localStorage . getItem ( 'authToken' ) ;
64104 const savedUser = localStorage . getItem ( 'currentUser' ) ;
65-
105+
66106 if ( token && savedUser ) {
67107 try {
68108 JSON . parse ( savedUser ) ;
@@ -74,10 +114,13 @@ export function AuthProvider({ children }: AuthProviderProps) {
74114 localStorage . removeItem ( 'currentUser' ) ;
75115 setIsInitializing ( false ) ;
76116 }
117+ } else if ( autoGuestLogin ) {
118+ // Auto-login as guest if no token exists and autoGuestLogin is enabled
119+ performGuestLogin ( ) ;
77120 } else {
78121 setIsInitializing ( false ) ;
79122 }
80- } , [ getMe ] ) ;
123+ } , [ getMe , autoGuestLogin , performGuestLogin ] ) ;
81124
82125 const login = ( user : User , token ?: string ) => {
83126 setCurrentUser ( user ) ;
0 commit comments