Path: blob/master/src/packages/frontend/compute/launcher.tsx
5874 views
/*1Launcher buttons shown for a running compute server.2*/34import { Button, Modal, Spin, Tooltip } from "antd";5import { useMemo, useState } from "react";67import { useTypedRedux } from "@cocalc/frontend/app-framework";8import { Icon } from "@cocalc/frontend/components";9import ShowError from "@cocalc/frontend/components/error";10import { useImages } from "@cocalc/frontend/compute/images-hook";1112import { useServer } from "./compute-server";13import { getApps } from "./menu";14import { LauncherButton, getRoute } from "./proxy";1516export default function Launcher({17style,18configuration,19data,20compute_server_id,21project_id,22}) {23const [appName, setAppName] = useState<string>("");24const image = configuration?.image;25if (image == null || data == null || configuration == null) {26return null;27}28const apps = getApps(image);29if (!apps) {30return null;31}32return (33<div style={style}>34{!!appName && (35<AppLauncherModal36id={compute_server_id}37name={appName}38project_id={project_id}39close={() => setAppName("")}40/>41)}42{/*<Button43onClick={() => setAppName("explorer")}44type="text"45size="small"46style={{ color: "#666" }}47>48<Icon name="folder-open" /> Explorer49</Button>*/}5051{apps["jupyterlab"] != null && (52<Tooltip title={apps["jupyterlab"].tip} placement="left">53<Button54onClick={() => setAppName("jupyterlab")}55type="text"56size="small"57style={{ color: "#666" }}58>59<Icon60name={apps["jupyterlab"].icon}61style={{ marginRight: "-5px" }}62/>63JupyterLab64</Button>65</Tooltip>66)}67{apps["vscode"] != null && (68<Tooltip title={apps["vscode"].tip} placement="left">69<Button70onClick={() => setAppName("vscode")}71type="text"72size="small"73style={{ color: "#666" }}74>75<Icon name={apps["vscode"].icon} style={{ marginRight: "-5px" }} />76VS Code77</Button>78</Tooltip>79)}80{apps["xpra"] != null && (81<Tooltip title={apps["xpra"].tip} placement="left">82<Button83onClick={() => setAppName("xpra")}84type="text"85size="small"86style={{ color: "#666" }}87>88<Icon name={apps["xpra"].icon} style={{ marginRight: "-5px" }} />89Desktop90</Button>91</Tooltip>92)}93</div>94);95}9697function AppLauncher({98name,99configuration,100data,101compute_server_id,102project_id,103IMAGES,104}) {105const [error, setError] = useState<string>("");106const compute_servers_dns = useTypedRedux("customize", "compute_servers_dns");107const image = configuration.image;108const app = (IMAGES[image]?.apps ?? IMAGES["defaults"]?.apps ?? [])[name];109const route = useMemo(() => {110if (app == null) {111return null;112}113try {114return getRoute({ app, configuration, IMAGES });115} catch (err) {116setError(`${err}`);117return null;118}119}, [app, configuration, IMAGES]);120121if (app == null) {122return <ShowError error={`Unknown application '${name}'`} />;123}124125return (126<div>127{route && (128<LauncherButton129name={name}130app={app}131compute_server_id={compute_server_id}132project_id={project_id}133configuration={configuration}134data={data}135compute_servers_dns={compute_servers_dns}136setError={setError}137route={route}138noHide139autoLaunch140/>141)}142<ShowError143error={error}144setError={setError}145style={{ margin: "15px 0", width: "100%" }}146/>147</div>148);149}150151// function ExplorerLauncher({ compute_server_id, project_id }) {152// return (153// <div>154// {compute_server_id} {project_id}155// </div>156// );157// }158159export function AppLauncherModal({160name,161id,162project_id,163close,164}: {165name: string;166id: number;167project_id: string;168close: () => void;169}) {170const server = useServer({ id, project_id });171const [IMAGES] = useImages();172if (server == null || IMAGES == null) {173return <Spin />;174}175const image = server.configuration?.image ?? "defaults";176const apps = getApps(image);177178return (179<Modal180title={181<>182<Icon183name={apps[name]?.icon ?? "global"}184style={{ marginRight: "5px" }}185/>186{apps[name]?.label ?? name}187</>188}189open190onOk={close}191onCancel={close}192destroyOnHidden193>194{apps[name]?.tip}195<AppLauncher196name={name}197configuration={server.configuration}198data={server.data}199compute_server_id={server.id}200project_id={project_id}201IMAGES={IMAGES}202/>203</Modal>204);205}206207208