@@ -3,7 +3,10 @@ import { IconNames } from '@blueprintjs/icons';
33import { ItemListRenderer , ItemRenderer , Select } from '@blueprintjs/select' ;
44import { Chapter , Variant } from 'js-slang/dist/types' ;
55import React from 'react' ;
6+ import { useDispatch } from 'react-redux' ;
7+ import { playgroundConductorEvaluator } from 'src/features/playground/PlaygroundActions' ;
68
9+ import { flagConductorEnable } from '../../features/conductor/flagConductorEnable' ;
710import {
811 fullJSLanguage ,
912 fullTSLanguage ,
@@ -15,6 +18,8 @@ import {
1518 sourceLanguages ,
1619 styliseSublanguage
1720} from '../application/ApplicationTypes' ;
21+ import { IEvaluatorDefinition } from '../directory/language' ;
22+ import { useFeature } from '../featureFlags/useFeature' ;
1823import Constants from '../utils/Constants' ;
1924import { useTypedSelector } from '../utils/Hooks' ;
2025
@@ -69,7 +74,24 @@ const chapterRenderer: (isFolderModeEnabled: boolean) => ItemRenderer<SALanguage
6974 ) ;
7075 } ;
7176
77+ const evaluatorListRenderer : ItemListRenderer < IEvaluatorDefinition > = ( {
78+ itemsParentRef,
79+ renderItem,
80+ items
81+ } ) => {
82+ return (
83+ < Menu ulRef = { itemsParentRef } style = { { display : 'flex' , flexDirection : 'column' } } >
84+ { items . map ( renderItem ) }
85+ </ Menu >
86+ ) ;
87+ } ;
88+
89+ const evaluatorRenderer : ItemRenderer < IEvaluatorDefinition > = ( evaluator , { handleClick } ) => {
90+ return < MenuItem onClick = { handleClick } text = { evaluator . name } /> ;
91+ } ;
92+
7293const ChapterSelectComponent = Select . ofType < SALanguage > ( ) ;
94+ const EvaluatorSelectComponent = Select < IEvaluatorDefinition > ;
7395
7496export const ControlBarChapterSelect : React . FC < ControlBarChapterSelectProps > = ( {
7597 isFolderModeEnabled,
@@ -80,6 +102,34 @@ export const ControlBarChapterSelect: React.FC<ControlBarChapterSelectProps> = (
80102} ) => {
81103 const selectedLang = useTypedSelector ( store => store . playground . languageConfig . mainLanguage ) ;
82104
105+ const currentLang = useTypedSelector ( store => store . playground . conductorLanguage ) ;
106+ const currentEval = useTypedSelector ( store => store . playground . conductorEvaluator ) ;
107+ const dispatch = useDispatch ( ) ;
108+
109+ const conductorEnabled = useFeature ( flagConductorEnable ) ;
110+ if ( conductorEnabled ) {
111+ const handleChapterSelect = ( evaluator : IEvaluatorDefinition ) => {
112+ dispatch ( playgroundConductorEvaluator ( evaluator ) ) ;
113+ } ;
114+ return (
115+ < EvaluatorSelectComponent
116+ items = { currentLang . evaluators }
117+ onItemSelect = { handleChapterSelect }
118+ itemRenderer = { evaluatorRenderer }
119+ itemListRenderer = { evaluatorListRenderer }
120+ filterable = { false }
121+ disabled = { disabled }
122+ >
123+ < Button
124+ minimal
125+ text = { currentEval ?. name }
126+ rightIcon = { disabled ? null : IconNames . DOUBLE_CARET_VERTICAL }
127+ disabled = { disabled }
128+ />
129+ </ EvaluatorSelectComponent >
130+ ) ;
131+ }
132+
83133 const choices = [
84134 ...sourceLanguages ,
85135 // Full JS/TS version uses eval(), which is a huge security risk, so we only enable
0 commit comments