Header + OnlineToggle
This commit is contained in:
parent
c999302cda
commit
b237722e82
@ -1,7 +1,3 @@
|
||||
.App {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.Container {
|
||||
margin-top: 25px;
|
||||
}
|
@ -1,17 +1,21 @@
|
||||
import './App.css';
|
||||
import React from 'react'
|
||||
import React, { useReducer } from 'react'
|
||||
import { BrowserRouter, Routes, Route } from "react-router-dom"
|
||||
|
||||
import Header from "./components/Header"
|
||||
import Header from "./container/Header"
|
||||
import Leaderboard from "./components/Leaderboard"
|
||||
import Game from "./components/Game"
|
||||
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">
|
||||
<BrowserRouter>
|
||||
<Header />
|
||||
<Header polling={polling} dispatchPolling={dispatchPolling} />
|
||||
<Routes>
|
||||
{/* https://stackoverflow.com/questions/40541994/multiple-path-names-for-a-same-component-in-react-router */}
|
||||
<Route path="/game" element={<Game />} />
|
||||
@ -19,7 +23,6 @@ function App() {
|
||||
<Route path="/game/proposal" element={<Game />} />
|
||||
<Route path="/game/active" element={<Game />} />
|
||||
<Route path="/game/archive" element={<Game />} />
|
||||
|
||||
<Route path="/leaderboard" element={<Leaderboard />} />
|
||||
<Route path="/about" element={<About />} />
|
||||
</Routes>
|
||||
|
@ -32,6 +32,8 @@ export default function GameSelector() {
|
||||
if (!data.games)
|
||||
return <div>Loading..</div>
|
||||
|
||||
console.log("Games", data.games)
|
||||
|
||||
return (
|
||||
<div className='game-selector'>
|
||||
{isProposalPath && <Proposal games={data.games} onClick={onClick_proposal} />}
|
||||
|
@ -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>
|
||||
)
|
||||
}
|
@ -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>
|
||||
}
|
11
webapp/src/components/OnlineToggle.jsx
Normal file
11
webapp/src/components/OnlineToggle.jsx
Normal 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>
|
||||
)
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
.OnlineTgl {
|
||||
.OnlineToggle {
|
||||
transform: scale(.5);
|
||||
margin-left: -19px;
|
||||
}
|
||||
|
||||
.app-header {
|
||||
.Header {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.app-header nav {
|
||||
.Header nav {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
@ -16,7 +16,7 @@
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.app-header a {
|
||||
.Header a {
|
||||
color: lightgray;
|
||||
text-decoration: none;
|
||||
transition: .25s ease;
|
||||
@ -27,7 +27,7 @@
|
||||
padding: 0.25rem 1rem;
|
||||
}
|
||||
|
||||
.app-header .active {
|
||||
.Header .active {
|
||||
color: white;
|
||||
border-radius: 2px;
|
||||
background-color: cadetblue;
|
||||
@ -35,17 +35,17 @@
|
||||
padding: 0.25rem 1rem;
|
||||
}
|
||||
|
||||
.app-header a:hover:not(.active) {
|
||||
.Header a:hover:not(.active) {
|
||||
color: cadetblue;
|
||||
|
||||
box-shadow: 0 1.5px 0 0 currentcolor;
|
||||
}
|
||||
|
||||
[data-darkreader-scheme="dark"] .app-header a {
|
||||
[data-darkreader-scheme="dark"] .Header a {
|
||||
color: darkslategrey;
|
||||
}
|
||||
|
||||
[data-darkreader-scheme="dark"] .app-header .active {
|
||||
[data-darkreader-scheme="dark"] .Header .active {
|
||||
color: white;
|
||||
box-shadow: 0 1.5px 0 0 currentcolor;
|
||||
}
|
35
webapp/src/container/Header.jsx
Normal file
35
webapp/src/container/Header.jsx
Normal 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>
|
||||
)
|
||||
}
|
32
webapp/src/reducer/polling.js
Normal file
32
webapp/src/reducer/polling.js
Normal 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,
|
||||
};
|
Loading…
Reference in New Issue
Block a user