180 lines
5.6 KiB
JavaScript
180 lines
5.6 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
||
import { useNavigate } from 'react-router-dom';
|
||
import { useAuth } from '../context/AuthContext';
|
||
import { useRoom } from '../hooks/useRoom';
|
||
import NameInputModal from '../components/NameInputModal';
|
||
|
||
const CreateRoom = () => {
|
||
const navigate = useNavigate();
|
||
const { user, loginAnonymous, loading: authLoading } = useAuth();
|
||
const { createRoom, loading: roomLoading } = useRoom();
|
||
|
||
const [settings, setSettings] = useState({
|
||
maxPlayers: 10,
|
||
allowSpectators: true,
|
||
timerEnabled: false,
|
||
timerDuration: 30,
|
||
password: '',
|
||
});
|
||
const [isNameModalOpen, setIsNameModalOpen] = useState(false);
|
||
const [isHostNameModalOpen, setIsHostNameModalOpen] = useState(false);
|
||
|
||
// Проверка авторизации и показ модального окна для ввода имени
|
||
useEffect(() => {
|
||
if (!authLoading && !user) {
|
||
setIsNameModalOpen(true);
|
||
} else if (user) {
|
||
setIsNameModalOpen(false);
|
||
}
|
||
}, [authLoading, user]);
|
||
|
||
// Обработка ввода имени и авторизация
|
||
const handleNameSubmit = async (name) => {
|
||
try {
|
||
await loginAnonymous(name);
|
||
setIsNameModalOpen(false);
|
||
} catch (error) {
|
||
console.error('Login error:', error);
|
||
alert('Ошибка при авторизации. Попробуйте еще раз.');
|
||
}
|
||
};
|
||
|
||
const handleCreateRoom = async () => {
|
||
if (!user) {
|
||
setIsNameModalOpen(true);
|
||
return;
|
||
}
|
||
|
||
// Всегда спрашиваем имя хоста перед созданием комнаты
|
||
setIsHostNameModalOpen(true);
|
||
};
|
||
|
||
const handleHostNameSubmit = async (name) => {
|
||
setIsHostNameModalOpen(false);
|
||
|
||
try {
|
||
// Очищаем пустой пароль перед отправкой
|
||
const cleanSettings = { ...settings };
|
||
if (!cleanSettings.password || !cleanSettings.password.trim()) {
|
||
delete cleanSettings.password;
|
||
} else {
|
||
cleanSettings.password = cleanSettings.password.trim();
|
||
}
|
||
|
||
const room = await createRoom(
|
||
user.id,
|
||
undefined,
|
||
cleanSettings,
|
||
name.trim(),
|
||
);
|
||
navigate(`/room/${room.code}`);
|
||
} catch (error) {
|
||
console.error('Error creating room:', error);
|
||
alert('Ошибка создания комнаты');
|
||
}
|
||
};
|
||
|
||
return (
|
||
<div className="create-room-page">
|
||
<div className="create-room-container">
|
||
<h1>Создать комнату</h1>
|
||
|
||
<div className="form-group">
|
||
<label>Максимум игроков:</label>
|
||
<input
|
||
type="number"
|
||
min="2"
|
||
max="20"
|
||
value={settings.maxPlayers}
|
||
onChange={(e) =>
|
||
setSettings({ ...settings, maxPlayers: parseInt(e.target.value) })
|
||
}
|
||
/>
|
||
</div>
|
||
|
||
<div className="form-group checkbox">
|
||
<label>
|
||
<input
|
||
type="checkbox"
|
||
checked={settings.allowSpectators}
|
||
onChange={(e) =>
|
||
setSettings({ ...settings, allowSpectators: e.target.checked })
|
||
}
|
||
/>
|
||
Разрешить зрителей
|
||
</label>
|
||
</div>
|
||
|
||
<div className="form-group checkbox">
|
||
<label>
|
||
<input
|
||
type="checkbox"
|
||
checked={settings.timerEnabled}
|
||
onChange={(e) =>
|
||
setSettings({ ...settings, timerEnabled: e.target.checked })
|
||
}
|
||
/>
|
||
Включить таймер
|
||
</label>
|
||
</div>
|
||
|
||
{settings.timerEnabled && (
|
||
<div className="form-group">
|
||
<label>Время на ответ (сек):</label>
|
||
<input
|
||
type="number"
|
||
min="10"
|
||
max="120"
|
||
value={settings.timerDuration}
|
||
onChange={(e) =>
|
||
setSettings({ ...settings, timerDuration: parseInt(e.target.value) })
|
||
}
|
||
/>
|
||
</div>
|
||
)}
|
||
|
||
<div className="form-group">
|
||
<label>Пароль на комнату (необязательно):</label>
|
||
<input
|
||
type="password"
|
||
value={settings.password}
|
||
onChange={(e) =>
|
||
setSettings({ ...settings, password: e.target.value })
|
||
}
|
||
placeholder="Оставьте пустым для публичной комнаты"
|
||
/>
|
||
<small style={{ color: 'rgba(255, 255, 255, 0.6)', fontSize: '0.85rem', marginTop: '5px', display: 'block' }}>
|
||
Если указан пароль, только игроки с паролем смогут присоединиться к комнате
|
||
</small>
|
||
</div>
|
||
|
||
<div className="button-group">
|
||
<button
|
||
onClick={handleCreateRoom}
|
||
disabled={roomLoading}
|
||
className="primary"
|
||
>
|
||
{roomLoading ? 'Создание...' : 'Создать комнату'}
|
||
</button>
|
||
<button onClick={() => navigate('/')}>Назад</button>
|
||
</div>
|
||
</div>
|
||
|
||
<NameInputModal
|
||
isOpen={isNameModalOpen}
|
||
onSubmit={handleNameSubmit}
|
||
onCancel={null}
|
||
/>
|
||
|
||
<NameInputModal
|
||
isOpen={isHostNameModalOpen}
|
||
onSubmit={handleHostNameSubmit}
|
||
onCancel={() => setIsHostNameModalOpen(false)}
|
||
title="Введите ваше имя как ведущего"
|
||
description="Чтобы создать комнату, введите ваше имя как ведущего"
|
||
/>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default CreateRoom;
|