use-keybinds
Version:
Lightweight keybind library for React
3 lines • 1.66 kB
JavaScript
"use client"
import v,{createContext as S,useMemo as C}from"react";var a=(t,n)=>(n?"isSequential-":"")+t.join("");var u=S({keybinds:{},combinationsToKeybindKey:{}}),x=t=>{let{children:n,keybinds:e={}}=t,o=C(()=>Object.entries(e).reduce((i,d)=>{let l=d[0],c=d[1],y=a(c.keybind,c.isSequential);return{...i,[y]:l}},{}),[e]);return v.createElement(u.Provider,{value:{keybinds:e,combinationsToKeybindKey:o}},n)},k=x;import{useContext as R,useEffect as w}from"react";import{useCallback as K,useEffect as P,useState as T}from"react";var L=()=>{let[t,n]=T(typeof window<"u"?document.activeElement:null),e=K(()=>{n(document.activeElement)},[]),o=K(()=>{n(null)},[]);return P(()=>(addEventListener("focusin",e),addEventListener("focusout",o),()=>{removeEventListener("focusin",e),removeEventListener("focusout",o)}),[e,o]),t},f=L;var h=(t={})=>{let n=f(),{combinationsToKeybindKey:e}=R(u);w(()=>{let o=new Set([]),i=new Set([]),d=()=>{o.clear(),i.clear()},l=r=>Object.keys(e).join("").includes(r),c=r=>{if(n&&["INPUT","TEXTAREA"].includes(n.tagName))return;let s=r.code;l(s)?(o.add(s),i.add(s),setTimeout(()=>i.delete(s),4e3)):d();let p=a([...o],!1),g=a([...i],!0),E=e[p],b=e[g];b&&d();let m=t[b??E];m&&(i.clear(),m(r))},y=r=>{if(n&&["INPUT","TEXTAREA"].includes(n.tagName))return;let s=r.code;o.delete(s)};return addEventListener("keydown",c),addEventListener("keyup",y),()=>{removeEventListener("keydown",c),removeEventListener("keyup",y)}},[t,e,n])},F=h;import{useContext as N}from"react";var j=()=>{let{keybinds:t}=N(u);return{getKeybind:e=>t[e],keybinds:t}},q=j;export{k as KeybindsProvider,F as useKeybinds,q as useKeybindsList};
//# sourceMappingURL=index.mjs.map