1 |
"use client"; |
2 |
|
3 |
import useIsDesktop from "@/hooks/useIsDesktop"; |
4 |
import usePlatform from "@/hooks/usePlatform"; |
5 |
import styles from "@/styles/Search.module.css"; |
6 |
import { Button } from "@mui/material"; |
7 |
import { useEffect, useState } from "react"; |
8 |
import { MdSearch } from "react-icons/md"; |
9 |
import SearchModal from "./SearchModal"; |
10 |
|
11 |
export default function Search() { |
12 |
const platform = usePlatform(); |
13 |
const isDesktop = useIsDesktop(); |
14 |
const [modalOpen, setModalOpen] = useState(false); |
15 |
|
16 |
useEffect(() => { |
17 |
const callback = (event: KeyboardEvent) => { |
18 |
if ( |
19 |
event.code === "Slash" || |
20 |
((platform === "darwin" ? event.metaKey : event.ctrlKey) && |
21 |
event.code === "KeyK") |
22 |
) { |
23 |
event.preventDefault(); |
24 |
setTimeout(() => setModalOpen(true), 120); |
25 |
} else if (event.code === "Escape" && modalOpen) { |
26 |
event.preventDefault(); |
27 |
setModalOpen(false); |
28 |
} |
29 |
}; |
30 |
|
31 |
window.addEventListener("keydown", callback); |
32 |
|
33 |
return () => window.removeEventListener("keydown", callback); |
34 |
}, [modalOpen]); |
35 |
|
36 |
return ( |
37 |
<> |
38 |
<div className={styles.root}> |
39 |
{!isDesktop && ( |
40 |
<Button |
41 |
style={{ minWidth: 0, color: "#fff" }} |
42 |
className="text-white" |
43 |
onClick={() => setModalOpen(true)} |
44 |
> |
45 |
<MdSearch size={23} style={{ color: "white" }} /> |
46 |
</Button> |
47 |
)} |
48 |
{isDesktop && <MdSearch size={25} />} |
49 |
{isDesktop && ( |
50 |
<div |
51 |
className={styles.input} |
52 |
onClick={() => setModalOpen(true)} |
53 |
> |
54 |
Search anything |
55 |
</div> |
56 |
)} |
57 |
{isDesktop && ( |
58 |
<span className={styles.shortcut}> |
59 |
{platform === "darwin" ? "⌘" : "Ctrl +"} K |
60 |
</span> |
61 |
)} |
62 |
</div> |
63 |
{modalOpen && <SearchModal onClose={() => setModalOpen(false)} />} |
64 |
</> |
65 |
); |
66 |
} |