From 4d3113dc9958aa6a9f5670194ecb7fd9659bd42a Mon Sep 17 00:00:00 2001 From: sschwei1 <24sebastian05@gmail.com> Date: Mon, 24 Oct 2022 15:52:23 +0200 Subject: [PATCH] Add basic button control (no functionality) --- package-lock.json | 17 +++++++++++- package.json | 3 ++- src/components/button/ButtonGroup.tsx | 35 ++++++++++++++++++++++++ src/components/button/index.tsx | 2 ++ src/components/game/Cell.tsx | 4 +-- src/components/game/ControlPanel.tsx | 38 +++++++++++++++++++++++++++ src/components/game/Game.tsx | 7 +++++ src/styles/colors.less | 2 +- src/styles/game.less | 16 ++++++++--- src/styles/main.less | 10 +++++++ 10 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 src/components/button/ButtonGroup.tsx create mode 100644 src/components/button/index.tsx create mode 100644 src/components/game/ControlPanel.tsx diff --git a/package-lock.json b/package-lock.json index 1e71840..1955f9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "classnames": "^2.3.2", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-icons": "^4.6.0" }, "devDependencies": { "@types/react": "^18.0.17", @@ -1455,6 +1456,14 @@ "react": "^18.2.0" } }, + "node_modules/react-icons": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", + "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -2620,6 +2629,12 @@ "scheduler": "^0.23.0" } }, + "react-icons": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", + "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", + "requires": {} + }, "react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", diff --git a/package.json b/package.json index 033f3b4..8e769b6 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "dependencies": { "classnames": "^2.3.2", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-icons": "^4.6.0" }, "devDependencies": { "@types/react": "^18.0.17", diff --git a/src/components/button/ButtonGroup.tsx b/src/components/button/ButtonGroup.tsx new file mode 100644 index 0000000..bfd8e70 --- /dev/null +++ b/src/components/button/ButtonGroup.tsx @@ -0,0 +1,35 @@ +import React, {CSSProperties} from 'react'; + +interface ButtonGroupProps { + buttons: ButtonDefinition[]; + buttonStyleProps: CSSProperties; +} + +export interface ButtonDefinition { + text: string|JSX.Element; + onClick: React.MouseEventHandler; + cssProps: CSSProperties; +} + +const ButtonGroup = ({buttons, buttonStyleProps}: ButtonGroupProps) => { + return ( +
+ { + buttons.map(((btn, index) => ( + + ))) + } +
+ ); +} + +export default ButtonGroup; \ No newline at end of file diff --git a/src/components/button/index.tsx b/src/components/button/index.tsx new file mode 100644 index 0000000..bdbd978 --- /dev/null +++ b/src/components/button/index.tsx @@ -0,0 +1,2 @@ +export {default as ButtonGroup} from './ButtonGroup'; +export type { ButtonDefinition } from './ButtonGroup'; diff --git a/src/components/game/Cell.tsx b/src/components/game/Cell.tsx index 579cb62..2b812e3 100644 --- a/src/components/game/Cell.tsx +++ b/src/components/game/Cell.tsx @@ -33,9 +33,9 @@ const Cell = ({value, position, updateCell}: CellProps) => { return (
) } diff --git a/src/components/game/ControlPanel.tsx b/src/components/game/ControlPanel.tsx new file mode 100644 index 0000000..aead576 --- /dev/null +++ b/src/components/game/ControlPanel.tsx @@ -0,0 +1,38 @@ +import {ButtonDefinition, ButtonGroup} from '../button'; +import {AiOutlineClear, BsFillPlayFill, BsFillStopFill, CiSettings, TbArrowsRandom} from 'react-icons/all'; +import React, {useMemo} from 'react'; + +interface ControlPanelProps { + handleStart: React.MouseEventHandler; + handleStop: React.MouseEventHandler; + handleRandomFill: React.MouseEventHandler; + handleClear: React.MouseEventHandler; +} + +const ControlPanel = ({ + handleStart, + handleStop, + handleRandomFill, + handleClear +}: ControlPanelProps) => { + const controlButtons: ButtonDefinition[] = useMemo(() => [ + {text: , onClick: handleStart, cssProps: {}}, + {text: , onClick: handleStop, cssProps: {}}, + {text: , onClick: handleRandomFill, cssProps: {}}, + {text: , onClick: handleClear, cssProps: {}} + ], [handleStart, handleStop, handleRandomFill, handleClear]); + + return ( +
+ + +
+ ); +} + +export default ControlPanel; \ No newline at end of file diff --git a/src/components/game/Game.tsx b/src/components/game/Game.tsx index b6d730c..4e2b48f 100644 --- a/src/components/game/Game.tsx +++ b/src/components/game/Game.tsx @@ -2,6 +2,7 @@ import CellContainer from './CellContainer'; import {useCallback, useEffect, useState} from 'react'; import '../../styles/game.less'; +import ControlPanel from './ControlPanel'; interface GameProps { @@ -41,6 +42,12 @@ const Game = ({}: GameProps) => { return (
+ {}} + handleStop={() => {}} + handleRandomFill={() => {}} + handleClear={() => {}} + />