|
1 | | -import { useRef } from "react"; |
| 1 | +import { useRef, useState } from "react"; |
2 | 2 | import { LazyMotion, domAnimation, useInView } from "framer-motion"; |
3 | | -import { Flex, Button, Heading, HStack } from "@chakra-ui/react"; |
4 | 3 | import { TbBrandJavascript, TbBrandNextjs } from "react-icons/tb"; |
5 | 4 | import { FaReact } from "react-icons/fa"; |
| 5 | +import { FilterButton } from "./FilterButton"; |
6 | 6 |
|
7 | 7 | export function Filter({ onClick = (f) => f }) { |
8 | 8 | const animRef = useRef(null); |
9 | 9 | const isInView = useInView(animRef, { once: true }); |
| 10 | + const [activeFilter, setActiveFilter] = useState(undefined); |
| 11 | + |
| 12 | + const handleFilterClick = (filter) => { |
| 13 | + onClick(filter); |
| 14 | + setActiveFilter(filter); |
| 15 | + }; |
10 | 16 |
|
11 | 17 | return ( |
12 | 18 | <LazyMotion features={domAnimation}> |
13 | | - <Flex |
14 | | - py={8} |
15 | | - gap={3} |
16 | | - alignItems="center" |
| 19 | + <div |
17 | 20 | ref={animRef} |
18 | | - sx={{ |
| 21 | + className="flex items-start flex-col sm:flex-row sm:items-center gap-4 my-10" |
| 22 | + style={{ |
19 | 23 | opacity: isInView ? 1 : 0, |
20 | | - transition: "all 0.9s cubic-bezier(0.17, 0.55, 0.55, 1) 0.5s" |
| 24 | + transition: "all 0.9s cubic-bezier(0.17, 0.55, 0.55, 1) 1s" |
21 | 25 | }} |
22 | 26 | > |
23 | | - <Heading as="h3" fontSize="xl" aria-label="Filter projects" tabIndex="0"> |
| 27 | + <h3 aria-label="Filter projects" tabIndex="0" className="font-bold text-xl"> |
24 | 28 | Filter by: |
25 | | - </Heading> |
26 | | - <HStack> |
27 | | - <Button |
28 | | - variant="outline" |
29 | | - onClick={() => onClick(undefined)} |
30 | | - aria-label="Show all projects" |
| 29 | + </h3> |
| 30 | + <div className="flex items-center gap-4"> |
| 31 | + <FilterButton |
| 32 | + onClick={() => handleFilterClick(undefined)} |
| 33 | + label="All" |
| 34 | + active={activeFilter === undefined} |
31 | 35 | > |
32 | 36 | All |
33 | | - </Button> |
34 | | - <Button |
35 | | - variant="outline" |
36 | | - onClick={() => onClick("React")} |
37 | | - aria-label="Filter projects by react" |
| 37 | + </FilterButton> |
| 38 | + <FilterButton |
| 39 | + onClick={() => handleFilterClick("React")} |
| 40 | + label="React" |
| 41 | + active={activeFilter === "React"} |
38 | 42 | > |
39 | 43 | <FaReact size="20" /> |
40 | | - </Button> |
41 | | - <Button |
42 | | - variant="outline" |
43 | | - onClick={() => onClick("Next")} |
44 | | - aria-label="Filter projects by next" |
| 44 | + </FilterButton> |
| 45 | + <FilterButton |
| 46 | + onClick={() => handleFilterClick("Next")} |
| 47 | + label="Next" |
| 48 | + active={activeFilter === "Next"} |
45 | 49 | > |
46 | 50 | <TbBrandNextjs size="20" /> |
47 | | - </Button> |
48 | | - <Button |
49 | | - variant="outline" |
50 | | - onClick={() => onClick("Javascript")} |
51 | | - aria-label="Filter projects by javascript" |
| 51 | + </FilterButton> |
| 52 | + <FilterButton |
| 53 | + onClick={() => handleFilterClick("Javascript")} |
| 54 | + label="Javascript" |
| 55 | + active={activeFilter === "Javascript"} |
52 | 56 | > |
53 | 57 | <TbBrandJavascript size="20" /> |
54 | | - </Button> |
55 | | - </HStack> |
56 | | - </Flex> |
| 58 | + </FilterButton> |
| 59 | + </div> |
| 60 | + </div> |
57 | 61 | </LazyMotion> |
58 | 62 | ); |
59 | 63 | } |
0 commit comments