73 lines
1.5 KiB
JavaScript
73 lines
1.5 KiB
JavaScript
import { useEffect } from 'react'
|
|
import Router from 'next/router'
|
|
import logout from '../util/logout'
|
|
import addBase from '../../util/addBase'
|
|
|
|
/* - keyboard shortcuts
|
|
g then h -> navigate home
|
|
g then n -> navigate to new doc
|
|
g then s -> navigate to settings
|
|
g then l -> logout
|
|
e (when on doc page) -> edit doc
|
|
/ (when on home page) -> focus search
|
|
ctrl/cmd + enter -> submit new doc (handled in CodeMirror component)
|
|
*/
|
|
const keyToUrl = {
|
|
72: '/',
|
|
78: '/new',
|
|
83: '/settings',
|
|
}
|
|
const keyToEl = {
|
|
69: { sel: '#edit', func: 'click' },
|
|
191: { sel: '.search', func: 'focus' },
|
|
}
|
|
const getKey = e => e.which || e.keyCode
|
|
|
|
let prevKey
|
|
|
|
const handleKeyDown = e => {
|
|
const tag = e.target.tagName
|
|
if (tag === 'INPUT' || tag === 'TEXTAREA') return
|
|
const key = getKey(e)
|
|
if (prevKey === 71) {
|
|
// prev key was g
|
|
switch (key) {
|
|
case 72:
|
|
case 78:
|
|
case 83: {
|
|
const url = keyToUrl[key]
|
|
Router.push(url, addBase(url))
|
|
break
|
|
}
|
|
case 76: {
|
|
// logout
|
|
setTimeout(logout, 1)
|
|
break
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
switch (key) {
|
|
case 69:
|
|
case 191: {
|
|
const { sel, func } = keyToEl[key]
|
|
const el = document.querySelector(sel)
|
|
if (el) setTimeout(() => el[func](), 1)
|
|
break
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
prevKey = key
|
|
}
|
|
|
|
export default function Shortcuts(props) {
|
|
useEffect(() => {
|
|
window.addEventListener('keydown', handleKeyDown)
|
|
return () => window.removeEventListener('keydown', handleKeyDown)
|
|
}, [])
|
|
|
|
return null
|
|
}
|