1- import { useEffect , useRef , useState } from 'react'
1+ import { useCallback , useEffect , useRef , useState } from 'react'
22import Split from 'react-split'
33import * as monaco from 'monaco-editor'
44import CodeMirror , { EditorView } from '@uiw/react-codemirror'
@@ -14,6 +14,7 @@ import defaultSettings, { IPreferencesContext, lightThemes, preferenceParams } f
1414import { Menu } from './Navigation'
1515import { PreferencesContext } from './Popups/Settings'
1616import { Entries } from './utils/Entries'
17+ import { save } from './utils/SaveToFile'
1718import { fixedEncodeURIComponent , formatArgs , lookupUrl , parseArgs } from './utils/UrlParsing'
1819import { useWindowDimensions } from './utils/WindowWidth'
1920
@@ -377,6 +378,30 @@ function App() {
377378 }
378379 } , [ ] )
379380
381+ // Stop the browser's save dialog on Ctrl+S
382+ const handleKeyDown = useCallback ( ( event : KeyboardEvent ) => {
383+ if ( ( event . ctrlKey || event . metaKey ) && event . key . toLowerCase ( ) === 's' ) {
384+ event . preventDefault ( )
385+ }
386+ } , [ ] )
387+
388+ // Actually save the file on Ctrl+S
389+ const handleKeyUp = useCallback ( ( event : KeyboardEvent ) => {
390+ if ( ( event . ctrlKey || event . metaKey ) && event . key . toLowerCase ( ) === 's' ) {
391+ event . preventDefault ( )
392+ save ( code )
393+ }
394+ } , [ code ] )
395+
396+ useEffect ( ( ) => {
397+ document . addEventListener ( 'keydown' , handleKeyDown )
398+ document . addEventListener ( 'keyup' , handleKeyUp )
399+ return ( ) => {
400+ document . removeEventListener ( 'keydown' , handleKeyDown )
401+ document . removeEventListener ( 'keyup' , handleKeyUp )
402+ }
403+ } , [ handleKeyDown , handleKeyUp ] )
404+
380405 return < PreferencesContext . Provider value = { { preferences, setPreferences} } >
381406 < div className = "app monaco-editor" >
382407 < nav >
0 commit comments