added image slider

This commit is contained in:
darkicewolf50 2024-04-06 17:51:30 -06:00
parent e4d34021d2
commit 92d6fd7ca9
12 changed files with 256 additions and 233 deletions

View File

@ -1,16 +1,5 @@
import React from 'react';
import ImageSlider from '../Images/ImageSlider'; // Adjust the import path based on your directory structure
import React from "react";
export default function AboutsUs() {
// return (
// <p>About Us</p>
// );
return (
<div>
<h1>Image Slider</h1>
<ImageSlider category="Car" />
</div>
);
};
return <p>About Us</p>;
}

View File

@ -1,6 +1,8 @@
import { useEffect, useState } from "react";
import yaml from "js-yaml";
import eventData from "../../MockDB/pastCompetitions.yml";
import SlideShow from "../../ImageSlider/SlideShow";
import { Link } from "react-router-dom";
/**
* @param {null} null - requires nothing
@ -47,7 +49,7 @@ const PreviousEvents = () => {
const competition = previousCompetitionsDict[competitionKey];
console.log(competition.SAEYoutubeLink);
return (
<table>
<table key={competitionKey}>
<tbody>
<thead>
<tr>
@ -94,9 +96,14 @@ const PreviousEvents = () => {
</div>
<div>
<h2>This Year's Events</h2>
<button>Upcoming Events</button>
<Link to={"/UpcomingEvents"}>
<button>Upcoming Events</button>
</Link>
{/* will change to thing below when merged onto dev branch */}
{/* <OpenPage pageToGoTo={"/UpcomingEvents"} textOnButton={"Upcoming Events"} /> */}
<SlideShow
imgList={previousCompetitionsDict["Oshkosh"]["OurPhotosLinks"]}
/>
</div>
</div>
);

View File

@ -3,6 +3,7 @@ import yaml from "js-yaml";
import "./UpcomingEvents.css";
import eventData from "../../MockDB/currentCompetition.yml";
import CountDownTimer from "../../CountDown/CountDownTimer";
import { Link } from "react-router-dom";
/**
* @param {null} null - requires nothing
@ -98,7 +99,9 @@ const UpcominEvents = () => {
<div></div>
<h1>Previous Events</h1>
</div>
<button>Previous Events</button>
<Link to={"/PreviousEvents"}>
<button>Previous Events</button>
</Link>
{/* will change to thing below when merged onto dev branch */}
{/* <OpenPage pageToGoTo={"/PreviuosEvents"} textOnButton={"Previous Events"} /> */}
</div>

View File

@ -1,7 +1,4 @@
import Modal from 'react-modal';
import { useState } from "react";
import './Gallery.css';
import { ImageFinder } from '../Images/ImageFinder.js';
import "./Gallery.css";
/**
* @param {null} null - requires onthing
@ -10,56 +7,55 @@ import { ImageFinder } from '../Images/ImageFinder.js';
* @author Sarim <sheikhsarim20@gmail.com>
* @todo Seperate the Modal section into its own seperate function, and add comments
*/
export default function Gallery() {
const [open, setOpen] = useState(false)
const [display, setDisplay] = useState('')
const [altDisplay, setAltDisplay] =useState('')
const allImages = ImageFinder('all')
const Gallery = () => {
return (
<div>
Gallery
{/* <div className="gallery">
{allImages.map((image, index) => (
<img
key={index}
className="galleryItem"
src={image.src}
alt={image.alt}
onClick={() => handleClick(image.src, image.alt)}
/>
))}
</div> */}
{/* <div>
<Modal
isOpen={open}
onRequestClose={() => setOpen(false)}
style={{
overlay: {
display: "flex",
alignItems: "center",
justifyContent: "center",
},
content: {
position: "initial",
border: "none",
borderRadius: "0px",
padding: "0px",
},
}}>
<div className="container">
<button
className="modalButton"
onClick={() => setOpen(false)}>
x
</button>
<img
className="modalImage"
src={display}
alt={altDisplay}
onClick={() => setOpen(false)}
/>
</div>
</Modal>
</div> */}
</div>
);
};
const handleClick = (image, alt) => {
setDisplay(image)
setAltDisplay(alt)
setOpen(true)
console.log(open)
}
return (
<div>
<div className="gallery">
{allImages.map((image, index) => (
<img
key={index}
className="galleryItem"
src={image.src}
alt={image.alt}
onClick={() => handleClick(image.src, image.alt)}
/>
))}
</div>
<div>
<Modal
isOpen={open}
onRequestClose={() => setOpen(false)}
style={{
overlay: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
},
content: {
position: 'initial',
border: 'none',
borderRadius: '0px',
padding: '0px'
}
}}
>
<div className="container">
<button className="modalButton" onClick={() => setOpen(false)}>x</button>
<img className="modalImage" src={display} alt={altDisplay} onClick={() => setOpen(false)} />
</div>
</Modal>
</div>
</div>
);
}
export default Gallery;

View File

@ -0,0 +1,77 @@
.slideShow figure {
display: none;
position: relative;
}
.fade {
animation-name: fade;
animation-duration: 1.5s;
}
@keyframes fade {
from {
opacity: 0.4;
}
to {
opacity: 1;
}
}
.slideShow .next,
.slideShow .prev {
cursor: pointer;
position: relative;
top: 50%;
width: auto;
margin-top: -22px;
padding: 16px;
color: white;
font-weight: bold;
font-size: 18px;
transition: 0.6s ease;
border-radius: 0 3px 3px 0;
user-select: none;
}
.slideShow .next {
right: 0;
border-radius: 3px 0 0 3px;
}
.slideShow .next:hover,
.slideShow .prev:hover {
background-color: rgba(0, 0, 0, 0.8);
}
.slideShow figure p {
color: #f2f2f2;
font-size: 12px;
padding: 8px 12px;
position: relative;
top: 0;
}
.slideShow figure figcaption {
color: #f2f2f2;
font-size: 15px;
padding: 8px 12px;
position: relative;
bottom: 8px;
width: 100%;
text-align: center;
}
.slideShow .dot {
cursor: pointer;
height: 15px;
width: 15px;
margin: 0 2px;
background-color: #bbb;
border-radius: 50%;
display: inline-block;
transition: background-color 0.6s ease;
}
.slideShow .active,
.slideShow .dot:hover {
background-color: #717171;
}

View File

@ -0,0 +1,106 @@
import { useEffect, useState } from "react";
import "./SlideShow.css";
const SlideShow = (imgList) => {
console.log(imgList);
const [imgArray, setImgArray] = useState(imgList["imgList"]);
let showIndex = 1;
const ErrorMessage = `Please add an Object Like This \`imgList: \`{ imgList: [ { AltTag: 'linkurl' }, { AltTag: 'linkurl' }, { AltTag: 'linkurl' } ] }`;
const slides = document.getElementsByTagName("figure");
const dots = document.getElementsByClassName("dot");
useEffect(() => {
if (imgArray !== undefined) {
showSlide(1);
}
}, []);
const showSlide = (indexToShow) => {
if (indexToShow > slides.length) {
indexToShow = 1;
}
if (indexToShow < 1) {
indexToShow = slides.length;
}
showIndex = indexToShow;
let indexToNotShow;
for (indexToNotShow = 0; indexToNotShow < slides.length; indexToNotShow++) {
slides[indexToNotShow].style.display = "none";
}
for (indexToNotShow = 0; indexToNotShow < slides.length; indexToNotShow++) {
dots[indexToNotShow].className = dots[indexToNotShow].className.replace(
" active",
""
);
}
slides[showIndex - 1].style.display = "block";
dots[showIndex - 1].className += " active";
};
return (
<div className="slideShow">
{imgArray === undefined ? (
<p dangerouslySetInnerHTML={{ __html: ErrorMessage }}></p>
) : (
<>
<div>
{Object.keys(imgArray).map((imgIndex) => {
let imgSrc = imgArray[imgIndex];
let imgLink = Object.values(imgSrc)[0];
let imgCaption = Object.keys(imgSrc)[0];
return (
<figure
key={imgIndex}
className="fade">
<p>
{parseInt(imgIndex) + 1} / {imgArray.length}
</p>
<img
src={imgLink}
alt={imgCaption}
/>
<figcaption>{imgCaption}</figcaption>
</figure>
);
})}
<p
class="prev"
onClick={() => {
showSlide(showIndex - 1);
}}>
&#10094;
</p>
<p
class="next"
onClick={() => {
showSlide(showIndex + 1);
}}>
&#10095;
</p>
</div>
<div
className="dots"
style={{ textAlign: "center" }}>
{Object.keys(imgArray).map((imgIndex) => {
return (
<span
key={imgIndex}
class="dot"
onClick={() => {
showSlide(imgIndex);
}}></span>
);
})}
</div>
</>
)}
</div>
);
};
export default SlideShow;

View File

@ -1,11 +0,0 @@
import imagesData from './Images.json';
// Function to search and filter images based on the provided category
export const ImageFinder = (category) => {
if (category === 'all') {
return imagesData;
} else {
const filteredImages = imagesData.filter(image => image.category === category);
return filteredImages;
}
};

View File

@ -1,57 +0,0 @@
import React, { useState, useEffect } from 'react';
import { ImageFinder } from './ImageFinder.js';
import RenderImage from './RenderImage.js';
const ImageSlider = ({ category }) => {
// Time Interval before the ImageSlider moves to the next image
const timeInterval = 5000;
// State to hold the images of the specified category and the current index
const [categoryImages, setCategoryImages] = useState([]);
const [currentIndex, setCurrentIndex] = useState(0);
// Effect to filter images based on the provided category when it changes
useEffect(() => {
const filteredImages = ImageFinder(category);
setCategoryImages(filteredImages);
setCurrentIndex(0);
}, [category]);
// Effect to automatically move to the next image after a certain time interval
useEffect(() => {
const intervalId = setInterval(() => {handleNext();}, timeInterval);
// Cleanup: Clear the interval on component unmount or when currentIndex or categoryImages changes
return () => clearInterval(intervalId);
}, [currentIndex, categoryImages]);
// Function to handle moving to the next image
const handleNext = () => {
setCurrentIndex((prevIndex) => (prevIndex + 1) % categoryImages.length);
};
// Function to handle moving to the previous image
const handlePrev = () => {
setCurrentIndex((prevIndex) => (prevIndex - 1 + categoryImages.length) % categoryImages.length);
};
return (
<div style={{ position: 'relative', overflow: 'hidden' }}>
{/* Container to display previous, current, and next images */}
<div style={{ display: 'flex' }}>
{/* Button to move to the previous image */}
<button onClick={handlePrev}>Previous</button>
{/* Render the previous image */}
{RenderImage((currentIndex - 1 + categoryImages.length) % categoryImages.length, categoryImages)}
{/* Render the current image */}
{RenderImage(currentIndex, categoryImages)}
{/* Render the next image */}
{RenderImage((currentIndex + 1) % categoryImages.length, categoryImages)}
{/* Button to move to the next image */}
<button onClick={handleNext}>Next</button>
</div>
</div>
);
};
export default ImageSlider;

View File

@ -1,51 +0,0 @@
[
{
"id": 1,
"src": "https://img.freepik.com/free-photo/luxurious-car-parked-highway-with-illuminated-headlight-sunset_181624-60607.jpg?size=626&ext=jpg&ga=GA1.1.87170709.1707264000&semt=sph",
"alt": "Image 1",
"category": "Car"
},
{
"id": 2,
"src": "https://media.architecturaldigest.com/photos/63079fc7b4858efb76814bd2/16:9/w_4000,h_2250,c_limit/9.%20DeLorean-Alpha-5%20%5BDeLorean%5D.jpg",
"alt": "Image 2",
"category": "Car"
},
{
"id": 3,
"src": "https://cdn.motor1.com/images/mgl/g440ng/s3/rimac-nevera.jpg",
"alt": "Image 3",
"category": "Car"
},
{
"id": 4,
"src": "https://www.shutterstock.com/image-vector/realistic-vector-red-car-gradients-260nw-2271536365.jpg",
"alt": "Image 4",
"category": "Car"
},
{
"id": 5,
"src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJNuga_vmLPm7BLwbqQmsuNklxIsqXm_tTMg&usqp=CAU",
"alt": "Image 5",
"category": "Members"
},
{
"id": 6,
"src": "data:image/png;base64,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",
"alt": "Image 6",
"category": "Members"
},
{
"id": 7,
"src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRMdEL6UJgg3rFpj41o1bcjX4z2b_OEaYYNJg&usqp=CAU",
"alt": "Image 7",
"category": "Members"
},
{
"id": 8,
"src": "https://png.pngtree.com/png-vector/20220331/ourmid/pngtree-group-of-people-silhouette-png-image_4520545.png",
"alt": "Image 8",
"category": "Members"
}
]

View File

@ -1,26 +0,0 @@
import React from "react";
// Function to render an image based on the provided index
const RenderImage = (index, categoryImages) => {
// Check if categoryImages is not empty before accessing its properties
if (categoryImages.length > 0 && categoryImages[index]) {
return (
<img
key={index}
src={categoryImages[index].src}
alt={categoryImages[index].alt}
// onClick={handleImageClick}
style={{ maxWidth: '100%', maxHeight: '100%' }}
/>
);
} else {
return null; // or handle this case as needed
}
}
export default RenderImage;
// // Function to handle custom click actions on the image
// const handleImageClick = () => {
// // Will be worked on later
// };

View File

@ -1,4 +1,4 @@
#OurSponsors {
/* #OurSponsors {
display: flex;
flex-direction: column;
justify-content: center;
@ -48,4 +48,4 @@
#OurSponsors h3 {
text-align: left;
}
*/

View File

@ -1,15 +1,5 @@
import React from 'react';
import ImageSlider from '../Images/ImageSlider'; // Adjust the import path based on your directory structure
import React from "react";
export default function Teams() {
// return (
// <p>Teams</p>
// );
return (
<div>
<h1>Image Slider</h1>
<ImageSlider category="Members" />
</div>
);
};
return <p>Teams</p>;
}