import React, { ChangeEvent, Dispatch, SetStateAction, useEffect, useRef, useState } from 'react'; import { motion } from 'framer-motion'; import { Link } from 'react-router-dom'; import './main.css'; import LogoImage from './logo.png'; import FilterIcon from './filter.svg'; import SearchIcon from './search.svg'; import { IFilterQuery } from '../types'; import { emptyQuery } from './utils'; import { useFocus } from '../utils'; const Navbar = ({ setSearchQuery, query }: { setSearchQuery: Dispatch>; query: IFilterQuery; }) => { /* * Hooks */ const [searchCollapsed, setSearchCollapsed] = useState(true); const [filtersCollapsed, setFiltersCollapsed] = useState(true); const [localFilters, setLocalFilters] = useState>(); const searchInput = useRef(null); const setInputFocus = useFocus(searchInput); const formRef = useRef(null); useEffect(() => { if (formRef.current) { for (const [key, value] of Object.entries(query)) { console.log(key, value); if (formRef.current.elements.namedItem(key)) { (formRef.current.elements.namedItem( key ) as HTMLSelectElement).value = value; } } } }, [query]); /* * Animations */ const searchVariants = { open: { width: 'calc(100vw - 4vh)', display: 'block' }, closed: { width: '6vh', transitionEnd: { display: 'none' } } }; const navVariants = { open: { height: '100vh', borderTopLeftRadius: 0, borderTopRightRadius: 0 }, closed: { height: '10vh', borderTopLeftRadius: '20px', borderTopRightRadius: '20px' } }; const filtersVariants = { open: { height: '100vh', padding: '2vh' }, closed: { height: 0, padding: 0 } }; const transition = { ease: 'easeIn', duration: 0.5 }; /* * Input handlers */ const handleFiltersButton = () => { if (!filtersCollapsed) { setSearchQuery((prev) => { return { ...prev, ...localFilters }; }); } setFiltersCollapsed((prev) => !prev); }; const handleSelectChange = ({ target: element }: ChangeEvent) => { setLocalFilters((prev) => { return { ...prev, [element.name]: element.value }; }); }; const handleSearchButton = () => { if (searchCollapsed) { setSearchCollapsed(false); setInputFocus(); } else if (searchInput && searchInput.current) { const value = searchInput.current.value; setSearchQuery((prev) => { return { ...prev, search: value }; }); setSearchCollapsed(true); searchInput.current.value = ''; } }; return (
); }; export default Navbar;