From 5e5560b558ff818546c94135bebf334be770c920 Mon Sep 17 00:00:00 2001 From: Michael Hunteman Date: Sat, 9 Mar 2024 15:13:45 -0800 Subject: Add carousel --- src/components/Admin.tsx | 6 ++-- src/components/Desktop.tsx | 6 ++-- src/components/Home.tsx | 76 +++++++++++++++++++++++++++++++++++++++++++++ src/components/Mobile.tsx | 17 +++++++--- src/components/RsvpForm.tsx | 63 +++++++++++++++++++++++-------------- src/components/active.css | 6 ++++ 6 files changed, 140 insertions(+), 34 deletions(-) create mode 100644 src/components/Home.tsx create mode 100644 src/components/active.css (limited to 'src/components') diff --git a/src/components/Admin.tsx b/src/components/Admin.tsx index bd1545d..a3da3fa 100644 --- a/src/components/Admin.tsx +++ b/src/components/Admin.tsx @@ -6,17 +6,17 @@ function Admin() { isLoading, isSuccess, isError, - error + error, } = useGetGuestsQuery(); let content; if (isLoading) { - content =

Loading...

+ content =

Loading...

; } else if (isSuccess) { content = JSON.stringify(guests); } else if (isError) { - content = <>{error.toString()} + content = <>{error.toString()}; } return ( diff --git a/src/components/Desktop.tsx b/src/components/Desktop.tsx index 34a0621..983c929 100644 --- a/src/components/Desktop.tsx +++ b/src/components/Desktop.tsx @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import { Link } from "react-router-dom"; -import { Button, IconButton } from "@mui/material"; +import { Link } from 'react-router-dom'; +import { Button, IconButton } from '@mui/material'; import DarkModeIcon from '@mui/icons-material/DarkMode'; import LightModeIcon from '@mui/icons-material/LightMode'; import { useTheme } from '@mui/material/styles'; @@ -13,7 +13,7 @@ function Desktop() { return (
- {pages.map(page => ( + {pages.map((page) => ( diff --git a/src/components/Home.tsx b/src/components/Home.tsx new file mode 100644 index 0000000..da9eb6b --- /dev/null +++ b/src/components/Home.tsx @@ -0,0 +1,76 @@ +import { useEffect, useRef, useState } from 'react'; +import './active.css'; + +function Home() { + const [index, setIndex] = useState(0); + const colors = ['#FF0000', '#00FF00', '#0000FF']; + const timeout = useRef(0); + + useEffect(() => { + resetTimeout(); + timeout.current = window.setTimeout( + () => + setIndex((prevIndex) => + prevIndex === colors.length - 1 ? 0 : prevIndex + 1 + ), + 2500 + ); + + return () => { + resetTimeout(); + }; + }, [index]); + + const resetTimeout = () => { + if (timeout.current) { + clearTimeout(timeout.current); + } + }; + + return ( + <> +
+
+ {colors.map((backgroundColor, colorIndex) => ( +
+ ))} +
+
+ {colors.map((_, colorIndex) => ( +
{ + setIndex(colorIndex); + }} + /> + ))} +
+
+ + ); +} + +export default Home; diff --git a/src/components/Mobile.tsx b/src/components/Mobile.tsx index f2ca255..f5502c0 100644 --- a/src/components/Mobile.tsx +++ b/src/components/Mobile.tsx @@ -1,7 +1,7 @@ import { useContext } from 'react'; -import { Link } from "react-router-dom"; +import { Link } from 'react-router-dom'; import { useState } from 'react'; -import { Button, IconButton, Menu, MenuItem } from "@mui/material"; +import { Button, IconButton, Menu, MenuItem } from '@mui/material'; import DarkModeIcon from '@mui/icons-material/DarkMode'; import LightModeIcon from '@mui/icons-material/LightMode'; import { useTheme } from '@mui/material/styles'; @@ -27,13 +27,22 @@ function Mobile() { {theme.palette.mode === 'dark' ? : } - + {pages.map((page) => ( - diff --git a/src/components/RsvpForm.tsx b/src/components/RsvpForm.tsx index d7efecf..090987b 100644 --- a/src/components/RsvpForm.tsx +++ b/src/components/RsvpForm.tsx @@ -10,14 +10,19 @@ import { TextField, } from '@mui/material'; import { useForm, Controller } from 'react-hook-form'; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from 'react-router-dom'; import { useUpdateGuestMutation, Guest } from '../apiSlice'; function RsvpForm() { const [updateGuest] = useUpdateGuestMutation(); const guest: Guest = useOutletContext(); - const { register, handleSubmit, control, formState: { errors } } = useForm({ + const { + register, + handleSubmit, + control, + formState: { errors }, + } = useForm({ defaultValues: { id: guest?.id, firstName: guest?.firstName, @@ -25,22 +30,27 @@ function RsvpForm() { attendance: '', email: '', partySize: 1, - message: '' - } + message: '', + }, }); const onSubmit = async (data: Guest) => { - updateGuest({...data}); + updateGuest({ ...data }); }; return ( - +

- Please RSVP for the wedding by March 10, 2025. - The ceremony will commence at 3 pm on April 26 in ... - The reception will follow at 5 pm in A Venue on the Ridge. + Please RSVP for the wedding by March 10, 2025. The ceremony will + commence at 3 pm on April 26 in ... The reception will follow at 5 + pm in A Venue on the Ridge.

@@ -81,12 +91,13 @@ function RsvpForm() { error={!!errors.email} helperText={errors.email?.message} required - {...register('email', - { required: 'This field is required', - pattern: { value: /\S+@\S+\.\S+/, - message: 'Please enter a valid email address' } - } - )} + {...register('email', { + required: 'This field is required', + pattern: { + value: /\S+@\S+\.\S+/, + message: 'Please enter a valid email address', + }, + })} /> @@ -98,12 +109,14 @@ function RsvpForm() { error={!!errors.partySize} helperText={errors.partySize?.message} required - {...register('partySize', - { required: 'This field is required', - min: { value: 1, message: 'Please enter a positive integer' }, - max: { value: 9, message: 'Please enter an integer less than 10' } - } - )} + {...register('partySize', { + required: 'This field is required', + min: { value: 1, message: 'Please enter a positive integer' }, + max: { + value: 9, + message: 'Please enter an integer less than 10', + }, + })} /> @@ -118,9 +131,11 @@ function RsvpForm() {