make every button that requires an account pop up a login prompt

This commit is contained in:
2026-10-27 08:46:09 +03:00
parent df2a334d7c
commit 3368686201
5 changed files with 32 additions and 10 deletions
+5 -1
View File
@@ -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)
}
+19
View File
@@ -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 (
<AuthModalContext.Provider value={{ openAuthModal }}>
{children}
{open && <AuthModal onClose={closeAuthModal} />}
</AuthModalContext.Provider>
)
}
export function useAuthModal() {
return useContext(AuthModalContext)
}
export function AuthProvider({ children }) {
const [user, setUser] = useState(null)
const [token, setToken] = useState(() => localStorage.getItem(TOKEN_KEY))
+3 -6
View File
@@ -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() {
</button>
</div>
) : (
<button className="btn btn-primary" onClick={() => setShowAuth(true)}>
<button className="btn btn-primary" onClick={openAuthModal}>
Войти
</button>
)}
</div>
{showAuth && <AuthModal onClose={() => setShowAuth(false)} />}
</>
)
}
+4 -2
View File
@@ -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(
<React.StrictMode>
<AuthProvider>
<App />
<AuthModalProvider>
<App />
</AuthModalProvider>
</AuthProvider>
</React.StrictMode>
)
+1 -1
View File
@@ -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);