diff --git a/src/App.css b/src/App.css index d97beb4e6..d0f2f735a 100644 --- a/src/App.css +++ b/src/App.css @@ -42,7 +42,8 @@ #App #heartWidget { font-size: 1.5em; - margin: 1em + margin: 1em; + color: black; } #App span { diff --git a/src/App.jsx b/src/App.jsx index 14a7f684d..3e21fed98 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,14 +1,238 @@ import './App.css'; +import ChatLog from './components/ChatLog.jsx'; +import {useState} from 'react'; + +const DATA = [ + { + 'id': 1, + 'sender': 'Vladimir', + 'body': 'why are you arguing with me', + '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', + 'liked': false + }, + { + 'id': 3, + 'sender': 'Vladimir', + 'body': 'because I am what', + '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', + 'liked': false + }, + { + 'id': 5, + 'sender': 'Vladimir', + 'body': 'how did you know', + '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', + 'liked': false + }, + { + 'id': 7, + 'sender': 'Vladimir', + 'body': 'no you are not 😀', + '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', + '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', + 'liked': false + }, + { + 'id': 10, + 'sender': 'Estragon', + 'body': 'No, you are the machine.', + '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', + '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', + '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', + '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', + 'liked': false + }, + { + 'id': 15, + 'sender': 'Vladimir', + 'body': 'you are a robot called Cleverbot', + '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', + 'liked': false + }, + { + 'id': 17, + 'sender': 'Vladimir', + 'body': 'explain', + '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', + 'liked': false + }, + { + 'id': 19, + 'sender': 'Vladimir', + 'body': 'so you are a human', + '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', + 'liked': false + }, + { + 'id': 21, + 'sender': 'Vladimir', + 'body': 'you are robots running on Android system', + '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', + 'liked': false + }, + { + 'id': 23, + 'sender': 'Vladimir', + 'body': 'so you are a robot', + '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', + 'liked': false + }, + { + 'id': 25, + 'sender': 'Vladimir', + 'body': 'but you just said that you are robots', + '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', + 'liked': false + }, + { + 'id': 27, + 'sender': 'Vladimir', + 'body': 'then you are lying', + 'timeStamp': '2018-05-29T23:17:34+00:00', + 'liked': false + } +]; + const App = () => { + const [messagesData, setMessagesData] = useState(DATA); + const toggleLiked = (messageId) => { + const messages = messagesData.map(message => { + if (message.id === messageId) { + return { ...message, liked: !message.liked }; + } else { + return message; + } + }); + + setMessagesData(messages); + }; + + const getLikesCount = (messagesData) => { + return messagesData.reduce((previousCount, item)=>previousCount+item.liked, 0); + }; + + const getNames = (messagesData) => { + let namesSet= messagesData.reduce((accumulator, item)=>{ + accumulator.add(item.sender); + return accumulator; + }, new Set()); + let arr=[...namesSet]; + return arr.join(' and '); + }; + return (
-

Application title

+

Chat between {getNames(messagesData)}

+

{getLikesCount(messagesData)} ❤️s

- {/* Wave 01: Render one ChatEntry component - Wave 02: Render ChatLog component */} + {/* Wave 01: Render one ChatEntry component*/ + /* */ + /*Wave 02: Render ChatLog component */ + }
); diff --git a/src/components/ChatEntry.jsx b/src/components/ChatEntry.jsx index 15c56f96b..b87a7c325 100644 --- a/src/components/ChatEntry.jsx +++ b/src/components/ChatEntry.jsx @@ -1,20 +1,31 @@ import './ChatEntry.css'; +import TimeStamp from './TimeStamp'; +import PropTypes from 'prop-types'; + + +const ChatEntry = (props) => { + let heart = props.liked ? '❤️' : '🤍'; + const messageClassName='chat-entry '+(props.isLocal?'local':'remote'); -const ChatEntry = () => { return ( -
-

Replace with name of sender

+
+

{props.sender}

-

Replace with body of ChatEntry

-

Replace with TimeStamp component

- +

{props.body}

+

+
); }; ChatEntry.propTypes = { - // Fill with correct proptypes + id: PropTypes.number.isRequired, + sender: PropTypes.string.isRequired, + body: PropTypes.string.isRequired, + timeStamp: PropTypes.string.isRequired, + liked: PropTypes.bool.isRequired, + onLikedToggle: PropTypes.func.isRequired, + isLocal:PropTypes.bool.isRequired }; - export default ChatEntry; diff --git a/src/components/ChatLog.jsx b/src/components/ChatLog.jsx new file mode 100644 index 000000000..a90372938 --- /dev/null +++ b/src/components/ChatLog.jsx @@ -0,0 +1,40 @@ +import ChatEntry from './ChatEntry'; +import './ChatLog.css'; +import PropTypes from 'prop-types'; + + +const ChatLog = ({entries,onItemLikedToggle}) => { + if (entries.length === 0) return null; + const localName = entries[0].sender; + return entries.map(entry => { + return ( + + ); + }); +}; + + + +ChatLog.propTypes = { + entries: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + sender: PropTypes.string.isRequired, + body: PropTypes.string.isRequired, + timeStamp: PropTypes.string.isRequired, + liked: PropTypes.bool.isRequired, + }) + ).isRequired, + onItemLikedToggle: PropTypes.func.isRequired +}; + +export default ChatLog;