{"version":3,"sources":["components/Navbar.js","features/posts/AddPostForm.js","features/posts/TimeAgo.js","components/PostCard.js","features/posts/PostsList.js","components/PostView.js","features/posts/SinglePostPage.js","App.js","index.js"],"names":["StyledNavbar","styled","div","Navbar","to","className","FormPageView","AddForm","form","ButtonsTray","AddPostForm","handleSave","useState","title","setTitle","content","setContent","author","setAuthor","canSave","every","Boolean","onSavePostClicked","a","date","Date","postDate","toISOString","data","id","nanoid","htmlFor","type","name","placeholder","value","onChange","e","target","style","width","height","cursor","onClick","disabled","TimeAgo","timestamp","timeAgo","parseISO","timePeriod","formatDistanceToNow","StyledPostCard","PostCard","post","textOverflow","maxWidth","overflow","whiteSpace","backgroundColor","color","margin","fontSize","PostsTray","PostsList","posts","useMemo","sortedPosts","slice","sort","b","localeCompare","map","StyledPostView","PostView","SinglePostPage","postId","useParams","find","App","setPosts","fetch","method","body","JSON","stringify","useEffect","axios","get","then","res","catch","err","console","log","path","element","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.1da42662.chunk.js","sourcesContent":["import { Link } from 'react-router-dom';\nimport styled from 'styled-components';\nconst StyledNavbar = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 10px;\n width: fit-content;\n margin: auto;\n gap: 40px;\n h1 {\n font-size: 1.5rem;\n font-weight: bold;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n }\n`;\nconst Navbar = () => {\n return (\n \n

Nightingale

\n \n \n \n
\n );\n};\n\nexport default Navbar;\n","import { nanoid } from 'nanoid';\nimport { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport styled from 'styled-components';\n/* ---------------------------------- style --------------------------------- */\nconst FormPageView = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: auto;\n text-align: center;\n justify-content: center;\n`;\nconst AddForm = styled.form`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: auto;\n text-align: center;\n justify-content: center;\n width: 400px;\n`;\nconst ButtonsTray = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n`;\n/* -------------------------------- component ------------------------------- */\nconst AddPostForm = ({ handleSave }) => {\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [author, setAuthor] = useState('');\n\n const onTitleChanged = (e) => setTitle(e.target.value);\n const onContentChanged = (e) => setContent(e.target.value);\n const onAuthorChanged = (e) => setAuthor(e.target.value);\n\n const canSave = [title, content, author].every(Boolean);\n\n const onSavePostClicked = async () => {\n if (canSave) {\n const date = new Date();\n const postDate = date.toISOString();\n const data = {\n title,\n content,\n author,\n id: nanoid(),\n date: postDate,\n };\n handleSave(data);\n // fetch('https://serverless-api.osaleh.workers.dev/api/add', {\n // method: 'POST',\n // body: JSON.stringify(data),\n // });\n setTitle('');\n setContent('');\n setAuthor('');\n }\n };\n\n return (\n \n

Add a New Post

\n \n \n \n \n \n \n \n\n \n \n Save Post\n \n \n \n \n \n \n
\n );\n};\n\nexport default AddPostForm;\n","import React from 'react';\nimport { parseISO, formatDistanceToNow } from 'date-fns';\n\nexport const TimeAgo = ({ timestamp }) => {\n let timeAgo = '';\n if (timestamp) {\n const date = parseISO(timestamp);\n const timePeriod = formatDistanceToNow(date);\n timeAgo = `${timePeriod} ago`;\n }\n\n return (\n \n   {timeAgo}\n \n );\n};\n","import styled from 'styled-components';\nimport { TimeAgo } from '../features/posts/TimeAgo';\nimport { Link } from 'react-router-dom';\n/* ---------------------------------- style --------------------------------- */\nconst StyledPostCard = styled.div`\n display: flex;\n flex-direction: column;\n align-items: left;\n justify-content: center;\n border: 1px solid #e89444;\n border-radius: 5px;\n padding: 10px;\n margin: 10px;\n background-color: #242628;\n /* width: 100%; */\n h1 {\n font-size: 1.5em;\n margin: 0;\n }\n p {\n font-size: 0.9em;\n margin: 0 0 5px 0;\n & span {\n font-size: 0.85em;\n }\n }\n\n .button {\n margin-top: 5x;\n width: fit-content;\n }\n`;\n/* -------------------------------- component ------------------------------- */\nconst PostCard = ({ post }) => {\n return (\n \n
\n

{post.title}

\n
\n\n

\n by {post.author ? post.author : 'Unknown author'}\n \n \n \n

\n \n {post.content}\n

\n \n \n View Post\n \n \n
\n );\n};\n\nexport default PostCard;\n// background 1D1F20\n// less background 242628\n// grey 73777B\n// orange E79346\n// less orange E89444\n// off white D6D7D8\n// off orange EAA252\n","import { useMemo } from 'react';\nimport styled from 'styled-components';\nimport PostCard from '../../components/PostCard';\n/* ---------------------------------- style --------------------------------- */\nconst PostsTray = styled.div`\n width: fit-content;\n align-self: center;\n margin: 0px auto;\n`;\n/* -------------------------------- component ------------------------------- */\nconst PostsList = ({ posts }) => {\n // const [posts, setPosts] = useState([]);\n\n let content;\n const sortedPosts = useMemo(() => {\n if (posts) {\n const sortedPosts = posts.slice();\n sortedPosts.sort((a, b) => b.date.localeCompare(a.date));\n return sortedPosts;\n }\n }, [posts]);\n const renderedPosts = sortedPosts.map((post) => (\n \n ));\n content = renderedPosts;\n\n return {content ? content : 'Add some posts!'};\n};\n\nexport default PostsList;\n","import styled from 'styled-components';\nimport { TimeAgo } from '../features/posts/TimeAgo';\nimport { Link } from 'react-router-dom';\n\n/* ---------------------------------- style --------------------------------- */\nconst StyledPostView = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border: 1px solid #ccc;\n border-radius: 5px;\n padding: 10px;\n margin: auto;\n width: 70%;\n background-color: #242628;\n h1 {\n font-size: 1.5em;\n margin: 0 0 5px 0;\n }\n p {\n font-size: 1em;\n margin: 0px 0 5px 0;\n & span {\n font-size: 0.85em;\n margin: 0px 5px 0px 0;\n }\n }\n .button {\n margin-top: 10px;\n }\n`;\n/* -------------------------------- component ------------------------------- */\nconst PostView = ({ post }) => {\n return (\n \n
\n

{post.title}

\n
\n

\n by {post.author ? post.author : 'Unknown author'}\n \n \n \n

\n

{post.content}

\n \n \n \n
\n );\n};\n\nexport default PostView;\n// background 1D1F20\n// less background 242628\n// grey 73777B\n// orange E79346\n// less orange E89444\n// off white D6D7D8\n// off orange EAA252\n","import { useParams } from 'react-router-dom';\nimport PostView from '../../components/PostView';\n\nconst SinglePostPage = ({ posts }) => {\n let content;\n let params = useParams();\n const { postId } = params;\n const post = posts.find((post) => post.id === postId);\n\n if (post) {\n content = ;\n }\n\n return
{post ? content : null}
;\n};\n\nexport default SinglePostPage;\n","import { BrowserRouter, Routes, Route } from 'react-router-dom';\nimport axios from 'axios';\nimport { useEffect, useState } from 'react';\nimport Navbar from './components/Navbar';\nimport AddPostForm from './features/posts/AddPostForm';\nimport PostsList from './features/posts/PostsList';\nimport SinglePostPage from './features/posts/SinglePostPage';\nimport './css/newfull.css';\nimport '../src/App.css';\nfunction App() {\n const [posts, setPosts] = useState([]);\n\n useEffect(() => {\n axios\n .get('https://serverless-api.osaleh.workers.dev/api/posts')\n .then((res) => {\n setPosts(res.data);\n })\n .catch((err) => {\n console.log(err);\n });\n }, []);\n async function handleSave(post) {\n fetch('https://serverless-api.osaleh.workers.dev/api/posts', {\n method: 'POST',\n body: JSON.stringify(post),\n });\n setPosts([...posts, post]);\n }\n return (\n \n \n \n } />\n } />\n }\n />\n \n \n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""}