import axios from 'axios' ; import { omit } from 'lodash' ; import { GoogleLoginResponse } from 'react-google-login' ; import { GetState } from 'zustand' ; import { createWithDevtools , NamedSetState } from './utils' ; export type AccountProvider = 'Password' | 'Google' ; export interface UserProfile { googleData ? : { token : string ; googleId : string ; imageUrl ? : string ; } ; provider : AccountProvider ; username ? : string ; email : string ; fullName : string ; firstName ? : string ; lastName ? : string ; } interface UserState { status : 'loggingIn' | 'loggedIn' | 'notAuthenticated' ; profile ? : UserProfile ; contactsPermission : boolean ; loginModal : { isOpen : boolean ; message ? : string ; } ; } const initialState = { status : 'loggingIn' , contactsPermission : false , loginModal : { isOpen : false , } , } ; export type ProfileResponse = Omit < UserProfile , 'googleData' | 'fullName' > ; const stateAndActions = ( set , get ) => { return { ... initialState , setStatus : ( isLoggedIn ) => set ( { status : isLoggedIn } ) , setProfile : ( profile ) => { set ( { profile : { ... profile , fullName : profile . firstName ? `${ profile . firstName } ${ profile . lastName || '' }` : profile . username || 'Unknown' , } , status : 'loggedIn' , } ) ; } , setContactsPermission : ( contactsPermission ) => set ( { contactsPermission } ) , onGoogleLogicSuccess : async ( { tokenId , profileObj } ) => { await axios . post ( '/user/google_login' , { token : tokenId } ) ; set ( { profile : { email : profileObj . email , fullName : profileObj . name , firstName : profileObj . givenName , lastName : profileObj . familyName , provider : 'Google' , googleData : { token : tokenId , googleId : profileObj . googleId , imageUrl : profileObj . imageUrl } , } , status : 'loggedIn' , } ) ; } , setGoogleData : ( data ) => { set ( state => { if ( ! state . profile ) return state ; return { ... state , profile : { ... state . profile , googleData : data } } ; } ) ; } , onLogout : async ( ) => { set ( state => ( { status : 'notAuthenticated' , ... omit ( state , [ 'profile' , 'status' ] ) } ) ) ; axios . post ( '/user/logout' ) ; } , toggleLoginModal : ( message ? ) => { set ( state => ( { loginModal : { isOpen : ! state . loginModal . isOpen , message } } ) , 'toggleLoginModal' ) ; } , } ; } ; export const [ useUserStore , userStoreApi ] = createWithDevtools ( stateAndActions , 'UserNew' ) ;