sto-k-odnomu/src/pages/CreateRoom.jsx
2026-01-10 18:51:33 +03:00

180 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;