diff --git a/README.md b/README.md index fd881bf9b..0d5db9eed 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,13 @@ This project includes a `src/components` folder containing several React compone ### Task 1: Project Set Up -- [ ] Create a forked copy of this project. -- [ ] Clone your OWN fork of the repository using your terminal. -- [ ] CD into the project base directory. -- [ ] Download project dependencies by running `npm install`. -- [ ] Start up the app using `npm start`. -- [ ] Optionally run tests using `npm test`. (The app must be running on `http://localhost:1234`) -- [ ] Push commits: `git push origin main`. +- [X] Create a forked copy of this project. +- [X] Clone your OWN fork of the repository using your terminal. +- [X] CD into the project base directory. +- [X] Download project dependencies by running `npm install`. +- [X] Start up the app using `npm start`. +- [X] Optionally run tests using `npm test`. (The app must be running on `http://localhost:1234`) +- [X] Push commits: `git push origin main`. ### Task 2a: Minimum Viable Product @@ -62,4 +62,4 @@ The move by the computer should probably be random if the previous checks turn o ## Submission Format -- [ ] Submit a link to your repo in canvas. +- [X] Submit a link to your repo in canvas. diff --git a/package-lock.json b/package-lock.json index 2320ed32b..511c24b5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "react-stateful-widgets", "version": "0.0.1", "license": "ISC", "dependencies": { diff --git a/src/components/Counter.js b/src/components/Counter.js index 447a5e849..fc1f74dc5 100644 --- a/src/components/Counter.js +++ b/src/components/Counter.js @@ -1,3 +1,4 @@ + /* COUNTER Instructions @@ -46,38 +47,49 @@ STEP 6: This click handler needs to use 'setCount' to set the 'count' to be zero again. */ -import React from 'react'; /* STEP 0 */ + +import React, { useState } from 'react'; /* STEP 0 */ + + + export default function Counter() { /* STEP 1 */ + const [count, setCount] = useState(0) const increment = () => { + + setCount(count + 1); /* STEP 4 */ }; const decrement = () => { + setCount(count - 1); /* STEP 5 */ }; const reset = () => { + setCount(0); /* STEP 6 */ }; const style = { fontSize: '1.5em', marginBottom: '0.3em', - color: 'royalblue', /* STEP 2 */ + color: count % 2 === 0 ? 'royalblue': 'crimson' /* STEP 2 */ }; return (

Counter

- Number 0 is even {/* STEP 3 */} + Number { count } is { count % 2 === 0 ? 'even' : 'odd' } {/* STEP 3 */}
- - - + + +
); -} + + } + \ No newline at end of file diff --git a/src/components/Input.js b/src/components/Input.js index 36bf8fe03..e93651d5e 100644 --- a/src/components/Input.js +++ b/src/components/Input.js @@ -34,34 +34,36 @@ STEP 6: We need to add an extra prop to the element like so: value={inputValue} */ -import React from 'react'; /* STEP 0 */ +import React, { useState } from 'react'; /* STEP 0 */ export default function Input() { /* STEP 1 */ + const [inputValue, setInputValue] = useState(''); const changeInput = evt => { // When the input changes, its whole value can be found inside the event object. // Log out the synthetic event object 'evt' and see for yourself. const { value } = evt.target; - + setInputValue(value); /* STEP 4 */ }; const reset = () => { /* STEP 5 */ + setInputValue(''); }; const style = { fontSize: '1.5em', marginBottom: '0.3em', - color: 'royalblue', /* STEP 2 */ + color: inputValue.length > 10 ? 'crimson' : 'royalblue', /* STEP 2 */ }; return (

Input

-
{/* STEP 3 */} +
{inputValue.toUpperCase()}
{/* STEP 3 */}
- {/* STEP 6 */} + {/* STEP 6 */}
diff --git a/src/components/Moods.js b/src/components/Moods.js index 98b49467f..290ea75cb 100644 --- a/src/components/Moods.js +++ b/src/components/Moods.js @@ -28,7 +28,7 @@ STEPS 4, 5, 6: Inside these click handlers set the correct mood, using 'setMood' and the variables below the imports. */ -import React from 'react'; /* STEP 0 */ +import React, { useState } from 'react'; /* STEP 0 */ const initialMood = 'Not sure how I feel'; const happyMood = 'Quite happy!'; @@ -36,27 +36,31 @@ const sadMood = 'Rather sad'; export default function Moods() { /* STEP 1 */ + const [mood, setMood] = useState(happyMood); const makeHappy = () => { /* STEP 4 */ + setMood(happyMood); }; const makeSad = () => { /* STEP 5 */ + setMood(sadMood); }; const reset = () => { /* STEP 6 */ + setMood(initialMood); }; const style = { fontSize: '1.5em', marginBottom: '0.3em', - color: 'crimson', /* STEP 2 */ + color: mood === happyMood ? 'royalblue' : 'crimson', /* STEP 2 */ }; return (

Moods

-
Not sure how I feel
{/* STEP 3 */} +
{ mood }
{/* STEP 3 */}
diff --git a/src/components/Spinner.js b/src/components/Spinner.js index d0326fd34..0c3992a12 100644 --- a/src/components/Spinner.js +++ b/src/components/Spinner.js @@ -37,23 +37,26 @@ STEP 4: Do you remember the operator we use to do "not"? */ -import React from 'react'; /* STEP 0 */ +import React, { useState } from 'react'; /* STEP 0 */ export default function Spinner() { /* STEP 1 */ + const [spinnerOn, setSpinnerOn] = useState(true); const toggleSpinner = () => { - /* STEP 4 */ + /* STEP 4 */ + setSpinnerOn(!spinnerOn); + }; return (

Spinner

{ - true &&
--+--
/* STEP 2 */ + spinnerOn &&
--+--
/* STEP 2 */ }
); diff --git a/src/components/Squares.js b/src/components/Squares.js index 25ab72546..6797b8952 100644 --- a/src/components/Squares.js +++ b/src/components/Squares.js @@ -14,7 +14,7 @@ Only one square (or none) can be active at any given point. Find comments below to help you along. */ -import React from 'react'; +import React, { useState } from 'react'; // Use this variable ONLY to initialize a slice of state! const listOfSquareIds = ['sqA', 'sqB', 'sqC', 'sqD']; @@ -24,13 +24,15 @@ export default function Squares() { // 'activeSquare'. One holds the _array_ of square ids, and the other keeps track // of the currently active square. On page load there's no active square, // so the value of 'activeSquare' should be null. + const [squares, setSquares] = useState(listOfSquareIds); + const [activeSquare, setActiveSquare] = useState(null); const getClassName = id => { // This is NOT a click handler but a helper, used inside the JSX (see below). // It should return a string containing the class name of 'active', if the id passed // as the argument matches the active square in state, empty string otherwise. // Right-click and "inspect element" on the square to see its effect. - return '' + return id === activeSquare ? 'active' : ''; }; const markActive = id => { @@ -38,6 +40,9 @@ export default function Squares() { // Set the id argument to become the active id in state // (unless it already is, in which case we should reset // the currently active square id back to initial state). + if (id === activeSquare){ + setActiveSquare(null); + }else {setActiveSquare(id)} }; return ( @@ -48,7 +53,7 @@ export default function Squares() { // Nasty bug! We should map over a slice of state, instead of 'listOfSquareIds'. // We might say: "it works, though!" But if the list of squares is not state, // we could never add squares, change squares or remove squares in the future. Fix! - listOfSquareIds.map(id => + squares.map(id =>