diff options
author | lonkaars <l.leblansch@gmail.com> | 2021-04-18 14:28:53 +0200 |
---|---|---|
committer | lonkaars <l.leblansch@gmail.com> | 2021-04-18 14:28:53 +0200 |
commit | af796b465c66a61b498facff010b372a52a24508 (patch) | |
tree | 21de47cf4e1b621fc2fd1b7a3408f1fb0f188ce1 | |
parent | 465b971fd0cb80004bf60865ddc25df9cd72ba38 (diff) |
wip dialog box
-rw-r--r-- | components/dialogBox.tsx | 16 | ||||
-rw-r--r-- | components/gameSettings.tsx | 363 | ||||
-rw-r--r-- | styles/ui.css | 5 | ||||
-rw-r--r-- | styles/utility.css | 7 |
4 files changed, 188 insertions, 203 deletions
diff --git a/components/dialogBox.tsx b/components/dialogBox.tsx index 7abbded..0a61762 100644 --- a/components/dialogBox.tsx +++ b/components/dialogBox.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, ReactNode } from 'react'; +import { ReactNode } from 'react'; import { Vierkant } from './ui'; @@ -7,20 +7,10 @@ import CancelIcon from '@material-ui/icons/Cancel'; export function DialogBox(props: { children: ReactNode; title: string; - style?: CSSProperties; onclick?: () => void; + hidden?: boolean; }) { - return <Vierkant - style={{ - position: 'fixed', - top: '50%', - left: '50%', - transform: 'translate(-50%, -50%)', - boxShadow: '0 8px 32px -5px #0007', - width: 392, - ...props.style, - }} - > + return <Vierkant className={'dialogbox drop-2 pad-l posfix abscenter ' + (props.hidden ? 'dispnone' : '')}> <h2 style={{ marginBottom: 24 }}>{props.title}</h2> <span onClick={props.onclick}> <CancelIcon diff --git a/components/gameSettings.tsx b/components/gameSettings.tsx index f562e5d..3c3a699 100644 --- a/components/gameSettings.tsx +++ b/components/gameSettings.tsx @@ -1,5 +1,5 @@ import axios from 'axios'; -import { Component, CSSProperties, ReactNode } from 'react'; +import { Component, CSSProperties, ReactNode, useEffect, useState } from 'react'; import { ruleset, userPreferences } from '../api/api'; import { DialogBox } from './dialogBox'; @@ -7,106 +7,93 @@ import { Button, CheckBox, Input, Vierkant } from './ui'; import BuildOutlinedIcon from '@material-ui/icons/BuildOutlined'; -type CurrentGameSettingsStateType = { - editGameRulesDialogVisible: boolean; - ruleset: ruleset; -}; - -export class CurrentGameSettings extends Component { - state: CurrentGameSettingsStateType = { - editGameRulesDialogVisible: false, - ruleset: { - timelimit: { - enabled: false, - shared: false, - }, - ranked: false, +export function CurrentGameSettings() { + var [editGameRulesDialogVisible, setEditGameRulesDialogVisible] = useState(false); + var [ruleset, setRuleset] = useState<ruleset>({ + timelimit: { + enabled: false, + shared: false, + minutes: 0, + seconds: 0, + addmove: 0, }, - }; - - constructor(props: {}) { - super(props); + ranked: false, + }); - if (typeof window === 'undefined') return; // return if run on server - - axios.request<userPreferences>({ + useEffect(() => { + axios.request<{ preferences: userPreferences; }>({ method: 'get', url: `/api/user/preferences`, headers: { 'content-type': 'application/json' }, }) - // FIXME: this assumes the request ruleset has all properties of a ruleset - .then(request => this.setState({ ruleset: request.data.ruleset || this.state.ruleset })) + .then(request => setRuleset(request.data.preferences.ruleset)) .catch(() => {}); - } + }, []); - showEditGameRules = () => this.setState({ editGameRulesDialogVisible: true }); - hideEditGameRules = () => this.setState({ editGameRulesDialogVisible: false }); - setGameRules = (newRules: ruleset) => this.setState({ ruleset: newRules }); + /* showEditGameRules = () => this.setState({ editGameRulesDialogVisible: true }); */ + /* hideEditGameRules = () => this.setState({ editGameRulesDialogVisible: false }); */ + /* setGameRules = (newRules: ruleset) => this.setState({ ruleset: newRules }); */ - render() { - var timelimit_str = this.state.ruleset.timelimit.enabled - ? `${this.state.ruleset.timelimit.minutes}m${this.state.ruleset.timelimit.seconds}s plus ${this.state.ruleset.timelimit.addmove}` - : 'Geen tijdslimiet'; - var ranked_str = this.state.ruleset.ranked - ? 'Gerangschikt' - : 'Niet gerangschikt'; - return <div + var timelimit_str = ruleset.timelimit.enabled + ? `${ruleset.timelimit.minutes}m${ruleset.timelimit.seconds}s plus ${ruleset.timelimit.addmove}` + : 'Geen tijdslimiet'; + var ranked_str = ruleset.ranked + ? 'Gerangschikt' + : 'Niet gerangschikt'; + return <div + style={{ + position: 'relative', + height: 80, + overflow: 'visible', + zIndex: 1, + }} + > + <p + className='subtile nosel posabs' style={{ - position: 'relative', - height: 80, - overflow: 'visible', - zIndex: 1, + top: '50%', + left: 0, + transform: 'translateY(-50%)', }} > - <p - style={{ - opacity: .75, - fontStyle: 'italic', - userSelect: 'none', - position: 'absolute', - top: '50%', - left: 0, - transform: 'translateY(-50%)', - }} - > - {timelimit_str} - <br /> - {ranked_str} - </p> - <Button + {timelimit_str} + <br /> + {ranked_str} + </p> + <Button + style={{ + width: 150, + position: 'absolute', + top: '50%', + right: 0, + transform: 'translateY(-50%)', + }} + onclick={() => setEditGameRulesDialogVisible(true)} + > + <BuildOutlinedIcon style={{ fontSize: 48 }} /> + <span style={{ - width: 150, + fontWeight: 600, position: 'absolute', + right: 24, top: '50%', - right: 0, + width: 85, + verticalAlign: 'middle', + textAlign: 'center', transform: 'translateY(-50%)', + userSelect: 'none', }} - onclick={this.showEditGameRules} > - <BuildOutlinedIcon style={{ fontSize: 48 }} /> - <span - style={{ - fontWeight: 600, - position: 'absolute', - right: 24, - top: '50%', - width: 85, - verticalAlign: 'middle', - textAlign: 'center', - transform: 'translateY(-50%)', - userSelect: 'none', - }} - > - Spelregels aanpassen - </span> - </Button> - <EditGameSettings - parentState={this.state} - hideEditGameRules={this.hideEditGameRules} - setGameRules={this.setGameRules} - /> - </div>; - } + Spelregels aanpassen + </span> + </Button> + <EditGameSettings + hideEditGameRules={() => setEditGameRulesDialogVisible(false)} + setGameRules={setRuleset} + ruleset={ruleset} + visible={editGameRulesDialogVisible} + /> + </div>; } function GameSettingsSection(props: { @@ -168,120 +155,116 @@ function GameRule(props: { } type editGameSettingsProps = { - parentState: CurrentGameSettingsStateType; + visible: boolean; + ruleset: ruleset; hideEditGameRules: () => void; setGameRules: (newRules: ruleset) => void; }; -export class EditGameSettings extends Component<editGameSettingsProps> { - render() { - return <DialogBox - title='Spelregels aanpassen' +export function EditGameSettings(props: editGameSettingsProps) { + return <DialogBox + title='Spelregels aanpassen' + hidden={!props.visible} + onclick={props.hideEditGameRules} + > + <div style={{ - margin: 0, - display: this.props.parentState.editGameRulesDialogVisible ? 'block' : 'none', + marginTop: 24, + maxHeight: 500, + overflowY: 'scroll', + borderRadius: 8, }} - onclick={this.props.hideEditGameRules} > - <div - style={{ - marginTop: 24, - maxHeight: 500, - overflowY: 'scroll', - borderRadius: 8, - }} + <GameSettingsSection + title='Tijdslimiet' + state={props.ruleset.timelimit.enabled} + id='timelimit' > - <GameSettingsSection - title='Tijdslimiet' - state={this.props.parentState.ruleset.timelimit.enabled} - id='timelimit' + <div + style={{ + display: 'grid', + gridTemplateColumns: '1fr 1fr 1fr', + gridGap: 16, + margin: '16px 0', + }} > - <div - style={{ - display: 'grid', - gridTemplateColumns: '1fr 1fr 1fr', - gridGap: 16, - margin: '16px 0', - }} - > - <Input - id='timelimit_minutes' - type='number' - label='min' - min={0} - max={60} - value={this.props.parentState.ruleset.timelimit.minutes} - /> - <Input - id='timelimit_seconds' - type='number' - label='sec' - min={0} - max={60} - value={this.props.parentState.ruleset.timelimit.seconds} - /> - <Input - id='timelimit_addmove' - type='number' - label='plus' - min={0} - value={this.props.parentState.ruleset.timelimit.addmove} - /> - </div> - <CheckBox id='timelimit_shared' state={this.props.parentState.ruleset.timelimit.shared} /> - <span - style={{ - verticalAlign: 'super', - marginLeft: 4, - }} - > - Timer gebruiken voor bijde spelers - </span> - </GameSettingsSection> - {false && <GameSettingsSection title='Regelset' state={false}> - <div - style={{ - display: 'grid', - gridTemplateColumns: '1fr 1fr', - gridGap: 16, - margin: '16px 0', - }} - > - <GameRule title='+2' description='Extra kolommen' /> - <GameRule title='+4' description='Extra kolommen' /> - </div> - <GameRule style={{ marginBottom: 16 }} title='Gravity' description='De zwaartekracht draait soms' /> - <GameRule title='Flashlight' description='Het veld wordt opgelicht door de vallende fiches' /> - </GameSettingsSection>} - <GameSettingsSection - title='Gerangschikt spel' - state={this.props.parentState.ruleset.ranked} - id='ranked' - noMarginBottom - /> - </div> - <Button - style={{ - textAlign: 'center', - marginTop: 24, - }} - onclick={() => { - var rules: ruleset = { - timelimit: { - enabled: document.getElementById('timelimit_enabled').classList.contains('on'), - minutes: Number((document.getElementById('timelimit_minutes') as HTMLInputElement).value), - seconds: Number((document.getElementById('timelimit_seconds') as HTMLInputElement).value), - addmove: Number((document.getElementById('timelimit_addmove') as HTMLInputElement).value), - shared: document.getElementById('timelimit_shared').classList.contains('on'), - }, - ranked: document.getElementById('ranked_enabled').classList.contains('on'), - }; - this.props.setGameRules(rules); - this.props.hideEditGameRules(); - }} - > - Instellingen opslaan - </Button> - </DialogBox>; - } + <Input + id='timelimit_minutes' + type='number' + label='min' + min={0} + max={60} + value={props.ruleset.timelimit.minutes} + /> + <Input + id='timelimit_seconds' + type='number' + label='sec' + min={0} + max={60} + value={props.ruleset.timelimit.seconds} + /> + <Input + id='timelimit_addmove' + type='number' + label='plus' + min={0} + value={props.ruleset.timelimit.addmove} + /> + </div> + <CheckBox id='timelimit_shared' state={props.ruleset.timelimit.shared} /> + <span + style={{ + verticalAlign: 'super', + marginLeft: 4, + }} + > + Timer gebruiken voor bijde spelers + </span> + </GameSettingsSection> + {false && <GameSettingsSection title='Regelset' state={false}> + <div + style={{ + display: 'grid', + gridTemplateColumns: '1fr 1fr', + gridGap: 16, + margin: '16px 0', + }} + > + <GameRule title='+2' description='Extra kolommen' /> + <GameRule title='+4' description='Extra kolommen' /> + </div> + <GameRule style={{ marginBottom: 16 }} title='Gravity' description='De zwaartekracht draait soms' /> + <GameRule title='Flashlight' description='Het veld wordt opgelicht door de vallende fiches' /> + </GameSettingsSection>} + <GameSettingsSection + title='Gerangschikt spel' + state={props.ruleset.ranked} + id='ranked' + noMarginBottom + /> + </div> + <Button + style={{ + textAlign: 'center', + marginTop: 24, + }} + onclick={() => { + var rules: ruleset = { + timelimit: { + enabled: document.getElementById('timelimit_enabled').classList.contains('on'), + minutes: Number((document.getElementById('timelimit_minutes') as HTMLInputElement).value), + seconds: Number((document.getElementById('timelimit_seconds') as HTMLInputElement).value), + addmove: Number((document.getElementById('timelimit_addmove') as HTMLInputElement).value), + shared: document.getElementById('timelimit_shared').classList.contains('on'), + }, + ranked: document.getElementById('ranked_enabled').classList.contains('on'), + }; + props.setGameRules(rules); + props.hideEditGameRules(); + }} + > + Instellingen opslaan + </Button> + </DialogBox>; } diff --git a/styles/ui.css b/styles/ui.css index b8cd44c..efc96b7 100644 --- a/styles/ui.css +++ b/styles/ui.css @@ -65,3 +65,8 @@ bottom: -12px; transform: translate(-50%, 0%) rotate(0deg); } + +.dialogbox { + width: 392px; +} + diff --git a/styles/utility.css b/styles/utility.css index f8954cd..0393d1d 100644 --- a/styles/utility.css +++ b/styles/utility.css @@ -17,6 +17,7 @@ .posabs { position: absolute; } .posrel { position: relative; } +.posfix { position: fixed; } .t0 { top: 0; } .b0 { bottom: 0; } @@ -61,3 +62,9 @@ text-overflow: ellipsis; } +.abscenter { + top: 51%; + left: 50%; + transform: translate(-50%, -50%); +} + |