1- import { GitBranch , Laptop } from "@phosphor-icons/react" ;
1+ import { useFeatureFlag } from "@hooks/useFeatureFlag" ;
2+ import { Cloud , GitBranch , Laptop } from "@phosphor-icons/react" ;
23import { ChevronDownIcon } from "@radix-ui/react-icons" ;
34import { Button , DropdownMenu , Flex , Text } from "@radix-ui/themes" ;
45import type { Responsive } from "@radix-ui/themes/dist/esm/props/prop-def.js" ;
6+ import type { WorkspaceMode } from "@shared/types" ;
7+ import { useMemo } from "react" ;
58
6- export type WorkspaceMode = "local" | "worktree" ;
9+ export type { WorkspaceMode } ;
710
811interface WorkspaceModeSelectProps {
912 value : WorkspaceMode ;
@@ -25,13 +28,26 @@ const MODE_CONFIG: Record<
2528 description : "Edits a copy so your work stays isolated" ,
2629 icon : < GitBranch size = { 16 } weight = "regular" /> ,
2730 } ,
31+ cloud : {
32+ label : "Cloud" ,
33+ description : "Runs in isolated sandbox" ,
34+ icon : < Cloud size = { 16 } weight = "regular" /> ,
35+ } ,
2836} ;
2937
3038export function WorkspaceModeSelect ( {
3139 value,
3240 onChange,
3341 size = "1" ,
3442} : WorkspaceModeSelectProps ) {
43+ const cloudModeEnabled = useFeatureFlag ( "twig-cloud-mode-toggle" ) ;
44+
45+ const availableModes = useMemo < WorkspaceMode [ ] > (
46+ ( ) =>
47+ cloudModeEnabled ? [ "worktree" , "local" , "cloud" ] : [ "worktree" , "local" ] ,
48+ [ cloudModeEnabled ] ,
49+ ) ;
50+
3551 const currentMode = MODE_CONFIG [ value ] ?? MODE_CONFIG . worktree ;
3652
3753 return (
@@ -49,40 +65,36 @@ export function WorkspaceModeSelect({
4965 </ DropdownMenu . Trigger >
5066
5167 < DropdownMenu . Content align = "start" size = "1" >
52- < DropdownMenu . Item
53- onSelect = { ( ) => onChange ( "worktree" ) }
54- style = { { padding : "6px 8px" , height : "auto" } }
55- >
56- < div style = { { display : "flex" , gap : 6 , alignItems : "flex-start" } } >
57- < GitBranch
58- size = { 12 }
59- style = { { marginTop : 2 , flexShrink : 0 , color : "var(--gray-11)" } }
60- />
61- < div >
62- < Text size = "1" > { MODE_CONFIG . worktree . label } </ Text >
63- < Text size = "1" color = "gray" style = { { display : "block" } } >
64- { MODE_CONFIG . worktree . description }
65- </ Text >
66- </ div >
67- </ div >
68- </ DropdownMenu . Item >
69- < DropdownMenu . Item
70- onSelect = { ( ) => onChange ( "local" ) }
71- style = { { padding : "6px 8px" , height : "auto" } }
72- >
73- < div style = { { display : "flex" , gap : 6 , alignItems : "flex-start" } } >
74- < Laptop
75- size = { 12 }
76- style = { { marginTop : 2 , flexShrink : 0 , color : "var(--gray-11)" } }
77- />
78- < div >
79- < Text size = "1" > { MODE_CONFIG . local . label } </ Text >
80- < Text size = "1" color = "gray" style = { { display : "block" } } >
81- { MODE_CONFIG . local . description }
82- </ Text >
83- </ div >
84- </ div >
85- </ DropdownMenu . Item >
68+ { availableModes . map ( ( mode ) => {
69+ const config = MODE_CONFIG [ mode ] ;
70+ return (
71+ < DropdownMenu . Item
72+ key = { mode }
73+ onSelect = { ( ) => onChange ( mode ) }
74+ style = { { padding : "6px 8px" , height : "auto" } }
75+ >
76+ < div
77+ style = { { display : "flex" , gap : 6 , alignItems : "flex-start" } }
78+ >
79+ < span
80+ style = { {
81+ marginTop : 2 ,
82+ flexShrink : 0 ,
83+ color : "var(--gray-11)" ,
84+ } }
85+ >
86+ { config . icon }
87+ </ span >
88+ < div >
89+ < Text size = "1" > { config . label } </ Text >
90+ < Text size = "1" color = "gray" style = { { display : "block" } } >
91+ { config . description }
92+ </ Text >
93+ </ div >
94+ </ div >
95+ </ DropdownMenu . Item >
96+ ) ;
97+ } ) }
8698 </ DropdownMenu . Content >
8799 </ DropdownMenu . Root >
88100 ) ;
0 commit comments