diff --git a/src/App.jsx b/src/App.jsx index c902699..861c284 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,123 +1,18 @@ import { useState } from 'react' - -import initialEmails from './data/emails' - +import Header from './Header' +import EmailPage from './EmailPage' import './styles/App.css' -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 unreadEmails = emails.filter(email => !email.read) - const starredEmails = emails.filter(email => email.starred) - - const toggleStar = targetEmail => { - const updatedEmails = emails => - emails.map(email => - email.id === targetEmail.id - ? { ...email, starred: !email.starred } - : email - ) - setEmails(updatedEmails) - } - - const toggleRead = targetEmail => { - const updatedEmails = emails => - emails.map(email => - email.id === targetEmail.id ? { ...email, read: !email.read } : email - ) - setEmails(updatedEmails) - } - - let filteredEmails = emails - - if (hideRead) filteredEmails = getReadEmails(filteredEmails) - - if (currentTab === 'starred') - filteredEmails = getStarredEmails(filteredEmails) + const [searchTerm, setSearchTerm] = useState('') return (
-
-
- - - - - gmail logo -
- -
- -
-
- -
- -
+
+
) } + export default App diff --git a/src/EmailItem.jsx b/src/EmailItem.jsx new file mode 100644 index 0000000..79dbd3a --- /dev/null +++ b/src/EmailItem.jsx @@ -0,0 +1,26 @@ +function EmailItem({ email, toggleRead, toggleStar }) { + return ( +
  • +
    + toggleRead(email)} + /> +
    +
    + toggleStar(email)} + /> +
    +
    {email.sender}
    +
    {email.title}
    +
  • + ) +} + +export default EmailItem diff --git a/src/EmailPage.jsx b/src/EmailPage.jsx new file mode 100644 index 0000000..f143f01 --- /dev/null +++ b/src/EmailPage.jsx @@ -0,0 +1,81 @@ +import { useState } from 'react' +import initialEmails from './data/emails' +import Sidebar from './Sidebar' +import EmailItem from './EmailItem' + +const getUnreadEmails = emails => emails.filter(email => !email.read) +const getStarredEmails = emails => emails.filter(email => email.starred) + +function EmailPage({searchTerm}) { + const [emails, setEmails] = useState(initialEmails) + const [hideRead, setHideRead] = useState(false) + const [currentTab, setCurrentTab] = useState('inbox') + + const unreadEmails = getUnreadEmails(emails) + const starredEmails = getStarredEmails(emails) + + const toggleStar = targetEmail => { + setEmails(prevEmails => + prevEmails.map(email => + email.id === targetEmail.id + ? { ...email, starred: !email.starred } + : email + ) + ) + } + + const toggleRead = targetEmail => { + setEmails(prevEmails => + prevEmails.map(email => + email.id === targetEmail.id + ? { ...email, read: !email.read } + : email + ) + ) + } + + // Filtering logic + let filteredEmails = emails + if (hideRead) { + filteredEmails = getUnreadEmails(filteredEmails) + } + if (currentTab === 'starred') { + filteredEmails = getStarredEmails(filteredEmails) + } + if (searchTerm) { + const searchTermLowerCase = searchTerm.toLowerCase() + filteredEmails = filteredEmails.filter( + email => + email.title.toLowerCase().includes(searchTermLowerCase) || + email.sender.toLowerCase().includes(searchTermLowerCase) + ) + } + + return ( + <> + + +
    + +
    + + ) +} + +export default EmailPage diff --git a/src/Header.jsx b/src/Header.jsx new file mode 100644 index 0000000..19fb7cd --- /dev/null +++ b/src/Header.jsx @@ -0,0 +1,26 @@ +function Header({ searchTerm, setSearchTerm }) { + return ( +
    +
    + + + + gmail logo +
    + +
    + setSearchTerm(e.target.value)} + /> +
    +
    + ) +} + +export default Header diff --git a/src/Sidebar.jsx b/src/Sidebar.jsx new file mode 100644 index 0000000..208beac --- /dev/null +++ b/src/Sidebar.jsx @@ -0,0 +1,34 @@ +function Sidebar({ currentTab, unreadEmails, starredEmails, hideRead, setHideRead }){ + return ( + + ) +} + +export default Sidebar diff --git a/src/main.jsx b/src/main.jsx index fce89a2..58c5c7b 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -7,4 +7,4 @@ ReactDOM.createRoot(document.getElementById('root')).render( , -) +) \ No newline at end of file