Skip to content

Commit

Permalink
task first iteration
Browse files Browse the repository at this point in the history
  • Loading branch information
yuliabakun committed Nov 9, 2023
1 parent 463f841 commit 8504256
Show file tree
Hide file tree
Showing 18 changed files with 411 additions and 768 deletions.
7 changes: 2 additions & 5 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { PeoplePage } from './components/PeoplePage';
import { Outlet } from 'react-router-dom';
import { Navbar } from './components/Navbar';

import './App.scss';

export const App = () => {
Expand All @@ -10,9 +9,7 @@ export const App = () => {

<div className="section">
<div className="container">
<h1 className="title">Home Page</h1>
<h1 className="title">Page not found</h1>
<PeoplePage />
<Outlet />
</div>
</div>
</div>
Expand Down
25 changes: 25 additions & 0 deletions src/Root.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {
HashRouter as Router,
Routes,
Route,
Navigate,
} from 'react-router-dom';
import { App } from './App';
import { HomePage } from './pages/HomePage';
import { PeoplePage } from './pages/PeoplePage';
import { ErrorPage } from './pages/ErrorPage';

export const Root = () => (
<Router>
<Routes>
<Route path="/" element={<App />}>
<Route index element={<HomePage />} />
<Route path="/home" element={<Navigate to="/" replace />} />
<Route path="/people" element={<PeoplePage />}>
<Route path=":personId" element={<PeoplePage />} />
</Route>
<Route path="*" element={<ErrorPage />} />
</Route>
</Routes>
</Router>
);
27 changes: 21 additions & 6 deletions src/components/Navbar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
import { NavLink, useSearchParams } from 'react-router-dom';
import cn from 'classnames';

export const Navbar = () => {
const [searchParams] = useSearchParams();

const styleLink = ({ isActive }: { isActive: boolean }) => cn('navbar-item',
{ 'has-background-grey-lighter': isActive });

return (
<nav
data-cy="nav"
Expand All @@ -8,15 +16,22 @@ export const Navbar = () => {
>
<div className="container">
<div className="navbar-brand">
<a className="navbar-item" href="#/">Home</a>
<NavLink
to="/"
className={styleLink}
>
Home
</NavLink>

<a
aria-current="page"
className="navbar-item has-background-grey-lighter"
href="#/people"
<NavLink
to={{
pathname: '/people',
search: searchParams.toString(),
}}
className={styleLink}
>
People
</a>
</NavLink>
</div>
</div>
</nav>
Expand Down
110 changes: 61 additions & 49 deletions src/components/PeopleFilters.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,39 @@
export const PeopleFilters = () => {
import cn from 'classnames';
import { Link, useSearchParams } from 'react-router-dom';
import { filterOptions } from '../types/filterBySex';
import { CenturyFilter } from '../types/CenturyFilter';
import { SearchParams, getSearchWith } from '../utils/searchHelper';
import { SearchLink } from './SearchLink';

type Props = {
setSearchWith: (params: SearchParams) => void;
};

export const PeopleFilters: React.FC<Props> = ({ setSearchWith }) => {
const [searchParams] = useSearchParams();

const query = searchParams.get('query') || '';
const filterBySex = searchParams.get('sex') || 'all';
const filterByCentury = searchParams.getAll('centuries') || [];

const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setSearchWith({ query: event.target.value || null });
};

return (
<nav className="panel">
<p className="panel-heading">Filters</p>

<p className="panel-tabs" data-cy="SexFilter">
<a className="is-active" href="#/people">All</a>
<a className="" href="#/people?sex=m">Male</a>
<a className="" href="#/people?sex=f">Female</a>
{filterOptions.map(option => (
<SearchLink
key={option.title}
params={{ sex: option.value }}
className={cn({ 'is-active': filterBySex === option.value })}
>
{option.title}
</SearchLink>
))}
</p>

<div className="panel-block">
Expand All @@ -16,6 +43,8 @@ export const PeopleFilters = () => {
type="search"
className="input"
placeholder="Search"
value={query}
onChange={handleQueryChange}
/>

<span className="icon is-left">
Expand All @@ -27,66 +56,49 @@ export const PeopleFilters = () => {
<div className="panel-block">
<div className="level is-flex-grow-1 is-mobile" data-cy="CenturyFilter">
<div className="level-left">
<a
data-cy="century"
className="button mr-1"
href="#/people?centuries=16"
>
16
</a>

<a
data-cy="century"
className="button mr-1 is-info"
href="#/people?centuries=17"
>
17
</a>

<a
data-cy="century"
className="button mr-1 is-info"
href="#/people?centuries=18"
>
18
</a>

<a
data-cy="century"
className="button mr-1 is-info"
href="#/people?centuries=19"
>
19
</a>

<a
data-cy="century"
className="button mr-1"
href="#/people?centuries=20"
>
20
</a>
{CenturyFilter.map(item => (
<SearchLink
key={item}
data-cy="century"
className={cn('button mr-1', {
'is-info': filterByCentury.includes(item),
})}
params={{
centuries: filterByCentury.includes(item)
? filterByCentury.filter(el => el !== item)
: [...filterByCentury, item],
}}
>
{item}
</SearchLink>
))}
</div>

<div className="level-right ml-4">
<a
<SearchLink
data-cy="centuryALL"
className="button is-success is-outlined"
href="#/people"
params={{ centuries: null }}
>
All
</a>
</SearchLink>
</div>
</div>
</div>

<div className="panel-block">
<a
<Link
className="button is-link is-outlined is-fullwidth"
href="#/people"
to={{
search: getSearchWith({
centuries: null,
sex: null,
query: null,
}, searchParams),
}}
>
Reset all filters
</a>
</Link>
</div>
</nav>
);
Expand Down
35 changes: 0 additions & 35 deletions src/components/PeoplePage.tsx

This file was deleted.

Loading

0 comments on commit 8504256

Please sign in to comment.