make every button that requires an account pop up a login prompt
This commit is contained in:
@@ -3,22 +3,26 @@ import CodeInput from './components/CodeInput'
|
|||||||
import ProfileBar from './components/ProfileBar'
|
import ProfileBar from './components/ProfileBar'
|
||||||
import SearchScreen from './components/SearchScreen'
|
import SearchScreen from './components/SearchScreen'
|
||||||
import GameScreen from './components/GameScreen'
|
import GameScreen from './components/GameScreen'
|
||||||
import { useAuth } from './auth'
|
import { useAuth, useAuthModal } from './auth'
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const { token } = useAuth()
|
const { token } = useAuth()
|
||||||
|
const { openAuthModal } = useAuthModal()
|
||||||
const [screen, setScreen] = useState('menu') // 'menu' | 'search' | 'game'
|
const [screen, setScreen] = useState('menu') // 'menu' | 'search' | 'game'
|
||||||
const [gameSession, setGameSession] = useState(null)
|
const [gameSession, setGameSession] = useState(null)
|
||||||
|
|
||||||
const handleRandomBattle = () => {
|
const handleRandomBattle = () => {
|
||||||
|
if (!token) return openAuthModal()
|
||||||
setScreen('search')
|
setScreen('search')
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleInvite = () => {
|
const handleInvite = () => {
|
||||||
|
if (!token) return openAuthModal()
|
||||||
// TODO: создание приватной комнаты
|
// TODO: создание приватной комнаты
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleJoinByCode = (code) => {
|
const handleJoinByCode = (code) => {
|
||||||
|
if (!token) return openAuthModal()
|
||||||
// TODO: присоединение к комнате по коду
|
// TODO: присоединение к комнате по коду
|
||||||
console.log('join code:', code)
|
console.log('join code:', code)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,28 @@
|
|||||||
import { createContext, useContext, useEffect, useState, useCallback } from 'react'
|
import { createContext, useContext, useEffect, useState, useCallback } from 'react'
|
||||||
import { api } from './api'
|
import { api } from './api'
|
||||||
|
import AuthModal from './components/AuthModal'
|
||||||
|
|
||||||
const AuthContext = createContext(null)
|
const AuthContext = createContext(null)
|
||||||
|
const AuthModalContext = createContext(null)
|
||||||
const TOKEN_KEY = 'sea_battle_token'
|
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 }) {
|
export function AuthProvider({ children }) {
|
||||||
const [user, setUser] = useState(null)
|
const [user, setUser] = useState(null)
|
||||||
const [token, setToken] = useState(() => localStorage.getItem(TOKEN_KEY))
|
const [token, setToken] = useState(() => localStorage.getItem(TOKEN_KEY))
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
import { useState } from 'react'
|
import { useAuth, useAuthModal } from '../auth'
|
||||||
import { useAuth } from '../auth'
|
|
||||||
import AuthModal from './AuthModal'
|
|
||||||
|
|
||||||
export default function ProfileBar() {
|
export default function ProfileBar() {
|
||||||
const { user, loading, logout } = useAuth()
|
const { user, loading, logout } = useAuth()
|
||||||
const [showAuth, setShowAuth] = useState(false)
|
const { openAuthModal } = useAuthModal()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -26,12 +24,11 @@ export default function ProfileBar() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<button className="btn btn-primary" onClick={() => setShowAuth(true)}>
|
<button className="btn btn-primary" onClick={openAuthModal}>
|
||||||
Войти
|
Войти
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{showAuth && <AuthModal onClose={() => setShowAuth(false)} />}
|
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import ReactDOM from 'react-dom/client'
|
import ReactDOM from 'react-dom/client'
|
||||||
import App from './App'
|
import App from './App'
|
||||||
import { AuthProvider } from './auth'
|
import { AuthProvider, AuthModalProvider } from './auth'
|
||||||
import './styles.css'
|
import './styles.css'
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById('root')).render(
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
|
<AuthModalProvider>
|
||||||
<App />
|
<App />
|
||||||
|
</AuthModalProvider>
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
</React.StrictMode>
|
</React.StrictMode>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ h1, h2, h3, h4, h5, h6 {
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input:not([type]), input[type="text"] {
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
|
|||||||
Reference in New Issue
Block a user