Header + OnlineToggle

This commit is contained in:
djmil 2023-11-03 08:53:27 +01:00
parent c999302cda
commit b237722e82
10 changed files with 96 additions and 59 deletions

View File

@ -1,7 +1,3 @@
.App { .App {
text-align: center; text-align: center;
} }
.Container {
margin-top: 25px;
}

View File

@ -1,17 +1,21 @@
import './App.css'; import './App.css';
import React from 'react' import React, { useReducer } from 'react'
import { BrowserRouter, Routes, Route } from "react-router-dom" import { BrowserRouter, Routes, Route } from "react-router-dom"
import Header from "./components/Header" import Header from "./container/Header"
import Leaderboard from "./components/Leaderboard" import Leaderboard from "./components/Leaderboard"
import Game from "./components/Game" import Game from "./components/Game"
import About from "./components/About" import About from "./components/About"
function App() { import { pollingReducer, pollingDefaults } from './reducer/polling';
function App() {
const [polling, dispatchPolling] = useReducer(pollingReducer, pollingDefaults)
console.log('polling', polling)
return <div className="App"> return <div className="App">
<BrowserRouter> <BrowserRouter>
<Header /> <Header polling={polling} dispatchPolling={dispatchPolling} />
<Routes> <Routes>
{/* https://stackoverflow.com/questions/40541994/multiple-path-names-for-a-same-component-in-react-router */} {/* https://stackoverflow.com/questions/40541994/multiple-path-names-for-a-same-component-in-react-router */}
<Route path="/game" element={<Game />} /> <Route path="/game" element={<Game />} />
@ -19,7 +23,6 @@ function App() {
<Route path="/game/proposal" element={<Game />} /> <Route path="/game/proposal" element={<Game />} />
<Route path="/game/active" element={<Game />} /> <Route path="/game/active" element={<Game />} />
<Route path="/game/archive" element={<Game />} /> <Route path="/game/archive" element={<Game />} />
<Route path="/leaderboard" element={<Leaderboard />} /> <Route path="/leaderboard" element={<Leaderboard />} />
<Route path="/about" element={<About />} /> <Route path="/about" element={<About />} />
</Routes> </Routes>

View File

@ -32,6 +32,8 @@ export default function GameSelector() {
if (!data.games) if (!data.games)
return <div>Loading..</div> return <div>Loading..</div>
console.log("Games", data.games)
return ( return (
<div className='game-selector'> <div className='game-selector'>
{isProposalPath && <Proposal games={data.games} onClick={onClick_proposal} />} {isProposalPath && <Proposal games={data.games} onClick={onClick_proposal} />}

View File

@ -1,30 +0,0 @@
import './Header.css';
import React from "react"
import { NavLink } from "react-router-dom";
import OnlineToggle from './OnlineTgl';
import { AppData } from "../context/data"
import Wobler from './Wobler';
export default function Header() {
const [data] = React.useContext(AppData)
return (
<div className='app-header'>
<h1 >
CordaCheckers
</h1>
<OnlineToggle />
<nav>
<NavLink to="/about">
About
</NavLink>
<NavLink to="/game">
<Wobler text="Game" dance={data.gamesFetching} />
</NavLink>
<NavLink to="/leaderboard">
<Wobler text="Leaderboard" dance={data.leaderboardFetching} />
</NavLink>
</nav>
</div>
)
}

View File

@ -1,12 +0,0 @@
import "./index.css"
import React from "react"
import { AppData } from "../../context/data"
export default function OnlineTgl() {
const [/*appData*/, dispatchData] = React.useContext(AppData)
return <div className="OnlineTgl">
<input className="tgl tgl-flip" id="cb5" type="checkbox" defaultChecked onClick={() => dispatchData({type: "toggleOfflineMode"})}/>
<label className="tgl-btn" data-tg-off="offline" data-tg-on="online" htmlFor="cb5"/>
</div>
}

View File

@ -0,0 +1,11 @@
import "./OnlineToggle.css"
import React from "react"
export default function OnlineToggle({ isOnline, onClick }) {
return (
<div className="OnlineToggle">
<input className="tgl tgl-flip" id="cb5" type="checkbox" checked={isOnline} onChange={onClick} />
<label className="tgl-btn" data-tg-off="offline" data-tg-on="online" htmlFor="cb5" />
</div>
)
}

View File

@ -1,13 +1,13 @@
.OnlineTgl { .OnlineToggle {
transform: scale(.5); transform: scale(.5);
margin-left: -19px; margin-left: -19px;
} }
.app-header { .Header {
display: flex; display: flex;
} }
.app-header nav { .Header nav {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
display: flex; display: flex;
@ -16,7 +16,7 @@
padding-top: 10px; padding-top: 10px;
} }
.app-header a { .Header a {
color: lightgray; color: lightgray;
text-decoration: none; text-decoration: none;
transition: .25s ease; transition: .25s ease;
@ -27,7 +27,7 @@
padding: 0.25rem 1rem; padding: 0.25rem 1rem;
} }
.app-header .active { .Header .active {
color: white; color: white;
border-radius: 2px; border-radius: 2px;
background-color: cadetblue; background-color: cadetblue;
@ -35,17 +35,17 @@
padding: 0.25rem 1rem; padding: 0.25rem 1rem;
} }
.app-header a:hover:not(.active) { .Header a:hover:not(.active) {
color: cadetblue; color: cadetblue;
box-shadow: 0 1.5px 0 0 currentcolor; box-shadow: 0 1.5px 0 0 currentcolor;
} }
[data-darkreader-scheme="dark"] .app-header a { [data-darkreader-scheme="dark"] .Header a {
color: darkslategrey; color: darkslategrey;
} }
[data-darkreader-scheme="dark"] .app-header .active { [data-darkreader-scheme="dark"] .Header .active {
color: white; color: white;
box-shadow: 0 1.5px 0 0 currentcolor; box-shadow: 0 1.5px 0 0 currentcolor;
} }

View File

@ -0,0 +1,35 @@
import './Header.css';
import React from "react"
import { NavLink } from "react-router-dom";
import OnlineToggle from '../components/OnlineToggle';
import Wobler from '../components/Wobler';
export default function Header({ polling, dispatchPolling }) {
return (
<div className='Header'>
<h1 >
CordaCheckers
</h1>
<OnlineToggle
isOnline={polling.enabled}
onClick={() => dispatchPolling({ type: "toggleOnOff" })}
/>
<nav>
<NavLink to="/about">
About
</NavLink>
<NavLink to="/game">
<Wobler text="Game" dance={polling.games} />
</NavLink>
<NavLink to="/leaderboard">
<Wobler text="Leaderboard" dance={polling.leaderboard} />
</NavLink>
</nav>
</div>
)
}

View File

@ -0,0 +1,32 @@
export function pollingReducer(polling, action) {
switch (action.type) {
case "toggleOnOff":
return {
...polling,
enabled: !polling.enabled
};
case "games":
return {
...polling,
games: action.value
};
case "leaderboard":
return {
...polling,
leaderboard: action.value
};
default:
throw Error("Unknown action: " + action.type);
}
}
export const pollingDefaults = {
enabled: true,
games: false,
leaderboard: false,
};