2024-02-04 11:25:21 +00:00
|
|
|
|
import { Show, createSignal } from 'solid-js'
|
2022-11-02 22:11:30 +00:00
|
|
|
|
|
2023-11-14 15:10:00 +00:00
|
|
|
|
import { PageLayout } from '../components/_shared/PageLayout'
|
|
|
|
|
|
2022-11-02 22:11:30 +00:00
|
|
|
|
export const ConnectPage = () => {
|
2023-05-11 18:34:04 +00:00
|
|
|
|
const [state, setState] = createSignal<'initial' | 'loading' | 'success' | 'error'>('initial')
|
|
|
|
|
|
|
|
|
|
const formRef: { current: HTMLFormElement } = { current: null }
|
|
|
|
|
const handleFormSubmit = async (e) => {
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
setState('loading')
|
|
|
|
|
|
|
|
|
|
// eslint-disable-next-line unicorn/prefer-spread
|
2023-11-14 10:45:44 +00:00
|
|
|
|
const postData = Array.from(formRef.current.elements).reduce(
|
|
|
|
|
(acc, element) => {
|
|
|
|
|
const formField = element as unknown as { name: string; value: string }
|
|
|
|
|
if (formField.name) {
|
|
|
|
|
acc[formField.name] = formField.value
|
|
|
|
|
}
|
2023-05-11 18:34:04 +00:00
|
|
|
|
|
2023-11-14 10:45:44 +00:00
|
|
|
|
return acc
|
|
|
|
|
},
|
2023-11-14 15:10:00 +00:00
|
|
|
|
{} as Record<string, string>,
|
2023-11-14 10:45:44 +00:00
|
|
|
|
)
|
2023-05-11 18:34:04 +00:00
|
|
|
|
|
|
|
|
|
const requestOptions = {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: {
|
2023-11-14 15:10:00 +00:00
|
|
|
|
'Content-Type': 'application/json',
|
2023-05-11 18:34:04 +00:00
|
|
|
|
},
|
2023-11-14 15:10:00 +00:00
|
|
|
|
body: JSON.stringify(postData),
|
2023-05-11 18:34:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-12 14:36:05 +00:00
|
|
|
|
const result = await fetch('/api/feedback', requestOptions)
|
|
|
|
|
|
|
|
|
|
if (!result.ok) {
|
|
|
|
|
console.error('[handleFormSubmit]', result)
|
2023-05-11 18:34:04 +00:00
|
|
|
|
setState('error')
|
2023-05-12 14:36:05 +00:00
|
|
|
|
return
|
2023-05-11 18:34:04 +00:00
|
|
|
|
}
|
2023-05-12 14:11:00 +00:00
|
|
|
|
|
2023-05-12 14:36:05 +00:00
|
|
|
|
setState('success')
|
2023-05-12 14:11:00 +00:00
|
|
|
|
window.scrollTo({
|
2023-11-14 15:10:00 +00:00
|
|
|
|
top: 0,
|
2023-05-12 14:11:00 +00:00
|
|
|
|
})
|
2023-05-11 18:34:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-11-14 10:45:44 +00:00
|
|
|
|
// TODO: l10n
|
2022-11-02 22:11:30 +00:00
|
|
|
|
return (
|
2023-11-14 10:45:44 +00:00
|
|
|
|
<PageLayout title="Предложить идею">
|
2022-11-24 21:37:43 +00:00
|
|
|
|
<article class="wide-container container--static-page">
|
2022-11-02 22:11:30 +00:00
|
|
|
|
<div class="row">
|
2023-03-10 17:42:48 +00:00
|
|
|
|
<div class="col-sm-20 col-md-16 col-lg-14 col-xl-12 offset-md-5">
|
2023-05-12 14:36:05 +00:00
|
|
|
|
<Show when={state() === 'loading' || state() === 'initial' || state() === 'error'}>
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<h1>
|
|
|
|
|
<span class="wrapped">Предложить идею</span>
|
|
|
|
|
</h1>
|
2022-11-14 21:57:19 +00:00
|
|
|
|
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<p>
|
|
|
|
|
Хотите что-то предложить, обсудить или посоветовать? Поделиться темой или идеей? Напишите
|
|
|
|
|
нам скорее! Если укажете свою почту, мы обязательно ответим.
|
|
|
|
|
</p>
|
2022-11-02 22:11:30 +00:00
|
|
|
|
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<form onSubmit={handleFormSubmit} ref={(el) => (formRef.current = el)}>
|
|
|
|
|
<div class="pretty-form__item">
|
2023-05-12 14:11:00 +00:00
|
|
|
|
<select name="subject" disabled={state() === 'loading'}>
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<option value="Сотрудничество" selected>
|
|
|
|
|
Сотрудничество
|
|
|
|
|
</option>
|
|
|
|
|
<option value="Посоветовать тему">Посоветовать тему</option>
|
|
|
|
|
<option value="Сообщить об ошибке">Сообщить об ошибке</option>
|
|
|
|
|
<option value="Предложить проект">Предложить проект</option>
|
|
|
|
|
<option value="Волонтерство">Волонтерство</option>
|
|
|
|
|
<option value="Другое">Другое</option>
|
|
|
|
|
</select>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="pretty-form__item">
|
2023-05-12 14:11:00 +00:00
|
|
|
|
<input
|
|
|
|
|
type="email"
|
|
|
|
|
name="contact"
|
|
|
|
|
placeholder="Email для обратной связи"
|
|
|
|
|
disabled={state() === 'loading'}
|
|
|
|
|
/>
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<label for="contact-email">Email для обратной связи</label>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="pretty-form__item">
|
2023-05-12 14:11:00 +00:00
|
|
|
|
<textarea name="message" placeholder="Текст сообщения" disabled={state() === 'loading'} />
|
2023-05-12 13:59:40 +00:00
|
|
|
|
<label for="message">Текст сообщения</label>
|
|
|
|
|
</div>
|
|
|
|
|
<button class="button" disabled={state() === 'loading'} type="submit">
|
|
|
|
|
Отправить письмо
|
|
|
|
|
</button>
|
|
|
|
|
</form>
|
|
|
|
|
</Show>
|
2023-05-12 14:36:05 +00:00
|
|
|
|
<Show when={state() === 'error'}>
|
|
|
|
|
<br />
|
|
|
|
|
Ошибка. Что-то пошло не так. Пожалуйста, попробуйте написать ещё раз
|
|
|
|
|
</Show>
|
|
|
|
|
<Show when={state() === 'success'}>Спасибо за письмо!</Show>
|
2022-11-02 22:11:30 +00:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
2023-02-17 09:21:02 +00:00
|
|
|
|
</PageLayout>
|
2022-11-02 22:11:30 +00:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-17 09:21:02 +00:00
|
|
|
|
export const Page = ConnectPage
|