From 737344a72d23dc97b0d0e73cc4ab7fdffd0fbf49 Mon Sep 17 00:00:00 2001 From: Brendan F Date: Sun, 14 May 2023 23:12:27 -0700 Subject: Merge in react app code From sluchajfun and youtube-heardle-template --- src/components/Search/index.styled.ts | 88 +++++++++++++++++++++++++++++++++++ src/components/Search/index.tsx | 67 ++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 src/components/Search/index.styled.ts create mode 100644 src/components/Search/index.tsx (limited to 'src/components/Search') diff --git a/src/components/Search/index.styled.ts b/src/components/Search/index.styled.ts new file mode 100644 index 0000000..c1344d5 --- /dev/null +++ b/src/components/Search/index.styled.ts @@ -0,0 +1,88 @@ +import styled from "styled-components"; + +export const Container = styled.div` + position: relative; + + width: 100%; + + margin-top: 5%; +`; + +export const SearchContainer = styled.div` + display: flex; + align-items: center; + + width: 100%; + height: 50px; + + border-color: ${({ theme }) => theme.border}; + border-width: 1px; + border-radius: 5px; + border-style: solid; + + color: ${({ theme }) => theme.text}; +`; + +export const SearchPadding = styled.div` + display: flex; + align-items: center; + + width: 100%; + + padding: 0 15px; +`; + +export const Input = styled.input` + width: 100%; + height: 100%; + margin: 0 10px; + + background-color: transparent; + border: none; + outline: none !important; + + color: ${({ theme }) => theme.text}; + font-size: 1rem; +`; + +export const ResultsContainer = styled.div` + position: absolute; + bottom: 50px; + z-index: 1; + + display: flex; + flex-direction: column; + justify-content: flex-end; + + width: 100%; + + overflow-y: scroll; +`; + +export const Result = styled.div` + padding: 1px 15px; + + background-color: ${({ theme }) => theme.background100}; + + border-color: ${({ theme }) => theme.border}; + border-width: 1px; + border-radius: 5px; + border-style: solid; + + color: ${({ theme }) => theme.text}; + + cursor: pointer; +`; + +export const ResultText = styled.p` + width: 100%; + + color: ${({ theme }) => theme.text}; + font-size: 0.9rem; + + user-select: none; + + &:hover { + opacity: 0.8; + } +`; diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx new file mode 100644 index 0000000..16f5c9e --- /dev/null +++ b/src/components/Search/index.tsx @@ -0,0 +1,67 @@ +import React from "react"; +import { event } from "react-ga"; +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>; +} + +export function Search({ currentTry, setSelectedSong }: Props) { + const [value, setValue] = React.useState(""); + const [results, setResults] = React.useState([]); + + React.useEffect(() => { + if (value) { + setResults(searchSong(value)); + } else if (value === "") { + setResults([]); + } + }, [value]); + + // clear value on selection + React.useEffect(() => { + setValue(""); + }, [currentTry]); + + return ( + + + {results.map((song) => ( + { + setSelectedSong(song); + setValue(`${song.artist} - ${song.name}`); + setResults([]); + + event({ + category: "Player", + action: "Chose song", + label: `${song.artist} - ${song.name}`, + }); + }} + > + + {song.artist} - {song.name} + + + ))} + + + + + setValue(e.currentTarget.value)} + placeholder="Search" + value={value} + /> + + + + ); +} -- cgit v1.2.3