import React, { useEffect, useState, useMemo } from 'react' import styled from 'styled-components' import { AiOutlineSearch } from 'react-icons/ai' import Layout from '../shared/components/Layout' import { fetchThumbnail, fetchVodFiles } from '../shared/api' import { VideoOnDemand, Thumbnail } from '../models' import VideoCard from '../shared/components/Card/VideoCard' import { screenSizes, defaultVideoCardProperties } from '../shared/constants' import { useWindowDimensions } from '../shared/hooks' const StyledSearchItem = styled.div` display: flex; margin: auto; margin-top: 20px; margin-bottom: 20px; border: 2px solid ${(props) => props.theme.palette.primary.main}; border-radius: 50px; min-height: 42px; width: 300px; padding: 10px; align-items: center; @media (max-width: ${screenSizes.s}px) { border-left: none; border-right: none; border-radius: 0; padding: 10px 0; width: 100%; max-width: 100%; } ` const StyledSearchInput = styled.input` border: none; height: 100%; flex: 1; padding: 0 5px; font-size: 18px; background: none; margin: 0 10px; &:focus { outline: none; } @media (max-width: ${screenSizes.s}px) { margin-left: 30px; } ` const StyledSearch = styled.td` margin: 0 10px; & svg { color: ${(props) => props.theme.palette.primary.main}; font-size: 26px; } @media (max-width: ${screenSizes.s}px) { margin-right: 30px; } ` const StyledVideoList = styled.div` padding: 0 40px; display: flex; flex-direction: row; justify-content: space-evenly; margin-top: 10px; margin-bottom: 50px; flex-wrap: wrap; justify-content: center; ` const StyledVideoCard = styled.div` margin: 10px; display: flex; flex-direction: column; align-items: center; justify-content: center; ` type VideoItemProps = { asset: VideoOnDemand } const VideoItem = ({ vod }: VideoItemProps) => { const [thumbnail, setThumbnail] = useState< | { obj: Thumbnail url: string } | undefined >(undefined) const { width } = useWindowDimensions() const videoCardProperties = useMemo(() => { if (defaultVideoCardProperties.width > width - 100) { return { ...defaultVideoCardProperties, width: width - 100, infos: 'hide', } } return defaultVideoCardProperties }, [width]) useEffect(() => { ;(async () => { try { if (vod.media?.thumbnail) { const data = await fetchThumbnail(vod.media) setThumbnail({ obj: vod.media?.thumbnail, url: data as string, }) } } catch (error) { console.error('search.tsx(fetchThumbnail):') } })() }, [vod]) return ( ) } const SearchPage = () => { const [vodAssets, setVodAssets] = useState>([]) const [nextToken, setNextToken] = useState(null) const [searchValue, setSearchValue] = useState('') const { width } = useWindowDimensions() const filterAssets = (elem: VideoOnDemand) => elem.media?.title.toLowerCase().includes(searchValue.toLowerCase()) || elem.media?.description .toLowerCase() .includes(searchValue.toLowerCase()) useEffect(() => { ;(async () => { try { const { data } = await fetchVodFiles(nextToken) setNextToken( data?.listVideoOnDemands?.nextToken ? data.listVideoOnDemands.nextToken : null ) setVodAssets( data?.listVideoOnDemands?.items as Array ) } catch (error) { console.error('search.tsx(fetchVodFiles):', error) } })() }, [nextToken]) return ( setSearchValue(e.target.value)} /> {width >= screenSizes.xs && ( )} {vodAssets .filter(filterAssets) .map((elem: VideoOnDemand, key) => { return })} ) } export default SearchPage