import { MDBFilters } from 'mdb-react-filters';
import {
MDBContainer,
MDBNavbar,
MDBNavbarToggler,
MDBIcon,
MDBCollapse,
MDBDropdownMenu,
MDBNavbarLink,
MDBNavbarItem,
MDBBtn,
MDBDropdownItem,
MDBDropdownToggle,
MDBDropdown,
MDBNavbarNav,
MDBBadge,
MDBRow,
MDBCol,
MDBSelect,
MDBAnimation,
MDBCheckbox,
MDBRating,
MDBRatingElement,
MDBRadio,
MDBRipple,
MDBFooter,
} from 'mdb-react-ui-kit';
import React, { useState } from 'react';
const advancedData = [
{
id: 1,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40'],
condition: 'new',
color: 'blue',
price: 12.99,
keywords: ['t-shirt', 'sweatshitrt'],
discount: 0,
gender: 'male',
},
{
id: 2,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40', '44'],
condition: 'new',
color: 'red',
price: 12.99,
discount: 0,
gender: 'male',
},
{
id: 3,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 3,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36'],
condition: 'new',
color: 'grey',
price: 40.99,
discount: 10,
gender: 'male',
},
{
id: 4,
category: 'jackets',
name: 'Denim Jacket',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40'],
condition: 'new',
color: 'grey',
price: 40.99,
discount: 0,
gender: 'unisex',
},
{
id: 5,
category: 'jeans',
name: 'Ripped jeans',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/11.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '38', '40'],
condition: 'renewed',
color: 'blue',
price: 20.99,
discount: 5,
gender: 'female',
},
{
id: 6,
category: 'jeans',
name: 'Boyfriend jeans',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/10.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: false,
size: ['34', '36', '38', '40'],
condition: 'used',
color: 'blue',
price: 20.99,
discount: 5,
gender: 'female',
},
{
id: 7,
category: 'shirts',
name: 'Ripped sweatshirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/7.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '38', '40'],
condition: 'collectible',
color: 'white',
price: 29.99,
discount: 5,
gender: 'female',
},
{
id: 8,
category: 'shirts',
name: 'Longsleeve',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/8.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40'],
condition: 'collectible',
color: 'black',
price: 120.99,
discount: 0,
gender: 'male',
},
{
id: 8,
category: 'shirts',
name: 'Stripped sweatshirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/6.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'white',
price: 32.99,
discount: 10,
gender: 'female',
},
{
id: 9,
category: 'trousers',
name: 'Red chinos',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/5.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'red',
price: 62.99,
discount: 10,
gender: 'female',
},
{
id: 10,
category: 'coats',
name: 'Camel coat',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/4.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'used',
color: 'brown',
price: 62.99,
discount: 10,
gender: 'female',
},
{
id: 11,
category: 'jeans',
name: 'Blue jeans',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/3.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'blue',
price: 42.99,
discount: 0,
gender: 'female',
},
{
id: 12,
category: 'shirts',
name: 'Orange T-shirt',
rating: 3,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/3.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'orange',
price: 12.99,
discount: 0,
gender: 'female',
},
{
id: 13,
category: 'skirts',
name: 'Ballerina skirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/2.webp',
description:
'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['38', '36'],
condition: 'collectible',
color: 'white',
price: 12.99,
discount: 0,
gender: 'female',
},
];
export default function App() {
const [showNavText, setShowNavText] = useState(false);
const [filterData, setFilterData] = useState(advancedData);
const [sort, setSort] = useState({ sortProperty: '', order: 'asc' });
const [filters, setFilters] = useState({ condition: [], rating: 0, price: { min: 0, max: Infinity }, size: [], color: '' });
const handleGetValue = (e) => {
const value = e;
if (value === 1) {
setSort({ sortProperty: 'rating', order: 'desc' });
}
if (value === 2) {
setSort({ sortProperty: 'price', order: 'asc' });
}
if (value === 3) {
setSort({ sortProperty: 'price', order: 'desc' });
}
};
const onChangeCheckbox = (e: { target: { name, value } }) => {
const containsValue = (filters[e.target.name]).includes(e.target.value);
if (containsValue) {
setFilters({
...filters,
[e.target.name]: (filters[e.target.name]).filter((element) => element !== e.target.value),
});
} else {
const newArray = [...(filters[e.target.name]), e.target.value];
setFilters({ ...filters, [e.target.name]: newArray });
}
};
const onChangeRadio = (e) => {
const values = e.target.value.split('-');
setFilters({ ...filters, [e.target.name]: { min: parseInt(values[0]), max: parseInt(values[1]) } });
};
const onChangeColor = (e) => {
setFilters({ ...filters, [e.target.name]: e.target.value });
};
return (
<>
<header>
<MDBNavbar sticky expand='lg' light className='bg-light'>
<MDBContainer fluid className='justify-content-between'>
<MDBNavbarToggler
type='button'
data-target='#navbarText'
aria-controls='navbarText'
aria-expanded='false'
aria-label='Toggle navigation'
onClick={() => setShowNavText(!showNavText)}
>
<MDBIcon icon='bars' fas />
</MDBNavbarToggler>
<a className='navbar-brand' href='https://mdbecommerce.com/'>
<MDBIcon fab icon='mdb' className='fa-2x' />
</a>
<MDBCollapse navbar show={showNavText}>
<MDBNavbarNav className='ml-auto'>
<MDBNavbarItem className='nav-item my-auto'>
<a className='nav-link active' aria-current='page' href='#'>
<MDBBadge className='rounded-pill' color='danger'>
1
</MDBBadge>
<MDBIcon fas icon='shopping-cart' />
</a>
</MDBNavbarItem>
<MDBDropdown className='nav-item my-auto'>
<MDBDropdownToggle className='nav-link' tag='a'>
<i className='united kingdom flag m-0'></i>
</MDBDropdownToggle>
<MDBDropdownMenu>
<MDBDropdownItem link>Action</MDBDropdownItem>
<MDBDropdownItem link>Another action</MDBDropdownItem>
<MDBDropdownItem link>Something else here</MDBDropdownItem>
</MDBDropdownMenu>
</MDBDropdown>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Shop</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Contact</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Sign in</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem>
<MDBNavbarLink>
<MDBBtn outline color='dark' rounded>
Sign up
</MDBBtn>
</MDBNavbarLink>
</MDBNavbarItem>
</MDBNavbarNav>
</MDBCollapse>
</MDBContainer>
</MDBNavbar>
<div
className='p-5 text-center bg-image'
style={{
backgroundImage: "url('https://mdbootstrap.com/img/Photos/Others/clothes(5)-crop.webp')",
height: '400px',
}}
>
<div className='mask' style={{ backgroundColor: 'rgba(0, 0, 0, 0.7)' }}>
<div className='d-flex justify-content-center align-items-center h-100'>
<div className='text-white'>
<h1 className='mb-3'>Shop</h1>
</div>
</div>
</div>
</div>
</header>
<main>
<MDBContainer className='mt-5'>
<MDBRow>
<MDBCol md='4'>
<section>
<h5>Filters</h5>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Condition</h6>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='new'
checked={filters.condition.includes('new')}
label='NEW'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='used'
checked={filters.condition.includes('used')}
label='USED'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='collectible'
checked={filters.condition.includes('collectible')}
label='COLLECTIBLE'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='renewed'
checked={filters.condition.includes('renewed')}
label='RENEWED'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Avg. Customer Review</h6>
<MDBRating
active={filters.rating}
setActive={(value) => setFilters({ ...filters, rating: value })}
>
<MDBRatingElement title='1' itemId={1} icon='star' />
<MDBRatingElement title='2' itemId={2} icon='star' />
<MDBRatingElement title='3' itemId={3} icon='star' />
<MDBRatingElement title='4' itemId={4} icon='star' />
<MDBRatingElement title='5' itemId={5} icon='star' />
</MDBRating>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Price</h6>
<MDBRadio
name='price'
onChange={onChangeRadio}
value='0-25'
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 0, max: 25 })}
label='UNDER $25'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
onChange={onChangeRadio}
value='25-50'
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 25, max: 50 })}
label='$25 TO $50'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='50-100'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 50, max: 100 })}
label='$50 TO $100'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='100-200'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 100, max: 200 })}
label='$100 TO $200'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='200-'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 200, max: Infinity })}
label='$200 & ABOVE'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Price</h6>
<MDBCheckbox
name='size'
value='34'
onChange={onChangeCheckbox}
checked={filters.size.includes('34')}
label='34'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
onChange={onChangeCheckbox}
value='36'
checked={filters.size.includes('36')}
label='36'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
value='38'
onChange={onChangeCheckbox}
checked={filters.size.includes('38')}
label='38'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
value='40'
onChange={onChangeCheckbox}
checked={filters.size.includes('40')}
label='40'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Color</h6>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'white'}
className='btn-check'
type='radio'
name='color'
id='colorRadio4'
value='white'
/>
<MDBRipple
rippleTag='label'
className='btn btn-light btn-rounded p-3 '
htmlFor='colorRadio4'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'grey'}
className='btn-check'
type='radio'
name='color'
id='colorRadio6'
value='grey'
/>
<MDBRipple
style={{ backgroundColor: '#bdbdbd' }}
rippleTag='label'
className='btn btn-rounded p-3 '
htmlFor='colorRadio6'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'black'}
className='btn-check'
type='radio'
name='color'
id='colorRadio3'
value='black'
/>
<MDBRipple
rippleTag='label'
className='btn bg-dark text-white btn-rounded p-3 '
htmlFor='colorRadio3'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'blue'}
className='btn-check'
type='radio'
name='color'
id='colorRadio2'
value='blue'
/>
<MDBRipple
rippleTag='label'
className='btn bg-primary btn-rounded p-3 '
htmlFor='colorRadio2'
></MDBRipple>
</div>
<div style={{ paddingRight: '1rem' }} className='form-check form-check-inline m-0 p-0'>
<input
onChange={onChangeColor}
checked={filters.color === 'red'}
className='btn-check'
type='radio'
name='color'
id='colorRadio1'
value='red'
/>
<MDBRipple
rippleTag='label'
className='btn bg-danger btn-rounded p-3 '
htmlFor='colorRadio1'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'orange'}
className='btn-check'
type='radio'
name='color'
id='colorRadio5'
value='orange'
/>
<MDBRipple
rippleTag='label'
className='btn btn-rounded bg-warning p-3 '
htmlFor='colorRadio5'
></MDBRipple>
</div>
</section>
</section>
</MDBCol>
<MDBCol md='8'>
<MDBRow className='justify-content-center'>
<MDBCol md='6' className='my-auto py-3'>
<MDBSelect
getSelectedValue={handleGetValue}
label='Sort'
data={[
{ text: 'Best rating', value: 1, selected: true },
{ text: 'Lowest price first', value: 2 },
{ text: 'Highest price first', value: 3 },
]}
/>
</MDBCol>
</MDBRow>
<MDBFilters
filters={filters}
filterOptions={[
{ type: 'checkbox', key: 'condition' },
{
type: 'custom',
key: 'rating',
custom: (data, key, filter) => {
return filter ? data.filter((item) => item.rating === filter) : data;
},
},
{
type: 'custom',
key: 'price',
custom: (data, key, filter) => {
return filter
? data.filter((item) => item.price >= filter.min && item.price <= filter.max)
: data;
},
},
{
type: 'custom',
key: 'size',
custom: (data, key, filter) => {
return filter.length
? data.filter((item) => item.size.some((size) => filter.includes(size)))
: data;
},
},
{
type: 'radio',
key: 'color',
},
]}
filterData={setFilterData}
data={advancedData}
sortOptions={sort}
className='mb-4'
>
{filterData.map((item, i) => (
<MDBCol key={i} md='4' className='col-md-4 my-4 justify-content-center text-center'>
<MDBAnimation key={Math.random()} animation='fade-in' start='onLoad' tag='div'>
<div className='bg-image hover-overlay hover-zoom hover-shadow ripple rounded'>
<img src={item.image} className='img-fluid w-100' style={{ height: '325px' }} />
<a href='#!'>
<div className='mask rounded' style={{ backgroundColor: 'rgba(66, 66, 66, 0.2)' }}></div>
</a>
</div>
<div className='pt-4'>
<h5>{item.name}</h5>
<strong>${item.price}</strong>
</div>
</MDBAnimation>
</MDBCol>
))}
</MDBFilters>
</MDBCol>
</MDBRow>
</MDBContainer>
</main>
<MDBFooter className='bg-dark text-white text-lg-left'>
<div className='bg-primary text-center p-3'>
<MDBRow>
<MDBCol md='6'>
<span className='font-weight-bold'>Get connected with us on social networks!</span>
</MDBCol>
<MDBCol md='6'>
<MDBIcon fab icon='instagram' />
<MDBIcon fab icon='linkedin-in' style={{ marginLeft: '1.5rem' }} />
<MDBIcon fab icon='twitter' style={{ marginLeft: '1.5rem' }} />
<MDBIcon fab icon='facebook-f' style={{ marginLeft: '1.5rem' }} />
</MDBCol>
</MDBRow>
</div>
<div className='container p-5'>
<div className='row p-2'>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>About me</h5>
<hr className='mb-4 mt-0' />
<p>
Here you can use rows and columns to organize your footer content. Lorem ipsum dolor sit amet,
consectetur adipisicing elit.
</p>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Products</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled mb-0'>
<li className='mb-2'>
<a href='#!' className='text-white'>
MDBootstrap
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
MDWordPress
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
BrandFlow
</a>
</li>
<li>
<a href='#!' className='text-white'>
Bootstrap Angular
</a>
</li>
</ul>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Useful links</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled'>
<li className='mb-2'>
<a href='#!' className='text-white'>
Your Account
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
Become an Affiliate
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
Shipping Rates
</a>
</li>
<li>
<a href='#!' className='text-white'>
Help
</a>
</li>
</ul>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Contacts</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled'>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='far fa-map mr-1'></i> New York, Avenue Street 10
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='fas fa-phone-alt mr-1'></i> 042 876 836 908
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='far fa-envelope mr-1'></i> company@example.com
</a>
</li>
<li>
<a href='#!' className='text-white'>
<i className='far fa-clock mr-1'></i> Monday - Friday: 10-17
</a>
</li>
</ul>
</div>
</div>
</div>
<div className='text-center p-3' style={{ backgroundColor: 'rgba(0, 0, 0, 0.2)' }}>
© 2020 Copyright:
<a className='text-white' href='https://mdbootstrap.com/'>
MDBootstrap.com
</a>
</div>
</MDBFooter>
</>
);
}