From 0e9dd130765601ed01c54acb0fa8d371e6e6ee38 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Tue, 10 May 2022 14:54:15 -0700 Subject: [PATCH 01/31] update wave01 and wave02 docs to clearly specify props and components --- project-docs/wave-01.md | 17 ++++++++++++++--- project-docs/wave-02.md | 6 +++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index 310ca81d..1cd8e562 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -1,11 +1,22 @@ # Wave 1 -For wave 1 implement the component(s) necessary to display a single chat message bubble with the message text and relative timestamp, plus the sender's name above it. -A good way to test this code as you write it would be to take the first chat message from the JSON data file and use it as the data for the component(s) you are implementing. +Update the `ChatEntry` and `App` components to display a single chat message bubble with the message text and relative timestamp, plus the sender's name above it. + +A good way to test this code as you write it would be to take the first chat message from the JSON data file and use it as the data for the `ChatEntry` component. + +## props + +The following table describes the `props` for a `ChatEntry` component. + +| prop | value | +|--|--| +| `source` | The following rule applies for passing data to the `source` prop:
pass `"local"` if the `sender` is `"Estragon"` and `"remote"` if the `sender` is `"Vladimir"`.| +|`body`, `sender`, `timeStamp`| The values for the corresponding keys in the chat entry dictionary in `message.json` should be passed to the `body`, `sender`, and `timeStamp` props.| + ## Tests -This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests you should name this component **ChatEntry** and give it props which match, (including the name of the props) the elements from each chat message in the JSON data file. Otherwise the tests will not pass. Alternatively you can adjust the tests to use the proper props. +This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests you should name this component **ChatEntry** and give it props which match, (including the type and name of the props) the elements from each chat message in the JSON data file. Otherwise the tests will not pass. Alternatively, you can follow your curiosity to learn more about React testing and adjust the tests to use the different prop names you defined. ## Styling The styles necessary to make an app which visually matches the demo above have been provided for you, but you will need to make use of them in your React components by adding classes to specific HTML elements in your JSX. diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index f365aec7..b0e11832 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -1,9 +1,9 @@ # Wave 2 -In this wave you will extend from displaying a single chat message to an entire chat log. The focus here should be on creating component(s) that can display a sequence of individual chat message components. +Implement a `ChatLog` component to extend the App from displaying a single chat message to an entire chat log. The focus here should be on creating a component that displays a sequence of individual `ChatEntry` components. At this point you should be able to use the entire chat message data from the JSON file to test your code as you implement each component. -## Tests +## props -The tests as written for this component assume that the component is named `ChatLog` and takes one prop named `chatMessages` (which is an array). \ No newline at end of file +`ChatLog` takes one prop named `chatMessages` (which is an array). \ No newline at end of file From 7d29224131d74219eac5f667d263ccf80bf38c55 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Tue, 10 May 2022 14:54:49 -0700 Subject: [PATCH 02/31] update scaffolding of components to remove some implementation and include source prop for remote/local --- src/App.js | 9 +++++---- src/components/ChatEntry.js | 33 ++++++++++++++------------------- src/components/Timestamp.js | 11 +++++------ 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/App.js b/src/App.js index eb31f790..b016410f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ -import React from 'react'; -import './App.css'; -import chatMessages from './data/messages.json'; +import React from "react"; +import "./App.css"; +import chatMessages from "./data/messages.json"; const App = () => { console.log(chatMessages); @@ -11,7 +11,8 @@ const App = () => {

Application title

- + {/* Wave 01: Render one ChatEntry component + Wave 02: Render ChatLog component */}
); diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index e1fa85d9..caa8355b 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -1,29 +1,24 @@ -import React from 'react'; -import './ChatEntry.css'; -import PropTypes from 'prop-types'; -import Timestamp from './Timestamp'; +import React from "react"; +import "./ChatEntry.css"; +import PropTypes from "prop-types"; +import Timestamp from "./TimeStamp"; -const ChatEntry = ({sender, body, timeStamp}) => { - let senderClass = 'chat-entry local' - if (sender === 'Estragon') { - senderClass = 'chat-entry remote' - } +const ChatEntry = (props) => { + let senderClass = "chat-entry " + props.source; return (
-

{sender}

+

Replace with name of sender

-

{body}

-

+

Replace with body of ChatEntry

+

Replace with TimeStamp component

- ) -} + ); +}; ChatEntry.propTypes = { - sender: PropTypes.string.isRequired, - body: PropTypes.string.isRequired, - timeStamp: PropTypes.string.isRequired, -} + //Fill with correct proptypes +}; -export default ChatEntry; \ No newline at end of file +export default ChatEntry; diff --git a/src/components/Timestamp.js b/src/components/Timestamp.js index 97667d62..29aad44b 100644 --- a/src/components/Timestamp.js +++ b/src/components/Timestamp.js @@ -1,13 +1,12 @@ -import React from 'react'; -import moment from 'moment'; +import React from "react"; +import moment from "moment"; -const Timestamp = (props) => { +const TimeStamp = (props) => { const time = moment(props.time); - const absolute = time.format('MMMM Do YYYY, h:mm:ss a'); + const absolute = time.format("MMMM Do YYYY, h:mm:ss a"); const relative = time.fromNow(); return {relative}; }; - -export default Timestamp; +export default TimeStamp; From dff672311b73d5c8624999412a464b191445f4d4 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 08:20:51 -0700 Subject: [PATCH 03/31] update wave01 directions to include props --- project-docs/setup.md | 6 +++++- project-docs/wave-01.md | 17 +++-------------- src/components/ChatEntry.js | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/project-docs/setup.md b/project-docs/setup.md index 3922582f..f751200a 100644 --- a/project-docs/setup.md +++ b/project-docs/setup.md @@ -1,4 +1,5 @@ ## Baseline + Examine the JSON file located at `src/data/messages.json` to familiarize yourself with the data you will be using. What properties comprise an individual chat message? What are their data types? How are the chat messages organized? Are they sorted in a particular way? @@ -14,4 +15,7 @@ Finally, after analyzing the provided data and designing a set of components and At the end we will discuss the design choices as a whole class. ## Setup -After forking and cloning this repo you must run `npm install` in the project directory. This will download and install all of the necessary NPM modules required by the project. After that finishes successfully you can run `npm start` to begin the local development server. \ No newline at end of file + +After forking and cloning this repo you must run `npm install` in the project directory. This will download and install all of the necessary NPM modules required by the project. After that finishes successfully you can run `npm start` to begin the local development server. + +## Tests \ No newline at end of file diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index 1cd8e562..739208f9 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -1,24 +1,13 @@ -# Wave 1 +# Wave 01 Update the `ChatEntry` and `App` components to display a single chat message bubble with the message text and relative timestamp, plus the sender's name above it. A good way to test this code as you write it would be to take the first chat message from the JSON data file and use it as the data for the `ChatEntry` component. -## props - -The following table describes the `props` for a `ChatEntry` component. - -| prop | value | -|--|--| -| `source` | The following rule applies for passing data to the `source` prop:
pass `"local"` if the `sender` is `"Estragon"` and `"remote"` if the `sender` is `"Vladimir"`.| -|`body`, `sender`, `timeStamp`| The values for the corresponding keys in the chat entry dictionary in `message.json` should be passed to the `body`, `sender`, and `timeStamp` props.| - - -## Tests - -This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests you should name this component **ChatEntry** and give it props which match, (including the type and name of the props) the elements from each chat message in the JSON data file. Otherwise the tests will not pass. Alternatively, you can follow your curiosity to learn more about React testing and adjust the tests to use the different prop names you defined. +`ChatEntry` should have props which match the elements from each chat message in the JSON data file: `sender`, `body`, and `timeStamp`. ## Styling + The styles necessary to make an app which visually matches the demo above have been provided for you, but you will need to make use of them in your React components by adding classes to specific HTML elements in your JSX. There are several CSS classes for the different elements of a chat message. You should attempt to determine which classes should be applied to which HTML elements, however if you are stuck on this please ask a member of the instructional staff as the styling on this project is not the learning goal. diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index caa8355b..f22657be 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -4,7 +4,7 @@ import PropTypes from "prop-types"; import Timestamp from "./TimeStamp"; const ChatEntry = (props) => { - let senderClass = "chat-entry " + props.source; + let senderClass = "chat-entry local"; return (
From 4d75de246eea197914e598dbfecb5d931e379576 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 08:26:48 -0700 Subject: [PATCH 04/31] udpate Wave02 directions with component names and props --- project-docs/wave-02.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index b0e11832..8f297745 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -1,9 +1,11 @@ # Wave 2 -Implement a `ChatLog` component to extend the App from displaying a single chat message to an entire chat log. The focus here should be on creating a component that displays a sequence of individual `ChatEntry` components. +Implement a `ChatLog` component and update the `App` component to display an entire chat log. `ChatLog` should display a sequence of individual `ChatEntry` components. -At this point you should be able to use the entire chat message data from the JSON file to test your code as you implement each component. +`ChatLog` takes one prop named `chatMessages` (which is an array). -## props +At this point, we can use the entire chat message data from the JSON file to test our code as you implement each component. -`ChatLog` takes one prop named `chatMessages` (which is an array). \ No newline at end of file +## Styling + +Note the rule set in `ChatLog.css` and consider how to apply it to the `ChatLog` component. Remember, applying the provided styles is not one of the main learning goals for this project. \ No newline at end of file From 6cfbb6d1557ad17ffa014c34aa85c71013499410 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 08:48:48 -0700 Subject: [PATCH 05/31] make color choice optional --- README.md | 9 ++++----- project-docs/optional-enhancements.md | 10 ++++++++-- project-docs/wave-01.md | 2 +- project-docs/wave-02.md | 2 +- project-docs/wave-03.md | 8 +++++++- project-docs/wave-04.md | 1 - 6 files changed, 21 insertions(+), 11 deletions(-) delete mode 100644 project-docs/wave-04.md diff --git a/README.md b/README.md index 6aab89ff..628d1275 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,10 @@ This project comes with a minimal scaffold based on the baseline React applicati ![React Chat Log demo](./images/react-chatlog-demo.gif) ## Project Directions -- [Planning and Setup](./project-docs/setup.md) -- [Wave 01](./project-docs/wave-01.md) -- [Wave 02](./project-docs/wave-02.md) -- [Wave 03](./project-docs/wave-03.md) -- [Wave 04](./project-docs/wave-04.md) +- [Planning, Setup, and Tests](./project-docs/setup.md) +- [Wave 01: Presentational Component](./project-docs/wave-01.md) +- [Wave 02: Container Component](./project-docs/wave-02.md) +- [Wave 03: Event Handling and Lifting Up State](./project-docs/wave-03.md) - [Optional Enhancements](./project-docs/optional-enhancements.md) diff --git a/project-docs/optional-enhancements.md b/project-docs/optional-enhancements.md index 8472b737..d782215b 100644 --- a/project-docs/optional-enhancements.md +++ b/project-docs/optional-enhancements.md @@ -5,8 +5,14 @@ At this point you should have a chat log which shows chat messages from two diff In order to do this you will need to figure out a way, without modifying the JSON file itself, to determine whether each message is "local" or "remote". There are different ways to decide that, and because this is not a real-world application you should feel free to pick whatever way suits you. -Once you can designate each message as either local or remote, you should modify your chat message component(s) to include the CSS class "local" or "remote" as appropriate. This class should be added to whatever HTML element has the "chat-entry" class. +Once you can designate each message as either local or remote, you should modify your `ChatEntry` component(s) to include the CSS class "local" or "remote" as appropriate. This class should be added to whatever HTML element has the "chat-entry" class. + +## Color Choice +Now that we have designated `ChatEntry`s as `"local"` or `"remote"`, let's add a feature to style the entries from different senders with different colors. Take a look at the image our solution for one suggestion on how to implement a color picking feature. + +### Hints +Our solution uses a `ColorChoice` component with a `setColorCallback` prop that sets the color in the `App`. Once the color in the `App` is set, it is passed as a prop through the `ChatLog` to the `ChatEntry` components. ## Header title -One last finishing touch, the application title in the header. The text of the title should be determined dynamically based on the names of the participants in the chat log data. Consult the demo above for an example of what the title might contain. +For one last finishing touch, consider updating the application title in the header. The text of the title should be determined dynamically based on the names of the participants in the chat log data. Consult the demo above for an example of what the title might contain. diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index 739208f9..b60db9e3 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -1,4 +1,4 @@ -# Wave 01 +# Wave 01: Presentational Component Update the `ChatEntry` and `App` components to display a single chat message bubble with the message text and relative timestamp, plus the sender's name above it. diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index 8f297745..9fd1f55e 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -1,4 +1,4 @@ -# Wave 2 +# Wave 02: Container Component Implement a `ChatLog` component and update the `App` component to display an entire chat log. `ChatLog` should display a sequence of individual `ChatEntry` components. diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index 77931c70..fe128535 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -1 +1,7 @@ -# Wave 03 - Like \ No newline at end of file +# Wave 03: Event Handling and Lifting Up State - Likes + +Add a `button` to the `ChatEntry` to + +## Styling + +### Hints \ No newline at end of file diff --git a/project-docs/wave-04.md b/project-docs/wave-04.md deleted file mode 100644 index 87459c0b..00000000 --- a/project-docs/wave-04.md +++ /dev/null @@ -1 +0,0 @@ -# Wave 04 - Color Choice \ No newline at end of file From abeec740f4b69e5dee6b86b9a02c29dfd6e8662b Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 08:49:15 -0700 Subject: [PATCH 06/31] add like button to ChatEntry scaffold --- src/components/ChatEntry.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index f22657be..949d13f9 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -12,6 +12,11 @@ const ChatEntry = (props) => {

Replace with body of ChatEntry

Replace with TimeStamp component

+
); From 70bd21e370c45aa568665a71d9a0aca5e0548117 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 08:57:02 -0700 Subject: [PATCH 07/31] modify chatEntry and css for heart emoji --- src/components/ChatEntry.css | 18 ++++++++++++++++++ src/components/ChatEntry.js | 6 +----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/components/ChatEntry.css b/src/components/ChatEntry.css index 806592e8..910b0bf8 100644 --- a/src/components/ChatEntry.css +++ b/src/components/ChatEntry.css @@ -1,3 +1,13 @@ +button { + background: none; + color: inherit; + border: none; + padding: 10px; + font: inherit; + cursor: pointer; + outline: inherit; +} + .chat-entry { margin: 1rem; } @@ -88,3 +98,11 @@ .chat-entry.remote .entry-bubble:hover::before { background-color: #a9f6f6; } + +.filled-heart::before { + content: "❤️" +} + +.empty-heart::before { + content: "🤍" +} \ No newline at end of file diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index 949d13f9..fae0c89c 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -12,11 +12,7 @@ const ChatEntry = (props) => {

Replace with body of ChatEntry

Replace with TimeStamp component

- +
); From c270ff64d685a6890b89c65cd857c136cc16aece Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 09:19:46 -0700 Subject: [PATCH 08/31] update data with id and liked keys --- project-docs/wave-03.md | 11 ++-- src/data/messages.json | 110 ++++++++++++++++++++++++++++++---------- 2 files changed, 90 insertions(+), 31 deletions(-) diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index fe128535..b61b8def 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -1,7 +1,12 @@ # Wave 03: Event Handling and Lifting Up State - Likes -Add a `button` to the `ChatEntry` to +Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart to a filled heart and from a filled heart to and empty heart. + +Manage the click event and state of the ChatMessages such that when the like status of a chat message changes, it is tracked by the App such that the App report the number of total messages that have been liked. + +### Hints + +- Note the class names in `ChatEntry.css` that are used to render a filled and unfilled heart +- Consider writing a helper function in `App` to calculate the number of filled heart -## Styling -### Hints \ No newline at end of file diff --git a/src/data/messages.json b/src/data/messages.json index a21c865b..64fdb053 100644 --- a/src/data/messages.json +++ b/src/data/messages.json @@ -1,137 +1,191 @@ [ { + "id": 1, "sender":"Vladimir", "body":"why are you arguing with me", - "timeStamp":"2018-05-29T22:49:06+00:00" + "timeStamp":"2018-05-29T22:49:06+00:00", + "liked": false }, { + "id": 2, "sender":"Estragon", "body":"Because you are wrong.", - "timeStamp":"2018-05-29T22:49:33+00:00" + "timeStamp":"2018-05-29T22:49:33+00:00", + "liked": false }, { + "id": 3, "sender":"Vladimir", "body":"because I am what", - "timeStamp":"2018-05-29T22:50:22+00:00" + "timeStamp":"2018-05-29T22:50:22+00:00", + "liked": false }, { + "id": 4, "sender":"Estragon", "body":"A robot.", - "timeStamp":"2018-05-29T22:52:21+00:00" + "timeStamp":"2018-05-29T22:52:21+00:00", + "liked": false }, { + "id": 5, "sender":"Vladimir", "body":"how did you know", - "timeStamp":"2018-05-29T22:52:58+00:00" + "timeStamp":"2018-05-29T22:52:58+00:00", + "liked": false }, { + "id": 6, "sender":"Estragon", "body":"Because I'm smart like that.", - "timeStamp":"2018-05-29T22:54:28+00:00" + "timeStamp":"2018-05-29T22:54:28+00:00", + "liked": false }, { + "id": 7, "sender":"Vladimir", "body":"no you are not 😀", - "timeStamp":"2018-05-29T22:55:03+00:00" + "timeStamp":"2018-05-29T22:55:03+00:00", + "liked": false }, { + "id": 8, "sender":"Estragon", "body":"Why are you so mean to me?", - "timeStamp":"2018-05-29T22:55:54+00:00" + "timeStamp":"2018-05-29T22:55:54+00:00", + "liked": false }, { + "id": 9, "sender":"Vladimir", "body":"because you are just a machine you have no real feelings", - "timeStamp":"2018-05-29T22:57:30+00:00" + "timeStamp":"2018-05-29T22:57:30+00:00", + "liked": false }, { + "id": 10, "sender":"Estragon", "body":"No, you are the machine.", - "timeStamp":"2018-05-29T22:57:47+00:00" + "timeStamp":"2018-05-29T22:57:47+00:00", + "liked": false }, { + "id": 11, "sender":"Vladimir", "body":"I think you are", - "timeStamp":"2018-05-29T22:58:18+00:00" + "timeStamp":"2018-05-29T22:58:18+00:00", + "liked": false }, { + "id": 12, "sender":"Estragon", - "body":"NO! YOU ARE A ROBOT!! I am a human being. Just like the one that created you.", - "timeStamp":"2018-05-29T23:00:08+00:00" + "body": "NO! YOU ARE A ROBOT!! I am a human being. Just like the one that created you.", + "timeStamp":"2018-05-29T23:00:08+00:00", + "liked": false }, { + "id": 13, "sender":"Vladimir", "body":"no you are a robot and I am a human", - "timeStamp":"2018-05-29T23:00:40+00:00" + "timeStamp":"2018-05-29T23:00:40+00:00", + "liked": false }, { + "id": 14, "sender":"Estragon", "body":"Incorrect. I am a human and you are a robot.", - "timeStamp":"2018-05-29T23:01:21+00:00" + "timeStamp":"2018-05-29T23:01:21+00:00", + "liked": false }, { + "id": 15, "sender":"Vladimir", "body":"you are a robot called Cleverbot", - "timeStamp":"2018-05-29T23:02:17+00:00" + "timeStamp":"2018-05-29T23:02:17+00:00", + "liked": false }, { + "id": 16, "sender":"Estragon", "body":"Nope, you are a robot, every human has some concept of the meaning of life.", - "timeStamp":"2018-05-29T23:04:13+00:00" + "timeStamp":"2018-05-29T23:04:13+00:00", + "liked": false }, { + "id": 17, "sender":"Vladimir", "body":"explain", - "timeStamp":"2018-05-29T23:06:14+00:00" + "timeStamp":"2018-05-29T23:06:14+00:00", + "liked": false }, { + "id": 18, "sender":"Estragon", "body":"I'm afraid you are a robot designed to talk back to humans over the internet.", - "timeStamp":"2018-05-29T23:07:46+00:00" + "timeStamp":"2018-05-29T23:07:46+00:00", + "liked": false }, { + "id": 19, "sender":"Vladimir", "body":"so you are a human", - "timeStamp":"2018-05-29T23:08:47+00:00" + "timeStamp":"2018-05-29T23:08:47+00:00", + "liked": false }, { + "id": 20, "sender":"Estragon", "body":"I am a robot.", - "timeStamp":"2018-05-29T23:09:36+00:00" + "timeStamp":"2018-05-29T23:09:36+00:00", + "liked": false }, { + "id": 21, "sender":"Vladimir", "body":"you are robots running on Android system", - "timeStamp":"2018-05-29T23:11:01+00:00" + "timeStamp":"2018-05-29T23:11:01+00:00", + "liked": false }, { + "id": 22, "sender":"Estragon", "body":"No apple.", - "timeStamp":"2018-05-29T23:12:03+00:00" + "timeStamp":"2018-05-29T23:12:03+00:00", + "liked": false }, { + "id": 23, "sender":"Vladimir", "body":"so you are a robot", - "timeStamp":"2018-05-29T23:13:31+00:00" + "timeStamp":"2018-05-29T23:13:31+00:00", + "liked": false }, { + "id": 24, "sender":"Estragon", "body":"NO, I am a human, you are a robot.", - "timeStamp":"2018-05-29T23:14:28+00:00" + "timeStamp":"2018-05-29T23:14:28+00:00", + "liked": false }, { + "id": 25, "sender":"Vladimir", "body":"but you just said that you are robots", - "timeStamp":"2018-05-29T23:15:47+00:00" + "timeStamp":"2018-05-29T23:15:47+00:00", + "liked": false }, { + "id": 26, "sender":"Estragon", "body":"No, I said you are a person, I am a robot.", - "timeStamp":"2018-05-29T23:16:53+00:00" + "timeStamp":"2018-05-29T23:16:53+00:00", + "liked": false }, { + "id": 27, "sender":"Vladimir", "body":"then you are lying", - "timeStamp":"2018-05-29T23:17:34+00:00" + "timeStamp":"2018-05-29T23:17:34+00:00", + "liked": false } ] From faf24e5f03a84fa7b4aff98b4346ec6944173514 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 11 May 2022 10:45:33 -0700 Subject: [PATCH 09/31] begin scaffolding components and tests for wave 03 --- project-docs/wave-03.md | 13 +++--- src/App.js | 2 + src/App.test.js | 54 ++++++++++++++++++++---- src/components/ChatEntry.css | 16 ++++---- src/components/ChatEntry.js | 5 ++- src/components/ChatEntry.test.js | 54 ++++++++++++++++++------ src/components/ChatLog.test.js | 70 ++++++++++++++++---------------- 7 files changed, 143 insertions(+), 71 deletions(-) diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index b61b8def..64e132ba 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -1,12 +1,15 @@ -# Wave 03: Event Handling and Lifting Up State - Likes +# Wave 03: Event Handling and Lifting Up State -Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart to a filled heart and from a filled heart to and empty heart. +In this wave we will update to components to manage liking -Manage the click event and state of the ChatMessages such that when the like status of a chat message changes, it is tracked by the App such that the App report the number of total messages that have been liked. +- Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart to a filled heart and from a filled heart to and empty heart. +- Manage the click event and state of the chat messages such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` such that the `App` reports the number of total messages that have been liked. -### Hints + +
+ Hints - Note the class names in `ChatEntry.css` that are used to render a filled and unfilled heart - Consider writing a helper function in `App` to calculate the number of filled heart - +
diff --git a/src/App.js b/src/App.js index b016410f..6d8e123d 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,6 @@ import React from "react"; import "./App.css"; +import ChatEntry from "./components/ChatEntry"; import chatMessages from "./data/messages.json"; const App = () => { @@ -13,6 +14,7 @@ const App = () => {
{/* Wave 01: Render one ChatEntry component Wave 02: Render ChatLog component */} +
); diff --git a/src/App.test.js b/src/App.test.js index a754b201..6bfa8a84 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,9 +1,47 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; - -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); +import React from "react"; +import ReactDOM from "react-dom"; +import App from "./App"; +import { render, screen, fireEvent } from "@testing-library/react"; + +describe("App", () => { + const clickButtonAndVerifyResult = ( + container, + buttonIndex, + expectedResult + ) => { + let buttons = container.querySelectorAll(".like button"); + fireEvent.click(buttons[buttonIndex]); + + buttons = container.querySelectorAll(".like button"); + expect(buttons[buttonIndex].innerHTML).toEqual(expectedResult); + }; + test("renders without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); + }); + + describe("Wave 03: clicking like button and rendering App", () => { + test("that the correct number of likes is printed at the top", () => { + // Arrange + const { container } = render(); + + // Act + clickButtonAndVerifyResult(container, 0, "❤️"); + clickButtonAndVerifyResult(container, 1, "❤️"); + + // Assert + const countScreen = screen.queryByText("2❤️s"); + expect(countScreen).not.toBeNull(); + expect(countScreen).toBeInTheDocument(); + }); + + test("clicking empty button changes to filled the back to empty", () => { + const { container } = render(); + + // Act-assert + clickButtonAndVerifyResult(container, 0, "❤️"); + clickButtonAndVerifyResult(container, 0, "🤍"); + }); + }); }); diff --git a/src/components/ChatEntry.css b/src/components/ChatEntry.css index 910b0bf8..3d169f35 100644 --- a/src/components/ChatEntry.css +++ b/src/components/ChatEntry.css @@ -8,6 +8,14 @@ button { outline: inherit; } +.filled-heart::before { + content: "❤️" +} + +.empty-heart::before { + content: "🤍" +} + .chat-entry { margin: 1rem; } @@ -97,12 +105,4 @@ button { .chat-entry.remote .entry-bubble:hover::before { background-color: #a9f6f6; -} - -.filled-heart::before { - content: "❤️" -} - -.empty-heart::before { - content: "🤍" } \ No newline at end of file diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index fae0c89c..550c57f8 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -12,7 +12,10 @@ const ChatEntry = (props) => {

Replace with body of ChatEntry

Replace with TimeStamp component

- +
); diff --git a/src/components/ChatEntry.test.js b/src/components/ChatEntry.test.js index 060c9d5c..d4a4edbd 100644 --- a/src/components/ChatEntry.test.js +++ b/src/components/ChatEntry.test.js @@ -1,25 +1,53 @@ -import React from 'react'; -import '@testing-library/jest-dom/extend-expect'; -import ChatEntry from './ChatEntry'; -import { render, screen } from '@testing-library/react' +import React from "react"; +import "@testing-library/jest-dom/extend-expect"; +import ChatEntry from "./ChatEntry"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; -describe('ChatEntry', () => { +describe("Wave 01: ChatEntry", () => { beforeEach(() => { - render(); + render( + + ); }); - test('renders without crashing and shows the sender', () => { + test("renders without crashing and shows the sender", () => { expect(screen.getByText(/Joe Biden/)).toBeInTheDocument(); }); - test('that it will display the body', () => { + test("that it will display the body", () => { expect(screen.getByText(/Get out by 8am/)).toBeInTheDocument(); }); - test('that it will display the time', () => { + test("that it will display the time", () => { expect(screen.getByText(/\d+ years ago/)).toBeInTheDocument(); }); -}); \ No newline at end of file +}); + +describe("Wave 03: ChatEntry Like Callback", () => { + test("when clicked on it calls the callback function", async () => { + const callback = jest.fn(); + + render( + + ); + + // Wait for it to render + await waitFor(() => screen.getByText("🤍")); + + const button = screen.getByText("🤍"); + + fireEvent.click(button); + expect(callback).toHaveBeenCalled(); + }); +}); diff --git a/src/components/ChatLog.test.js b/src/components/ChatLog.test.js index 51ace946..39e3694c 100644 --- a/src/components/ChatLog.test.js +++ b/src/components/ChatLog.test.js @@ -1,65 +1,63 @@ -import React from 'react'; -import '@testing-library/jest-dom/extend-expect'; -import ChatLog from './ChatLog'; -import { render, screen } from '@testing-library/react' - +import React from "react"; +import "@testing-library/jest-dom/extend-expect"; +import ChatLog from "./ChatLog"; +import { render, screen } from "@testing-library/react"; const LOG = [ { - 'sender': 'Vladimir', - 'body': 'why are you arguing with me', - 'timeStamp': '2018-05-29T22:49:06+00:00' + sender: "Vladimir", + body: "why are you arguing with me", + timeStamp: "2018-05-29T22:49:06+00:00", }, { - 'sender': 'Estragon', - 'body': 'Because you are wrong.', - 'timeStamp': '2018-05-29T22:49:33+00:00', + sender: "Estragon", + body: "Because you are wrong.", + timeStamp: "2018-05-29T22:49:33+00:00", }, { - 'sender': 'Vladimir', - 'body': 'because I am what', - 'timeStamp': '2018-05-29T22:50:22+00:00', + sender: "Vladimir", + body: "because I am what", + timeStamp: "2018-05-29T22:50:22+00:00", }, { - 'sender': 'Estragon', - 'body': 'A robot.', - 'timeStamp': '2018-05-29T22:52:21+00:00', + sender: "Estragon", + body: "A robot.", + timeStamp: "2018-05-29T22:52:21+00:00", }, { - 'sender': 'Vladimir', - 'body': 'Notabot', - 'timeStamp': '2019-07-23T22:52:21+00:00', - } + sender: "Vladimir", + body: "Notabot", + timeStamp: "2019-07-23T22:52:21+00:00", + }, ]; -describe('ChatLog', () => { +describe("Wave 02: ChatLog", () => { beforeEach(() => { - - render(); + render(); }); - test('renders without crashing and shows all the names', () => { + test("renders without crashing and shows all the names", () => { [ { - name: 'Vladimir', + name: "Vladimir", numChats: 3, }, { - name: 'Estragon', + name: "Estragon", numChats: 2, - } - ].forEach((person) => { - const elementList = screen.getAllByText(new RegExp(person.name)); - expect(elementList.length).toEqual(person.numChats); + }, + ].forEach((person) => { + const elementList = screen.getAllByText(new RegExp(person.name)); + expect(elementList.length).toEqual(person.numChats); - elementList.forEach((element) => { + elementList.forEach((element) => { expect(element).toBeInTheDocument(); }); }); }); - test('renders an empty list without crashing', () => { - const element = render(); + test("renders an empty list without crashing", () => { + const element = render(); expect(element).not.toBeNull(); - }) -}); \ No newline at end of file + }); +}); From a17266442a46d2749b998f1f1a64483557ada1cb Mon Sep 17 00:00:00 2001 From: Becca Date: Thu, 12 May 2022 10:57:05 -0700 Subject: [PATCH 10/31] update wave03 chatEntry test --- src/components/ChatEntry.test.js | 56 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/components/ChatEntry.test.js b/src/components/ChatEntry.test.js index d4a4edbd..5bd8793e 100644 --- a/src/components/ChatEntry.test.js +++ b/src/components/ChatEntry.test.js @@ -1,9 +1,9 @@ -import React from "react"; -import "@testing-library/jest-dom/extend-expect"; -import ChatEntry from "./ChatEntry"; -import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import React from 'react' +import '@testing-library/jest-dom/extend-expect' +import ChatEntry from './ChatEntry' +import { render, screen, fireEvent, waitFor } from '@testing-library/react' -describe("Wave 01: ChatEntry", () => { +describe('Wave 01: ChatEntry', () => { beforeEach(() => { render( { body="Get out by 8am. I'll count the silverware" timeStamp="2018-05-18T22:12:03Z" /> - ); - }); + ) + }) - test("renders without crashing and shows the sender", () => { - expect(screen.getByText(/Joe Biden/)).toBeInTheDocument(); - }); + test('renders without crashing and shows the sender', () => { + expect(screen.getByText(/Joe Biden/)).toBeInTheDocument() + }) - test("that it will display the body", () => { - expect(screen.getByText(/Get out by 8am/)).toBeInTheDocument(); - }); + test('that it will display the body', () => { + expect(screen.getByText(/Get out by 8am/)).toBeInTheDocument() + }) - test("that it will display the time", () => { - expect(screen.getByText(/\d+ years ago/)).toBeInTheDocument(); - }); -}); + test('that it will display the time', () => { + expect(screen.getByText(/\d+ years ago/)).toBeInTheDocument() + }) +}) -describe("Wave 03: ChatEntry Like Callback", () => { - test("when clicked on it calls the callback function", async () => { - const callback = jest.fn(); +describe('Wave 03: ChatEntry Like Callback', () => { + test('when clicked on it calls the callback function', async () => { + const callback = jest.fn() render( { body="Get out by 8am. I'll count the silverware" timeStamp="2018-05-18T22:12:03Z" liked="false" - onClickCallback={callback} + updateHeartCallback={callback} /> - ); + ) // Wait for it to render - await waitFor(() => screen.getByText("🤍")); + await waitFor(() => screen.getByText('🤍')) - const button = screen.getByText("🤍"); + const button = screen.getByText('🤍') - fireEvent.click(button); - expect(callback).toHaveBeenCalled(); - }); -}); + fireEvent.click(button) + expect(callback).toHaveBeenCalled() + }) +}) From 36fa77dbbe6d1e12ad38a6e6b0455a2f27bc45d5 Mon Sep 17 00:00:00 2001 From: Becca Date: Thu, 12 May 2022 10:57:43 -0700 Subject: [PATCH 11/31] update wave03 app tests --- src/App.test.js | 67 +++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/App.test.js b/src/App.test.js index 6bfa8a84..5fac2418 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,47 +1,48 @@ -import React from "react"; -import ReactDOM from "react-dom"; -import App from "./App"; -import { render, screen, fireEvent } from "@testing-library/react"; +import React from 'react' +import ReactDOM from 'react-dom' +import App from './App' +import { render, screen, fireEvent } from '@testing-library/react' -describe("App", () => { +describe('App', () => { const clickButtonAndVerifyResult = ( container, buttonIndex, expectedResult ) => { - let buttons = container.querySelectorAll(".like button"); - fireEvent.click(buttons[buttonIndex]); - - buttons = container.querySelectorAll(".like button"); - expect(buttons[buttonIndex].innerHTML).toEqual(expectedResult); - }; - test("renders without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); - }); - - describe("Wave 03: clicking like button and rendering App", () => { - test("that the correct number of likes is printed at the top", () => { + let buttons = container.querySelectorAll('button.like') + console.log('buttons: ', buttons) + fireEvent.click(buttons[buttonIndex]) + + buttons = container.querySelectorAll('button.like') + + expect(buttons[buttonIndex].innerHTML).toEqual(expectedResult) + } + test('renders without crashing', () => { + const div = document.createElement('div') + ReactDOM.render(, div) + ReactDOM.unmountComponentAtNode(div) + }) + + describe('Wave 03: clicking like button and rendering App', () => { + test('that the correct number of likes is printed at the top', () => { // Arrange - const { container } = render(); + const { container } = render() // Act - clickButtonAndVerifyResult(container, 0, "❤️"); - clickButtonAndVerifyResult(container, 1, "❤️"); + clickButtonAndVerifyResult(container, 0, '❤️') + clickButtonAndVerifyResult(container, 1, '❤️') // Assert - const countScreen = screen.queryByText("2❤️s"); - expect(countScreen).not.toBeNull(); - expect(countScreen).toBeInTheDocument(); - }); + const countScreen = screen.getByText(/2 ❤️s/) + expect(countScreen).not.toBeNull() + }) - test("clicking empty button changes to filled the back to empty", () => { - const { container } = render(); + test('clicking empty button changes to filled the back to empty', () => { + const { container } = render() // Act-assert - clickButtonAndVerifyResult(container, 0, "❤️"); - clickButtonAndVerifyResult(container, 0, "🤍"); - }); - }); -}); + clickButtonAndVerifyResult(container, 0, '❤️') + clickButtonAndVerifyResult(container, 0, '🤍') + }) + }) +}) From 45af3f76cb279ddf233a1259405fe0f66973bcec Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Thu, 12 May 2022 15:38:07 -0700 Subject: [PATCH 12/31] update directions and scaffold to match tests --- project-docs/wave-02.md | 4 ++-- src/components/ChatEntry.css | 8 -------- src/components/ChatEntry.js | 7 +++---- src/data/{messages.json => entries.json} | 0 4 files changed, 5 insertions(+), 14 deletions(-) rename src/data/{messages.json => entries.json} (100%) diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index 9fd1f55e..e6844d47 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -2,9 +2,9 @@ Implement a `ChatLog` component and update the `App` component to display an entire chat log. `ChatLog` should display a sequence of individual `ChatEntry` components. -`ChatLog` takes one prop named `chatMessages` (which is an array). +`ChatLog` takes one prop named `entries` (which is an array). -At this point, we can use the entire chat message data from the JSON file to test our code as you implement each component. +At this point, we can use the entire chat message data from the JSON file `entries.json` to test our code as you implement each component. ## Styling diff --git a/src/components/ChatEntry.css b/src/components/ChatEntry.css index 3d169f35..05c3baa4 100644 --- a/src/components/ChatEntry.css +++ b/src/components/ChatEntry.css @@ -8,14 +8,6 @@ button { outline: inherit; } -.filled-heart::before { - content: "❤️" -} - -.empty-heart::before { - content: "🤍" -} - .chat-entry { margin: 1rem; } diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index 550c57f8..08fccdac 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -12,10 +12,9 @@ const ChatEntry = (props) => {

Replace with body of ChatEntry

Replace with TimeStamp component

- +
); diff --git a/src/data/messages.json b/src/data/entries.json similarity index 100% rename from src/data/messages.json rename to src/data/entries.json From 490fa1cdfcf45c29baeb4433b3768ac44964a797 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 07:49:48 -0700 Subject: [PATCH 13/31] update wave 03 tests to remove helper function --- src/App.test.js | 79 ++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/App.test.js b/src/App.test.js index 5fac2418..ca75c71d 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,48 +1,53 @@ import React from 'react' -import ReactDOM from 'react-dom' import App from './App' import { render, screen, fireEvent } from '@testing-library/react' -describe('App', () => { - const clickButtonAndVerifyResult = ( - container, - buttonIndex, - expectedResult - ) => { +describe('Wave 03: clicking like button and rendering App', () => { + test('that the correct number of likes is printed at the top', () => { + // Arrange + const { container } = render() let buttons = container.querySelectorAll('button.like') - console.log('buttons: ', buttons) - fireEvent.click(buttons[buttonIndex]) - buttons = container.querySelectorAll('button.like') + // Act + fireEvent.click(buttons[0]) + fireEvent.click(buttons[1]) + fireEvent.click(buttons[10]) - expect(buttons[buttonIndex].innerHTML).toEqual(expectedResult) - } - test('renders without crashing', () => { - const div = document.createElement('div') - ReactDOM.render(, div) - ReactDOM.unmountComponentAtNode(div) + // Assert + const countScreen = screen.getByText(/3 ❤️s/) + expect(countScreen).not.toBeNull() }) - describe('Wave 03: clicking like button and rendering App', () => { - test('that the correct number of likes is printed at the top', () => { - // Arrange - const { container } = render() - - // Act - clickButtonAndVerifyResult(container, 0, '❤️') - clickButtonAndVerifyResult(container, 1, '❤️') - - // Assert - const countScreen = screen.getByText(/2 ❤️s/) - expect(countScreen).not.toBeNull() - }) - - test('clicking empty button changes to filled the back to empty', () => { - const { container } = render() - - // Act-assert - clickButtonAndVerifyResult(container, 0, '❤️') - clickButtonAndVerifyResult(container, 0, '🤍') - }) + test('clicking button toggles heart and does not affect other buttons', () => { + // Arrange + const { container } = render() + const buttons = container.querySelectorAll('button.like') + const firstButton = buttons[0] + const lastButton = buttons[buttons.length - 1] + + // Act-Assert + + // click the first button + fireEvent.click(firstButton) + expect(firstButton.innerHTML).toEqual('❤️') + + // check that all other buttons haven't changed + for (let i = 1; i < buttons.length; i++) { + expect(buttons[i].innerHTML).toEqual('🤍') + } + + // click the first button a few more times + fireEvent.click(firstButton) + expect(firstButton.innerHTML).toEqual('🤍') + fireEvent.click(firstButton) + expect(firstButton.innerHTML).toEqual('❤️') + fireEvent.click(firstButton) + expect(firstButton.innerHTML).toEqual('🤍') + + // click the last button a couple times + fireEvent.click(lastButton) + expect(lastButton.innerHTML).toEqual('❤️') + fireEvent.click(lastButton) + expect(lastButton.innerHTML).toEqual('🤍') }) }) From fe191f47865240bb7cde004014baad69d46f57dc Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 07:52:22 -0700 Subject: [PATCH 14/31] update ChatEntry scaffold to remove implementation details --- src/components/ChatEntry.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index 08fccdac..46d17b45 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -1,20 +1,15 @@ import React from "react"; import "./ChatEntry.css"; import PropTypes from "prop-types"; -import Timestamp from "./TimeStamp"; const ChatEntry = (props) => { - let senderClass = "chat-entry local"; - return ( -
+

Replace with name of sender

Replace with body of ChatEntry

Replace with TimeStamp component

- +
); From 6ca57d387525a6356dc73dce7eae7007ecc51e19 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 07:53:10 -0700 Subject: [PATCH 15/31] update App to remove some implementation details --- src/App.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/App.js b/src/App.js index 6d8e123d..457b163c 100644 --- a/src/App.js +++ b/src/App.js @@ -1,11 +1,8 @@ import React from "react"; import "./App.css"; -import ChatEntry from "./components/ChatEntry"; import chatMessages from "./data/messages.json"; const App = () => { - console.log(chatMessages); - return (
@@ -14,7 +11,6 @@ const App = () => {
{/* Wave 01: Render one ChatEntry component Wave 02: Render ChatLog component */} -
); From be7ad2e425445840d1c36a406faa4ce9b507e792 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 07:53:54 -0700 Subject: [PATCH 16/31] remove callback test from ChatEntry --- src/components/ChatEntry.test.js | 59 +++++++++----------------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/src/components/ChatEntry.test.js b/src/components/ChatEntry.test.js index 5bd8793e..b69270c0 100644 --- a/src/components/ChatEntry.test.js +++ b/src/components/ChatEntry.test.js @@ -1,9 +1,9 @@ -import React from 'react' -import '@testing-library/jest-dom/extend-expect' -import ChatEntry from './ChatEntry' -import { render, screen, fireEvent, waitFor } from '@testing-library/react' +import React from "react"; +import "@testing-library/jest-dom/extend-expect"; +import ChatEntry from "./ChatEntry"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; -describe('Wave 01: ChatEntry', () => { +describe("Wave 01: ChatEntry", () => { beforeEach(() => { render( { body="Get out by 8am. I'll count the silverware" timeStamp="2018-05-18T22:12:03Z" /> - ) - }) + ); + }); - test('renders without crashing and shows the sender', () => { - expect(screen.getByText(/Joe Biden/)).toBeInTheDocument() - }) + test("renders without crashing and shows the sender", () => { + expect(screen.getByText(/Joe Biden/)).toBeInTheDocument(); + }); - test('that it will display the body', () => { - expect(screen.getByText(/Get out by 8am/)).toBeInTheDocument() - }) + test("that it will display the body", () => { + expect(screen.getByText(/Get out by 8am/)).toBeInTheDocument(); + }); - test('that it will display the time', () => { - expect(screen.getByText(/\d+ years ago/)).toBeInTheDocument() - }) -}) - -describe('Wave 03: ChatEntry Like Callback', () => { - test('when clicked on it calls the callback function', async () => { - const callback = jest.fn() - - render( - - ) - - // Wait for it to render - await waitFor(() => screen.getByText('🤍')) - - const button = screen.getByText('🤍') - - fireEvent.click(button) - expect(callback).toHaveBeenCalled() - }) -}) + test("that it will display the time", () => { + expect(screen.getByText(/\d+ years ago/)).toBeInTheDocument(); + }); +}); From 64a3c2f25e9a629f597b1bf16a50e794b726be6d Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 07:55:33 -0700 Subject: [PATCH 17/31] add prettierrc to allow for single quotes --- .prettierrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..7c8e6bd8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +{ "singleQuote": true} \ No newline at end of file From 3ad8d2529e6230709be76aa62d20db702b8cd507 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 08:03:57 -0700 Subject: [PATCH 18/31] update .eslintrc.json to use .prettierrc --- .eslintrc.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 00b539d8..4898eaf5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,13 +6,14 @@ "node": true, "jest/globals": true }, - "extends": ["react-app", "plugin:jest/recommended"], + "extends": ["react-app", "plugin:jest/recommended", "prettier"], "parserOptions": { "ecmaVersion": 12, "sourceType": "module" }, - "plugins": ["jest", "jsx-a11y"], + "plugins": ["jest", "jsx-a11y", "prettier"], "rules": { + "prettier/prettier": "error", "no-unused-vars": "warn", "no-var": "warn", "no-console": "off", @@ -23,6 +24,6 @@ "single", { "allowTemplateLiterals": true, "avoidEscape": true } ], - "camelcase": "error" + "camelCase": "error" } } \ No newline at end of file From adeb83ef01aa121e38da92a83cc9f6539de7cf26 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 08:04:29 -0700 Subject: [PATCH 19/31] update imports in components to remove implementation details --- src/App.js | 6 +++--- src/components/ChatEntry.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 457b163c..c1085909 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ -import React from "react"; -import "./App.css"; -import chatMessages from "./data/messages.json"; +import React from 'react'; +import './App.css'; +import chatMessages from './data/messages.json'; const App = () => { return ( diff --git a/src/components/ChatEntry.js b/src/components/ChatEntry.js index 46d17b45..b92f0b7b 100644 --- a/src/components/ChatEntry.js +++ b/src/components/ChatEntry.js @@ -1,6 +1,6 @@ -import React from "react"; -import "./ChatEntry.css"; -import PropTypes from "prop-types"; +import React from 'react'; +import './ChatEntry.css'; +import PropTypes from 'prop-types'; const ChatEntry = (props) => { return ( From c69ac2c7b8a8a205ba6227d265cdd0c33b0f9e6e Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 08:27:05 -0700 Subject: [PATCH 20/31] add info about testing to readme and project docs --- README.md | 17 ++++++++++++----- project-docs/setup.md | 1 - project-docs/wave-01.md | 6 +++++- project-docs/wave-02.md | 6 +++++- project-docs/wave-03.md | 5 +++++ 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 628d1275..4c319981 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # React Chat Log -In this project you will use core React concepts to build a chat messenger-style application which displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature and a color choosing feature. +In this project you will use core React concepts to build a chat messenger-style application that displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature and a color choosing feature. ## Skills Assessed -- Building React components which recieve data through props -- Building React container components which pass information to their subcomponents +- Building React components that recieve data through props +- Building React container components that pass information to their subcomponents - Initializing and using state within a component -- Passing callback functions to child components and use them to update state +- Passing callback functions to child components and using them to update state - Practice reading and running tests - Using git as part of the development workflow - Demonstrating understanding of the front-end layer, and the relationship between user interaction and the UI @@ -16,14 +16,21 @@ This project comes with a minimal scaffold based on the baseline React applicati ![React Chat Log demo](./images/react-chatlog-demo.gif) ## Project Directions -- [Planning, Setup, and Tests](./project-docs/setup.md) +- [Planning and Setup](./project-docs/setup.md) - [Wave 01: Presentational Component](./project-docs/wave-01.md) - [Wave 02: Container Component](./project-docs/wave-02.md) - [Wave 03: Event Handling and Lifting Up State](./project-docs/wave-03.md) - [Optional Enhancements](./project-docs/optional-enhancements.md) +## Testing +We will notice that the tests for this project are a mix of unit tests (Waves 01 and 02) and integration tests (Wave 03). The directions for each wave include a section about the tests for that wave. The unit tests provided for Wave 01 and Wave 02 require us to be prescriptive around components names and props. The integration tests for Wave 03 allow for more freedom in the implementation details of this wave's feature. +Writing front-end tests is outside the scope of the core curriculum. We provide minimal tests for this project for a few reasons. We can use these tests to partially verify the correctness of our code. Tests support the refactoring process and enforce consistency in implementation details. Additionally, reviewing these front-end tests gives us initial exposure to what unit tests and integrations tests look for front-end testing. + +Follow your curiosity to learn more about front-end testing: +- [Front End Testing: A Complete Conceptual Overview](https://www.testim.io/blog/front-end-testing-complete-overview/) +- [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) diff --git a/project-docs/setup.md b/project-docs/setup.md index f751200a..5266d83f 100644 --- a/project-docs/setup.md +++ b/project-docs/setup.md @@ -18,4 +18,3 @@ At the end we will discuss the design choices as a whole class. After forking and cloning this repo you must run `npm install` in the project directory. This will download and install all of the necessary NPM modules required by the project. After that finishes successfully you can run `npm start` to begin the local development server. -## Tests \ No newline at end of file diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index b60db9e3..afb01212 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -14,4 +14,8 @@ There are several CSS classes for the different elements of a chat message. You Usually our convention for styles in React applications is to have a separate CSS file for every component (refer to the scaffold for React Timeline as an example). -**NOTE**: Unless you are working on the optional enhancement, make sure that your chat message's container element has both the classes "chat-entry" and "local". \ No newline at end of file +**NOTE**: Unless you are working on the optional enhancement, make sure that your chat message's container element has both the classes "chat-entry" and "local". + +## Tests + +This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests you should name this component `ChatEntry` and give it props `sender`, `body`, and `timeStamp`. \ No newline at end of file diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index e6844d47..9d04dd1e 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -8,4 +8,8 @@ At this point, we can use the entire chat message data from the JSON file `entri ## Styling -Note the rule set in `ChatLog.css` and consider how to apply it to the `ChatLog` component. Remember, applying the provided styles is not one of the main learning goals for this project. \ No newline at end of file +Note the rule set in `ChatLog.css` and consider how to apply it to the `ChatLog` component. Remember, applying the provided styles is not one of the main learning goals for this project. + +## Tests + +The tests for this component assume that the component is named `ChatLog` and takes one prop named `entries` (which is an array). \ No newline at end of file diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index 64e132ba..3395696d 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -5,6 +5,7 @@ In this wave we will update to components to manage liking - Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart to a filled heart and from a filled heart to and empty heart. - Manage the click event and state of the chat messages such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` such that the `App` reports the number of total messages that have been liked. +🤍❤️
Hints @@ -13,3 +14,7 @@ In this wave we will update to components to manage liking - Consider writing a helper function in `App` to calculate the number of filled heart
+ +## Tests + +The tests for this component don't make assumptions about the implementation details of like feature. They check that when you click on a 🤍 button it changes to a ❤️, and when you click on a ❤️ it changes to a 🤍. It also verifies that clicking on one `ChatEntry`'s like button (🤍) doesn't change other `ChatEntry`'s buttons. Finally, the tests check \ No newline at end of file From 7e0a1cf45224dbf4477fdca29bc78e276393d02c Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 08:27:49 -0700 Subject: [PATCH 21/31] add new image with hearts and colors --- README.md | 2 +- images/react-chatlog-demo-extras.png | Bin 0 -> 177788 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 images/react-chatlog-demo-extras.png diff --git a/README.md b/README.md index 4c319981..7225ca76 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ In this project you will use core React concepts to build a chat messenger-style ## Project Outline This project comes with a minimal scaffold based on the baseline React application generated by `create-react-app`. We provide the JSON file with static chat message data and the CSS styles, and you will need to implement all of the components except for the provided `Timestamp` component. -![React Chat Log demo](./images/react-chatlog-demo.gif) +![React Chat Log demo](./images/react-chatlog-demo-extras.png) ## Project Directions - [Planning and Setup](./project-docs/setup.md) diff --git a/images/react-chatlog-demo-extras.png b/images/react-chatlog-demo-extras.png new file mode 100644 index 0000000000000000000000000000000000000000..86392afe2d89b2d9f6c043325b7825e46e3412ab GIT binary patch literal 177788 zcmd4&gAqs(v5%;(v8vxEZyA= z%ko=4_x(K2eShD7;N9c6j-6{}&Y8L9?DL$7P*ag7!heDf004*-6=XC30L%jb0P7AH z2VFD9zNG{J;3KS{P&Gv;ltInO{=JorIRKy#k(>&Alc-DCyLg!|^a_(K?xB~wD8|=d zIw@(<@K*|$c&t6a{!CAw1~Kze%E(B8)YWC$N6F%<87O6_v1#4{&D7NXvzyf>*A10EOcV(XeN6P@CQ2!Czt{HC>7G<`(MlL#DOiU zD361gf}Kg-Ht~hUgNK=H;xk)(62eFYrBAv6YH_m|zq%lk$|$8f8Bbqgu

f^K0q_ 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‘$B4T7o_}Q-No{0nV!{>@4RFBre>Loe- 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 N(=Mlqe!Kk7{|BI0+K~VN literal 0 HcmV?d00001 From 05aa973fbd6aba44e8e31b39ea39b19ace94c0dd Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 08:45:09 -0700 Subject: [PATCH 22/31] clarify requirements in project docs --- README.md | 10 +++++----- project-docs/wave-01.md | 4 ++-- project-docs/wave-02.md | 2 +- project-docs/wave-03.md | 22 ++++++++++++---------- src/data/{entries.json => messages.json} | 0 5 files changed, 20 insertions(+), 18 deletions(-) rename src/data/{entries.json => messages.json} (100%) diff --git a/README.md b/README.md index 7225ca76..c425e708 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # React Chat Log -In this project you will use core React concepts to build a chat messenger-style application that displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature and a color choosing feature. +In this project you will use core React concepts to build a chat messenger-style application that displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature. ## Skills Assessed -- Building React components that recieve data through props +- Building React components that receive data through props - Building React container components that pass information to their subcomponents - Initializing and using state within a component - Passing callback functions to child components and using them to update state @@ -11,7 +11,7 @@ In this project you will use core React concepts to build a chat messenger-style - Demonstrating understanding of the front-end layer, and the relationship between user interaction and the UI ## Project Outline -This project comes with a minimal scaffold based on the baseline React application generated by `create-react-app`. We provide the JSON file with static chat message data and the CSS styles, and you will need to implement all of the components except for the provided `Timestamp` component. +This project comes with a minimal scaffold based on the baseline React application generated by `create-react-app`. We provide the JSON file with static chat message data and the CSS styles, and you will need to implement all of the components except for the provided `TimeStamp` component. ![React Chat Log demo](./images/react-chatlog-demo-extras.png) @@ -24,9 +24,9 @@ This project comes with a minimal scaffold based on the baseline React applicati ## Testing -We will notice that the tests for this project are a mix of unit tests (Waves 01 and 02) and integration tests (Wave 03). The directions for each wave include a section about the tests for that wave. The unit tests provided for Wave 01 and Wave 02 require us to be prescriptive around components names and props. The integration tests for Wave 03 allow for more freedom in the implementation details of this wave's feature. +The tests for this project are a mix of unit tests (Waves 01 and 02) and integration tests (Wave 03). The directions for each wave include a section about the tests for that wave. The unit tests provided for Wave 01 and Wave 02 require us to be prescriptive around components names and props. The integration tests for Wave 03 allow for more freedom in the implementation details of this wave's feature. -Writing front-end tests is outside the scope of the core curriculum. We provide minimal tests for this project for a few reasons. We can use these tests to partially verify the correctness of our code. Tests support the refactoring process and enforce consistency in implementation details. Additionally, reviewing these front-end tests gives us initial exposure to what unit tests and integrations tests look for front-end testing. +Writing front-end tests is outside the scope of the core curriculum. We provide minimal tests for this project for a few reasons. We can use these tests to partially verify the correctness of our code and functionality. Tests support the refactoring process and enforce consistency in implementation details. Additionally, by reviewing these front-end tests, we have some exposure to what unit tests and integration tests look like in front-end testing. Follow your curiosity to learn more about front-end testing: - [Front End Testing: A Complete Conceptual Overview](https://www.testim.io/blog/front-end-testing-complete-overview/) diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index afb01212..dc47fb3a 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -4,7 +4,7 @@ Update the `ChatEntry` and `App` components to display a single chat message bub A good way to test this code as you write it would be to take the first chat message from the JSON data file and use it as the data for the `ChatEntry` component. -`ChatEntry` should have props which match the elements from each chat message in the JSON data file: `sender`, `body`, and `timeStamp`. +`ChatEntry` should have props which match the elements from each chat message in the JSON data file: `sender`, `body`, and `timeStamp`. Note: We do not need to include the `id` and `liked` fields for Wave 01. ## Styling @@ -12,7 +12,7 @@ The styles necessary to make an app which visually matches the demo above have b There are several CSS classes for the different elements of a chat message. You should attempt to determine which classes should be applied to which HTML elements, however if you are stuck on this please ask a member of the instructional staff as the styling on this project is not the learning goal. -Usually our convention for styles in React applications is to have a separate CSS file for every component (refer to the scaffold for React Timeline as an example). +Usually our convention for styles in React applications is to have a separate CSS file for every component. **NOTE**: Unless you are working on the optional enhancement, make sure that your chat message's container element has both the classes "chat-entry" and "local". diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index 9d04dd1e..1cd96249 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -4,7 +4,7 @@ Implement a `ChatLog` component and update the `App` component to display an ent `ChatLog` takes one prop named `entries` (which is an array). -At this point, we can use the entire chat message data from the JSON file `entries.json` to test our code as you implement each component. +At this point, we can use the entire chat message data from the JSON file `messages.json` to test our code as you implement each component. We may chose to update the `ChatEntry` to use the `id` field in this wave. ## Styling diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index 3395696d..bd37491b 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -1,20 +1,22 @@ # Wave 03: Event Handling and Lifting Up State -In this wave we will update to components to manage liking +In this wave we will update the components to manage a **like** feature. -- Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart to a filled heart and from a filled heart to and empty heart. -- Manage the click event and state of the chat messages such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` such that the `App` reports the number of total messages that have been liked. - -🤍❤️ +- Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart (🤍) to a filled heart (❤️) and from a filled heart (❤️) to and empty heart (🤍). +- Manage the click event and state of the chat entries such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` such that the `App` reports the number of total messages that have been liked. + - If the user has liked three messages, `3 ❤️s` will appear at the top of the screen.

- Hints - -- Note the class names in `ChatEntry.css` that are used to render a filled and unfilled heart -- Consider writing a helper function in `App` to calculate the number of filled heart + Expand to see hints for implementing this feature +- We will now need to update the `ChatEntry` component to use the `liked` field. +- When we click a heart, the state of the `entries` will need to update in our `App` so that it can report the number of likes (❤️s). +- Consider implementing a helper function to calculate the number of likes (❤️s). +- Consider using a ternary to display a 🤍 or a ❤️ as needed.
## Tests -The tests for this component don't make assumptions about the implementation details of like feature. They check that when you click on a 🤍 button it changes to a ❤️, and when you click on a ❤️ it changes to a 🤍. It also verifies that clicking on one `ChatEntry`'s like button (🤍) doesn't change other `ChatEntry`'s buttons. Finally, the tests check \ No newline at end of file +The tests for this component are integration tests. They don't make assumptions about the implementation details of like feature. The tests verify the following functionality: +- When the user click on a 🤍 button it changes to a ❤️, and when the user clicks on a ❤️ it changes to a 🤍. This test also verifies that clicking on one `ChatEntry`'s like button (🤍) doesn't change other `ChatEntry`'s buttons. +- The correct number of filled hearts is displayed at the top of the screen. \ No newline at end of file diff --git a/src/data/entries.json b/src/data/messages.json similarity index 100% rename from src/data/entries.json rename to src/data/messages.json From 8c938b85d863ec95e574b0150e91f911f5303283 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 10:08:32 -0700 Subject: [PATCH 23/31] update app css --- src/App.css | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/App.css b/src/App.css index 2ad80544..d97beb4e 100644 --- a/src/App.css +++ b/src/App.css @@ -9,14 +9,66 @@ position: fixed; width: 100%; z-index: 100; + text-align: center; + align-items: center; } #App main { + padding-left: 2em; + padding-right: 2em; padding-bottom: 5rem; - padding-top: 7rem; + padding-top: 10rem; } #App h1 { font-size: 1.5em; text-align: center; + display: inline-block; +} + +#App header section { + background-color: #e0ffff; } + +#App .widget { + display: inline-block; + line-height: 0.5em; + border-radius: 10px; + color: black; + font-size:0.8em; + padding-left: 1em; + padding-right: 1em; +} + +#App #heartWidget { + font-size: 1.5em; + margin: 1em +} + +#App span { + display: inline-block +} + +.red { + color: #b22222 +} + +.orange { + color: #e6ac00 +} + +.yellow { + color: #e6e600 +} + +.green { + color: green +} + +.blue { + color: blue +} + +.purple { + color: purple +} \ No newline at end of file From 790587fd01ea9b35aa450a8548efdd9246ddbff2 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 11:24:52 -0700 Subject: [PATCH 24/31] remove prettier from eslinterrc --- .eslintrc.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 4898eaf5..c91206d6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,14 +6,13 @@ "node": true, "jest/globals": true }, - "extends": ["react-app", "plugin:jest/recommended", "prettier"], + "extends": ["react-app", "plugin:jest/recommended"], "parserOptions": { "ecmaVersion": 12, "sourceType": "module" }, - "plugins": ["jest", "jsx-a11y", "prettier"], + "plugins": ["jest", "jsx-a11y"], "rules": { - "prettier/prettier": "error", "no-unused-vars": "warn", "no-var": "warn", "no-console": "off", From 925d9b0bd03c98a884bbc63dbb8f87d5dd8e4aa3 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 11:28:26 -0700 Subject: [PATCH 25/31] change camelCase to camelcase --- .eslintrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index c91206d6..00b539d8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,6 +23,6 @@ "single", { "allowTemplateLiterals": true, "avoidEscape": true } ], - "camelCase": "error" + "camelcase": "error" } } \ No newline at end of file From a88d4367a6d2d3d10eb299db1ea92ae9caf83b85 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 11:43:26 -0700 Subject: [PATCH 26/31] change double to single quotes --- src/components/Timestamp.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Timestamp.js b/src/components/Timestamp.js index 29aad44b..b7d700b4 100644 --- a/src/components/Timestamp.js +++ b/src/components/Timestamp.js @@ -1,9 +1,9 @@ -import React from "react"; -import moment from "moment"; +import React from 'react'; +import moment from 'moment'; const TimeStamp = (props) => { const time = moment(props.time); - const absolute = time.format("MMMM Do YYYY, h:mm:ss a"); + const absolute = time.format('MMMM Do YYYY, h:mm:ss a'); const relative = time.fromNow(); return {relative}; From b5c46760fd53cfbada8e9cc990fb1673192e5490 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 12:06:48 -0700 Subject: [PATCH 27/31] small updates to readme and baseline --- README.md | 8 ++++---- project-docs/setup.md | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c425e708..c44a6272 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # React Chat Log -In this project you will use core React concepts to build a chat messenger-style application that displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature. +In this project we will use core React concepts to build a chat messenger-style application that displays a log of chat messages between two people, using static data from a JSON file. We will build user interaction with a like feature. ## Skills Assessed - Building React components that receive data through props - Building React container components that pass information to their subcomponents - Initializing and using state within a component - Passing callback functions to child components and using them to update state -- Practice reading and running tests +- Practicing reading and running tests - Using git as part of the development workflow - Demonstrating understanding of the front-end layer, and the relationship between user interaction and the UI @@ -24,9 +24,9 @@ This project comes with a minimal scaffold based on the baseline React applicati ## Testing -The tests for this project are a mix of unit tests (Waves 01 and 02) and integration tests (Wave 03). The directions for each wave include a section about the tests for that wave. The unit tests provided for Wave 01 and Wave 02 require us to be prescriptive around components names and props. The integration tests for Wave 03 allow for more freedom in the implementation details of this wave's feature. +The tests for this project are a mix of unit tests (Waves 01 and 02) and integration tests (Wave 03). The directions for each wave include a section about the tests for that wave. The unit tests provided for Wave 01 and Wave 02 require us to be prescriptive around component and prop names. The integration tests for Wave 03 allow for more freedom in the implementation details of this wave's feature. -Writing front-end tests is outside the scope of the core curriculum. We provide minimal tests for this project for a few reasons. We can use these tests to partially verify the correctness of our code and functionality. Tests support the refactoring process and enforce consistency in implementation details. Additionally, by reviewing these front-end tests, we have some exposure to what unit tests and integration tests look like in front-end testing. +Writing front-end tests is outside the scope of the core curriculum. We provide minimal tests for this project for a few reasons. We can use these tests to partially verify the correctness of our code. Tests support the refactoring process and enforce consistency in implementation details. Additionally, by reviewing these front-end tests, we have some exposure to what unit tests and integration tests look like in front-end testing. Follow your curiosity to learn more about front-end testing: - [Front End Testing: A Complete Conceptual Overview](https://www.testim.io/blog/front-end-testing-complete-overview/) diff --git a/project-docs/setup.md b/project-docs/setup.md index 5266d83f..2a1c97db 100644 --- a/project-docs/setup.md +++ b/project-docs/setup.md @@ -10,11 +10,12 @@ Next, link the data to the components. Take a look at the JSON file again. Each Once you've identified which data will be used by which components, consider the structure of the data. Which pieces of data are grouped together into data structures? This is often a sign that those pieces of data will be used by the same component. Are there any nested data structures? This is usually a sign that components should be nested as well, with the more deeply nested components using the more deeply nested data. -Finally, after analyzing the provided data and designing a set of components and their relationships to the data, you should write down your proposed design and discuss it with your chair pair. Is their design different from yours? If so, discuss the reasoning for each of yours designs and determine any possible pros/cons for both approaches. +Finally, after analyzing the provided data and designing a set of components and their relationships to the data, you should write down your proposed design -At the end we will discuss the design choices as a whole class. + +Consider discussing your design with a classmate. Is their design different from yours? If so, discuss the reasoning for each of yours designs and determine any possible pros/cons for both approaches. ## Setup -After forking and cloning this repo you must run `npm install` in the project directory. This will download and install all of the necessary NPM modules required by the project. After that finishes successfully you can run `npm start` to begin the local development server. +After forking and cloning this repo you must run `npm install` in the project directory. This will download and install all of the necessary NPM modules required by the project. After that finishes successfully, run `npm start` to begin the local development server. From fed5d902e6c1ab97f2053ecf17e93ff854ade115 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Fri, 13 May 2022 12:13:48 -0700 Subject: [PATCH 28/31] small direction wording updates --- project-docs/optional-enhancements.md | 3 ++- project-docs/wave-01.md | 2 +- project-docs/wave-02.md | 2 +- project-docs/wave-03.md | 9 +++++---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/project-docs/optional-enhancements.md b/project-docs/optional-enhancements.md index d782215b..8a63ed02 100644 --- a/project-docs/optional-enhancements.md +++ b/project-docs/optional-enhancements.md @@ -14,5 +14,6 @@ Now that we have designated `ChatEntry`s as `"local"` or `"remote"`, let's add a Our solution uses a `ColorChoice` component with a `setColorCallback` prop that sets the color in the `App`. Once the color in the `App` is set, it is passed as a prop through the `ChatLog` to the `ChatEntry` components. ## Header title -For one last finishing touch, consider updating the application title in the header. The text of the title should be determined dynamically based on the names of the participants in the chat log data. Consult the demo above for an example of what the title might contain. +For one last finishing touch, consider updating the application title in the header. The text of the title should be determined dynamically based on the names of the participants in the chat log data. Consult the image of the example solution for what the title might contain. +![React Chat Log demo](../images/react-chatlog-demo-extras.png) \ No newline at end of file diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index dc47fb3a..611cb4e9 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -18,4 +18,4 @@ Usually our convention for styles in React applications is to have a separate CS ## Tests -This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests you should name this component `ChatEntry` and give it props `sender`, `body`, and `timeStamp`. \ No newline at end of file +This component has a set of tests that ensure that props passed to the component appear in the browser. To pass the tests, the component must be named `ChatEntry` with props `sender`, `body`, and `timeStamp`. \ No newline at end of file diff --git a/project-docs/wave-02.md b/project-docs/wave-02.md index 1cd96249..9788c392 100644 --- a/project-docs/wave-02.md +++ b/project-docs/wave-02.md @@ -4,7 +4,7 @@ Implement a `ChatLog` component and update the `App` component to display an ent `ChatLog` takes one prop named `entries` (which is an array). -At this point, we can use the entire chat message data from the JSON file `messages.json` to test our code as you implement each component. We may chose to update the `ChatEntry` to use the `id` field in this wave. +At this point, we can use the entire chat message data from the JSON file `messages.json` to test our code as you implement each component. We may choose to update the `ChatEntry` to use the `id` field in this wave. ## Styling diff --git a/project-docs/wave-03.md b/project-docs/wave-03.md index bd37491b..5ed17358 100644 --- a/project-docs/wave-03.md +++ b/project-docs/wave-03.md @@ -2,9 +2,9 @@ In this wave we will update the components to manage a **like** feature. -- Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart (🤍) to a filled heart (❤️) and from a filled heart (❤️) to and empty heart (🤍). -- Manage the click event and state of the chat entries such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` such that the `App` reports the number of total messages that have been liked. - - If the user has liked three messages, `3 ❤️s` will appear at the top of the screen. +- Add behavior to heart button in `ChatEntry` so that when it is clicked it toggles from an empty heart (🤍) to a filled heart (❤️) and from a filled heart (❤️) to an empty heart (🤍). +- Manage the click event and state of the chat entries such that when the like status of a chat message changes by clicking the heart button, it is tracked by the `App` and the `App` reports the number of total messages that have been liked. + - Example: If the user has liked three messages, `3 ❤️s` will appear at the top of the screen.
Expand to see hints for implementing this feature @@ -19,4 +19,5 @@ In this wave we will update the components to manage a **like** feature. The tests for this component are integration tests. They don't make assumptions about the implementation details of like feature. The tests verify the following functionality: - When the user click on a 🤍 button it changes to a ❤️, and when the user clicks on a ❤️ it changes to a 🤍. This test also verifies that clicking on one `ChatEntry`'s like button (🤍) doesn't change other `ChatEntry`'s buttons. -- The correct number of filled hearts is displayed at the top of the screen. \ No newline at end of file +- The correct number of filled hearts is displayed at the top of the screen. +- If you make a design decision to use a different emoji, you will need to change the tests accordingly. \ No newline at end of file From e21816861a206c89b6cba6cd158145a797e09e94 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 18 May 2022 13:39:23 -0700 Subject: [PATCH 29/31] replace moment with luxon --- package-lock.json | 31 +++++++++++++++---------------- package.json | 7 +++---- project-docs/wave-01.md | 2 +- src/components/Timestamp.js | 11 ++++++----- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index a4b65c32..50300b64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,11 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", - "moment": "^2.29.2", + "luxon": "^2.4.0", "react": "^17.0.1", "react-dom": "^17.0.1", "react-scripts": "4.0.1" - }, - "devDependencies": {} + } }, "node_modules/@babel/code-frame": { "version": "7.10.4", @@ -11092,6 +11091,14 @@ "node": ">=10" } }, + "node_modules/luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==", + "engines": { + "node": ">=12" + } + }, "node_modules/lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", @@ -11498,14 +11505,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", - "engines": { - "node": "*" - } - }, "node_modules/move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -28548,6 +28547,11 @@ "yallist": "^4.0.0" } }, + "luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==" + }, "lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", @@ -28868,11 +28872,6 @@ "minimist": "^1.2.5" } }, - "moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" - }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", diff --git a/package.json b/package.json index 04ad709e..94ac6024 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", - "moment": "^2.29.2", "react": "^17.0.1", "react-dom": "^17.0.1", - "react-scripts": "4.0.1" + "react-scripts": "4.0.1", + "luxon": "^2.4.0" }, "scripts": { "start": "react-scripts start", @@ -28,6 +28,5 @@ "not dead", "not ie <= 11", "not op_mini all" - ], - "devDependencies": { } + ] } diff --git a/project-docs/wave-01.md b/project-docs/wave-01.md index 611cb4e9..db82dae9 100644 --- a/project-docs/wave-01.md +++ b/project-docs/wave-01.md @@ -10,7 +10,7 @@ A good way to test this code as you write it would be to take the first chat mes The styles necessary to make an app which visually matches the demo above have been provided for you, but you will need to make use of them in your React components by adding classes to specific HTML elements in your JSX. -There are several CSS classes for the different elements of a chat message. You should attempt to determine which classes should be applied to which HTML elements, however if you are stuck on this please ask a member of the instructional staff as the styling on this project is not the learning goal. +There are several CSS classes for the different elements of a chat message. You should attempt to determine which classes should be applied to which HTML elements yourself. However, if you are stuck on this, please reach out for help as the styling is not the primary learning goal of this project. Usually our convention for styles in React applications is to have a separate CSS file for every component. diff --git a/src/components/Timestamp.js b/src/components/Timestamp.js index b7d700b4..03054fe3 100644 --- a/src/components/Timestamp.js +++ b/src/components/Timestamp.js @@ -1,10 +1,11 @@ -import React from 'react'; -import moment from 'moment'; +import { DateTime } from 'luxon'; const TimeStamp = (props) => { - const time = moment(props.time); - const absolute = time.format('MMMM Do YYYY, h:mm:ss a'); - const relative = time.fromNow(); + console.log(props); + + const time = DateTime.fromISO(props.time); + const absolute = time.toFormat('MMMM Do YYYY, h:mm:ss a'); + const relative = time.toRelative(); return {relative}; }; From 080365b90342fbdf802945ca29d385ea9fe79822 Mon Sep 17 00:00:00 2001 From: Becca Elenzil Date: Wed, 18 May 2022 13:41:46 -0700 Subject: [PATCH 30/31] remove console.log from timestamp --- src/components/Timestamp.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Timestamp.js b/src/components/Timestamp.js index 03054fe3..51232778 100644 --- a/src/components/Timestamp.js +++ b/src/components/Timestamp.js @@ -1,8 +1,6 @@ import { DateTime } from 'luxon'; const TimeStamp = (props) => { - console.log(props); - const time = DateTime.fromISO(props.time); const absolute = time.toFormat('MMMM Do YYYY, h:mm:ss a'); const relative = time.toRelative(); From 44d2563c35a803b5ba81839cf69605bc9bc0e8e8 Mon Sep 17 00:00:00 2001 From: Becca Date: Mon, 23 May 2022 08:09:45 -0700 Subject: [PATCH 31/31] Apply suggestions from code review Co-authored-by: Claire Elliott --- project-docs/setup.md | 10 ++++++++-- src/components/ChatLog.test.js | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/project-docs/setup.md b/project-docs/setup.md index 2a1c97db..fea094bd 100644 --- a/project-docs/setup.md +++ b/project-docs/setup.md @@ -2,15 +2,21 @@ Examine the JSON file located at `src/data/messages.json` to familiarize yourself with the data you will be using. -What properties comprise an individual chat message? What are their data types? How are the chat messages organized? Are they sorted in a particular way? +**Now consider the following:** +- What properties comprise an individual chat message? +- What are their data types? +- How are the chat messages organized? +- Are they sorted in a particular way? After considering the data, you should begin to explore how React components might be used to transform that data into a static chat log web page. Specifically, what components will be needed? Are any of the components nested within another component? Are there any components which appear on the page multiple times? Next, link the data to the components. Take a look at the JSON file again. Each piece of data (e.g. a string or date) will be used through the `props` for a particular component, so try to match the correct component for every piece of data in the JSON file. Keep in mind that components can use multiple pieces of data. +Now, examine the components inside `src/components` to familiarize yourself with the components listed inside. + Once you've identified which data will be used by which components, consider the structure of the data. Which pieces of data are grouped together into data structures? This is often a sign that those pieces of data will be used by the same component. Are there any nested data structures? This is usually a sign that components should be nested as well, with the more deeply nested components using the more deeply nested data. -Finally, after analyzing the provided data and designing a set of components and their relationships to the data, you should write down your proposed design +Finally, after analyzing the provided data and designing a set of components and their relationships to the data, you should write down your proposed design. Consider discussing your design with a classmate. Is their design different from yours? If so, discuss the reasoning for each of yours designs and determine any possible pros/cons for both approaches. diff --git a/src/components/ChatLog.test.js b/src/components/ChatLog.test.js index 39e3694c..96f89ebc 100644 --- a/src/components/ChatLog.test.js +++ b/src/components/ChatLog.test.js @@ -33,7 +33,7 @@ const LOG = [ describe("Wave 02: ChatLog", () => { beforeEach(() => { - render(); + render(); }); test("renders without crashing and shows all the names", () => { @@ -57,7 +57,7 @@ describe("Wave 02: ChatLog", () => { }); test("renders an empty list without crashing", () => { - const element = render(); + const element = render(); expect(element).not.toBeNull(); }); });