From f55a995c0a1578791a310748add166cf4610e5c8 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Thu, 13 May 2021 20:16:10 -0400 Subject: [PATCH] Introducing BackendUserInfo --- helpers/teams/BackendUserInfo.ts | 86 ++++++++++++++++++++++++++++++++ layouts/default.vue | 4 +- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 helpers/teams/BackendUserInfo.ts diff --git a/helpers/teams/BackendUserInfo.ts b/helpers/teams/BackendUserInfo.ts new file mode 100644 index 000000000..6e49ec0ae --- /dev/null +++ b/helpers/teams/BackendUserInfo.ts @@ -0,0 +1,86 @@ +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(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) + } +} diff --git a/layouts/default.vue b/layouts/default.vue index c15e3c70d..63a0a411a 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -14,9 +14,9 @@