mirror of
https://github.com/System-End/site.git
synced 2026-04-19 18:35:12 +00:00
Iterate join form config
This commit is contained in:
parent
4ad17330d4
commit
74f71bf617
5 changed files with 29 additions and 22 deletions
|
|
@ -3,7 +3,7 @@ import useForm from '../../lib/use-form'
|
||||||
import Submit from '../submit'
|
import Submit from '../submit'
|
||||||
|
|
||||||
const JoinForm = ({ sx = {} }) => {
|
const JoinForm = ({ sx = {} }) => {
|
||||||
const { status, formProps, useField } = useForm('https://v3-6arfu6pu5.hackclub.dev/api/som-join/')
|
const { status, formProps, useField } = useForm('/api/join/')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card sx={{ maxWidth: 'narrow', mx: 'auto', label: { mb: 3 }, ...sx }}>
|
<Card sx={{ maxWidth: 'narrow', mx: 'auto', label: { mb: 3 }, ...sx }}>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { useState, useEffect } from 'react'
|
||||||
const useForm = (
|
const useForm = (
|
||||||
submitURL = '/',
|
submitURL = '/',
|
||||||
callback,
|
callback,
|
||||||
options = { clearOnSubmit: 5000, method: 'post' }
|
options = { clearOnSubmit: 5000, method: 'POST' }
|
||||||
) => {
|
) => {
|
||||||
const [status, setStatus] = useState('default')
|
const [status, setStatus] = useState('default')
|
||||||
const [data, setData] = useState({})
|
const [data, setData] = useState({})
|
||||||
|
|
@ -33,27 +33,24 @@ const useForm = (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const { method = 'post' } = options
|
const { method = 'POST' } = options
|
||||||
|
const action = submitURL
|
||||||
const action =
|
|
||||||
process.env.NODE_ENV === 'production'
|
|
||||||
? `https://v3.hackclub.com${submitURL}/`
|
|
||||||
: submitURL
|
|
||||||
|
|
||||||
const onSubmit = e => {
|
const onSubmit = e => {
|
||||||
e.persist()
|
e.persist() // Remove in React 17
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
setStatus('submitting')
|
setStatus('submitting')
|
||||||
fetch(action, {
|
fetch(action, {
|
||||||
method,
|
method,
|
||||||
headers: {
|
headers: {
|
||||||
'content-type': 'application/json'
|
Accept: 'application/json',
|
||||||
|
'Content-Type': 'application/json'
|
||||||
},
|
},
|
||||||
mode: 'no-cors',
|
|
||||||
body: JSON.stringify(data)
|
body: JSON.stringify(data)
|
||||||
})
|
})
|
||||||
.then(r => r.json())
|
.then(r => r.json())
|
||||||
.then(r => {
|
.then(r => {
|
||||||
|
console.log('Form success!')
|
||||||
setStatus('success')
|
setStatus('success')
|
||||||
if (callback) callback(r)
|
if (callback) callback(r)
|
||||||
setTimeout(() => setStatus('default'), 2000)
|
setTimeout(() => setStatus('default'), 2000)
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,20 @@ const withMDX = require('@next/mdx')({ extension: /\.mdx?$/ })
|
||||||
module.exports = withMDX({
|
module.exports = withMDX({
|
||||||
trailingSlash: true,
|
trailingSlash: true,
|
||||||
pageExtensions: ['js', 'jsx', 'mdx'],
|
pageExtensions: ['js', 'jsx', 'mdx'],
|
||||||
assetPrefix: isProd ? '/v3' : ''
|
assetPrefix: isProd ? '/v3' : '',
|
||||||
|
async headers() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: '/api/(.+)',
|
||||||
|
headers: [
|
||||||
|
{ key: 'Access-Control-Allow-Origin', value: '*' },
|
||||||
|
{
|
||||||
|
key: 'Access-Control-Allow-Methods',
|
||||||
|
value: 'GET, POST, OPTIONS'
|
||||||
|
},
|
||||||
|
{ key: 'Access-Control-Allow-Headers', value: 'Content-Type' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,10 @@ const joinTable = new AirtablePlus({
|
||||||
export default async (req, res) => {
|
export default async (req, res) => {
|
||||||
res.setHeader('Access-Control-Allow-Origin', '*')
|
res.setHeader('Access-Control-Allow-Origin', '*')
|
||||||
res.setHeader('Access-Control-Allow-Headers', '*')
|
res.setHeader('Access-Control-Allow-Headers', '*')
|
||||||
|
if (req.method === 'OPTIONS') {
|
||||||
|
console.log('OPTIONS request made')
|
||||||
|
return res.status(201)
|
||||||
|
}
|
||||||
if (req.method !== 'POST') {
|
if (req.method !== 'POST') {
|
||||||
return res.status(405).json({ error: 'Method not allowed, use POST' })
|
return res.status(405).json({ error: 'Method not allowed, use POST' })
|
||||||
}
|
}
|
||||||
|
|
@ -19,6 +23,7 @@ export default async (req, res) => {
|
||||||
console.log('Exists:', exists)
|
console.log('Exists:', exists)
|
||||||
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
|
console.log('Posting to Airtable…')
|
||||||
await joinTable.create({
|
await joinTable.create({
|
||||||
'Full Name': data.name,
|
'Full Name': data.name,
|
||||||
'Email Address': data.email,
|
'Email Address': data.email,
|
||||||
|
|
|
||||||
10
vercel.json
10
vercel.json
|
|
@ -8,15 +8,5 @@
|
||||||
"source": "/v3/_next/:path*",
|
"source": "/v3/_next/:path*",
|
||||||
"destination": "/_next/:path*"
|
"destination": "/_next/:path*"
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"headers": [
|
|
||||||
{
|
|
||||||
"source": "/api/(.+)",
|
|
||||||
"headers": [
|
|
||||||
{ "key": "Access-Control-Allow-Origin", "value": "*" },
|
|
||||||
{ "key": "Access-Control-Allow-Methods", "value": "POST, OPTIONS" },
|
|
||||||
{ "key": "Access-Control-Allow-Headers", "value": "Content-Type" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue