|
import { Session, User } from "@supabase/supabase-js"; |
|
import ReactGA from "react-ga4"; |
|
import toast from "react-hot-toast"; |
|
import { create } from "zustand"; |
|
import { supabase } from "src/lib/api/supabase"; |
|
|
|
interface UserActions { |
|
logout: () => void; |
|
setSession: (session: Session) => void; |
|
} |
|
|
|
interface UserStates { |
|
user: User | null; |
|
isAuthenticated: boolean; |
|
premium: boolean; |
|
premiumCancelled: boolean; |
|
organization: boolean; |
|
orgAdmin: boolean; |
|
} |
|
|
|
const initialStates: UserStates = { |
|
user: null, |
|
isAuthenticated: false, |
|
premium: false, |
|
premiumCancelled: false, |
|
organization: false, |
|
orgAdmin: false, |
|
}; |
|
|
|
const useUser = create<UserStates & UserActions>()(set => ({ |
|
...initialStates, |
|
setSession: async session => { |
|
supabase.rpc("get_subscription_info").then(({ data }) => { |
|
if (data) { |
|
set({ |
|
premium: data.premium, |
|
organization: data.organization, |
|
premiumCancelled: !!data.cancelled, |
|
orgAdmin: data.org_admin, |
|
}); |
|
ReactGA.set({ tier: data.premium ? "premium" : "free" }); |
|
} |
|
|
|
set({ user: session.user, isAuthenticated: true }); |
|
ReactGA.set({ userId: session.user.id }); |
|
}); |
|
}, |
|
logout: async () => { |
|
toast.loading("Logging out...", { id: "logout" }); |
|
await supabase.auth.signOut(); |
|
set(initialStates); |
|
toast.success("Logged out.", { id: "logout" }); |
|
}, |
|
})); |
|
|
|
export default useUser; |
|
|