diff --git a/src/App.jsx b/src/App.jsx index c902699..a5d7ec4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -4,14 +4,20 @@ import initialEmails from './data/emails' import './styles/App.css' +import Emails from './components/Emails.jsx'; + const getReadEmails = emails => emails.filter(email => !email.read) const getStarredEmails = emails => emails.filter(email => email.starred) + + function App() { const [emails, setEmails] = useState(initialEmails) const [hideRead, setHideRead] = useState(false) const [currentTab, setCurrentTab] = useState('inbox') + const [searchQuery, setSearchQuery] = useState('') + const [openEmailId, setOpenEmailId] = useState(null) const unreadEmails = emails.filter(email => !email.read) const starredEmails = emails.filter(email => email.starred) @@ -34,7 +40,20 @@ function App() { setEmails(updatedEmails) } - let filteredEmails = emails + const handleSearch = (event) => { + setSearchQuery(event.target.value); + }; + + const filterEmails = (query) => { + if (query == "") { + return emails + } + + return emails.filter(email => + email.title.toLowerCase().includes(searchQuery.toLowerCase())) + }; + + let filteredEmails = filterEmails(searchQuery) if (hideRead) filteredEmails = getReadEmails(filteredEmails) @@ -56,7 +75,7 @@ function App() {
- +
-
- -
+ ) } diff --git a/src/components/Email.jsx b/src/components/Email.jsx new file mode 100644 index 0000000..203ae24 --- /dev/null +++ b/src/components/Email.jsx @@ -0,0 +1,37 @@ + + +function Email({email, index, toggleStar, toggleRead, activeEmailId, setActiveEmailId}) { + const handleEmailClick = (id) => { + setActiveEmailId(prevId => (prevId === id ? null : id)); + }; + + return
  • +
    + toggleRead(email)} + /> +
    +
    + toggleStar(email)} + /> +
    +
    {email.sender}
    +
    handleEmailClick(email.id)} >{email.title}
    + {activeEmailId === email.id && ( +
    + {email.body} +
    + )} +
  • ; +} +export default Email; \ No newline at end of file diff --git a/src/components/Emails.jsx b/src/components/Emails.jsx new file mode 100644 index 0000000..a119e1e --- /dev/null +++ b/src/components/Emails.jsx @@ -0,0 +1,14 @@ +import Email from './Email'; + +function Emails({filteredEmails, toggleStar, toggleRead, activeEmailId, setActiveEmailId}) { + + return
    + +
    ; +} + +export default Emails; \ No newline at end of file diff --git a/src/data/emails.js b/src/data/emails.js index 68fb1fc..2ab8d2d 100644 --- a/src/data/emails.js +++ b/src/data/emails.js @@ -4,34 +4,39 @@ export default [ sender: `Zoom`, title: `Cloud Recording - Nicolas Marcora's Personal Meeting Room is now available`, starred: false, - read: true + read: true, + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }, { id: 2, sender: `Zoom`, title: `Sean Davison has joined your Personal Meeting Room`, starred: false, - read: false + read: false, + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }, { id: 3, sender: `Notion`, title: `1 update in Boolean`, starred: true, - read: true + read: true, + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }, { id: 4, sender: `The Calendly Team`, title: `Use more than one calendar?`, starred: false, - read: false + read: false, + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }, { id: 5, sender: `Patrick`, title: `Updated invitation: Coding chat with Nico`, starred: true, - read: false + read: false, + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." } ] diff --git a/src/styles/App.css b/src/styles/App.css index da375b1..949bf16 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -86,6 +86,10 @@ .email { display: grid; grid-template-columns: 30px 30px 150px 1fr; + grid-template-rows: auto auto; + grid-template-areas: + "select star sender title" + "body body body body"; padding: 10px; background-color: white; font-size: 0.9rem; @@ -144,3 +148,8 @@ .email .star-checkbox:checked::before { background-image: url(https://www.gstatic.com/images/icons/material/system/2x/star_googyellow500_20dp.png); } + +.email-body { + width: 95%; + font-weight: 300; +} \ No newline at end of file