hangerthem.com/components/contact.tsx
2024-08-12 15:15:13 +02:00

156 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client"
import styled from "styled-components"
import { useReCaptcha } from "next-recaptcha-v3"
import { useCallback, useState } from "react"
import { requestSendEmail } from "@/services/api-services/emailServices"
import { Container, Content } from "@/styles/pageStyles"
import { Instagram, Github, Discord, Linkedin } from "react-bootstrap-icons"
import Link from "next/link"
const ContactForm = styled.form`
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
width: 100%;
input,
textarea {
width: 100%;
padding: 1rem;
border: 1px solid rgba(var(--white), 0.1);
background-color: rgba(var(--white), 0.1);
color: rgb(var(--white));
font-family: inherit;
outline: none;
border-radius: 0.25rem;
&:active,
&:focus {
border-color: rgb(var(--primary));
}
}
textarea {
height: 200px;
resize: none;
}
button {
padding: 0.5rem 0.75rem;
background-color: rgb(var(--primary), 0.8);
color: rgb(var(--white));
border: none;
cursor: pointer;
font-size: 1.2rem;
font-weight: 600;
font-family: inherit;
transition: background-color 0.2s ease-in-out;
border-radius: 0.25rem;
&:hover {
background-color: rgb(var(--primary));
}
&:disabled {
background-color: rgba(var(--primary), 0.5);
cursor: not-allowed;
}
}
`
const SocialMedia = styled.div`
display: flex;
gap: 1rem;
`
export default function Contact() {
const [data, setData] = useState({
name: "",
email: "",
message: "",
})
const [loading, setLoading] = useState(false)
const { executeRecaptcha } = useReCaptcha()
const handleSubmit = useCallback(
async (event: React.FormEvent) => {
event.preventDefault()
setLoading(true)
const recaptchaToken = await executeRecaptcha("form_submit")
const response = await requestSendEmail({ ...data, recaptchaToken })
if (response.status === 200) {
alert("Email sent successfully!")
} else {
alert("Failed to send email! Please try again later.")
}
setLoading(false)
},
[executeRecaptcha, data]
)
return (
<Container id="contact">
<Content>
<h2> Get in touch</h2>
<p>Feel free to reach out to me for any queries or just to say hi!</p>
<ContactForm onSubmit={handleSubmit}>
<input
type="text"
placeholder="Name"
onChange={(e) => setData({ ...data, name: e.target.value })}
/>
<input
type="email"
placeholder="Email"
onChange={(e) => setData({ ...data, email: e.target.value })}
/>
<textarea
placeholder="Message"
onChange={(e) => setData({ ...data, message: e.target.value })}
></textarea>
<button
type="submit"
disabled={!data.name || !data.email || !data.message || loading}
>
{loading ? "Sending..." : "Send"}
</button>
</ContactForm>
<p>Or connect with me on social media:</p>
<SocialMedia>
<Link
href="https://www.instagram.com/ferda_borisjuk/"
target="_blank"
rel="noreferrer"
>
<Instagram size={32} />
</Link>
<Link
href="https://github.com/HangerThem"
target="_blank"
rel="noreferrer"
>
<Github size={32} />
</Link>
<Link
href="https://discord.com/users/495134242825699328"
target="_blank"
rel="noreferrer"
>
<Discord size={32} />
</Link>
<Link
href="https://www.linkedin.com/in/franti%C5%A1ek-borisjuk-022686225/"
target="_blank"
rel="noreferrer"
>
<Linkedin size={32} />
</Link>
</SocialMedia>
</Content>
</Container>
)
}