Path: blob/main/components/dashboard/src/user-context.tsx
2498 views
/**1* Copyright (c) 2021 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { User } from "@gitpod/public-api/lib/gitpod/v1/user_pb";7import { useQueryClient } from "@tanstack/react-query";8import React, { createContext, useState, useContext, useMemo, useCallback } from "react";9import { updateCommonErrorDetails } from "./service/metrics";10import { updateUserForExperiments } from "./service/public-api";11import { getPrimaryEmail } from "@gitpod/public-api-common/lib/user-utils";1213const UserContext = createContext<{14user?: User;15setUser: React.Dispatch<User>;16}>({17setUser: () => null,18});1920const refetchCookie = async () => {21await fetch("/api/auth/jwt-cookie", {22credentials: "include",23})24.then((resp) => resp.text())25.then((text) => console.log(`Completed JWT Cookie refresh: ${text}`))26.catch((err) => {27console.log("Failed to update jwt-cookie", err);28});29};3031const UserContextProvider: React.FC = ({ children }) => {32const [user, setUser] = useState<User>();3334const updateServiceUser = (user?: User) => {35updateCommonErrorDetails({ userId: user?.id });36updateUserForExperiments(!!user ? { id: user.id, email: getPrimaryEmail(user) } : undefined);37};38updateServiceUser(user);3940const client = useQueryClient();4142const doSetUser = useCallback(43(updatedUser: User) => {44updateServiceUser(updatedUser);45// If user has changed clear cache46// Ignore the case where user hasn't been set yet - initial load47if (user && user?.id !== updatedUser.id) {48client.clear();49}50setUser(updatedUser);5152// Schedule a periodic refresh of JWT cookie53const w = window as any;54const _gp = w._gp || (w._gp = {});5556const frequencyMs = 1000 * 60 * 5; // 5 mins57if (!_gp.jwttimer) {58// Store the timer on the window, to avoid queuing up multiple59_gp.jwtTimer = setInterval(refetchCookie, frequencyMs);6061setTimeout(refetchCookie, 20_000);62}63},64[user, client],65);6667// Wrap value in useMemo to avoid unnecessary re-renders68const ctxValue = useMemo(() => ({ user, setUser: doSetUser }), [user, doSetUser]);6970return <UserContext.Provider value={ctxValue}>{children}</UserContext.Provider>;71};7273export { UserContext, UserContextProvider };7475export const useCurrentUser = () => {76const { user } = useContext(UserContext);77return user;78};798081