Sifa professional network frontend (Next.js, React, TailwindCSS) sifa.id/
at main 45 lines 1.1 kB view raw
1'use client'; 2 3import { useCallback, useEffect, useRef, useState } from 'react'; 4 5const KONAMI_CODE = [ 6 'ArrowUp', 7 'ArrowUp', 8 'ArrowDown', 9 'ArrowDown', 10 'ArrowLeft', 11 'ArrowRight', 12 'ArrowLeft', 13 'ArrowRight', 14 'b', 15 'a', 16]; 17 18export function useKonamiCode() { 19 const [activated, setActivated] = useState(false); 20 const positionRef = useRef(0); 21 22 useEffect(() => { 23 function handleKeyDown(e: KeyboardEvent) { 24 const key = e.key.length === 1 ? e.key.toLowerCase() : e.key; 25 if (key === KONAMI_CODE[positionRef.current]) { 26 const next = positionRef.current + 1; 27 if (next === KONAMI_CODE.length) { 28 setActivated(true); 29 positionRef.current = 0; 30 } else { 31 positionRef.current = next; 32 } 33 } else { 34 positionRef.current = key === KONAMI_CODE[0] ? 1 : 0; 35 } 36 } 37 38 window.addEventListener('keydown', handleKeyDown); 39 return () => window.removeEventListener('keydown', handleKeyDown); 40 }, []); 41 42 const dismiss = useCallback(() => setActivated(false), []); 43 44 return { activated, dismiss }; 45}