- add contact form scaffolding

This commit is contained in:
oonyeje 2023-10-23 12:03:57 -04:00
parent 86f4da9749
commit f0568f6402
6 changed files with 135 additions and 92 deletions

View File

@ -1,27 +1,27 @@
import React, { ReactNode } from "react"; import React, { ReactNode } from "react";
import Image from "next/image"; import Image from "next/image";
import { StaticImport } from "next/dist/shared/lib/get-img-props"; import { StaticImport } from "next/dist/shared/lib/get-img-props";
interface ContentProps { interface ContentProps {
title: string, title: string,
heroImgSrc: string | StaticImport, heroImgSrc: string | StaticImport,
description?: string, description?: string,
innerChildren?: ReactNode innerChildren?: ReactNode
} }
const Content = ({ const Content = ({
title = '', title = '',
heroImgSrc, heroImgSrc = '',
description = '', description = '',
innerChildren = <></> innerChildren = <></>
}: ContentProps) => { }: ContentProps) => {
return ( return (
<div className="p-4 px-10 flex flex-col"> <div className="p-4 px-10 flex flex-col">
<div className=" w-fit pb-1 mb-8 border-b-2 border-white">{title}</div> <div className=" w-fit pb-1 mb-8 border-b-2 border-white">{title}</div>
{heroImgSrc && <div className="mb-8 h-1/2"><Image src={heroImgSrc} alt=""/></div>} {heroImgSrc && <div className="mb-8 h-1/2"><Image src={heroImgSrc} alt=""/></div>}
<div>{description}</div> <div>{description}</div>
<div>{innerChildren}</div> <div>{innerChildren}</div>
</div> </div>
); );
}; };
export default Content; export default Content;

View File

@ -0,0 +1,41 @@
import { useForm, SubmitHandler, FieldValues } from 'react-hook-form';
const ContactForm = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
const handleFormSubmission: SubmitHandler<FieldValues> = (data) => {
console.log(data)
};
const handleFormError: SubmitHandler<FieldValues> = (error) => {
console.log(error)
};
return (
<div>
<form className="flex justify-center" onSubmit={handleSubmit(handleFormSubmission, handleFormError)}>
<div className="w-full">
<div className=' flex flex-col justify-between space-y-4 w-full'>
<div className='flex flex-row space-x-2'>
<input placeholder='First Name' className='w-1/2' {...register('firstName', { required: true })} />
<input placeholder='Last Name' className='w-1/2' {...register('lastName', { required: true })} />
{errors.firstName && <p>First name is required.</p>}
{errors.lastName && <p>Last name is required.</p>}
</div>
<div className="flex flex-row w-full">
<textarea placeholder='Summary...' className="flex grow" {...register('summary')} />
{errors.summary && <p>Please enter a message for your Project Inquiry.</p>}
</div>
<input className="bg-blue-600" type="submit" />
</div>
</div>
</form>
</div>
);
};
export default ContactForm;

View File

@ -31,15 +31,7 @@ const contentValues = {
}, },
contact: { contact: {
name: 'CONTACT', name: 'CONTACT',
description: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Rhoncus urna neque viverra justo nec ultrices dui. Quis risus sed vulputate odio ut. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit. Mi ipsum faucibus vitae aliquet nec. Adipiscing elit ut aliquam purus sit amet luctus. Morbi tempus iaculis urna id. Vitae congue mauris rhoncus aenean vel elit scelerisque. Cursus turpis massa tincidunt dui. Vulputate sapien nec sagittis aliquam malesuada. Lectus proin nibh nisl condimentum id venenatis a condimentum. Est lorem ipsum dolor sit amet consectetur. Blandit aliquam etiam erat velit. description: ``
Vel turpis nunc eget lorem dolor. Volutpat commodo sed egestas egestas fringilla phasellus faucibus. Auctor eu augue ut lectus arcu bibendum. Suscipit tellus mauris a diam maecenas sed enim ut sem. Vivamus at augue eget arcu dictum varius. Vitae et leo duis ut diam quam nulla porttitor. Enim eu turpis egestas pretium. A diam sollicitudin tempor id eu nisl nunc mi. Venenatis cras sed felis eget. Sagittis eu volutpat odio facilisis mauris sit amet massa vitae. Tempor orci eu lobortis elementum nibh tellus molestie. Semper auctor neque vitae tempus quam pellentesque nec nam. Tempor commodo ullamcorper a lacus vestibulum sed arcu non odio. Tristique nulla aliquet enim tortor. Volutpat commodo sed egestas egestas fringilla phasellus. Enim ut sem viverra aliquet eget sit amet tellus cras. Cras semper auctor neque vitae tempus quam.
In nibh mauris cursus mattis molestie. Vivamus arcu felis bibendum ut tristique et egestas quis ipsum. Dolor purus non enim praesent elementum facilisis leo. Enim ut tellus elementum sagittis. Sed libero enim sed faucibus turpis in. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Nibh sit amet commodo nulla facilisi nullam vehicula ipsum. Arcu dictum varius duis at consectetur lorem donec massa. Tellus cras adipiscing enim eu turpis egestas pretium. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Bibendum enim facilisis gravida neque convallis. Quis viverra nibh cras pulvinar mattis nunc. Quam nulla porttitor massa id neque aliquam vestibulum. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus turpis in eu mi bibendum neque. Curabitur gravida arcu ac tortor. Purus sit amet luctus venenatis lectus magna fringilla. Tincidunt vitae semper quis lectus nulla at volutpat. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt lobortis.
Mi quis hendrerit dolor magna eget est lorem. Ut lectus arcu bibendum at. Elit at imperdiet dui accumsan sit amet nulla. Tristique et egestas quis ipsum suspendisse ultrices. A arcu cursus vitae congue. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Nec dui nunc mattis enim ut tellus elementum sagittis. Posuere ac ut consequat semper. Eu non diam phasellus vestibulum lorem sed risus. Arcu ac tortor dignissim convallis aenean et tortor at. Velit scelerisque in dictum non consectetur a erat. Condimentum mattis pellentesque id nibh. Quam quisque id diam vel quam. At lectus urna duis convallis convallis tellus id interdum velit. Aliquam vestibulum morbi blandit cursus risus at ultrices. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Mattis molestie a iaculis at erat pellentesque adipiscing. In nulla posuere sollicitudin aliquam ultrices sagittis. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique.
Amet consectetur adipiscing elit ut aliquam purus sit amet luctus. Et ultrices neque ornare aenean euismod elementum. Orci sagittis eu volutpat odio. Vitae aliquet nec ullamcorper sit amet risus nullam. A scelerisque purus semper eget duis at. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Quis auctor elit sed vulputate. Enim ut sem viverra aliquet eget sit. Nulla aliquet porttitor lacus luctus. Mi sit amet mauris commodo quis imperdiet. Ac felis donec et odio pellentesque diam volutpat commodo sed. Lacus viverra vitae congue eu consequat ac felis donec et. Facilisis magna etiam tempor orci eu lobortis elementum nibh tellus. Velit egestas dui id ornare arcu.`
} }
} }

View File

@ -1,58 +1,62 @@
import React from 'react'; import React from 'react';
import Content from '../components/content' import Content from '../components/content'
import backgroundPic from '../public/unspash_image.jpg' import backgroundPic from '../public/unspash_image.jpg'
import ContentCarousel from '../components/content/carousel' import ContentCarousel from '../components/content/carousel';
import contentValues from './content'; import ContactForm from '../components/form/ContactForm';
import portfolioValues from './portfolio'; import contentValues from './content';
import { pdfjs, Document, Page } from 'react-pdf'; import portfolioValues from './portfolio';
import { pdfjs, Document, Page } from 'react-pdf';
const resumePdf = '../public/assets/Okechi_Onyeje_Resume_Professional_2023.pdf'
const resumePdf = '../public/assets/Okechi_Onyeje_Resume_Professional_2023.pdf'
export default [
{ export default [
name: contentValues.intro.name, {
url: '#intro', name: contentValues.intro.name,
content: <Content url: '#intro',
title='Intro' content: <Content
heroImgSrc={backgroundPic} title='Intro'
description={contentValues.intro.description} heroImgSrc={backgroundPic}
/> description={contentValues.intro.description}
}, />
{ },
name: contentValues.work.name, {
url: '#work', name: contentValues.work.name,
content: <Content url: '#work',
title='Work' content: <Content
heroImgSrc={backgroundPic} title='Work'
description={contentValues.work.description} heroImgSrc={backgroundPic}
innerChildren={ description={contentValues.work.description}
<div> innerChildren={
<Document <div>
file={resumePdf} <Document
/> file={resumePdf}
<ContentCarousel />
data={portfolioValues} <ContentCarousel
/> data={portfolioValues}
</div> />
} </div>
/> }
}, />
{ },
name: contentValues.about.name, {
url: '#about', name: contentValues.about.name,
content: <Content url: '#about',
title='About' content: <Content
heroImgSrc={backgroundPic} title='About'
description={contentValues.about.description} heroImgSrc={backgroundPic}
/> description={contentValues.about.description}
}, />
{ },
name: contentValues.contact.name, {
url: '#contact', name: contentValues.contact.name,
content: <Content url: '#contact',
title='Contact' content: <Content
heroImgSrc={backgroundPic} title='Contact'
description={contentValues.contact.description} heroImgSrc=''
/> description={contentValues.contact.description}
} innerChildren={
<ContactForm/>
}
/>
}
]; ];

View File

@ -16,6 +16,7 @@
"next": "latest", "next": "latest",
"react": "latest", "react": "latest",
"react-dom": "latest", "react-dom": "latest",
"react-hook-form": "^7.47.0",
"react-modal": "^3.16.1", "react-modal": "^3.16.1",
"react-pdf": "^7.4.0" "react-pdf": "^7.4.0"
}, },

View File

@ -2227,6 +2227,11 @@ react-dom@latest:
loose-envify "^1.1.0" loose-envify "^1.1.0"
scheduler "^0.23.0" scheduler "^0.23.0"
react-hook-form@^7.47.0:
version "7.47.0"
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.47.0.tgz#a42f07266bd297ddf1f914f08f4b5f9783262f31"
integrity sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg==
react-is@^16.13.1: react-is@^16.13.1:
version "16.13.1" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"