Skip to content

Commit

Permalink
added filter by name to members page
Browse files Browse the repository at this point in the history
  • Loading branch information
M-Farmaha committed Feb 3, 2024
1 parent 28925c1 commit deb3232
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/Api/members.json
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
},
{
"id": "10",
"name": "Пенкальський Aртем",
"name": "Пенкальський Артем",
"birthDate": "2017-09-25",
"avatar": "https://raw.githubusercontent.com/M-Farmaha/100-club/main/src/ImageGallery/photos/1.jpg",
"sex": "male",
Expand Down
81 changes: 81 additions & 0 deletions src/components/Filter/Filter-styled.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import styled from "styled-components";

export const Section = styled.section`
margin-top: 100px;
margin-left: auto;
margin-right: auto;
padding-left: 24px;
padding-right: 24px;
background-color: var(--secondary-white-color);
`;

export const Form = styled.form`
height: 120px;
display: flex;
justify-content: center;
align-items: center;
`;

export const Group = styled.div`
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 10px;
`;

export const Label = styled.label`
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
font-size: 16px;
font-weight: 600;
transition: var(--main-transition);
color: ${(props) =>
props.isFilterFocused
? "var(--accent-hover-color)"
: "var(--primary-black-color)"};
`;

export const Input = styled.input`
width: 290px;
height: 50px;
padding: 0px 20px;
font-family: inherit;
font-size: 16px;
outline: none;
border-radius: 50px;
border: 2px solid var(--primary-black-color);
color: var(--primary-black-color);
background-color: var(--secondary-white-color);
transition: var(--main-transition);
&:focus {
background-color: var(--primary-white-color);
border: 2px solid var(--accent-hover-color);
}
`;

export const IconWrap = styled.span`
display: inline-flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
`;

export const IconSvg = styled.svg`
width: 100%;
height: 100%;
fill: currentColor;
`;
52 changes: 52 additions & 0 deletions src/components/Filter/Filter.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { useEffect, useState } from "react";
import {
Form,
Group,
IconSvg,
IconWrap,
Input,
Label,
Section,
} from "./Filter-styled";

import sprite from "../../sprite.svg";

export const Filter = ({ membersArray, setVisibleMembersArray }) => {
const [isFilterFocused, setIsFilterFocused] = useState(false);
const [inputValue, setInputValue] = useState("");

useEffect(() => {
const visibleMembersArray = membersArray?.filter((member) =>
member.name.toLowerCase().includes(inputValue?.toLowerCase())
);
setVisibleMembersArray(visibleMembersArray);
}, [inputValue, membersArray, setVisibleMembersArray]);

return (
<Section>
<Form onSubmit={(e) => e.preventDefault()}>
<Group>
<Label htmlFor={"filterInput"} isFilterFocused={isFilterFocused}>
Знайти учасника за іменем
<IconWrap>
<IconSvg>
<use href={sprite + "#icon-search"}></use>
</IconSvg>
</IconWrap>
</Label>

<Input
id={"filterInput"}
autoComplete="off"
type="text"
value={inputValue}
placeholder="Введіть ім'я"
onChange={(e) => setInputValue(e.target.value)}
onFocus={() => setIsFilterFocused(true)}
onBlur={() => setIsFilterFocused(false)}
/>
</Group>
</Form>
</Section>
);
};
5 changes: 3 additions & 2 deletions src/components/ImageGallery/ImageGallery-styled.jsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import styled from "styled-components";

export const Section = styled.section`
padding-top: 100px;
margin-top: 100px;
min-height: 1200px;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
background-color: var(--secondary-white-color);
`;

export const ImageGalleryList = styled.ul`
Expand Down
2 changes: 1 addition & 1 deletion src/components/MembersList/MembersItem.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {
MembersItemLi,
MembersItemText,
MembersItemWrap,
} from "./MemdersList-styled";
} from "./MembersList-styled";

export const MembersItem = ({ el, index }) => {
return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import styled from "styled-components";

export const Section = styled.section`
padding-top: 200px;
padding-bottom: 100px;
min-height: 1200px;
background-color: var(--secondary-white-color);
`;

export const MembersUl = styled.ul`
Expand Down
6 changes: 3 additions & 3 deletions src/components/MembersList/MembersList.jsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { MembersUl, Section } from "./MemdersList-styled";
import { MembersUl, Section } from "./MembersList-styled";
import { MembersItem } from "./MembersItem";

export const MembersList = ({ membersArray }) => {
export const MembersList = ({ visibleMembersArray }) => {
return (
<>
<Section>
<MembersUl>
{membersArray?.map((el, index) => (
{visibleMembersArray?.map((el, index) => (
<MembersItem key={el.id} el={el} index={index} />
))}
</MembersUl>
Expand Down
10 changes: 6 additions & 4 deletions src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@

--main-transition: 250ms cubic-bezier(0.4, 0, 0.2, 1);

--box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px,
rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px,
rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px;

--accent-color: rgb(105, 150, 0);
--accent-hover-color: rgb(151, 211, 0);

Expand All @@ -18,6 +14,12 @@

--primary-white-color: #ffffff;
--secondary-white-color: #f7f7f7;

--box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px,
rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px,
rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px;

--input-shadow: rgba(255, 255, 255, 0.1) -4px -2px 6px 0px inset, rgba(70, 70, 70, 0.1) 4px 2px 4px 0px inset;
}

body {
Expand Down
8 changes: 7 additions & 1 deletion src/pages/MembersPage/MembersPage.jsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { useEffect, useState } from "react";
import { MembersList } from "../../components/MembersList/MembersList";
import { membersApi } from "../../Api/ApiRequest";
import { Filter } from "../../components/Filter/Filter";

const MembersPage = () => {
const [membersArray, setMembersArray] = useState([]);
const [visibleMembersArray, setVisibleMembersArray] = useState(membersArray);

useEffect(() => {
window.scrollTo(0, 0);
Expand All @@ -15,7 +17,11 @@ const MembersPage = () => {

return (
<>
<MembersList membersArray={membersArray} />
<Filter
membersArray={membersArray}
setVisibleMembersArray={setVisibleMembersArray}
/>
<MembersList visibleMembersArray={visibleMembersArray} />
</>
);
};
Expand Down
4 changes: 4 additions & 0 deletions src/sprite.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit deb3232

Please sign in to comment.