Skip to content

feat: add support for insiders channel to "VS Code Desktop" button #7730

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add arrow and fix icon
  • Loading branch information
matifali committed May 31, 2023
commit 7680ae1bc2fecc768af8f66d751c7a337ce3cbb1
14 changes: 3 additions & 11 deletions site/src/components/Icons/VSCodeInsidersIcon.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
import SvgIcon, { SvgIconProps } from "@mui/material/SvgIcon"

export const VSCodeInsidersIcon = (props: SvgIconProps) => (
<SvgIcon {...props} viewBox="0 0 100 100">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none">
<mask
id="mask0"
mask-type="alpha"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="100"
height="100"
>
<SvgIcon {...props} viewBox="0 0 256 256">
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="256" height="256">
<path
d="M176.049 250.669C180.838 255.459 188.13 256.7 194.234 253.764L246.94 228.419C252.478 225.755 256 220.154 256 214.008V42.1479C256 36.0025 252.478 30.4008 246.94 27.7374L194.234 2.39089C188.13 -0.544416 180.838 0.696607 176.049 5.48572C181.95 -0.41506 192.039 3.76413 192.039 12.1091V244.046C192.039 252.391 181.95 256.57 176.049 250.669Z"
fill="white"
Expand Down
158 changes: 84 additions & 74 deletions site/src/components/VSCodeDesktopButton/VSCodeDesktopButton.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import React, { FC, PropsWithChildren, useState, useEffect } from "react"
import { getApiKey } from "api/api"
import { VSCodeIcon } from "components/Icons/VSCodeIcon"
import { VSCodeInsidersIcon } from "components/Icons/VSCodeInsidersIcon"
import { PrimaryAgentButton } from "components/Resources/AgentButton"
import React, { FC, PropsWithChildren, useState, useEffect } from "react";
import { getApiKey } from "api/api";
import { VSCodeIcon } from "components/Icons/VSCodeIcon";
import { VSCodeInsidersIcon } from "components/Icons/VSCodeInsidersIcon";
import { PrimaryAgentButton } from "components/Resources/AgentButton";
import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";

export interface VSCodeDesktopButtonProps {
userName: string
workspaceName: string
agentName?: string
folderPath?: string
userName: string;
workspaceName: string;
agentName?: string;
folderPath?: string;
}

enum VSCodeVariant {
Expand All @@ -17,112 +18,121 @@ enum VSCodeVariant {
}

const getSelectedVariantFromLocalStorage = (): VSCodeVariant | null => {
const storedVariant = localStorage.getItem("selectedVariant")
const storedVariant = localStorage.getItem("selectedVariant");
if (
storedVariant &&
Object.values(VSCodeVariant).includes(storedVariant as VSCodeVariant)
) {
return storedVariant as VSCodeVariant
return storedVariant as VSCodeVariant;
}
return null
}
return null;
};

export const VSCodeDesktopButton: FC<
PropsWithChildren<VSCodeDesktopButtonProps>
> = ({ userName, workspaceName, agentName, folderPath }) => {
const [loading, setLoading] = useState(false)
const [loading, setLoading] = useState(false);
const [selectedVariant, setSelectedVariant] = useState<VSCodeVariant | null>(
getSelectedVariantFromLocalStorage(),
)
const [dropdownOpen, setDropdownOpen] = useState(false)
getSelectedVariantFromLocalStorage()
);
const [dropdownOpen, setDropdownOpen] = useState(false);

useEffect(() => {
if (selectedVariant) {
localStorage.setItem("selectedVariant", selectedVariant)
localStorage.setItem("selectedVariant", selectedVariant);
} else {
localStorage.removeItem("selectedVariant")
localStorage.removeItem("selectedVariant");
}
}, [selectedVariant])
}, [selectedVariant]);

const handleButtonClick = () => {
setLoading(true)
setLoading(true);
getApiKey()
.then(({ key }) => {
const query = new URLSearchParams({
owner: userName,
workspace: workspaceName,
url: location.origin,
token: key,
})
});
if (agentName) {
query.set("agent", agentName)
query.set("agent", agentName);
}
if (folderPath) {
query.set("folder", folderPath)
query.set("folder", folderPath);
}

const vscodeCommand =
selectedVariant === VSCodeVariant.VSCode
? "vscode://"
: "vscode-insiders://"
: "vscode-insiders://";

location.href = `${vscodeCommand}coder.coder-remote/open?${query.toString()}`
location.href = `${vscodeCommand}coder.coder-remote/open?${query.toString()}`;
})
.catch((ex) => {
console.error(ex)
console.error(ex);
})
.finally(() => {
setLoading(false)
})
}
setLoading(false);
});
};

const handleVariantChange = (variant: VSCodeVariant) => {
setSelectedVariant(variant)
setDropdownOpen(false)
}
setSelectedVariant(variant);
setDropdownOpen(false);
};

return (
<div>
<div style={{ position: "relative" }}>
<PrimaryAgentButton
startIcon={
selectedVariant === VSCodeVariant.VSCode ? (
<VSCodeIcon />
) : (
<VSCodeInsidersIcon />
)
}
disabled={loading || dropdownOpen}
onClick={() => setDropdownOpen(!dropdownOpen)}
<div style={{ position: "relative", display: "inline-flex" }}>
<PrimaryAgentButton
startIcon={
selectedVariant === VSCodeVariant.VSCode ? (
<VSCodeIcon />
) : (
<VSCodeInsidersIcon />
)
}
disabled={loading || dropdownOpen}
onClick={handleButtonClick}
>
{selectedVariant === VSCodeVariant.VSCode
? "VS Code Desktop"
: "VS Code Insiders"}
</PrimaryAgentButton>
<PrimaryAgentButton
onClick={() => setDropdownOpen(!dropdownOpen)}
>
<KeyboardArrowDownIcon
style={{
transition: "transform 0.3s ease-in-out",
transform: dropdownOpen ? "rotate(180deg)" : "rotate(0)",
cursor: "pointer",
}}
/>
</PrimaryAgentButton>
{dropdownOpen && (
<div
style={{
position: "absolute",
top: "100%",
left: 0,
marginTop: "4px",
}}
>
{selectedVariant === VSCodeVariant.VSCode
? "VS Code Desktop"
: "VS Code Insiders"}
</PrimaryAgentButton>
{dropdownOpen && (
<div
style={{
position: "absolute",
top: "100%",
left: 0,
marginTop: "4px",
}}
<PrimaryAgentButton
onClick={() => handleVariantChange(VSCodeVariant.VSCode)}
startIcon={<VSCodeIcon />}
>
VS Code Desktop
</PrimaryAgentButton>
<PrimaryAgentButton
onClick={() => handleVariantChange(VSCodeVariant.VSCodeInsiders)}
startIcon={<VSCodeInsidersIcon />}
>
<PrimaryAgentButton
onClick={() => handleVariantChange(VSCodeVariant.VSCode)}
startIcon={<VSCodeIcon />}
>
VS Code Desktop
</PrimaryAgentButton>
<PrimaryAgentButton
onClick={() => handleVariantChange(VSCodeVariant.VSCodeInsiders)}
startIcon={<VSCodeInsidersIcon />}
>
VS Code Insiders
</PrimaryAgentButton>
</div>
)}
</div>
VS Code Insiders
</PrimaryAgentButton>
</div>
)}
</div>
)
}
);
};