diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index f26c6b3..924e002 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -3,22 +3,26 @@ import CodeInput from './components/CodeInput' import ProfileBar from './components/ProfileBar' import SearchScreen from './components/SearchScreen' import GameScreen from './components/GameScreen' -import { useAuth } from './auth' +import { useAuth, useAuthModal } from './auth' export default function App() { const { token } = useAuth() + const { openAuthModal } = useAuthModal() const [screen, setScreen] = useState('menu') // 'menu' | 'search' | 'game' const [gameSession, setGameSession] = useState(null) const handleRandomBattle = () => { + if (!token) return openAuthModal() setScreen('search') } const handleInvite = () => { + if (!token) return openAuthModal() // TODO: создание приватной комнаты } const handleJoinByCode = (code) => { + if (!token) return openAuthModal() // TODO: присоединение к комнате по коду console.log('join code:', code) } diff --git a/frontend/src/auth.jsx b/frontend/src/auth.jsx index 7c6b1ed..fe3aa73 100644 --- a/frontend/src/auth.jsx +++ b/frontend/src/auth.jsx @@ -1,9 +1,28 @@ import { createContext, useContext, useEffect, useState, useCallback } from 'react' import { api } from './api' +import AuthModal from './components/AuthModal' const AuthContext = createContext(null) +const AuthModalContext = createContext(null) const TOKEN_KEY = 'sea_battle_token' +export function AuthModalProvider({ children }) { + const [open, setOpen] = useState(false) + const openAuthModal = useCallback(() => setOpen(true), []) + const closeAuthModal = useCallback(() => setOpen(false), []) + + return ( + + {children} + {open && } + + ) +} + +export function useAuthModal() { + return useContext(AuthModalContext) +} + export function AuthProvider({ children }) { const [user, setUser] = useState(null) const [token, setToken] = useState(() => localStorage.getItem(TOKEN_KEY)) diff --git a/frontend/src/components/ProfileBar.jsx b/frontend/src/components/ProfileBar.jsx index b42c2ec..ba1d290 100644 --- a/frontend/src/components/ProfileBar.jsx +++ b/frontend/src/components/ProfileBar.jsx @@ -1,10 +1,8 @@ -import { useState } from 'react' -import { useAuth } from '../auth' -import AuthModal from './AuthModal' +import { useAuth, useAuthModal } from '../auth' export default function ProfileBar() { const { user, loading, logout } = useAuth() - const [showAuth, setShowAuth] = useState(false) + const { openAuthModal } = useAuthModal() return ( <> @@ -26,12 +24,11 @@ export default function ProfileBar() { ) : ( - )} - {showAuth && setShowAuth(false)} />} ) } diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index c2d9307..1175a03 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,13 +1,15 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' -import { AuthProvider } from './auth' +import { AuthProvider, AuthModalProvider } from './auth' import './styles.css' ReactDOM.createRoot(document.getElementById('root')).render( - + + + ) diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 8cb7844..39b9f3b 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -149,7 +149,7 @@ h1, h2, h3, h4, h5, h6 { gap: 10px; } -input { +input:not([type]), input[type="text"] { font-size: 32px; font-weight: 700; color: var(--text);