Path: blob/main/components/dashboard/src/data/current-user/update-mutation.ts
2501 views
/**1* Copyright (c) 2023 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 { AdditionalUserData, User as UserProtocol } from "@gitpod/gitpod-protocol";7import { useMutation } from "@tanstack/react-query";8import { trackEvent } from "../../Analytics";9import { getGitpodService } from "../../service/service";10import { useCurrentUser } from "../../user-context";11import { converter } from "../../service/public-api";12import deepmerge from "deepmerge";13import uniq from "lodash/uniq";1415type UpdateCurrentUserArgs = Partial<UserProtocol>;1617export const useUpdateCurrentUserMutation = () => {18return useMutation({19mutationFn: async (partialUser: UpdateCurrentUserArgs) => {20const current = await getGitpodService().server.getLoggedInUser();21const currentAdditionalData = { ...current.additionalData };22// workspaceAutostartOptions needs to be overriden23if (partialUser.additionalData?.workspaceAutostartOptions) {24currentAdditionalData.workspaceAutostartOptions = [];25}26const update: UpdateCurrentUserArgs = {27id: current.id,28fullName: partialUser.fullName || current.fullName,29additionalData: deepmerge<AdditionalUserData>(30currentAdditionalData || {},31partialUser.additionalData || {},32),33};34// deepmerge will try append array, so once data is defined, ignore previous value35if (partialUser.additionalData?.profile?.explorationReasons) {36update.additionalData!.profile!.explorationReasons = uniq(37partialUser.additionalData.profile.explorationReasons,38);39}40if (partialUser.additionalData?.profile?.signupGoals) {41update.additionalData!.profile!.signupGoals = uniq(partialUser.additionalData.profile.signupGoals);42}43const user = await getGitpodService().server.updateLoggedInUser(update);44return converter.toUser(user);45},46});47};4849export const useUpdateCurrentUserDotfileRepoMutation = () => {50const user = useCurrentUser();51const updateUser = useUpdateCurrentUserMutation();5253return useMutation({54mutationFn: async (dotfileRepo: string) => {55if (!user) {56throw new Error("No user present");57}5859const additionalData = {60dotfileRepo,61};62const updatedUser = await updateUser.mutateAsync({ additionalData });6364return updatedUser;65},66onMutate: async () => {67return {68previousDotfileRepo: user?.dotfileRepo || "",69};70},71onSuccess: (updatedUser, _, context) => {72if (updatedUser?.dotfileRepo !== context?.previousDotfileRepo) {73trackEvent("dotfile_repo_changed", {74previous: context?.previousDotfileRepo ?? "",75current: updatedUser?.dotfileRepo ?? "",76});77}78},79});80};818283