@@ -9,6 +9,19 @@ import {
99 VSCodeRadioGroup ,
1010 VSCodeRadio ,
1111} from "@vscode/webview-ui-toolkit/react"
12+ import { CaretSortIcon , CheckIcon } from "@radix-ui/react-icons"
13+ import {
14+ Button ,
15+ Command ,
16+ CommandGroup ,
17+ CommandInput ,
18+ CommandItem ,
19+ CommandList ,
20+ Popover ,
21+ PopoverContent ,
22+ PopoverTrigger ,
23+ } from "@/components/ui"
24+ import { cn } from "@/lib/utils"
1225import { useExtensionState } from "../../context/ExtensionStateContext"
1326import {
1427 Mode ,
@@ -66,6 +79,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
6679 const [ testPrompt , setTestPrompt ] = useState ( "" )
6780 const [ isEnhancing , setIsEnhancing ] = useState ( false )
6881 const [ isDialogOpen , setIsDialogOpen ] = useState ( false )
82+ const [ open , setOpen ] = useState ( false )
83+ const [ isCustomLanguage , setIsCustomLanguage ] = useState ( false )
84+ const [ customLanguage , setCustomLanguage ] = useState ( "" )
6985 const [ selectedPromptContent , setSelectedPromptContent ] = useState ( "" )
7086 const [ selectedPromptTitle , setSelectedPromptTitle ] = useState ( "" )
7187 const [ isToolsEditMode , setIsToolsEditMode ] = useState ( false )
@@ -399,38 +415,88 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
399415 < div className = "pb-5 border-b border-vscode-input-border" >
400416 < div className = "mb-5" >
401417 < div className = "font-bold mb-1" > Preferred Language</ div >
402- < select
403- value = { preferredLanguage }
404- onChange = { ( e ) => {
405- setPreferredLanguage ( e . target . value )
406- vscode . postMessage ( {
407- type : "preferredLanguage" ,
408- text : e . target . value ,
409- } )
410- } }
411- className = "w-full px-2 py-1 h-7 bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border rounded" >
412- < option value = "English" > English</ option >
413- < option value = "Arabic" > Arabic - العربية</ option >
414- < option value = "Brazilian Portuguese" > Portuguese - Português (Brasil)</ option >
415- < option value = "Catalan" > Catalan - Català</ option >
416- < option value = "Czech" > Czech - Čeština</ option >
417- < option value = "French" > French - Français</ option >
418- < option value = "German" > German - Deutsch</ option >
419- < option value = "Hindi" > Hindi - हिन्दी</ option >
420- < option value = "Hungarian" > Hungarian - Magyar</ option >
421- < option value = "Italian" > Italian - Italiano</ option >
422- < option value = "Japanese" > Japanese - 日本語</ option >
423- < option value = "Korean" > Korean - 한국어</ option >
424- < option value = "Polish" > Polish - Polski</ option >
425- < option value = "Portuguese" > Portuguese - Português (Portugal)</ option >
426- < option value = "Russian" > Russian - Русский</ option >
427- < option value = "Simplified Chinese" > Simplified Chinese - 简体中文</ option >
428- < option value = "Spanish" > Spanish - Español</ option >
429- < option value = "Traditional Chinese" > Traditional Chinese - 繁體中文</ option >
430- < option value = "Turkish" > Turkish - Türkçe</ option >
431- </ select >
418+ < Popover open = { open } onOpenChange = { setOpen } >
419+ < PopoverTrigger asChild >
420+ < Button
421+ variant = "combobox"
422+ role = "combobox"
423+ aria-expanded = { open }
424+ className = "w-full justify-between" >
425+ { preferredLanguage ?? "Select language..." }
426+ < CaretSortIcon className = "opacity-50" />
427+ </ Button >
428+ </ PopoverTrigger >
429+ < PopoverContent align = "start" className = "p-0" >
430+ < Command >
431+ < CommandInput placeholder = "Search language..." className = "h-9" />
432+ < CommandList >
433+ < CommandGroup >
434+ { [
435+ { value : "English" , label : "English" } ,
436+ { value : "Arabic" , label : "Arabic - العربية" } ,
437+ {
438+ value : "Brazilian Portuguese" ,
439+ label : "Portuguese - Português (Brasil)" ,
440+ } ,
441+ { value : "Catalan" , label : "Catalan - Català" } ,
442+ { value : "Czech" , label : "Czech - Čeština" } ,
443+ { value : "French" , label : "French - Français" } ,
444+ { value : "German" , label : "German - Deutsch" } ,
445+ { value : "Hindi" , label : "Hindi - हिन्दी" } ,
446+ { value : "Hungarian" , label : "Hungarian - Magyar" } ,
447+ { value : "Italian" , label : "Italian - Italiano" } ,
448+ { value : "Japanese" , label : "Japanese - 日本語" } ,
449+ { value : "Korean" , label : "Korean - 한국어" } ,
450+ { value : "Polish" , label : "Polish - Polski" } ,
451+ { value : "Portuguese" , label : "Portuguese - Português (Portugal)" } ,
452+ { value : "Russian" , label : "Russian - Русский" } ,
453+ { value : "Simplified Chinese" , label : "Simplified Chinese - 简体中文" } ,
454+ { value : "Spanish" , label : "Spanish - Español" } ,
455+ {
456+ value : "Traditional Chinese" ,
457+ label : "Traditional Chinese - 繁體中文" ,
458+ } ,
459+ { value : "Turkish" , label : "Turkish - Türkçe" } ,
460+ ] . map ( ( language ) => (
461+ < CommandItem
462+ key = { language . value }
463+ value = { language . value }
464+ onSelect = { ( value ) => {
465+ setPreferredLanguage ( value )
466+ vscode . postMessage ( {
467+ type : "preferredLanguage" ,
468+ text : value ,
469+ } )
470+ setOpen ( false )
471+ } } >
472+ { language . label }
473+ < CheckIcon
474+ className = { cn (
475+ "ml-auto" ,
476+ preferredLanguage === language . value
477+ ? "opacity-100"
478+ : "opacity-0" ,
479+ ) }
480+ />
481+ </ CommandItem >
482+ ) ) }
483+ </ CommandGroup >
484+ </ CommandList >
485+ </ Command >
486+ < div className = "border-t border-[var(--vscode-input-border)]" >
487+ < button
488+ className = "w-full px-2 py-1.5 text-sm text-left hover:bg-[var(--vscode-list-hoverBackground)]"
489+ onClick = { ( ) => {
490+ setIsCustomLanguage ( true )
491+ setOpen ( false )
492+ } } >
493+ + Choose another language
494+ </ button >
495+ </ div >
496+ </ PopoverContent >
497+ </ Popover >
432498 < p className = "text-xs mt-1.5 text-vscode-descriptionForeground" >
433- Select the language that Cline should use for communication.
499+ Select the language that Roo should use for communication.
434500 </ p >
435501 </ div >
436502
@@ -1359,6 +1425,40 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
13591425 </ div >
13601426 </ div >
13611427 ) }
1428+ { isCustomLanguage && (
1429+ < div className = "fixed inset-0 bg-black/50 flex items-center justify-center z-50" >
1430+ < div className = "bg-[var(--vscode-editor-background)] p-6 rounded-lg w-96" >
1431+ < h3 className = "text-lg font-semibold mb-4" > Add Custom Language</ h3 >
1432+ < input
1433+ type = "text"
1434+ className = "w-full p-2 mb-4 bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border border-[var(--vscode-input-border)] rounded"
1435+ placeholder = "Enter language name"
1436+ value = { customLanguage }
1437+ onChange = { ( e ) => setCustomLanguage ( e . target . value ) }
1438+ />
1439+ < div className = "flex justify-end gap-2" >
1440+ < Button variant = "secondary" onClick = { ( ) => setIsCustomLanguage ( false ) } >
1441+ Cancel
1442+ </ Button >
1443+ < Button
1444+ onClick = { ( ) => {
1445+ if ( customLanguage . trim ( ) ) {
1446+ setPreferredLanguage ( customLanguage . trim ( ) )
1447+ vscode . postMessage ( {
1448+ type : "preferredLanguage" ,
1449+ text : customLanguage . trim ( ) ,
1450+ } )
1451+ setIsCustomLanguage ( false )
1452+ setCustomLanguage ( "" )
1453+ }
1454+ } }
1455+ disabled = { ! customLanguage . trim ( ) } >
1456+ Add
1457+ </ Button >
1458+ </ div >
1459+ </ div >
1460+ </ div >
1461+ ) }
13621462 </ div >
13631463 )
13641464}
0 commit comments