UNPKG

use-keybinds

Version:

Lightweight keybind library for React

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