blob: 72ce8a101bd9fce24e4192f59fc23bdd9ebca3c0 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import React from "react";
import { IoSearch } from "react-icons/io5";
import { searchSong } from "../../helpers";
import { Song } from "../../types/song";
import * as Styled from "./index.styled";
interface Props {
currentTry: number;
setSelectedSong: React.Dispatch<React.SetStateAction<Song | undefined>>;
/** Optional override of the song pool to search within. */
songs?: Song[];
}
export function Search({ currentTry, setSelectedSong, songs }: Props) {
const [value, setValue] = React.useState("");
const [results, setResults] = React.useState<Song[]>([]);
React.useEffect(() => {
if (!value.trim()) {
setResults([]);
return;
}
setResults(searchSong(value, songs));
}, [value, songs]);
React.useEffect(() => {
setValue("");
}, [currentTry]);
return (
<Styled.Container>
<Styled.ResultsContainer>
{results.map((song) => (
<Styled.Result
key={song.youtubeId}
onClick={() => {
setSelectedSong(song);
setValue(`${song.artist} - ${song.name}`);
setResults([]);
}}
>
<Styled.ResultText>
{song.artist} - {song.name}
</Styled.ResultText>
</Styled.Result>
))}
</Styled.ResultsContainer>
<Styled.SearchContainer>
<Styled.SearchPadding>
<IoSearch size={20} />
<Styled.Input
value={value}
onChange={(e) => setValue(e.currentTarget.value)}
placeholder="Search"
/>
</Styled.SearchPadding>
</Styled.SearchContainer>
</Styled.Container>
);
}
|