Files
hoppscotch/helpers/teams/BackendUserInfo.ts
2021-05-13 20:16:29 -04:00

87 lines
1.7 KiB
TypeScript

import { fb } from "../fb"
import { BehaviorSubject } from "rxjs"
import { apolloClient } from "../apollo"
import gql from "graphql-tag"
/*
* This file deals with interfacing data provided by the
* Hoppscotch Backend server
*/
/**
* Defines the information provided about a user
*/
interface UserInfo {
/**
* UID of the user
*/
uid: string
/**
* Displayable name of the user (or null if none available)
*/
displayName: string | null
/**
* Email of the user (or null if none available)
*/
email: string | null
/**
* URL to the profile photo of the user (or null if none available)
*/
photoURL: string | null
/**
* Whether the user has access to Early Access features
*/
eaInvited: boolean
}
/**
* An observable subject onto the currently logged in user info (is null if not logged in)
*/
export const currentUserInfo$ = new BehaviorSubject<UserInfo | null>(null)
/**
* Initializes the currenUserInfo$ view and sets up its update mechanism
*/
export function initUserInfo() {
updateUserInfo()
fb.idToken$.subscribe(token => {
if (token) {
updateUserInfo()
} else {
currentUserInfo$.next(null)
}
})
}
/**
* Runs the actual user info fetching
*/
async function updateUserInfo() {
try {
const { data } = await apolloClient.query({
query: gql`
query GetUserInfo {
me {
uid,
displayName,
email,
photoURL,
eaInvited
}
}
`
})
currentUserInfo$.next({
uid: data.me.uid,
displayName: data.me.displayName,
email: data.me.email,
photoURL : data.me.photoURL,
eaInvited: data.me.eaInvited
})
} catch (e) {
currentUserInfo$.next(null)
}
}