@@ -26,10 +26,11 @@ import * as React from 'react';
2626import { CallLogView } from './callLog' ;
2727import './recorder.css' ;
2828import { asLocator } from '@isomorphic/locatorGenerators' ;
29- import { toggleTheme } from '@web/theme' ;
29+ import { useDarkModeSetting } from '@web/theme' ;
3030import { copy , useSetting } from '@web/uiUtils' ;
3131import yaml from 'yaml' ;
3232import { parseAriaSnapshot } from '@isomorphic/ariaSnapshot' ;
33+ import { Dialog } from '@web/components/dialog' ;
3334
3435export interface RecorderProps {
3536 sources : Source [ ] ,
@@ -48,8 +49,16 @@ export const Recorder: React.FC<RecorderProps> = ({
4849 const [ selectedTab , setSelectedTab ] = useSetting < string > ( 'recorderPropertiesTab' , 'log' ) ;
4950 const [ ariaSnapshot , setAriaSnapshot ] = React . useState < string | undefined > ( ) ;
5051 const [ ariaSnapshotErrors , setAriaSnapshotErrors ] = React . useState < SourceHighlight [ ] > ( ) ;
52+ const [ settingsOpen , setSettingsOpen ] = React . useState ( false ) ;
53+ const [ darkMode , setDarkMode ] = useDarkModeSetting ( ) ;
54+ const [ autoExpect , setAutoExpect ] = useSetting < boolean > ( 'autoExpect' , false ) ;
55+ const settingsButtonRef = React . useRef < HTMLButtonElement > ( null ) ;
5156 window . playwrightSelectSource = selectedSourceId => setSelectedFileId ( selectedSourceId ) ;
5257
58+ React . useEffect ( ( ) => {
59+ window . dispatch ( { event : 'setAutoExpect' , params : { autoExpect } } ) ;
60+ } , [ autoExpect ] ) ;
61+
5362 const source = React . useMemo ( ( ) => {
5463 const source = sources . find ( s => s . id === selectedFileId ) ;
5564 return source ?? emptySource ( ) ;
@@ -178,7 +187,33 @@ export const Recorder: React.FC<RecorderProps> = ({
178187 < ToolbarButton icon = 'clear-all' title = 'Clear' disabled = { ! source || ! source . text } onClick = { ( ) => {
179188 window . dispatch ( { event : 'clear' } ) ;
180189 } } > </ ToolbarButton >
181- < ToolbarButton icon = 'color-mode' title = 'Toggle color mode' toggled = { false } onClick = { ( ) => toggleTheme ( ) } > </ ToolbarButton >
190+ < ToolbarButton
191+ ref = { settingsButtonRef }
192+ icon = 'settings-gear'
193+ title = 'Settings'
194+ onClick = { ( ) => setSettingsOpen ( current => ! current ) }
195+ />
196+ < Dialog
197+ style = { { padding : '4px 8px' } }
198+ open = { settingsOpen }
199+ width = { 200 }
200+ verticalOffset = { 8 }
201+ requestClose = { ( ) => setSettingsOpen ( false ) }
202+ anchor = { settingsButtonRef }
203+ dataTestId = 'settings-dialog'
204+ >
205+ < div key = 'dark-mode-setting' className = 'setting' >
206+ < input type = 'checkbox' id = 'dark-mode-setting' checked = { darkMode } onChange = { ( ) => setDarkMode ( ! darkMode ) } />
207+ < label htmlFor = 'dark-mode-setting' > Dark mode</ label >
208+ </ div >
209+ < div key = 'auto-expect-setting' className = 'setting' title = 'Automatically generate assertions while recording' >
210+ < input type = 'checkbox' id = 'auto-expect-setting' checked = { autoExpect } onChange = { ( ) => {
211+ window . dispatch ( { event : 'setAutoExpect' , params : { autoExpect : ! autoExpect } } ) ;
212+ setAutoExpect ( ! autoExpect ) ;
213+ } } />
214+ < label htmlFor = 'auto-expect-setting' > Generate assertions</ label >
215+ </ div >
216+ </ Dialog >
182217 </ Toolbar >
183218 < SplitView
184219 sidebarSize = { 200 }
0 commit comments