Files
datacontroller.io/src/pages/contact.tsx
2025-12-13 17:53:11 +01:00

204 lines
6.6 KiB
TypeScript

import { PageProps, Link, graphql } from 'gatsby'
import React, { useState } from 'react'
import Layout from '../components/layout'
import Seo from '../components/seo'
import { Section } from '../components/shared'
import {
SectionHeading,
SectionDesc,
SolidButton
} from '../components/shared/styledComponents'
import {
StyledHeading,
StyledLabel,
ContactBackground
} from '../styledComponents/contact'
import contactBg from '../images/contact_bg.jpg'
import '../styledComponents/contact.css'
import { NostrController } from '../controllers'
type DataProps = {
site: {
meta: {
title: string
description: string
social: { linkedin: string }
}
}
}
const Contact: React.FC<PageProps<DataProps>> = ({ data, location }) => {
const nostrController = NostrController.getInstance()
const [name, setName] = useState<string>()
const [email, setEmail] = useState<string>()
const [emailError, setEmailError] = useState<boolean>(false)
const [subject, setSubject] = useState<string>()
const [message, setMessage] = useState<string>()
const [notification, setNotification] = useState<string>()
const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value
setEmail(value)
if (
value &&
(value.toLowerCase().includes('@gmail.com') ||
value.toLowerCase().includes('@googlemail.com'))
) {
setEmailError(true)
setNotification('Gmail addresses are not allowed.')
} else {
setEmailError(false)
setNotification(undefined)
}
}
const getBorderStyle = (value: string | undefined) =>
value === undefined ? {} : value ? {} : { border: '1px solid red' }
return (
<Layout
location={location}
heading="Book a Demo"
desc="Schedule a demonstration of the Data Controller to see our latest features and explore use cases"
>
<Seo title="Contact" />
<Section color="black" bgColor="white" bottomArrow={false}>
<div className="row">
<div className="col-md-6">
<SectionHeading center="no">Schedule a Call</SectionHeading>
<SectionDesc center="no">
Feel free to contact us at any time to book a demo and start your
Data Controller journey. Our team will respond within 24 hours and
help you proceed with the registration process.
</SectionDesc>
<StyledHeading>Contact Us</StyledHeading>
<form
onSubmit={async (evt) => {
evt.preventDefault()
// Prevent sending if emailError is set
if (emailError) {
return
}
if (name && email && subject && message) {
const res = await nostrController
.sendDM(
'npub1dc0000002dtkw7et06sztc9nvk79r6yju8gk69sr88rgrg0e8cvsnptgyv',
`Name: ${name}
Email: ${email}
Subject: ${subject}
Message: ${message}`
)
.catch((err) => {
setNotification(
`Something went wrong. Please check the console for more information. Please try one more time.`
)
console.log(`Sending message error: `, err)
})
if (res && res.length) {
setNotification(`Message sent. We'll contact you shortly.`)
} else {
setNotification(
`Something went wrong. Please try one more time.`
)
}
}
}}
>
<div className="mb-3">
<StyledLabel htmlFor="name" className="form-label">
Name
</StyledLabel>
<input
type="text"
className="form-control contactFormStyles"
id="name"
name="name"
rules="required|max:50"
onChange={(evt) => {
setName(evt.target.value)
setNotification(undefined)
}}
style={getBorderStyle(name)}
/>
</div>
<div className="mb-3">
<StyledLabel htmlFor="email" className="form-label">
Email address
</StyledLabel>
<input
type="email"
className="form-control contactFormStyles"
id="email"
name="email"
rules="required|email"
aria-describedby="emailHelp"
onChange={handleEmailChange}
style={getBorderStyle(email)}
/>
<div id="emailHelp" className="form-text">
We'll never share your email with anyone else.
</div>
</div>
<div className="mb-3">
<StyledLabel htmlFor="subject" className="form-label">
Subject
</StyledLabel>
<input
type="text"
className="form-control contactFormStyles"
id="subject"
name="subject"
rules="required|max:50"
onChange={(evt) => {
setSubject(evt.target.value)
setNotification(undefined)
}}
style={getBorderStyle(subject)}
/>
</div>
<div className="mb-3">
<StyledLabel htmlFor="mesage" className="form-label">
Message
</StyledLabel>
<textarea
className="form-control contactFormStyles"
id="mesage"
name="message"
rows="5"
rules="required|max:200"
onChange={(evt) => {
setMessage(evt.target.value)
setNotification(undefined)
}}
style={getBorderStyle(message)}
></textarea>
</div>
<div className="mb-3">
<SolidButton theme="dark">Submit</SolidButton>
</div>
</form>
{notification && <span>{notification}</span>}
</div>
<div className="col-md-6">
<ContactBackground src={contactBg} info="Book a Demo" />
</div>
</div>
</Section>
</Layout>
)
}
export default Contact