Path: blob/main/components/dashboard/src/user-settings/SelectIDE.tsx
2500 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 { ReactNode, useCallback, useContext, useState } from "react";7import { UserContext } from "../user-context";8import { CheckboxInputField } from "../components/forms/CheckboxInputField";9import SelectIDEComponent, { isJetbrains } from "../components/SelectIDEComponent";10import PillLabel from "../components/PillLabel";11import { useUpdateCurrentUserMutation } from "../data/current-user/update-mutation";12import { converter } from "../service/public-api";13import { isOrganizationOwned } from "@gitpod/public-api-common/lib/user-utils";14import Alert from "../components/Alert";15import { useFeatureFlag } from "../data/featureflag-query";16import { IDESettingsVersion } from "@gitpod/gitpod-protocol/lib/ide-protocol";1718export type IDEChangedTrackLocation = "workspace_list" | "workspace_start" | "preferences";19interface SelectIDEProps {20location: IDEChangedTrackLocation;21}2223export default function SelectIDE(props: SelectIDEProps) {24const { user, setUser } = useContext(UserContext);25const updateUser = useUpdateCurrentUserMutation();2627const [defaultIde, setDefaultIde] = useState<string>(user?.editorSettings?.name || "code");28const [useLatestVersion, setUseLatestVersion] = useState<boolean>(user?.editorSettings?.version === "latest");29const [preferToolbox, setPreferToolbox] = useState<boolean>(user?.editorSettings?.preferToolbox || false);30const [ideWarning, setIdeWarning] = useState<ReactNode | undefined>(undefined);31const enableExperimentalJBTB = useFeatureFlag("enable_experimental_jbtb");3233const isOrgOwnedUser = user && isOrganizationOwned(user);3435const actualUpdateUserIDEInfo = useCallback(36async (selectedIde: string, useLatestVersion: boolean, preferToolbox: boolean) => {37// update stored autostart options to match useLatestVersion value set here38const workspaceAutostartOptions = user?.workspaceAutostartOptions?.map((o) => {39const option = converter.fromWorkspaceAutostartOption(o);4041if (option.ideSettings) {42option.ideSettings.useLatestVersion = useLatestVersion;43option.ideSettings.preferToolbox = preferToolbox;44}4546return option;47});4849const updatedUser = await updateUser.mutateAsync({50additionalData: {51workspaceAutostartOptions,52ideSettings: {53settingVersion: IDESettingsVersion,54defaultIde: selectedIde,55useLatestVersion: useLatestVersion,56preferToolbox: preferToolbox,57},58},59});60setUser(updatedUser);61},62[setUser, updateUser, user?.workspaceAutostartOptions],63);6465const actuallySetDefaultIde = useCallback(66async (value: string) => {67await actualUpdateUserIDEInfo(value, useLatestVersion, preferToolbox);68setDefaultIde(value);69},70[actualUpdateUserIDEInfo, useLatestVersion, preferToolbox],71);7273const actuallySetUseLatestVersion = useCallback(74async (value: boolean) => {75await actualUpdateUserIDEInfo(defaultIde, value, preferToolbox);76setUseLatestVersion(value);77},78[actualUpdateUserIDEInfo, defaultIde, preferToolbox],79);8081const actuallySetPreferToolbox = useCallback(82async (value: boolean) => {83await actualUpdateUserIDEInfo(defaultIde, useLatestVersion, value);84setPreferToolbox(value);85},86[actualUpdateUserIDEInfo, defaultIde, useLatestVersion],87);8889const shouldShowJetbrainsNotice = isJetbrains(defaultIde);9091return (92<>93{ideWarning && (94<Alert type="warning" className="my-2 max-w-md">95<span className="text-sm">{ideWarning}</span>96</Alert>97)}9899<div className="w-112 max-w-full my-4">100<SelectIDEComponent101onSelectionChange={actuallySetDefaultIde}102selectedIdeOption={defaultIde}103useLatest={useLatestVersion}104setWarning={setIdeWarning}105ignoreRestrictionScopes={isOrgOwnedUser ? ["configuration"] : ["configuration", "organization"]}106hideVersions107/>108</div>109110{shouldShowJetbrainsNotice && (111<p className="text-left w-full text-gray-400 dark:text-gray-500">112<strong>JetBrains </strong> integration is currently in{" "}113<PillLabel type="warn" className="font-semibold mt-2 ml-0 py-0.5 px-1 self-center">114<a href="https://www.gitpod.io/docs/references/gitpod-releases">115<span className="text-xs">Beta</span>116</a>117</PillLabel>118 · 119<a120href="https://github.com/gitpod-io/gitpod/issues/6576"121target="_blank"122rel="noopener noreferrer"123className="gp-link"124>125Send feedback126</a>127</p>128)}129130<CheckboxInputField131label="Latest Release (Unstable)"132hint={133<span>134Use the latest version for each editor.{" "}135<a136className="gp-link"137target="_blank"138href="https://code.visualstudio.com/blogs/2016/02/01/introducing_insiders_build"139rel="noreferrer"140>141Insiders142</a>{" "}143for VS Code,{" "}144<a145className="gp-link"146target="_blank"147href="https://www.jetbrains.com/resources/eap/"148rel="noreferrer"149>150EAP151</a>{" "}152for JetBrains IDEs.153</span>154}155checked={useLatestVersion}156onChange={(checked) => actuallySetUseLatestVersion(checked)}157/>158159{enableExperimentalJBTB && (160<CheckboxInputField161label={162<span className="flex items-center gap-2">163Launch in JetBrains Toolbox{" "}164<PillLabel type="warn">165<a href="https://www.gitpod.io/docs/references/gitpod-releases">166<span className="text-xs">BETA</span>167</a>168</PillLabel>169</span>170}171hint={<span>Launch JetBrains IDEs in the JetBrains Toolbox.</span>}172checked={preferToolbox}173onChange={(checked) => actuallySetPreferToolbox(checked)}174/>175)}176</>177);178}179180181