Sifa professional network frontend (Next.js, React, TailwindCSS)
sifa.id/
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}