/ src / hooks / useExitOnCtrlCD.ts
useExitOnCtrlCD.ts
 1  import { useInput } from 'ink'
 2  import { useDoublePress } from './useDoublePress.js'
 3  import { useState } from 'react'
 4  
 5  type ExitState = {
 6    pending: boolean
 7    keyName: 'Ctrl-C' | 'Ctrl-D' | null
 8  }
 9  
10  export function useExitOnCtrlCD(onExit: () => void): ExitState {
11    const [exitState, setExitState] = useState<ExitState>({
12      pending: false,
13      keyName: null,
14    })
15  
16    const handleCtrlC = useDoublePress(
17      pending => setExitState({ pending, keyName: 'Ctrl-C' }),
18      onExit,
19    )
20    const handleCtrlD = useDoublePress(
21      pending => setExitState({ pending, keyName: 'Ctrl-D' }),
22      onExit,
23    )
24  
25    useInput((input, key) => {
26      if (key.ctrl && input === 'c') handleCtrlC()
27      if (key.ctrl && input === 'd') handleCtrlD()
28    })
29  
30    return exitState
31  }