import React, { useState } from
'react'
;
import {
Container, Row, Col, Modal,
Button, Dropdown, Form
} from
'react-bootstrap'
;
const images = [
{
url:
category:
'Programming'
,
},
{
url:
category: '
Programming
',
},
{
url:
'
https:
category: 'Data Analytics
',
},
{
url:
'
https:
category: 'Web Development
',
},
];
const itemsPerPage = 8;
const App = () => {
const [showModal, setShowModal] =
useState(false);
const [selectedImage, setSelectedImage] =
useState('
');
const [currentPage, setCurrentPage] =
useState(1);
const [selectedCategory, setSelectedCategory] =
useState('
All
');
const [gridDirection, setGridDirection] =
useState('
horizontal
');
const [imageMargin, setImageMargin] =
useState('
20px
');
const openModal = (image) => {
setSelectedImage(image);
setShowModal(true);
};
const handlePageChange = (page) => {
setCurrentPage(page);
};
const toggleGridDirection = () => {
setGridDirection(gridDirection ===
'
horizontal
' ?
'
vertical
' : '
horizontal
');
};
const filterImages = () => {
return selectedCategory === '
All
'
? images
: images.filter(
(image) =>
image.category === selectedCategory);
};
const paginatedImages = filterImages().slice(
(currentPage - 1) * itemsPerPage,
currentPage * itemsPerPage
);
const gridLayout = {
display: '
grid
',
gridTemplateColumns: gridDirection ===
'
horizontal
' ?
'
repeat(auto-fit, minmax(200px, 1fr))
' : '
1fr
',
gap: imageMargin,
};
return (
<Container fluid>
<Row>
<Col xs={12}>
<h1 className="text-success"
style={{ marginTop: '
50px
' }}>
GeeksforGeeks
</h1>
<h3>Grid Customization - 1</h3>
</Col>
</Row>
<Row>
<Col xs={12} md={6}>
<Dropdown>
<Dropdown.Toggle variant="secondary" block>
Filter by Category: {selectedCategory}
</Dropdown.Toggle>
<Dropdown.Menu>
<Dropdown.Item onClick={() =>
setSelectedCategory('
All
')}>
All
</Dropdown.Item>
<Dropdown.Item onClick={() =>
setSelectedCategory('
Programming
')}>
Programming
</Dropdown.Item>
<Dropdown.Item onClick={() =>
setSelectedCategory('
Data Analytics
')}>
Data Analytics
</Dropdown.Item>
<Dropdown.Item
onClick={() =>
setSelectedCategory('
Web Development
')}>
Web Development
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</Col>
<Col xs={12} md={6}>
<Button variant="secondary"
onClick={toggleGridDirection} block>
Toggle Grid Direction
</Button>
</Col>
</Row>
<Row>
<Col xs={12} md={4}>
<Form>
<Form.Group>
<Form.Label>Image Margin</Form.Label>
<Form.Control
type="text"
value={imageMargin}
onChange={(e) =>
setImageMargin(e.target.value)}
/>
</Form.Group>
</Form>
</Col>
</Row>
<Row>
<Col xs={12} style={gridLayout}>
{
paginatedImages.map((image, index) => (
<div key={index} className="mb-4">
<div className="photo"
onClick={() => openModal(image.url)}>
<img src={image.url}
alt={`Photo ${index + 1}`}
className="img-fluid" />
<div className="overlay">
<p className="text-white">
Photo {index + 1}
</p>
</div>
</div>
</div>
))}
</Col>
</Row>
<Row>
<Col xs={12}
className="pagination justify-content-center">
{
Array
.from(
{
length: Math
.ceil(filterImages().length / itemsPerPage)
}).map((_, index) => (
<Button
key={index}
variant=
{currentPage ===
index + 1 ?
'
success
' : '
secondary'}
onClick={() =>
handlePageChange(index + 1)}
>
{index + 1}
</Button>
))}
</Col>
</Row>
<Modal show={showModal}
onHide={() =>
setShowModal(
false
)} centered>
<Modal.Body>
<img src={selectedImage}
alt=
"Selected"
className=
"img-fluid"
/>
</Modal.Body>
</Modal>
</Container>
);
};
export
default
App;