2025-10-24 16:19:58 +03:00
|
|
|
|
import { useState } from 'react';
|
2025-10-30 19:22:14 +03:00
|
|
|
|
import { Form, Input, Button, Select, message, Space, Divider } from 'antd';
|
2025-11-14 19:06:36 +03:00
|
|
|
|
import { PhoneOutlined, SafetyOutlined, QrcodeOutlined, MailOutlined, CopyOutlined } from '@ant-design/icons';
|
|
|
|
|
|
|
|
|
|
|
|
const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:8200';
|
2025-10-24 16:19:58 +03:00
|
|
|
|
|
|
|
|
|
|
const { Option } = Select;
|
|
|
|
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
|
|
formData: any;
|
|
|
|
|
|
updateFormData: (data: any) => void;
|
|
|
|
|
|
onPrev: () => void;
|
|
|
|
|
|
onSubmit: () => void;
|
2025-10-24 20:40:44 +03:00
|
|
|
|
isPhoneVerified: boolean;
|
|
|
|
|
|
setIsPhoneVerified: (verified: boolean) => void;
|
2025-10-24 22:13:52 +03:00
|
|
|
|
addDebugEvent?: (type: string, status: string, message: string, data?: any) => void;
|
2025-10-24 16:19:58 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 20:40:44 +03:00
|
|
|
|
export default function Step3Payment({
|
|
|
|
|
|
formData,
|
|
|
|
|
|
updateFormData,
|
|
|
|
|
|
onPrev,
|
|
|
|
|
|
onSubmit,
|
|
|
|
|
|
isPhoneVerified,
|
2025-10-24 22:13:52 +03:00
|
|
|
|
setIsPhoneVerified,
|
|
|
|
|
|
addDebugEvent
|
2025-10-24 20:40:44 +03:00
|
|
|
|
}: Props) {
|
2025-10-24 16:19:58 +03:00
|
|
|
|
const [form] = Form.useForm();
|
2025-10-30 19:22:14 +03:00
|
|
|
|
const [codeSent, setCodeSent] = useState(false);
|
|
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
|
|
const [verifyLoading, setVerifyLoading] = useState(false);
|
2025-10-24 16:19:58 +03:00
|
|
|
|
const [submitting, setSubmitting] = useState(false);
|
2025-11-14 19:06:36 +03:00
|
|
|
|
const [debugCode, setDebugCode] = useState<string | null>(formData.smsDebugCode ?? null);
|
2025-10-24 16:19:58 +03:00
|
|
|
|
|
2025-10-30 19:22:14 +03:00
|
|
|
|
const sendCode = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const phone = form.getFieldValue('phone');
|
|
|
|
|
|
if (!phone) {
|
|
|
|
|
|
message.error('Введите номер телефона');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setLoading(true);
|
|
|
|
|
|
|
|
|
|
|
|
addDebugEvent?.('sms', 'pending', `📱 Отправляю SMS на ${phone}...`, { phone });
|
|
|
|
|
|
|
2025-11-14 19:06:36 +03:00
|
|
|
|
const response = await fetch(`${API_BASE_URL}/api/v1/sms/send`, {
|
2025-10-30 19:22:14 +03:00
|
|
|
|
method: 'POST',
|
|
|
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
|
|
|
body: JSON.stringify({ phone }),
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const result = await response.json();
|
|
|
|
|
|
|
|
|
|
|
|
if (response.ok) {
|
|
|
|
|
|
addDebugEvent?.('sms', 'success', `✅ SMS отправлен (DEBUG mode)`, {
|
|
|
|
|
|
phone,
|
|
|
|
|
|
debug_code: result.debug_code,
|
|
|
|
|
|
message: result.message
|
|
|
|
|
|
});
|
|
|
|
|
|
message.success('Код отправлен на ваш телефон');
|
|
|
|
|
|
setCodeSent(true);
|
|
|
|
|
|
if (result.debug_code) {
|
2025-11-14 19:06:36 +03:00
|
|
|
|
setDebugCode(result.debug_code);
|
|
|
|
|
|
updateFormData({ smsDebugCode: result.debug_code });
|
2025-10-30 19:22:14 +03:00
|
|
|
|
message.info(`DEBUG: Код ${result.debug_code}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
addDebugEvent?.('sms', 'error', `❌ Ошибка SMS: ${result.detail}`, { error: result.detail });
|
|
|
|
|
|
message.error(result.detail || 'Ошибка отправки кода');
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
message.error('Ошибка соединения с сервером');
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
setLoading(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const verifyCode = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const phone = form.getFieldValue('phone');
|
|
|
|
|
|
const code = form.getFieldValue('smsCode');
|
|
|
|
|
|
|
|
|
|
|
|
if (!code) {
|
|
|
|
|
|
message.error('Введите код из SMS');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setVerifyLoading(true);
|
|
|
|
|
|
|
|
|
|
|
|
addDebugEvent?.('sms', 'pending', `🔐 Проверяю SMS код...`, { phone, code });
|
|
|
|
|
|
|
2025-11-14 19:06:36 +03:00
|
|
|
|
const response = await fetch(`${API_BASE_URL}/api/v1/sms/verify`, {
|
2025-10-30 19:22:14 +03:00
|
|
|
|
method: 'POST',
|
|
|
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
|
|
|
body: JSON.stringify({ phone, code }),
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const result = await response.json();
|
|
|
|
|
|
|
|
|
|
|
|
if (response.ok) {
|
|
|
|
|
|
addDebugEvent?.('sms', 'success', `✅ Телефон подтвержден успешно`, {
|
|
|
|
|
|
phone,
|
|
|
|
|
|
verified: true
|
|
|
|
|
|
});
|
|
|
|
|
|
message.success('Телефон подтвержден!');
|
2025-11-14 19:06:36 +03:00
|
|
|
|
setDebugCode(null);
|
|
|
|
|
|
updateFormData({ smsDebugCode: undefined });
|
2025-10-30 19:22:14 +03:00
|
|
|
|
setIsPhoneVerified(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
addDebugEvent?.('sms', 'error', `❌ Неверный код SMS`, {
|
|
|
|
|
|
phone,
|
|
|
|
|
|
code,
|
|
|
|
|
|
error: result.detail
|
|
|
|
|
|
});
|
|
|
|
|
|
message.error(result.detail || 'Неверный код');
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
message.error('Ошибка соединения с сервером');
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
setVerifyLoading(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2025-10-24 20:40:44 +03:00
|
|
|
|
|
2025-10-24 16:19:58 +03:00
|
|
|
|
const handleSubmit = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const values = await form.validateFields();
|
|
|
|
|
|
updateFormData(values);
|
|
|
|
|
|
|
|
|
|
|
|
setSubmitting(true);
|
|
|
|
|
|
await onSubmit();
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
message.error('Заполните все обязательные поля');
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
setSubmitting(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<Form
|
|
|
|
|
|
form={form}
|
|
|
|
|
|
layout="vertical"
|
|
|
|
|
|
initialValues={formData}
|
|
|
|
|
|
style={{ marginTop: 24 }}
|
|
|
|
|
|
>
|
2025-11-19 18:46:48 +03:00
|
|
|
|
{/* Скрытые технические поля */}
|
|
|
|
|
|
<Form.Item name="clientIp" hidden>
|
|
|
|
|
|
<Input type="hidden" />
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name="smsCode" hidden>
|
|
|
|
|
|
<Input type="hidden" />
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
2025-10-25 09:35:55 +03:00
|
|
|
|
{/* Кнопка Назад вверху */}
|
|
|
|
|
|
<div style={{ marginBottom: 16 }}>
|
|
|
|
|
|
<Button onClick={onPrev} size="large">
|
|
|
|
|
|
← Назад
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-10-30 19:22:14 +03:00
|
|
|
|
{/* Блок верификации телефона */}
|
|
|
|
|
|
<div style={{
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
background: '#f6f8fa',
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
marginBottom: 24
|
|
|
|
|
|
}}>
|
|
|
|
|
|
<h3 style={{ marginTop: 0 }}>📱 Подтверждение телефона</h3>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="Номер телефона"
|
|
|
|
|
|
name="phone"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{ required: true, message: 'Введите номер телефона' },
|
|
|
|
|
|
{ pattern: /^\+7\d{10}$/, message: 'Формат: +79001234567' }
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Input
|
|
|
|
|
|
prefix={<PhoneOutlined />}
|
|
|
|
|
|
placeholder="+79001234567"
|
|
|
|
|
|
disabled={isPhoneVerified}
|
|
|
|
|
|
maxLength={12}
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="Электронная почта"
|
|
|
|
|
|
name="email"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{ required: true, message: 'Введите email' },
|
|
|
|
|
|
{ type: 'email', message: 'Неверный формат email' }
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Input
|
|
|
|
|
|
prefix={<MailOutlined />}
|
|
|
|
|
|
placeholder="example@mail.ru"
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
type="email"
|
|
|
|
|
|
disabled={isPhoneVerified}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{!isPhoneVerified && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<Form.Item>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
onClick={sendCode}
|
|
|
|
|
|
loading={loading}
|
|
|
|
|
|
disabled={codeSent}
|
|
|
|
|
|
block
|
|
|
|
|
|
>
|
|
|
|
|
|
{codeSent ? 'Код отправлен' : 'Отправить код'}
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</Form.Item>
|
2025-10-24 20:40:44 +03:00
|
|
|
|
|
2025-10-30 19:22:14 +03:00
|
|
|
|
{codeSent && (
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="Код из SMS"
|
|
|
|
|
|
name="smsCode"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{ required: true, message: 'Введите код' },
|
|
|
|
|
|
{ len: 6, message: '6 цифр' }
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Space.Compact style={{ width: '100%' }}>
|
|
|
|
|
|
<Input
|
|
|
|
|
|
prefix={<SafetyOutlined />}
|
|
|
|
|
|
placeholder="123456"
|
|
|
|
|
|
maxLength={6}
|
|
|
|
|
|
style={{ width: '70%' }}
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
/>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
onClick={verifyCode}
|
|
|
|
|
|
loading={verifyLoading}
|
|
|
|
|
|
style={{ width: '30%' }}
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
>
|
|
|
|
|
|
Проверить
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</Space.Compact>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
)}
|
2025-11-14 19:06:36 +03:00
|
|
|
|
|
|
|
|
|
|
{debugCode && !isPhoneVerified && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
marginTop: 8,
|
|
|
|
|
|
padding: 12,
|
2025-11-19 18:46:48 +03:00
|
|
|
|
background: '#fafafa',
|
2025-11-14 19:06:36 +03:00
|
|
|
|
borderRadius: 8,
|
2025-11-19 18:46:48 +03:00
|
|
|
|
border: '1px dashed #d9d9d9',
|
2025-11-14 19:06:36 +03:00
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
gap: 12,
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<span>
|
|
|
|
|
|
<strong>DEBUG код:</strong> {debugCode}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
icon={<CopyOutlined />}
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
navigator.clipboard.writeText(debugCode);
|
|
|
|
|
|
message.success('Код скопирован');
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
Скопировать
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
2025-10-30 19:22:14 +03:00
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{isPhoneVerified && (
|
|
|
|
|
|
<div style={{
|
|
|
|
|
|
padding: 12,
|
2025-11-19 18:46:48 +03:00
|
|
|
|
background: '#fafafa',
|
2025-10-30 19:22:14 +03:00
|
|
|
|
borderRadius: 8,
|
2025-11-19 18:46:48 +03:00
|
|
|
|
border: '1px solid #d9d9d9'
|
2025-10-30 19:22:14 +03:00
|
|
|
|
}}>
|
|
|
|
|
|
✅ Телефон подтвержден
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
2025-10-30 09:52:26 +03:00
|
|
|
|
|
2025-10-24 20:40:44 +03:00
|
|
|
|
{/* Блок выплаты (показывается только после верификации) */}
|
|
|
|
|
|
{isPhoneVerified && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<Divider />
|
|
|
|
|
|
|
|
|
|
|
|
<h3>💳 Способ получения выплаты</h3>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="Способ выплаты"
|
|
|
|
|
|
name="paymentMethod"
|
|
|
|
|
|
initialValue="sbp"
|
2025-10-24 16:19:58 +03:00
|
|
|
|
>
|
2025-10-24 20:40:44 +03:00
|
|
|
|
<div style={{
|
|
|
|
|
|
padding: '12px',
|
2025-11-19 18:46:48 +03:00
|
|
|
|
background: '#fafafa',
|
2025-10-24 20:40:44 +03:00
|
|
|
|
borderRadius: '8px',
|
2025-11-19 18:46:48 +03:00
|
|
|
|
border: '1px solid #d9d9d9'
|
2025-10-24 20:40:44 +03:00
|
|
|
|
}}>
|
2025-11-19 18:46:48 +03:00
|
|
|
|
<QrcodeOutlined style={{ fontSize: 20, color: '#595959', marginRight: 8 }} />
|
2025-10-24 20:40:44 +03:00
|
|
|
|
<strong>СБП (Система быстрых платежей)</strong>
|
|
|
|
|
|
<p style={{ margin: '8px 0 0 0', color: '#666', fontSize: 13 }}>
|
|
|
|
|
|
Выплата поступит на ваш счет в течение нескольких минут
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="Выберите ваш банк"
|
|
|
|
|
|
name="bankName"
|
|
|
|
|
|
rules={[{ required: true, message: 'Выберите банк для получения выплаты' }]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Select
|
|
|
|
|
|
placeholder="Выберите банк"
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
showSearch
|
|
|
|
|
|
filterOption={(input: string, option: any) => {
|
|
|
|
|
|
const children = option?.children;
|
|
|
|
|
|
if (typeof children === 'string') {
|
|
|
|
|
|
return children.toLowerCase().includes(input.toLowerCase());
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Option value="sberbank">🟢 Сбербанк</Option>
|
|
|
|
|
|
<Option value="tinkoff">🟡 Тинькофф</Option>
|
|
|
|
|
|
<Option value="vtb">🔵 ВТБ</Option>
|
|
|
|
|
|
<Option value="alfabank">🔴 Альфа-Банк</Option>
|
|
|
|
|
|
<Option value="raiffeisen">🟡 Райффайзенбанк</Option>
|
|
|
|
|
|
<Option value="gazprombank">🔵 Газпромбанк</Option>
|
|
|
|
|
|
<Option value="rosbank">🔴 Росбанк</Option>
|
|
|
|
|
|
<Option value="sovcombank">🟢 Совкомбанк</Option>
|
|
|
|
|
|
<Option value="otkritie">🔵 Открытие</Option>
|
|
|
|
|
|
<Option value="other">💳 Другой банк</Option>
|
|
|
|
|
|
</Select>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item>
|
|
|
|
|
|
<div style={{ display: 'flex', gap: 8, marginTop: 32 }}>
|
|
|
|
|
|
<Button onClick={onPrev} size="large">Назад</Button>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
onClick={handleSubmit}
|
|
|
|
|
|
loading={submitting}
|
|
|
|
|
|
style={{ flex: 1 }}
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
>
|
|
|
|
|
|
Отправить заявку
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Form.Item>
|
2025-10-28 10:13:18 +03:00
|
|
|
|
|
|
|
|
|
|
{/* 🔧 Технические кнопки для разработки */}
|
|
|
|
|
|
<div style={{
|
|
|
|
|
|
marginTop: 24,
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
background: '#f0f0f0',
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
border: '2px dashed #999'
|
|
|
|
|
|
}}>
|
|
|
|
|
|
<div style={{ marginBottom: 8, fontSize: 12, color: '#666', fontWeight: 'bold' }}>
|
|
|
|
|
|
🔧 DEV MODE - Быстрая навигация (без валидации)
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style={{ display: 'flex', gap: 8 }}>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
onClick={onPrev}
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
>
|
|
|
|
|
|
← Назад (Step 2)
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="dashed"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
// Пропускаем валидацию телефона
|
|
|
|
|
|
setIsPhoneVerified(true);
|
|
|
|
|
|
const devData = {
|
|
|
|
|
|
fullName: 'Тест Тестов',
|
|
|
|
|
|
email: 'test@test.ru',
|
2025-10-30 19:22:14 +03:00
|
|
|
|
phone: '+79991234567',
|
2025-10-28 10:13:18 +03:00
|
|
|
|
paymentMethod: 'sbp',
|
|
|
|
|
|
bankName: 'sberbank',
|
|
|
|
|
|
};
|
|
|
|
|
|
updateFormData(devData);
|
|
|
|
|
|
message.success('DEV: Телефон автоматически подтверждён');
|
|
|
|
|
|
}}
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
style={{ flex: 1 }}
|
|
|
|
|
|
>
|
|
|
|
|
|
✅ Автоподтверждение телефона [dev]
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
// Автоматически отправляем заявку
|
|
|
|
|
|
setIsPhoneVerified(true);
|
|
|
|
|
|
const devData = {
|
|
|
|
|
|
fullName: 'Тест Тестов',
|
|
|
|
|
|
email: 'test@test.ru',
|
2025-10-30 19:22:14 +03:00
|
|
|
|
phone: '+79991234567',
|
2025-10-28 10:13:18 +03:00
|
|
|
|
paymentMethod: 'sbp',
|
|
|
|
|
|
bankName: 'sberbank',
|
|
|
|
|
|
};
|
|
|
|
|
|
updateFormData(devData);
|
|
|
|
|
|
onSubmit();
|
|
|
|
|
|
}}
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
>
|
|
|
|
|
|
🚀 Отправить [пропустить]
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2025-10-24 20:40:44 +03:00
|
|
|
|
</>
|
|
|
|
|
|
)}
|
2025-10-24 16:19:58 +03:00
|
|
|
|
</Form>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|