mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
* chore: remove sliding menu * feat(ui): sheet * feat: shortcut component * chore: register new shortcut component to layout * fix: react attr naming * fix: set default to false for shortcut * feat(store): keydown-manager * feat(hooks): keyboard manager * chore: use util from base for la-editor * chore: use util from base for minimal-tiptap-editor * chore(utils): keyboard * chore: use new keyboard manager * fix: uniqueness of certain component * feat: global key handler * chore: implement new key handler
64 lines
1.3 KiB
TypeScript
64 lines
1.3 KiB
TypeScript
"use client"
|
|
|
|
import { useState, useEffect, useCallback } from "react"
|
|
import { useKeydownListener } from "@/hooks/use-keydown-listener"
|
|
import { useAuth } from "@clerk/nextjs"
|
|
import { useRouter } from "next/navigation"
|
|
|
|
type Sequence = {
|
|
[key: string]: string
|
|
}
|
|
|
|
const SEQUENCES: Sequence = {
|
|
GL: "/links",
|
|
GP: "/pages",
|
|
GT: "/topics"
|
|
}
|
|
|
|
const MAX_SEQUENCE_TIME = 1000
|
|
|
|
export function GlobalKeydownHandler() {
|
|
const [sequence, setSequence] = useState<string[]>([])
|
|
const { signOut } = useAuth()
|
|
const router = useRouter()
|
|
|
|
const resetSequence = useCallback(() => {
|
|
setSequence([])
|
|
}, [])
|
|
|
|
const checkSequence = useCallback(() => {
|
|
const sequenceStr = sequence.join("")
|
|
const route = SEQUENCES[sequenceStr]
|
|
|
|
if (route) {
|
|
console.log(`Navigating to ${route}...`)
|
|
router.push(route)
|
|
resetSequence()
|
|
}
|
|
}, [sequence, router, resetSequence])
|
|
|
|
useKeydownListener((e: KeyboardEvent) => {
|
|
// Check for logout shortcut
|
|
if (e.altKey && e.shiftKey && e.code === "KeyQ") {
|
|
signOut()
|
|
return
|
|
}
|
|
|
|
// Key sequence handling
|
|
const key = e.key.toUpperCase()
|
|
setSequence(prev => [...prev, key])
|
|
})
|
|
|
|
useEffect(() => {
|
|
checkSequence()
|
|
|
|
const timeoutId = setTimeout(() => {
|
|
resetSequence()
|
|
}, MAX_SEQUENCE_TIME)
|
|
|
|
return () => clearTimeout(timeoutId)
|
|
}, [sequence, checkSequence, resetSequence])
|
|
|
|
return null
|
|
}
|