{"version":3,"sources":["SVG.js","components/Header/Header.js","customHooks/monitorOrientation.js","components/Posts/Interact/Interact.js","components/Modal/Modal.js","components/Posts/Interact/Share.js","components/Posts/Post/Post.js","components/Posts/ViewPost/ViewPost.js","components/FormComponents/FormComponents.js","components/Posts/FilterPosts/FilterPosts.js","functions/filterPosts.js","components/Posts/Posts.js","components/Loading/Loading.js","functions/formatTags.js","functions/formatResources.js","functions/getResourcesArrays.js","components/SubmitPost/SubmitPost.js","components/EditPost/EditPost.js","components/Guidlines/Guidelines.js","components/Donate/Donate.js","components/Account/Signup/Signup.js","components/Account/Login/Login.js","components/Account/Logout/Logout.js","components/Account/PasswordRecover/PasswordRecover.js","components/Account/ChangePassword/ChangePassword.js","components/Account/ConfirmAccount/ConfirmAccount.js","components/Account/Account.js","components/Account/LoggedIn/LoggedIn.js","components/SubmitTip/SubmitTip.js","components/ViewTips/ViewTips.js","App.js","customHooks/setStorageVars.js","index.js"],"names":["AddSVG","props","style","fill","stroke","strokeWidth","xmlns","viewBox","id","data-name","x","y","width","height","rx","ry","x1","y1","x2","y2","ArticleSVG","strokeLinecap","strokeLinejoin","className","d","points","NoSVG","version","xlink","transform","DarkSVG","LightSVG","cx","cy","r","FilterSVG","PictureSVG","VideoSVG","fillRule","WebSVG","space","TweetSVG","NavArrowSVG","UserInputSVG","RedirectSVG","FacebookSVG","strokeMiterlimit","Hamburger","onClick","Header","darkMode","showMenu","loggedIn","JSON","parse","sessionStorage","getItem","admin","moderator","orientation","breakPoint","useState","setOrientation","useEffect","window","innerWidth","addEventListener","removeEventListener","useOrientation","menuVisible","setMenuVisible","iconStyle","marginRight","position","top","location","pathname","src","alt","display","toggleDarkMode","fillOpacity","ReactGA","event","category","action","label","right","Interact","e","preventDefault","stopPropagation","type","setShareModal","Modal","preventBubble","hide","setModalVisible","maxWidth","content","ShareContent","localStorage","copied","setCopied","Fragment","textAlign","FacebookShareButton","url","children","FacebookIcon","size","round","iconFillColor","TwitterShareButton","TwitterIcon","EmailShareButton","EmailIcon","RedditShareButton","RedditIcon","TelegramShareButton","TelegramIcon","WhatsappShareButton","WhatsappIcon","el","document","createElement","value","setAttribute","left","body","appendChild","select","execCommand","removeChild","Share","_id","title","Title","icon","setIcon","typeOfResource","linkOnly","whoCensored","charAt","toUpperCase","slice","subject","blockedLink","textDecoration","cursor","Post","shareModal","date","moment","format","domain","mediaLocation","public","match","open","focus","setModalResource","thumbnail","shareable","post_id","setResourcesArr","resourcesArr","count","shares","background","marginBottom","api","token","confirm","fetch","method","headers","Authorization","then","res","status","alert","catch","err","console","error","setItem","stringify","GalleryArrow","borderRadius","GalleryTab","tabs","i","pages","length","activePage","push","key","ViewPostContent","img","setImg","galleryItems","setGalleryItems","galleryHeight","setGalleryHeight","relatedLinks","relatedResources","map","resource","openInNewTab","resources","galleryItemsArr","index","toLowerCase","includes","controls","renderArrow","renderPagination","onChange","getElementById","item","offsetHeight","modifyGalleryHeight","setShareModalVisible","setModal","datePosted","dateCensored","description","post","ViewPost","shareModalVisible","DateInput","useField","field","meta","htmlFor","name","touched","FileInput","NumberInput","SelectInput","FilterInput","CheckboxInput","TextAreaInput","TextInput","Tag","selected","setSelected","tagsState","setTagsState","tagsStateMinusTag","tag","values","tags","handleChange","Tags","uniqueTags","posts","forEach","Set","FilterPosts","hidden","setHidden","filteredResources","filters","filterKeys","Object","keys","filter","val","undefined","filterObj","filteredPosts","postValid","whyFalse","postVal","filterVal","c","postValContainsItem","initialValues","validate","Posts","immutableResourcesArr","setImmutableResourcesArr","modalResource","modalVisible","a","response","json","ok","sort","b","findResource","params","log","Loading","fontSize","tagString","tagArr","split","cleanedTags","trim","resourceString","resourceArr","formatedResources","fileObj","makeResourcesArr","filesObj","readFileAsync","file","Promise","resolve","reject","reader","FileReader","onload","result","onerror","readAsDataURL","makeResourcePreviewsArr","previewArr","dataURL","marginTop","files","previews","SubmitPost","setThumbnail","setResources","resourcePreviews","setResourcePreviews","validationSchema","Yup","max","required","oneOf","Date","now","onSubmit","setSubmitting","resetForm","formData","FormData","append","formatTags","formatResources","getTime","border","padding","autoComplete","currentTarget","target","fileReader","multiple","getResourcesArrays","arrObj","flexDirection","isSubmitting","EditPost","editPost","deletePost","toString","resourceFiles","thumbExt","checked","Guidelines","DonateCustom","amount","frequency","min","setTimeout","placeholder","DonateOption","dollars","Donate","customAmount","setCustomAmount","Signup","username","email","password","passwordConfirm","matches","switchToLogin","Login","identity","color","switchToPasswordRecover","switchToSignup","Logout","removeItem","PasswordRecover","ChangePassword","changeToken","ConfirmAccountContent","loading","setLoading","confirmed","setConfirmed","ConfirmAccount","setConfirmAccount","Account","whichForm","setWhichForm","confirmAccount","change_password","confirm_token","LoggedIn","postList","setPostList","getPosts","getPostsBody","edit","SubmitTipContent","tip","handleSubmit","SubmitTip","ViewTips","tips","setTips","allTips","setAllTips","showReadTips","setShowReadTips","alterTips","tipArr","tipEls","message","removeTip","reverse","fontWeight","paddingTop","initialize","App","setDarkMode","submitTipModalVisible","setSubmitTipModalVisible","cssVars","light","backgroundColor","hoverBackgroundColor","colorSecondary","formLabelColor","modalExitBorder","linkColor","hoverFilter","dark","focusOutline","setProperty","setStorageVars","path","set","pageview","trackPage","exact","component","ReactDOM","render","StrictMode"],"mappings":"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","file":"static/js/main.987f2446.chunk.js","sourcesContent":["import React from 'react';\n\nconst AddSVG = props => {\n return (\n \n )\n}\n\nconst ArticleSVG = props => {\n return (\n \n )\n}\n\nconst NoSVG = props => {\n return (\n \n \n \n \n\n )\n}\n\nconst DarkSVG = props => {\n return (\n \n )\n}\n\nconst LightSVG = props => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst FilterSVG = props => {\n return (\n \n \n \n \n \n \n \n )\n}\n\nconst ListSVG = props => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst MoneySVG = props => {\n return (\n \n \n \n \n \n \n )\n}\n\nconst PictureSVG = props => {\n return (\n \n )\n}\n\nconst VideoSVG = props => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst WebSVG = props => {\n return (\n \n \n \n \n \n )\n}\n\nconst TweetSVG = props => {\n return (\n \n \n \n )\n}\n\nconst NavArrowSVG = props => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst UserInputSVG = props => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst RedirectSVG = props => {\n return (\n \n \n \n \n )\n}\n\nconst FacebookSVG = props => {\n return (\n \n \n \n \n )\n}\n\nexport {\n AddSVG,\n ArticleSVG,\n NoSVG,\n DarkSVG,\n LightSVG,\n FilterSVG,\n ListSVG,\n MoneySVG,\n PictureSVG,\n VideoSVG,\n WebSVG,\n TweetSVG,\n NavArrowSVG,\n UserInputSVG,\n RedirectSVG,\n FacebookSVG\n}","import React, { useState } from 'react';\nimport ReactGA from 'react-ga';\n\nimport './Header.css';\nimport useOrientation from '../../customHooks/monitorOrientation';\n\nimport { \n AddSVG, \n ArticleSVG, \n NoSVG, \n DarkSVG, \n LightSVG,\n UserInputSVG\n //MoneySVG\n} from '../../SVG';\n\nconst Hamburger = (props) => {\n return (\n
\n
\n
\n
\n
\n )\n}\n\nconst Header = props => {\n const { darkMode } = props;\n let showMenu = false;\n const loggedIn = JSON.parse(sessionStorage.getItem('loggedIn'))\n if(loggedIn){\n if(loggedIn.admin || loggedIn.moderator){\n showMenu = true;\n }\n }\n const orientation = useOrientation(1200);\n const [ menuVisible, setMenuVisible ] = useState(false);\n const iconStyle = {\n width: '18px',\n height: '18px',\n marginRight: '5px',\n position: 'relative',\n top: '3px'\n }\n const changeDarkMode = () => {\n props.toggleDarkMode(!darkMode);\n ReactGA.event({\n category: 'Dark Mode',\n action: 'Toggled Dark Mode',\n label: `Dark Mode: ${!darkMode}`\n });\n }\n return(\n
\n window.location.pathname = \"\"} id=\"header-logo\" src={darkMode? \"/faceblocked-white.png\" : \"/faceblocked-black.png\"} alt=\"\"/>\n {showMenu? \n <>\n \n setMenuVisible(!menuVisible)} />\n \n :\n
  • {darkMode? : }
  • \n }\n \n
    \n )\n}\n\nexport default Header;\n\n","import { useState, useEffect } from 'react';\n\nexport default (breakPoint) => {\n const [ orientation, setOrientation ] = useState(0);\n\n useEffect(() => {\n window.innerWidth <= breakPoint? setOrientation(0) : setOrientation(1);\n window.addEventListener('resize', () => {\n window.innerWidth <= breakPoint? setOrientation(0) : setOrientation(1);\n });\n return () => {\n window.removeEventListener('resize', () => {\n window.innerWidth <= breakPoint? setOrientation(0) : setOrientation(1);\n });\n }\n }, [orientation, breakPoint]);\n\n return orientation;\n};","import React from 'react';\n\nimport './Interact.css';\n\nconst Interact = (props) => {\n const interact = e => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n /*const api = localStorage.getItem('api');\n const domain = localStorage.getItem('domain');\n const token = sessionStorage.getItem('token');\n\n fetch(`${api}/resource/interact/${props.post_id}/${props.type}?Authorization=${token}`)\n .then(res => {\n if(res.status === 200){\n return res.json()\n }\n return false;\n })\n .then(body => {\n if(body){\n const updatedFields = Object.keys(body);\n const updatedResourceIndex = props.resourcesArr.findIndex(el => el._id === props.post_id);\n const updatedResource = props.resourcesArr[updatedResourceIndex];\n updatedFields.forEach(field => updatedResource[field] += body[field] );\n const resourcesCopy = props.resourcesArr;\n resourcesCopy[updatedResourceIndex] = {...updatedResource};\n props.setResourcesArr([...resourcesCopy]);\n if(props.setModal){\n props.setModal({visible: true, resource: updatedResource})\n }\n }\n })\n .catch(error => alert(error)); */\n if(props.type === 'shares'){\n props.setShareModal(true);\n }\n /* if(props.type === 'shares'){\n if(navigator.share){\n navigator.share({\n title: `Checkout this instance of big tech censorship`,\n url: `${domain}/posts/${props.post_id}`\n })\n .then(() => {\n console.log('Thanks for sharing')\n })\n .catch(error => console.log(error));\n } else {\n alert(`Share this link: ${domain}/posts/${props.post_id}`)\n }\n } */\n }\n return(\n \n \"\"/\n {`Share`/*props.count*/}\n \n )\n}\n \nexport default Interact;","import React from 'react';\n\nimport './Modal.css';\n\nconst Modal = props => {\n\n const preventBubble = e => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n const hide = e => {\n if(e){\n preventBubble(e);\n }\n props.setModalVisible(false);\n }\n return ( \n
    hide(e)} style={props.style}>\n
    preventBubble(e)} style={{maxWidth: props.maxWidth}}>\n
    hide(e)}>
    \n {props.content}\n
    \n
    \n );\n}\n \nexport default Modal;","import React, { useState, useEffect } from 'react';\nimport {\n EmailShareButton,\n EmailIcon,\n FacebookShareButton,\n FacebookIcon,\n RedditShareButton,\n RedditIcon,\n TelegramShareButton,\n TelegramIcon,\n TwitterShareButton,\n TwitterIcon,\n WhatsappShareButton,\n WhatsappIcon\n} from \"react-share\";\nimport ReactGA from 'react-ga';\n\nimport './Share.css';\nimport Modal from '../../Modal/Modal';\n\nconst ShareContent = (props) => {\n const darkMode = JSON.parse(localStorage.getItem('darkMode'));\n const [copied, setCopied] = useState(false);\n const copyLink = () => {\n const el = document.createElement('textarea');\n el.value = props.url;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.select();\n document.execCommand('copy');\n document.body.removeChild(el);\n setCopied(true);\n }\n return (\n \n

    Share Post

    \n
    \n } />\n } />\n } />\n } />\n } />\n } />\n
    \n \n
    \n );\n}\n\nconst Share = props => {\n useEffect(() => {\n ReactGA.event({\n category: 'Posts',\n action: `Shared post: ${props._id}`,\n label: `${props.title}`\n });\n }, [props])\n return(\n } />\n );\n}\n\nexport default Share;","import React, { useState, useEffect } from 'react';\nimport moment from 'moment';\n\nimport './Post.css';\n\nimport Interact from '../Interact/Interact';\nimport Share from '../Interact/Share';\n\nimport {\n PictureSVG,\n ArticleSVG,\n VideoSVG,\n WebSVG,\n TweetSVG,\n RedirectSVG,\n FacebookSVG\n} from '../../../SVG';\n\nconst Title = props => {\n const [ icon, setIcon ] = useState(null);\n useEffect(() => {\n const darkMode = JSON.parse(localStorage.getItem('darkMode'));\n if(props.typeOfResource){\n const { typeOfResource } = props;\n const iconStyle = {\n height: '1.1em',\n width: '1.1em',\n marginRight: '3px'\n }\n if(typeOfResource === 'article'){\n darkMode?\n setIcon()\n :\n setIcon()\n }\n if(typeOfResource === 'video'){\n setIcon()\n }\n if(typeOfResource === 'picture'){\n darkMode?\n setIcon()\n :\n setIcon()\n }\n if(typeOfResource === 'post'){\n darkMode?\n setIcon()\n :\n setIcon()\n }\n if(typeOfResource === 'website'){\n setIcon()\n }\n if(typeOfResource === 'tweet'){\n setIcon()\n }\n if(typeOfResource === 'fbpage'){\n setIcon()\n }\n if(props.linkOnly){\n setIcon()\n }\n }\n }, [props])\n const title = props.title? props.title : `${props.whoCensored.charAt(0).toUpperCase() + props.whoCensored.slice(1)} censors ${props.subject} ${props.typeOfResource}`\n return (\n

    \n {icon}\n {props.linkOnly? {title} : title}\n

    \n )\n}\n\nconst Post = (props) => {\n const [ shareModal, setShareModal ] = useState(false);\n const date = moment(props.date, 'x').format(\"MMM. D, YYYY\");\n const domain = localStorage.getItem('domain');\n const mediaLocation = localStorage.getItem('mediaLocation');\n const openInNewTab = url => {\n if (!url.match(/^https?:\\/\\//i)) {\n url = 'http://' + url;\n }\n const win = window.open(`${url}`, '_blank');\n win.focus();\n }\n const setModalAndMakeVisible = () => {\n if(props.linkOnly && props.public){\n openInNewTab(props.blockedLink)\n } else {\n props.setModalResource({...props});\n props.setModalVisible(true);\n }\n }\n const deletePost = (e) => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n \n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n const confirmed = window.confirm('Are you sure you want to delete this post?');\n if(!confirmed){\n return;\n }\n fetch(`${api}/resource/${props._id}`, {\n method: 'DELETE',\n headers: {\n Authorization: token\n }\n })\n .then(res => {\n if(res.status !== 200){\n alert('Auth failed...')\n }\n\n alert(\"Deleted!\");\n window.location.pathname = '/posts';\n })\n .catch(err => console.error(err));\n }\n const goEditPost = e => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n localStorage.setItem('editPost', JSON.stringify({...props}));\n window.location.pathname = '/edit-post';\n }\n const loggedIn = JSON.parse(sessionStorage.getItem('loggedIn')) || { admin: false, moderator: false };\n return (\n
    \n {props.thumbnail?\n
    \n \n
    \n :\n null\n }\n \n \n <p className=\"post-details\">{date}{props.shareable?\n <Interact setShareModal={setShareModal} post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} type=\"shares\" count={props.shares} />\n :\n null\n }{/* <span className=\"post-bullet\">•</span>{props.creator_username} */}\n </p>\n <p className=\"post-details\">\n {/* <Interact post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} type=\"upvotes\" count={props.upvotes} />\n <Interact post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} type=\"downvotes\" count={props.downvotes} /> */}\n </p>\n {shareModal?\n <Share url={`${domain}/posts/${props._id}`} setShareModal={setShareModal} {...props} />\n :\n null\n }\n {props.linkOnly?\n loggedIn.admin || loggedIn.moderator?\n <>\n <button className=\"form-button\" style={{background: 'red', marginBottom: '0px'}} onClick={deletePost}>Delete this link</button>\n <button className=\"form-button\" style={{marginBottom: '10px'}} onClick={goEditPost}>Edit this post</button>\n </>\n :\n null\n :\n null\n }\n </div>\n\n )\n}\n\nexport default Post;\n\n","import React, { useState, useEffect } from 'react';\nimport moment from 'moment';\nimport ReactGA from 'react-ga';\nimport Carousel from 'react-elastic-carousel';\n\nimport './ViewPost.css';\n\nimport Interact from '../Interact/Interact';\nimport Share from '../Interact/Share';\nimport Modal from '../../Modal/Modal';\nimport { NavArrowSVG } from '../../../SVG';\n\nconst GalleryArrow = props => {\n const style = {\n borderRadius: '100px', \n top: '50%', \n position: 'relative',\n transform: `${props.type === 'NEXT'? 'rotate(180deg)' : null}`,\n cursor: 'pointer'\n }\n return(\n <div onClick={props.onClick}>\n <NavArrowSVG width=\"20px\" height='20px' fill=\"grey\" style={style} />\n </div>\n )\n}\n\nconst GalleryTab = props => {\n let tabs = [];\n for(let i = 0; i < props.pages.length; i++){\n if(props.activePage === i){\n tabs.push(\n <div key={i} className='gallery-tab gallery-tab-active' />\n )\n } else {\n tabs.push(\n <div key={i} className='gallery-tab' />\n )\n }\n }\n return (\n <span id='gallery-tabs-container'>\n {tabs}\n </span>\n )\n}\n\nconst ViewPostContent = props => {\n const [img, setImg] = useState(null);\n const [galleryItems, setGalleryItems] = useState(null);\n const [galleryHeight, setGalleryHeight] = useState(null);\n const loggedIn = JSON.parse(sessionStorage.getItem('loggedIn')) || { admin: false, moderator: false };\n let relatedLinks = [];\n if(props.relatedResources.length > 0){\n relatedLinks = props.relatedResources.map(resource => <div className=\"view-post-link\" onClick={() => openInNewTab(resource)} key={resource}>{resource}</div>)\n }\n\n useEffect(() => {\n const mediaLocation = localStorage.getItem('mediaLocation');\n if (props.resources) {\n let galleryItemsArr = props.resources.map((resource, index) => {\n switch(true){\n case resource.toLowerCase().includes('jpg'): return <img id={`media-${index}`} key={resource} className=\"view-post-media\" src={`https://api.faceblocked.com/media/${resource}`} alt='' />;\n case resource.toLowerCase().includes('png'): return <img id={`media-${index}`} key={resource} className=\"view-post-media\" src={`https://api.faceblocked.com/media/${resource}`} alt='' />;\n case resource.toLowerCase().includes('svg'): return <img id={`media-${index}`} key={resource} className=\"view-post-media\" src={`https://api.faceblocked.com/media/${resource}`} alt='' />;\n case resource.toLowerCase().includes('gif'): return <img id={`media-${index}`} key={resource} className=\"view-post-media\" src={`https://api.faceblocked.com/media/${resource}`} alt='' />;\n default: return <video id={`media-${index}`} key={resource} className=\"view-post-media\" src={`https://api.faceblocked.com/media/${resource}`} controls />\n }\n });\n setGalleryItems(galleryItemsArr);\n } else if (props.thumbnail) {\n setImg(`${mediaLocation}/${props.thumbnail}`)\n }\n }, [props])\n\n const preventBubble = e => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n const goEditPost = e => {\n preventBubble(e);\n localStorage.setItem('editPost', JSON.stringify(props.post));\n window.location.pathname = '/edit-post';\n }\n\n const openInNewTab = url => {\n if (!url.match(/^https?:\\/\\//i)) {\n url = 'http://' + url;\n }\n const win = window.open(`${url}`, '_blank');\n win.focus();\n }\n\n const modifyGalleryHeight = props => {\n let height = document.getElementById(props.item.id).offsetHeight;\n setGalleryHeight(height + 20);\n }\n\n return (\n <React.Fragment>\n {img ?\n <img className=\"view-post-media\" src={img} alt=\"\" />\n :\n null\n }\n {galleryItems?\n galleryItems.length > 1?\n <Carousel renderArrow={GalleryArrow} renderPagination={GalleryTab} onChange={(props) => modifyGalleryHeight(props)} style={galleryHeight? {height: `${galleryHeight}px`}: null} >\n {galleryItems}\n </Carousel>\n :\n <>\n {galleryItems}\n </>\n :\n null\n }\n {props.linkOnly && !props.public?\n <p style={{marginBottom: '15px'}}>* once public this post will open a new tab with the link, not open a modal window. The title will be the display text and will hyperlink to the specified URL.</p>\n :\n null\n }\n <h1 id=\"view-post-title\">{props.title}</h1>\n {/* <Interact post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} setModal={props.setModal} type=\"upvotes\" count={props.upvotes} />\n <Interact post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} setModal={props.setModal} type=\"downvotes\" count={props.downvotes} />*/}\n {props.shareable ?\n <Interact setShareModal={props.setShareModalVisible} post_id={props._id} setResourcesArr={props.setResourcesArr} resourcesArr={props.resourcesArr} setModal={props.setModal} type=\"shares\" count={props.shares} />\n :\n null\n }\n {props.blockedLink ?\n props.linkOnly?\n <>\n <p className=\"view-post-sub-title\">{props.public? 'Link to view in case your browser blocked a popup' : 'Link that users will be redirected to:'}</p>\n <div className=\"view-post-link\" onClick={() => openInNewTab(props.blockedLink)}>{props.blockedLink}</div>\n </>\n :\n <>\n <p className=\"view-post-sub-title\">Go to blocked post:</p>\n <div className=\"view-post-link\" onClick={() => openInNewTab(props.blockedLink)}>{props.blockedLink}</div>\n </>\n : \n null\n }\n {relatedLinks.length > 0 ?\n <>\n <p className=\"view-post-sub-title\">Related resource{relatedLinks.length > 1? 's' : null}:</p>\n {relatedLinks}\n </>\n :\n null\n }\n {props.datePosted ?\n <>\n <p className=\"view-post-sub-title\">Date posted:</p>\n <div className=\"view-post-date\">{moment(props.datePosted, 'x').format(\"MMM D, YYYY\")}</div>\n </>\n :\n null\n }\n {props.dateCensored ?\n <>\n <p className=\"view-post-sub-title\">Date censored:</p>\n <div className=\"view-post-date\">{moment(props.dateCensored, 'x').format(\"MMM D, YYYY\")}</div>\n </>\n :\n null\n }\n {props.description? \n <>\n <p className=\"view-post-sub-title\">Description:</p>\n <p className=\"view-post-description\">{props.description}</p>\n </>\n :\n null\n }\n {loggedIn.admin || loggedIn.moderator ?\n <button id=\"view-post-edit-button\" onClick={goEditPost}>{props.public ? `Edit this post` : `Edit/publish this post`}</button>\n :\n null\n }\n </React.Fragment>\n )\n}\n\n\nconst ViewPost = (props) => {\n const [ shareModalVisible, setShareModalVisible ] = useState(false);\n useEffect(() => {\n ReactGA.event({\n category: 'Posts',\n action: `Viewed post: ${props._id}`,\n label: `${props.title}`\n });\n }, [props])\n const domain = localStorage.getItem('domain');\n return (\n <React.Fragment>\n <Modal setModalVisible={props.setModalVisible} maxWidth='600px' content={<ViewPostContent setShareModalVisible={setShareModalVisible} shareable={true} {...props} />} />\n {shareModalVisible?\n <Share url={`${domain}/posts/${props._id}`} setShareModal={setShareModalVisible} {...props} />\n :\n null\n }\n </React.Fragment>\n );\n}\n\nexport default ViewPost;","import React from 'react';\nimport { useField } from 'formik';\n\nconst DateInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <input className=\"form-input\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst FileInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <input className=\"form-input file-input\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst NumberInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <input className=\"form-input\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst SelectInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <select className=\"form-input\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst FilterInput = ({ label, ...props }) => {\n const [field] = useField(props);\n return (\n <>\n <select {...field} {...props} />\n </>\n )\n}\n\nconst CheckboxInput = ({ children, ...props }) => {\n const [field, meta] = useField(props, 'checkbox');\n return (\n <>\n <label className=\"form-label\" style={props.style}>\n <input type=\"checkbox\" {...field} {...props} />\n {children}\n </label>\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst TextAreaInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <textarea className=\"form-textarea\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nconst TextInput = ({ label, ...props }) => {\n const [field, meta] = useField(props);\n return (\n <>\n <label className=\"form-label\" htmlFor={props.id || props.name}>{label}</label>\n <input className=\"form-input\" {...field} {...props} />\n {meta.touched && meta.error ? (\n <div className=\"form-error\">{meta.error}</div>\n ) : null}\n </>\n )\n}\n\nexport {\n TextInput,\n TextAreaInput,\n CheckboxInput,\n SelectInput,\n NumberInput,\n FileInput,\n DateInput,\n FilterInput\n}","import React, { useState, useEffect } from 'react';\nimport { Formik, Form } from 'formik';\n\nimport { FilterInput } from '../../FormComponents/FormComponents';\nimport './FilterPosts.css';\nimport { FilterSVG } from '../../../SVG';\nimport filter from '../../../functions/filterPosts';\n\nconst Tag = props => {\n const [selected, setSelected] = useState(false);\n\n const handleClick = e => {\n const { tagsState, setTagsState } = props;\n if (selected) {\n let tagsStateMinusTag = [];\n for (let i = 0; i < tagsState.length; i++) {\n if (tagsState[i] !== props.tag) {\n tagsStateMinusTag.push(tagsState[i])\n }\n }\n props.values.tags = tagsStateMinusTag;\n setTagsState(tagsStateMinusTag);\n } else {\n tagsState.push(props.tag);\n setTagsState(tagsState);\n props.values.tags = tagsState;\n }\n setSelected(!selected);\n props.handleChange(props.values);\n }\n\n return (\n <span className={selected ? 'tag-button selected-button' : 'tag-button'} onClick={handleClick}>{props.tag}</span>\n )\n}\n\nconst Tags = props => {\n let uniqueTags = [];\n if(props.posts){\n props.posts.forEach(post => post.tags.forEach(tag => uniqueTags.push(tag)));\n }\n uniqueTags = [...new Set(uniqueTags)];\n const tags = uniqueTags.map(tag => <Tag tag={tag} key={tag} setTagsState={props.setTagsState} tagsState={[...props.tagsState]} {...props} />)\n return (\n <div id=\"tags-container\" className={props.className}>\n {tags}\n </div>\n )\n}\n\nconst FilterPosts = props => {\n const [hidden, setHidden] = useState(false);\n const [tagsState, setTagsState] = useState([]);\n /* let posts = JSON.parse(localStorage.getItem('resourcesArr'));\n if(!posts){\n posts = props.posts\n } */\n let { posts } = props;\n const handleChange = values => {\n const filteredResources = filter(posts, values);\n props.setResourcesArr(filteredResources);\n }\n\n useEffect(() => {\n if (window.innerWidth <= 740) {\n setHidden(true);\n } else if(window.innerWidth > 740) {\n setHidden(false);\n }\n }, [])\n return (\n <div id=\"filter-posts-container\">\n <div id=\"filter-posts-toggle-container\">\n <span className=\"clickable\" onClick={() => setHidden(!hidden)}>\n <FilterSVG fill=\"grey\" style={{ width: '25px', height: '25px' }} />\n <p>Filter</p>\n </span>\n </div>\n <Formik\n initialValues={{\n whoCensored: '',\n typeOfResource: '',\n tags: tagsState\n }}\n validate={handleChange}\n >\n {props => (\n <Form id=\"filter-posts-form\" style={hidden? {display: \"none\"} : null}>\n <FilterInput className=\"filter-posts-select\" name=\"whoCensored\" type=\"select\">\n <option value=\"\">Who Censored</option>\n <option value=\"facebook\">Facebook</option>\n <option value=\"twitter\">Twitter</option>\n <option value=\"youtube\">YouTube</option>\n <option value=\"google\">Google</option>\n </FilterInput>\n <FilterInput className=\"filter-posts-select\" name=\"typeOfResource\" type=\"select\">\n <option value=\"\">Type of Resource</option>\n <option value=\"article\">Article</option>\n <option value=\"video\">Video</option>\n <option value=\"picture\">Picture</option>\n <option value=\"post\">Post</option>\n <option value=\"website\">Website/URL</option>\n <option value=\"tweet\">Tweet</option>\n <option value=\"fbpage\">Facebook Page</option>\n </FilterInput>\n <Tags className={hidden ? 'hidden' : null} setTagsState={setTagsState} tagsState={[...tagsState]} handleChange={handleChange} values={props.values} posts={posts} />\n </Form>\n )}\n </Formik>\n </div>\n );\n}\n\nexport default FilterPosts;","import ReactGA from 'react-ga';\n\nexport default (posts, filters) => {\n let filterKeys = Object.keys(filters).filter(key => {\n let val = filters[key];\n if(val === '' || val === {} || val === [] || val === null || val === undefined){\n return false;\n }\n return true;\n });\n\n const filterObj = {};\n filterKeys.forEach(key => {\n filterObj[key] = filters[key]\n });\n ReactGA.event({\n category: 'Posts',\n action: `Filtered Posts`,\n label: `${JSON.stringify(filterObj)}`\n });\n\n let filteredPosts = [];\n\n for(let i = 0; i < posts.length; i++){\n let post = posts[i];\n let postValid = true;\n let whyFalse = {\n postVal: null,\n filterVal: null\n }\n\n for(let c = 0; c < filterKeys.length; c++){\n if(!postValid){\n break;\n }\n let key = filterKeys[c];\n let val = filters[key];\n if(typeof val === 'object' && val.length > 0){\n let postValContainsItem = false;\n for(let count = 0; count < val.length; count++){\n let item = val[count];\n if(post[key].includes(item)){\n postValContainsItem = true;\n }\n if(postValContainsItem){\n break;\n }\n }\n if(!postValContainsItem){\n postValid = false;\n whyFalse.postVal = post[key];\n whyFalse.filterVal = val;\n }\n } else if(typeof val !== 'object'){\n if(post[key] !== val){\n postValid = false;\n whyFalse.postVal = post[key];\n whyFalse.filterVal = val;\n }\n }\n }\n\n if(postValid){\n filteredPosts.push(post);\n }\n }\n return filteredPosts;\n}","import React, { useState, useEffect } from 'react';\n\nimport './Posts.css';\nimport Post from './Post/Post';\nimport ViewPost from './ViewPost/ViewPost';\nimport FilterPosts from './FilterPosts/FilterPosts';\n\nconst Posts = (props) => {\n const [ resourcesArr, setResourcesArr ] = useState([]);\n const [ immutableResourcesArr, setImmutableResourcesArr ] = useState([]);\n const [ modalResource, setModalResource ] = useState(null);\n const [modalVisible, setModalVisible] = useState(false);\n const api = localStorage.getItem('api');\n const openInNewTab = url => {\n if (!url.match(/^https?:\\/\\//i)) {\n url = 'http://' + url;\n }\n const win = window.open(`${url}`, '_blank');\n win.focus();\n }\n useEffect(() => {\n (async () => {\n try {\n const response = await fetch(`${api? api : 'https://api.faceblocked.com'}/resource/all`);\n const body = await response.json();\n if(response.ok && body){\n body.sort((a, b) => {\n if(a.date < b.date) {\n return 1;\n }\n\n return -1;\n })\n setResourcesArr(body);\n setImmutableResourcesArr(body);\n localStorage.setItem('resourcesArr', JSON.stringify(body));\n const findResource = (resources, id) => {\n for(let i = 0; i < resources.length; i++){\n if(resources[i]._id === id){\n return resources[i];\n }\n }\n }\n if(props.match.params.post_id){\n const resource = findResource(body, props.match.params.post_id);\n if(resource.linkOnly){\n setModalResource(resource);\n setModalVisible(true);\n openInNewTab(resource.blockedLink)\n \n } else {\n setModalResource(resource);\n setModalVisible(true);\n }\n }\n } else {\n console.log('failure')\n }\n } catch (error) {\n console.log(error)\n }\n })()\n }, [api, props])\n let posts = null;\n posts = resourcesArr.map(post => <Post shareable={true} post={post} setResourcesArr={setResourcesArr} resourcesArr={resourcesArr} setModalVisible={setModalVisible} setModalResource={setModalResource} key={post._id} {...post} />);\n return( \n <React.Fragment>\n {modalVisible?\n <ViewPost \n resourcesArr={resourcesArr}\n {...modalResource}\n title={modalResource.title? modalResource.title : `${modalResource.whoCensored.charAt(0).toUpperCase() + modalResource.whoCensored.slice(1)} censors ${modalResource.subject} ${modalResource.typeOfResource}`}\n setModalVisible={setModalVisible}\n setResourcesArr={setResourcesArr}\n />\n :\n null\n }\n <FilterPosts setResourcesArr={setResourcesArr} posts={immutableResourcesArr} />\n {posts}\n </React.Fragment>\n )\n}\n\nexport default Posts;","import React from 'react';\n\nimport './Loading.css';\n\nconst Loading = props => {\n const i = '--i';\n return ( \n <div id=\"loading\" style={{fontSize: props.fontSize}}>\n <span style={{[i]: '1'}}>L</span>\n <span style={{[i]: '2'}}>o</span>\n <span style={{[i]: '3'}}>a</span>\n <span style={{[i]: '4'}}>d</span>\n <span style={{[i]: '5'}}>i</span>\n <span style={{[i]: '6'}}>n</span>\n <span style={{[i]: '7'}}>g</span>\n <span style={{[i]: '8'}}>.</span>\n <span style={{[i]: '9'}}>.</span>\n <span style={{[i]: '10'}}>.</span>\n </div>\n );\n}\n \nexport default Loading;","export default tagString => {\n let tagArr = tagString.split(',');\n let cleanedTags = [];\n tagArr.forEach(tag => {\n tag = tag.trim()\n //tag = tag.replace(/[^a-zA-Z0-9 ]/g, '')\n if(tag.length < 1){\n return;\n }\n if(tag.length === 1 && tag.charAt(0) === '#'){\n return;\n }/* \n if(tag.charAt(0) === '#'){\n cleanedTags.push(tag.slice(1, tag.length));\n return;\n } */\n cleanedTags.push(tag);\n })\n return cleanedTags;\n}","export default resourceString => {\n let resourceArr = resourceString.split(',');\n let formatedResources = [];\n resourceArr.forEach(resource => {\n resource = resource.trim()\n if(resource.length < 5){\n return;\n }\n formatedResources.push(resource);\n })\n return formatedResources;\n}","import React from 'react';\n\nexport default async fileObj => {\n const makeResourcesArr = (filesObj) => {\n const keys = Object.keys(filesObj);\n return keys.map(key => filesObj[key]);\n }\n\n const readFileAsync = file => {\n return new Promise((resolve, reject) => {\n let reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result);\n };\n\n reader.onerror = reject;\n\n reader.readAsDataURL(file);\n })\n }\n \n const makeResourcePreviewsArr = async function(filesObj){\n try {\n let previewArr = [];\n const keys = Object.keys(filesObj); \n for(const key of keys){\n let dataURL = await readFileAsync(filesObj[key]);\n let el;\n if(dataURL.includes('image')){\n el = <img key={dataURL} src={dataURL} alt=\"\" style={{maxWidth: '80px', height: 'auto', marginTop: '5px', marginRight: '5px', display: 'inline-block'}} />\n }\n if(dataURL.includes('video')){\n el = <video controls key={dataURL} src={dataURL} alt=\"\" style={{maxWidth: '200px', height: 'auto', marginTop: '5px', marginRight: '5px', display: 'inline-block'}} />\n }\n previewArr.push(el)\n }\n return previewArr;\n } catch (error) {\n alert('Error adding files...')\n }\n }\n\n let files = makeResourcesArr(fileObj);\n let previews = await makeResourcePreviewsArr(fileObj)\n\n return { files, previews };\n}","import React, { useState } from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { TextInput, TextAreaInput, CheckboxInput, SelectInput, FileInput, DateInput } from '../FormComponents/FormComponents';\nimport Loading from '../Loading/Loading';\nimport formatTags from '../../functions/formatTags';\nimport formatResources from '../../functions/formatResources';\nimport getResourcesArrays from '../../functions/getResourcesArrays';\n\nconst SubmitPost = () => {\n const [ thumbnail, setThumbnail ] = useState(null);\n const [ resources, setResources ] = useState(null);\n const [ resourcePreviews, setResourcePreviews ] = useState([]);\n return (\n <Formik\n initialValues={{\n title: '',\n description: '',\n whoCensored: '',\n typeOfResource: '',\n subject: '',\n blockedLink: '',\n relatedResources: '',\n datePosted: '',\n dateCensored: '',\n linkOnly: false,\n }}\n validationSchema={Yup.object({\n title: Yup.string()\n .max(100, 'Title must be less than 100 characters long')\n .required('Required'),\n description: Yup.string(),\n whoCensored: Yup.string(),\n typeOfResource: Yup.string()\n .oneOf(['article', 'video', 'picture', 'post', 'website', 'tweet', 'fbpage'], 'Invalid selection')\n .required('Required'),\n tags: Yup.string()\n .max(500, 'Tags must not exceed 500 characters'),\n blockedLink: Yup.string(),\n relatedResources: Yup.string(),\n datePosted: Yup.date()\n .max(new Date(Date.now()), \"The date must be today or before\"),\n dateCensored: Yup.date()\n .max(new Date(Date.now()), \"The date must be today or before\"),\n linkOnly: Yup.boolean()\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n let formData = new FormData();\n setSubmitting(true);\n formData.append('title', values.title)\n formData.append('description', values.description)\n formData.append('whoCensored', values.whoCensored)\n formData.append('typeOfResource', values.typeOfResource)\n if(values.tags){formData.append('tags', JSON.stringify(formatTags(values.tags)))}\n formData.append('blockedLink', values.blockedLink)\n formData.append('relatedResources', JSON.stringify(formatResources(values.relatedResources)))\n formData.append('linkOnly', values.linkOnly)\n if(thumbnail){\n formData.append('thumbnail', thumbnail)\n }\n if(resources){\n const keys = Object.keys(resources);\n for(let i = 0; i < keys.length; i++){\n formData.append('resources', resources[i]);\n }\n }\n if(values.datePosted){\n formData.append('datePosted', new Date(values.datePosted).getTime())\n }\n if(values.dateCensored){\n formData.append('dateCensored', new Date(values.dateCensored).getTime())\n }\n fetch(`${api}/resource/submit-report`, {\n method: 'POST',\n headers: {\n 'Authorization': token\n },\n body: formData\n })\n .then(response => {\n setSubmitting(false);\n if(response.status === 401){\n return alert('You must be logged in to post')\n }\n //window.location.pathname = '/logged-in'\n })\n .catch(error => {\n alert(error)\n setSubmitting(false)\n });\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Report an Instance of Censorship</h1>\n <CheckboxInput name=\"linkOnly\" style={{border: 'var(--border)', padding: '10px 5px', borderRadius: '3px'}}>\n This is just a useful link I want to share\n </CheckboxInput>\n <TextInput label={props.values.linkOnly? \"Text to display\" : \"Title\"} name=\"title\" type=\"text\" autoComplete=\"off\" />\n {props.values.linkOnly?\n null\n :\n <SelectInput label=\"Who censored the resource?\" name=\"whoCensored\" type=\"select\">\n <option value=\"\"></option>\n <option value=\"facebook\">Facebook</option>\n <option value=\"twitter\">Twitter</option>\n <option value=\"youtube\">YouTube</option>\n <option value=\"google\">Google</option>\n </SelectInput>\n }\n <SelectInput label={props.values.linkOnly? \"What type of resource is found at the URL?\" : \"What type of resource was it?\"} name=\"typeOfResource\" type=\"select\">\n <option value=\"\"></option>\n <option value=\"article\">Article</option>\n <option value=\"video\">Video</option>\n <option value=\"picture\">Picture</option>\n <option value=\"post\">Post</option>\n <option value=\"website\">Website/URL</option>\n <option value=\"tweet\">Tweet</option>\n <option value=\"fbpage\">Facebook Page</option>\n </SelectInput>\n <TextInput label={props.values.linkOnly? \"Paste the link here\" : \"Link to BLOCKED post\"} name=\"blockedLink\" type=\"text\" />\n {props.values.linkOnly?\n null\n :\n <>\n <TextAreaInput label=\"Link(s) to related resources (separate with commas)\" name=\"relatedResources\" type=\"textarea\" style={{height: '35px'}} />\n <DateInput label=\"Original post date\" name=\"datePosted\" type=\"date\" />\n <DateInput label=\"Date post was censored\" name=\"dateCensored\" type=\"date\" />\n <FileInput label=\"Thumbnail image\" name=\"thumbnail\" type=\"file\" id=\"thumbnail-file\" onChange={event => {\n setThumbnail(event.currentTarget.files[0]);\n if(event.target.files[0]){\n const fileReader = new FileReader();\n fileReader.onload = () => {\n document.getElementById('thumbnail-preview').src = fileReader.result;\n }\n fileReader.readAsDataURL(event.target.files[0]);\n } else {\n document.getElementById('thumbnail-preview').src = '/images/thumbnail.jpg';\n }\n }} />\n <img id=\"thumbnail-preview\" src=\"/images/thumbnail.jpg\" alt=\"\" style={{maxWidth: '200px', height: 'auto', marginTop: '5px'}} />\n <FileInput label=\"Resource(s)\" name=\"resources\" type=\"file\" id=\"resource-files\" multiple onChange={async event => {\n try {\n if(event.target.files){\n setResources(event.target.files);\n let arrObj = await getResourcesArrays(event.target.files);\n setResourcePreviews(arrObj.previews);\n } else {\n setResourcePreviews([]);\n setResources(null);\n }\n } catch (error) {\n alert('error adding files')\n }\n }} />\n <span style={{flexDirection: 'row'}}>\n {resourcePreviews}\n </span>\n </>\n }\n <TextAreaInput label=\"Description\" name=\"description\" type=\"textarea\" />\n <TextAreaInput label=\"Tags (separate with commas)\" name=\"tags\" type=\"textarea\" style={{height: '35px'}} />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n\n </Formik>\n );\n}\n\nexport default SubmitPost;","import React, { useState } from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport moment from 'moment';\n\nimport { TextInput, SelectInput, FileInput, DateInput, TextAreaInput, CheckboxInput } from '../FormComponents/FormComponents';\nimport Loading from '../Loading/Loading';\nimport formatTags from '../../functions/formatTags';\nimport formatResources from '../../functions/formatResources';\nimport getResourcesArrays from '../../functions/getResourcesArrays';\n\n\nconst EditPost = () => {\n const [ thumbnail, setThumbnail ] = useState(null);\n const [ resources, setResources ] = useState(null);\n const [ resourcePreviews, setResourcePreviews ] = useState([]);\n const editPost = JSON.parse(localStorage.getItem('editPost'));\n const mediaLocation = localStorage.getItem('mediaLocation');\n\n const deletePost = (e) => {\n if(e){\n e.preventDefault();\n e.stopPropagation();\n }\n \n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n const confirmed = window.confirm('Are you sure you want to delete this post?');\n if(!confirmed){\n return;\n }\n fetch(`${api}/resource/${editPost._id}`, {\n method: 'DELETE',\n headers: {\n Authorization: token\n }\n })\n .then(res => {\n if(res.status !== 200){\n alert('Auth failed...')\n }\n\n alert(\"Deleted!\");\n window.location.pathname = '/posts';\n })\n .catch(err => console.error(err));\n }\n \n return (\n <Formik\n initialValues={{\n title: editPost.title,\n description: editPost.description? editPost.description : '',\n whoCensored: editPost.whoCensored,\n typeOfResource: editPost.typeOfResource,\n tags: editPost.tags.toString(),\n blockedLink: editPost.blockedLink,\n relatedResources: editPost.relatedResources.toString(),\n datePosted: editPost.datePosted? moment(editPost.datePosted, 'x').format(\"YYYY-MM-DD\") : '',\n dateCensored: editPost.dateCensored? moment(editPost.dateCensored, 'x').format(\"YYYY-MM-DD\") : '',\n resourceFiles: editPost.resources? editPost.resources : [],\n linkOnly: editPost.linkOnly\n }}\n validationSchema={Yup.object({\n title: Yup.string()\n .max(100, 'Title must be less than 100 characters long')\n .required('Required'),\n description: Yup.string(),\n whoCensored: Yup.string(),\n typeOfResource: Yup.string()\n .oneOf(['article', 'video', 'picture', 'post', 'website', 'tweet', 'fbpage'], 'Invalid selection')\n .required('Required'),\n tags: Yup.string()\n .max(500, 'Tags must not exceed 500 characters'),\n blockedLink: Yup.string(),\n relatedResources: Yup.string(),\n datePosted: Yup.date()\n .max(new Date(Date.now()), \"The date must be today or before\"),\n dateCensored: Yup.date()\n .max(new Date(Date.now()), \"The date must be today or before\"),\n linkOnly: Yup.boolean()\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n let formData = new FormData();\n\n setSubmitting(true);\n formData.append('title', values.title)\n formData.append('description', values.description)\n formData.append('whoCensored', values.whoCensored)\n formData.append('typeOfResource', values.typeOfResource)\n if(values.tags){formData.append('tags', JSON.stringify(formatTags(values.tags)))}\n formData.append('blockedLink', values.blockedLink)\n formData.append('relatedResources', JSON.stringify(formatResources(values.relatedResources)))\n formData.append('resourcesArr', values.resourceFiles);\n formData.append('linkOnly', values.linkOnly);\n if(values.datePosted){\n formData.append('datePosted', new Date(values.datePosted).getTime())\n }\n if(values.dateCensored){\n formData.append('dateCensored', new Date(values.dateCensored).getTime())\n }\n if(thumbnail){\n formData.append('thumbnail', thumbnail);\n }\n if(resources){\n const keys = Object.keys(resources);\n for(let i = 0; i < keys.length; i++){\n formData.append('resources', resources[i]);\n }\n }\n const thumbExt = editPost.thumbnail? editPost.thumbnail.split('.')[1] : null;\n formData.append('thumbFileExt', thumbExt)\n fetch(`${api}/resource/publish-report/${editPost._id}`, {\n method: 'POST',\n headers: {\n 'Authorization': token\n },\n body: formData\n })\n .then(res => {\n setSubmitting(false);\n if(res.status !== 200){\n alert('something went wrong')\n return;\n }\n window.location.pathname = '/posts'\n })\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Edit Post</h1>\n <CheckboxInput name=\"linkOnly\" style={{border: 'var(--border)', padding: '10px 5px', borderRadius: '3px'}} checked={props.values.linkOnly}>\n This is just a useful link I want to share\n </CheckboxInput>\n <TextInput label={props.values.linkOnly? 'Display text for link' : \"Title\"} name=\"title\" type=\"text\" autoComplete=\"off\" />\n {props.values.linkOnly?\n null\n :\n <SelectInput label=\"Who censored the resource?\" name=\"whoCensored\" type=\"select\">\n <option value=\"\"></option>\n <option value=\"facebook\">Facebook</option>\n <option value=\"twitter\">Twitter</option>\n <option value=\"youtube\">YouTube</option>\n <option value=\"google\">Google</option>\n </SelectInput>\n }\n <SelectInput label={props.values.linkOnly? \"What type of resource is found at the URL?\" : \"What type of resource was it?\"} name=\"typeOfResource\" type=\"select\">\n <option value=\"\"></option>\n <option value=\"article\">Article</option>\n <option value=\"video\">Video</option>\n <option value=\"picture\">Picture</option>\n <option value=\"post\">Post</option>\n <option value=\"website\">Website/URL</option>\n <option value=\"tweet\">Tweet</option>\n <option value=\"fbpage\">Facebook Page</option>\n </SelectInput>\n <TextInput label={props.values.linkOnly? 'Paste the link here' : \"Link to BLOCKED post\"} name=\"blockedLink\" type=\"text\" />\n {props.values.linkOnly?\n null\n :\n <>\n <TextAreaInput label=\"Link(s) to related resources (separate with commas)\" name=\"relatedResources\" type=\"textarea\" style={{height: '35px'}} /> <DateInput label=\"Original post date\" name=\"datePosted\" type=\"date\" />\n <DateInput label=\"Date post was censored\" name=\"dateCensored\" type=\"date\" />\n <FileInput label=\"Thumbnail image(Only add if you wish to change current)\" name=\"thumbnail\" type=\"file\" id=\"thumbnail-file\" onChange={event => {\n setThumbnail(event.currentTarget.files[0]? event.currentTarget.files[0] : null);\n if(event.target.files[0]){\n const fileReader = new FileReader();\n fileReader.onload = () => {\n document.getElementById('thumbnail-preview').src = fileReader.result;\n }\n fileReader.readAsDataURL(event.target.files[0]);\n } else if(editPost.thumbnail){\n document.getElementById('thumbnail-preview').src = `${mediaLocation}/${editPost.thumbnail}`\n } else {\n document.getElementById('thumbnail-preview').src = '/images/thumbnail.jpg';\n }\n }} />\n <img id=\"thumbnail-preview\" src={editPost.thumbnail? `${mediaLocation}/${editPost.thumbnail}` : '/images/thumbnail.jpg'} alt=\"\" style={{maxWidth: '200px', height: 'auto', marginTop: '5px'}} />\n <FileInput label=\"Resource(s)\" name=\"resources\" type=\"file\" id=\"resource-files\" multiple onChange={async event => {\n try {\n if(event.target.files){\n setResources(event.target.files);\n let arrObj = await getResourcesArrays(event.target.files);\n setResourcePreviews(arrObj.previews);\n } else {\n setResourcePreviews([]);\n setResources(null);\n }\n } catch (error) {\n alert('error adding files')\n }\n }} />\n <span style={{flexDirection: 'row'}}>\n {resourcePreviews}\n </span>\n </>\n }\n <TextAreaInput label=\"Description\" name=\"description\" type=\"textarea\" />\n <TextAreaInput label=\"Tags\" name=\"tags\" type=\"textarea\" style={{height: '35px'}} />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Publish'}</button>\n <button className=\"form-button\" style={{background: 'red', marginTop: '25px'}} onClick={deletePost}>Delete!</button>\n {/* <FileInput label=\"Resource file\" name=\"resource\" type=\"file\" id=\"resource-file\" onChange={event => {\n setResource(event.currentTarget.files[0]);\n }}/> */}\n </Form>\n )}\n\n </Formik>\n );\n}\n\nexport default EditPost;","import React from 'react';\n\nimport './Guidelines.css';\n\nconst Guidelines = () => {\n return ( \n <div id=\"guidelines-container\">\n <ul className=\"guidelines-ul\">\n <p className=\"guidelines-title\">We do things because of that</p>\n <li className=\"guidelines-li\">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.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.</li>\n <li className=\"guidelines-li\">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do</li>\n <li className=\"guidelines-li\">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</li>\n <li className=\"guidelines-li\">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.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.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.</li>\n <p className=\"guidelines-section-title\">Some things we do for other reasons</p>\n <li className=\"guidelines-li\">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do</li>\n <li className=\"guidelines-li\">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</li>\n <li className=\"guidelines-li\">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.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.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.</li>\n <p className=\"guidelines-section-title\">We do a lot of stuff for many reasons here's why</p>\n <li className=\"guidelines-li\">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do</li>\n <li className=\"guidelines-li\">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</li>\n <li className=\"guidelines-li\">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.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.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.</li>\n <li className=\"guidelines-li\">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do</li>\n <li className=\"guidelines-li\">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</li>\n <li className=\"guidelines-li\">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.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.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.</li>\n </ul>\n </div>\n );\n}\n \nexport default Guidelines;","import React, { useState } from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { NumberInput, SelectInput } from '../FormComponents/FormComponents';\nimport './Donate.css';\n\n\nconst DonateCustom = props => {\n return(\n <Formik \n initialValues={{\n amount: '',\n frequency: ''\n }}\n validationSchema={Yup.object({\n amount: Yup.number()\n .min(1)\n .required('Required'),\n frequency: Yup.string()\n .oneOf(['monthly', 'once'], 'Invalid selection')\n .required('Required')\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n setTimeout(() => {\n alert(JSON.stringify(values, null, 2));\n resetForm();\n setSubmitting(false);\n }, 100);\n }}\n >\n {props => (\n <Form>\n <h2 className=\"form-title\">Make a Custom Donation</h2>\n <NumberInput label=\"Amount\" name=\"amount\" type=\"number\" placeholder=\"$ USD\" />\n <SelectInput label=\"How often do you want to donate?\" name=\"frequency\" type=\"select\">\n <option value=\"\">Select one</option>\n <option value=\"monthly\">Monthly</option>\n <option value=\"once\">Once</option>\n </SelectInput>\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? '...loading' : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n )\n}\n\nconst DonateOption = props => {\n return(\n <div className=\"donate-option\" onClick={() => alert(\"If there was a back-end you would be directed to a secure payment page.\")}>\n <p className=\"donate-option-monthly\">Monthly donation of</p>\n <p className=\"donate-amount\">${props.dollars}</p>\n </div>\n )\n}\n\nconst Donate = () => {\n const [ customAmount, setCustomAmount ] = useState(100);\n return ( \n <div id=\"donate-container\">\n <h1 id=\"donate-title\">Support Combatting Internet Censorship</h1>\n <DonateOption dollars={5} />\n <DonateOption dollars={20} />\n <DonateOption dollars={50} />\n <DonateCustom customAmount={customAmount} setCustomAmount={setCustomAmount} />\n </div>\n );\n}\n \nexport default Donate;","import React from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport ReactGA from 'react-ga';\n\nimport { TextInput } from '../../FormComponents/FormComponents';\nimport Loading from '../../Loading/Loading';\n\nconst Signup = (props) => {\n return (\n <div style={props.style}>\n <Formik \n initialValues={{\n username: '',\n email: '',\n password: '',\n passwordConfirm: ''\n }}\n validationSchema={Yup.object({\n username: Yup.string()\n .max(25)\n .trim('Cannot have spaces in username')\n .required('Required'),\n email: Yup.string()\n .email('Invalid email')\n .required('Required'),\n password: Yup.string()\n .min(8, 'Password must be 8 characters or more')\n .max(50, 'Password must be less than 50 characters long')\n .matches(/[A-Z]/, 'Password must contain at least one capital letter')\n .matches(/[0-9]/, 'Password must contain at least one number')\n .matches(/[!@#$&]/, 'Password must contain at least one special character(!@#$&)'),\n passwordConfirm: Yup.string()\n .min(8, 'Password must be 8 characters or more')\n .max(50, 'Password must be less than 50 characters long')\n .matches(/[A-Z]/, 'Password must contain at least one capital letter')\n .matches(/[0-9]/, 'Password must contain at least one number')\n .matches(/[!@#$&]/, 'Password must contain at least one special character(!@#$&)') \n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const { username, email, password, passwordConfirm } = values;\n setSubmitting(true);\n fetch(`${api}/user/signup`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n username,\n email,\n password,\n passwordConfirm\n })\n })\n .then(response => {\n setSubmitting(false);\n if(response.status !== 200){\n ReactGA.event({\n category: 'Account',\n action: 'Failed signup attempt'\n });\n return alert('Something is wrong with your submission');\n }\n ReactGA.event({\n category: 'Account',\n action: 'Successful signup'\n });\n alert('You will be sent an email to confirm your account shortly!');\n props.switchToLogin()\n })\n .catch(error => alert(error));\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Create an Account</h1>\n <TextInput label=\"Username\" name=\"username\" type=\"text\" />\n <TextInput label=\"Email\" name=\"email\" type=\"email\" />\n <TextInput label=\"Password\" name=\"password\" type=\"password\" />\n <TextInput label=\"Confirm Password\" name=\"passwordConfirm\" type=\"password\" />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n <div className=\"form-toggle\" onClick={props.switchToLogin}>Already have an account? Click here</div>\n </div>\n )\n}\n\nexport default Signup;\n\n","import React from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport ReactGA from 'react-ga';\n\nimport { TextInput } from '../../FormComponents/FormComponents';\nimport Loading from '../../Loading/Loading';\n\nconst Login = (props) => {\n return (\n <div style={props.style}>\n <Formik \n initialValues={{\n identity: '',\n password: ''\n }}\n validationSchema={Yup.object({\n identity: Yup.string()\n .required('Required'),\n password: Yup.string()\n .required('Required')\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const { identity, password } = values;\n setSubmitting(true);\n fetch(`${api}/user/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n identity,\n password\n })\n })\n .then(response => {\n if(response.status === 200){\n ReactGA.event({\n category: 'Account',\n action: 'Successful Login'\n });\n return response.json()\n }\n setSubmitting(false);\n ReactGA.event({\n category: 'Account',\n action: 'Failed Login'\n });\n alert('faulty credentials')\n return false;\n })\n .then(body => {\n if(body){\n sessionStorage.setItem('token', body.token);\n sessionStorage.setItem('loggedIn', JSON.stringify({...body}));\n setSubmitting(false);\n window.location.pathname = '/logged-in'\n }\n })\n .catch(error => alert(error));\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Login</h1>\n <TextInput label=\"Username or Email\" name=\"identity\" type=\"text\" />\n <TextInput label=\"Password\" name=\"password\" type=\"password\" />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n <div className=\"form-toggle\" style={{color: 'var(--linkColor)'}} onClick={props.switchToPasswordRecover}>Forgot your password? Click here</div>\n <div className=\"form-toggle\" onClick={props.switchToSignup}>Want to create an account? Click here</div>\n </div>\n )\n}\n\n\nexport default Login;","import React from 'react';\n\nconst Logout = (props) => {\n const logout = () => {\n sessionStorage.removeItem('loggedIn');\n sessionStorage.removeItem('token');\n props.switchToLogin()\n }\n return ( \n <div style={props.style} >\n <h1 style={{textAlign: \"center\", marginBottom: '20px'}}>My Account</h1>\n <button className=\"form-button\" onClick={logout}>Logout</button>\n </div>\n );\n}\n \nexport default Logout;","import React from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport ReactGA from 'react-ga';\n\nimport { TextInput } from '../../FormComponents/FormComponents';\nimport Loading from '../../Loading/Loading';\n\nconst PasswordRecover = (props) => {\n return (\n <div style={props.style}>\n <Formik \n initialValues={{\n identity: ''\n }}\n validationSchema={Yup.object({\n identity: Yup.string()\n .required('Required')\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const { identity } = values;\n setSubmitting(true);\n fetch(`${api}/user/reset-password/${identity}`)\n .then(res => {\n setSubmitting(false);\n if(res.status === 200){\n ReactGA.event({\n category: 'Account',\n action: 'Successful request for password reset email'\n });\n alert('A password reset email will be sent shortly!');\n } else {\n ReactGA.event({\n category: 'Account',\n action: 'Failed request for password reset email'\n });\n alert('Failure');\n }\n })\n .catch(error => alert(error));\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Reset Password</h1>\n <TextInput label=\"Username or Email\" name=\"identity\" type=\"text\" />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n <div className=\"form-toggle\" onClick={props.switchToLogin}>Remember your password? Click here</div>\n <div className=\"form-toggle\" onClick={props.switchToSignup}>Want to make an account? Click here</div>\n </div>\n )\n}\n\nexport default PasswordRecover;","import React from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport ReactGA from 'react-ga';\n\nimport { TextInput } from '../../FormComponents/FormComponents';\nimport Loading from '../../Loading/Loading';\n\nconst ChangePassword = (props) => {\n return (\n <div style={props.style}>\n <Formik \n initialValues={{\n email: '',\n password: '',\n passwordConfirm: ''\n }}\n validationSchema={Yup.object({\n email: Yup.string()\n .email('Invalid email')\n .required('Required'),\n password: Yup.string()\n .min(8, 'Password must be 8 characters or more')\n .max(50, 'Password must be less than 50 characters long')\n .matches(/[A-Z]/, 'Password must contain at least one capital letter')\n .matches(/[0-9]/, 'Password must contain at least one number')\n .matches(/[!@#$&]/, 'Password must contain at least one special character(!@#$&)')\n .required('Required'),\n passwordConfirm: Yup.string()\n .oneOf([Yup.ref('password'), null], 'Must match new password')\n .required('Required')\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n setSubmitting(true);\n const { email, password, passwordConfirm } = values;\n fetch(`${api}/user/change-password/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': props.changeToken\n },\n body: JSON.stringify({\n email,\n password,\n passwordConfirm\n })\n })\n .then(res => {\n setSubmitting(false);\n if(res.status === 200){\n alert('Password successfully reset');\n props.switchToLogin();\n ReactGA.event({\n category: 'Account',\n action: 'Changed Password'\n });\n } else {\n alert('failure')\n }\n })\n .catch(error => alert(error));\n }}\n >\n {props => (\n <Form>\n <h1 className=\"form-title\">Reset Password</h1>\n <TextInput label=\"Email that you recieved this link at\" name=\"email\" type=\"email\" />\n <TextInput label=\"New password\" name=\"password\" type=\"password\" />\n <TextInput label=\"Confirm new password\" name=\"passwordConfirm\" type=\"password\" />\n <button className=\"form-button\" type=\"submit\">{props.isSubmitting? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n <div className=\"form-toggle\" onClick={props.switchToLogin}>Remember your password? Click here</div>\n </div>\n )\n}\n\nexport default ChangePassword;","import React, { useState, useEffect } from 'react';\nimport ReactGA from 'react-ga';\n\nimport Modal from '../../Modal/Modal';\nimport Loading from '../../Loading/Loading';\n\nconst ConfirmAccountContent = props => {\n const [ loading, setLoading ] = useState(true);\n const [ confirmed, setConfirmed ] = useState(false);\n const api = localStorage.getItem('api');\n useEffect(() => {\n fetch(`${api}/user/confirm-account`, {\n method: 'GET',\n headers: {\n 'Authorization': props.token\n }\n })\n .then(res => {\n setLoading(false);\n if(res.status === 200){\n setConfirmed(true);\n ReactGA.event({\n category: 'Account',\n action: 'Confirmed Account'\n });\n }\n })\n .catch(err => setLoading(false))\n }, [loading, confirmed, api, props])\n return (\n <React.Fragment>\n <h1 style={{textAlign: 'center'}}>Confirm Account</h1>\n {loading?\n <Loading fontSize='30px' />\n :\n confirmed?\n <p>Account confirmed! You can now login.</p>\n :\n <p>Error confirming account. Please try again later!</p>\n }\n </React.Fragment>\n )\n}\n\nconst ConfirmAccount = props => {\n return ( \n <Modal setModalVisible={props.setConfirmAccount} maxWidth=\"300px\" content={<ConfirmAccountContent {...props} />} style={props.style} />\n );\n}\n \nexport default ConfirmAccount;","import React, { useState, useEffect } from 'react';\n\nimport './Account.css';\nimport Signup from './Signup/Signup';\nimport Login from './Login/Login';\nimport Logout from './Logout/Logout';\nimport PasswordRecover from './PasswordRecover/PasswordRecover';\nimport ChangePassword from './ChangePassword/ChangePassword';\nimport ConfirmAccount from './ConfirmAccount/ConfirmAccount';\n\nconst Account = props => {\n const [ whichForm, setWhichForm ] = useState('login');\n const [ confirmAccount, setConfirmAccount ] = useState(false);\n const loggedIn = sessionStorage.getItem('loggedIn');\n useEffect(() => {\n if(loggedIn){\n setWhichForm('logout'); \n }\n if(props.match.params.change_password === 'change-password'){\n setWhichForm('changePassword')\n }\n if(props.match.params.confirm_token){\n setConfirmAccount(true);\n }\n }, [loggedIn, props])\n return( \n <div id=\"account\">\n {whichForm === 'login'?\n <Login \n switchToSignup={() => setWhichForm('signup')}\n switchToPasswordRecover={() => setWhichForm('passwordRecover')}\n />\n :\n null\n }\n {whichForm === 'signup'?\n <Signup \n switchToLogin={() => setWhichForm('login')}\n switchToPasswordRecover={() => setWhichForm('passwordRecover')}\n />\n :\n null\n }\n {confirmAccount?\n <ConfirmAccount \n setConfirmAccount={setConfirmAccount}\n token={props.match.params.confirm_token}\n />\n :\n null\n }\n {whichForm === 'passwordRecover'?\n <PasswordRecover \n switchToLogin={() => setWhichForm('login')} \n switchToSignup={() => setWhichForm('signup')}\n />\n :\n null\n }\n {whichForm === 'changePassword'?\n <ChangePassword \n changeToken={props.match.params.token}\n switchToLogin={() => setWhichForm('login')} \n />\n :\n null\n }\n {whichForm === 'logout'?\n <Logout \n switchToLogin={() => setWhichForm('login')}\n />\n :\n null\n }\n </div>\n )\n}\n\nexport default Account;","import React, { useState, useEffect } from 'react';\n\nimport './LoggedIn.css';\nimport Post from '../../Posts/Post/Post';\nimport ViewPost from '../../Posts/ViewPost/ViewPost';\nimport Loading from '../../Loading/Loading';\n\nconst LoggedIn = (props) => {\n const [postList, setPostList] = useState([]);\n const [modalVisible, setModalVisible] = useState(false);\n const [modalResource, setModalResource] = useState(null);\n const [loading, setLoading] = useState(true);\n const loggedIn = JSON.parse(sessionStorage.getItem('loggedIn'));\n const token = sessionStorage.getItem('token');\n const api = localStorage.getItem('api');\n useEffect(() => {\n (async () => {\n const checkTokenRes = await fetch(`${api}/check-token`, {\n headers: {\n 'Authorization': token\n }\n });\n if (checkTokenRes.status !== 200) {\n window.location.pathname = '/account';\n sessionStorage.removeItem('loggedIn');\n sessionStorage.removeItem('token');\n }\n const getPosts = await fetch(`${api}/resource/all`, {\n headers: {\n 'Authorization': token\n }\n });\n const getPostsBody = await getPosts.json();\n if(getPostsBody){\n setLoading(false);\n }\n setPostList(getPostsBody);\n })()\n }, [api, token])\n\n let posts = [];\n postList.forEach(post => post.public === false ? posts.push(<Post {...post} shareable={false} edit={true} setModalVisible={setModalVisible} setModalResource={setModalResource} resourcesArr={postList} key={post._id} />) : null);\n return (\n <div id=\"logged-in-container\">\n {loggedIn ?\n <>\n <p id=\"logged-in-title\">Hello {loggedIn.username}! {posts.length >= 1? `Below are some posts that haven't been made public yet. Review/Edit/Post them!` : `There are currently no posts to be reviewed.`}</p>\n <div id=\"logged-in-posts\">\n {loading? \n <Loading fontSize=\"20px\" />\n :\n null\n }\n {posts}\n {modalVisible ?\n <ViewPost\n resourcesArr={postList}\n {...modalResource}\n post={modalResource}\n title={modalResource.title? modalResource.title : `${modalResource.whoCensored.charAt(0).toUpperCase() + modalResource.whoCensored.slice(1)} censors ${modalResource.subject} ${modalResource.typeOfResource}`}\n setModalVisible={setModalVisible}\n shareable={false}\n />\n :\n null\n }\n </div>\n </>\n :\n null\n }\n\n </div>\n );\n}\n\nexport default LoggedIn;","import React from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport Modal from '../Modal/Modal';\n\nimport { TextAreaInput } from '../FormComponents/FormComponents';\nimport Loading from '../Loading/Loading';\n\nconst SubmitTipContent = props => {\n return (\n <Formik\n initialValues={{\n tip: ''\n }}\n validationSchema={Yup.object({\n tip: Yup.string()\n .max(500, 'Must be less than 500 characters long')\n .required('Required')\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const api = localStorage.getItem('api');\n const { tip } = values;\n setSubmitting(true);\n fetch(`${api}/tips/submit-tip`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tip\n })\n })\n .then(res => {\n setSubmitting(false);\n resetForm();\n if (res.status !== 200) {\n alert('something went wrong')\n return;\n }\n alert('We have recieved your tip. Thanks!');\n props.setModalVisible(false);\n })\n .catch(err => console.error(err));\n }}\n >\n {props => (\n <Form style={{ width: 'auto' }}>\n <h1 className=\"form-title\" style={{ textAlign: 'center' }}>Submit a Tip</h1>\n <TextAreaInput label=\"Under 500 characters please!\" name=\"tip\" type=\"textarea\" />\n <button className=\"form-button\" type=\"submit\" onClick={props.handleSubmit}>{props.isSubmitting ? <Loading fontSize=\"20px\" /> : 'Submit'}</button>\n </Form>\n )}\n </Formik>\n )\n}\n\nconst SubmitTip = props => {\n return (\n <Modal setModalVisible={props.setModalVisible} content={<SubmitTipContent setModalVisible={props.setModalVisible} />} maxWidth=\"450px\" />\n )\n}\n\n\nexport default SubmitTip;","import React, { useState, useEffect } from 'react';\n\nimport './ViewTips.css';\n\nconst ViewTips = props => {\n const [ tips, setTips ] = useState([]);\n const [ allTips, setAllTips ] = useState([]);\n const [ showReadTips, setShowReadTips ] = useState(false);\n\n const alterTips = (tipArr, showReadTips) => {\n let tipEls = [];\n tipArr.forEach(tip => tip.hidden && !showReadTips? null : tipEls.push(<div key={tip._id} className=\"tip\">{tip.message}{tip.hidden? null : <div className=\"remove-tip-button\" onClick={() => removeTip(tip._id)}>Mark as Read</div>}</div>))\n setTips(tipEls.reverse());\n }\n useEffect(() => {\n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n fetch(`${api}/tips/all`, {\n headers: {\n Authorization: token\n }\n })\n .then(res => {\n if(res.status !== 200){\n console.error(res);\n return;\n }\n return res.json();\n })\n .then(body => {\n alterTips(body);\n setAllTips(body);\n })\n .catch(err => console.error(err));\n }, [])\n\n const removeTip = _id => {\n const api = localStorage.getItem('api');\n const token = sessionStorage.getItem('token');\n fetch(`${api}/tips/delete-tip/${_id}`, {\n method: 'DELETE',\n headers: {\n Authorization: token\n }\n })\n .then(res => {\n if(res.status !== 200){\n console.error('Fail')\n return;\n }\n console.log(res)\n })\n .catch(error => console.error(error))\n setTimeout(() => {\n fetch(`${api}/tips/all`, {\n headers: {\n Authorization: token\n }\n })\n .then(res => {\n if(res.status !== 200){\n console.error(res);\n return;\n }\n return res.json();\n })\n .then(body => {\n alterTips(body);\n setAllTips(body);\n })\n .catch(err => console.error(err));\n }, 500);\n }\n\n const toggleShowReadTips = () => {\n alterTips(allTips, !showReadTips);\n setShowReadTips(!showReadTips);\n }\n\n return ( \n <div id='tips-container'>\n <button className=\"form-button toggle-show-read-tips\" onClick={toggleShowReadTips}>{showReadTips? 'Hide' : 'Show'} tips marked as \"Read\"</button>\n {tips.length > 0?\n tips\n :\n <div style={{fontSize: '50px', fontWeight: '300', textAlign: 'center', padding: '10px', paddingTop: '25vh'}}>Currently no tips to show</div>\n }\n </div> \n );\n}\n \nexport default ViewTips;","import React, { useState, useEffect } from 'react';\nimport {BrowserRouter as Router,Route } from 'react-router-dom';\nimport ReactGA from 'react-ga';\n\nimport './App.css';\nimport Header from './components/Header/Header';\n\nimport Posts from './components/Posts/Posts';\nimport SubmitPost from './components/SubmitPost/SubmitPost';\nimport EditPost from './components/EditPost/EditPost';\nimport Guidelines from './components/Guidlines/Guidelines';\nimport Donate from './components/Donate/Donate';\nimport Account from './components/Account/Account';\nimport LoggedIn from './components/Account/LoggedIn/LoggedIn';\nimport SubmitTip from './components/SubmitTip/SubmitTip';\nimport ViewTips from './components/ViewTips/ViewTips';\n//import Footer from './components/Footer/Footer';\n\nimport setStorageVars from './customHooks/setStorageVars';\n\nReactGA.initialize('UA-177197297-1');\nconst App = () => {\n const [ darkMode, setDarkMode ] = useState(JSON.parse(localStorage.getItem('darkMode')));\n const [ submitTipModalVisible, setSubmitTipModalVisible ] = useState(false);\n setStorageVars(darkMode);\n\n const trackPage = path => {\n if(path.includes('confirm-account')){\n let path = '/confirm-account';\n ReactGA.set({path});\n ReactGA.pageview(path)\n } else if(path.includes('change-password')){\n let path = '/change-password';\n ReactGA.set({path});\n ReactGA.pageview(path)\n } else {\n ReactGA.set({path});\n ReactGA.pageview(path);\n }\n }\n useEffect(() => {\n trackPage(window.location.pathname)\n })\n return (\n <div className=\"App\">\n <Header darkMode={darkMode} toggleDarkMode={setDarkMode} />\n {/* <div id=\"top-of-page-ad\" >\n AD COMPONENT\n </div> */}\n <Router>\n <Route exact path={[ \"/posts/:post_id\", \"/posts\", \"/\"]} component={Posts} />\n <Route path={[ \"/account/:change_password/:token\", \"/confirm-account/:confirm_token\", \"/account\"]} component={Account} />\n <Route path=\"/logged-in\" component={LoggedIn} />\n <Route path=\"/guidelines\" component={Guidelines} />\n <Route path=\"/donate\" component={Donate} />\n <Route path=\"/submit-post\" component={SubmitPost} />\n <Route path=\"/edit-post\" component={EditPost} />\n <Route path=\"/view-tips\" component={ViewTips} />\n </Router>\n {/* <Footer />\n <div id=\"bottom-of-page-ad\" >\n AD COMPONENT\n </div> */}\n {submitTipModalVisible?\n <SubmitTip setModalVisible={setSubmitTipModalVisible} />\n :\n null\n }\n <div id=\"submit-tip-button\" onClick={() => setSubmitTipModalVisible(!submitTipModalVisible)}>Submit a Tip</div>\n </div>\n );\n}\n\nexport default App;","import { useEffect } from 'react';\n\nexport default (darkMode) => {\n \n\n useEffect(() => {\n const api = localStorage.getItem('api');\n if (!api || api !== 'https://api.faceblocked.com') {\n localStorage.setItem('api', 'https://api.faceblocked.com');\n }\n const domain = localStorage.getItem('domain');\n if (!domain || domain !== 'https://faceblocked.com') {\n localStorage.setItem('domain', 'https://faceblocked.com');\n }\n const mediaLocation = localStorage.getItem('mediaLocation');\n if (!mediaLocation || mediaLocation !== 'https://api.faceblocked.com/media') {\n localStorage.setItem('mediaLocation', 'https://api.faceblocked.com/media');\n }\n let cssVars = JSON.parse(localStorage.getItem('cssVars'));\n if (!cssVars) {\n cssVars = {\n light: {\n backgroundColor: 'white',\n hoverBackgroundColor: 'rgb(240, 240, 240)',\n color: 'black',\n colorSecondary: 'rgb(70, 70, 70)',\n border: '1px solid rgb(200, 200, 200)',\n formLabelColor: 'black',\n modalExitBorder: '2px solid black',\n linkColor: 'blue',\n hoverFilter: 'brightness(.5)'\n },\n dark: {\n backgroundColor: 'black',\n hoverBackgroundColor: 'rgb(19, 19, 19)',\n color: 'white',\n colorSecondary: 'rgb(150, 150, 150)',\n border: '1px solid rgb(70, 70, 70)',\n formLabelColor: 'white',\n modalExitBorder: '2px solid white',\n linkColor: 'rgb(46, 126, 240)',\n hoverFilter: 'brightness(1.8)',\n focusOutline: '2px solid rgb(46, 126, 240)'\n }\n }\n localStorage.setItem('cssVars', JSON.stringify(cssVars));\n }\n if (!darkMode) {\n localStorage.setItem('darkMode', false);\n Object.keys(cssVars.light).forEach(key => {\n document.body.style.setProperty(`--${key}`, cssVars.light[key])\n });\n } else {\n localStorage.setItem('darkMode', true);\n Object.keys(cssVars.dark).forEach(key => {\n document.body.style.setProperty(`--${key}`, cssVars.dark[key])\n });\n }\n }, [darkMode])\n};\n\n/* const api = localStorage.getItem('api');\n if (!api || api !== 'https://api.faceblocked.com') {\n localStorage.setItem('api', 'https://api.faceblocked.com');\n }\n const domain = localStorage.getItem('domain');\n if (!domain || domain !== 'https://faceblocked.com') {\n localStorage.setItem('domain', 'https://faceblocked.com');\n }\n const mediaLocation = localStorage.getItem('mediaLocation');\n if (!mediaLocation || mediaLocation !== 'https://api.faceblocked.com/media') {\n localStorage.setItem('mediaLocation', 'https://api.faceblocked.com/media');\n }\n const darkMode = JSON.parse(localStorage.getItem('darkMode'));\n if (!darkMode) {\n localStorage.setItem('darkMode', false);\n }\n let cssVars = JSON.parse(localStorage.getItem('cssVars'));\n if (!cssVars) {\n const cssVarObj = {\n light: {\n backgroundColor: 'white',\n hoverBackgroundColor: 'rgb(240, 240, 240)',\n color: 'black',\n colorSecondary: 'rgb(70, 70, 70)',\n border: '1px solid rgb(200, 200, 200)',\n formLabelColor: 'black',\n modalExitBorder: '2px solid black',\n linkColor: 'blue',\n hoverFilter: 'brightness(.5)'\n },\n dark: {\n backgroundColor: 'black',\n hoverBackgroundColor: 'rgb(19, 19, 19)',\n color: 'white',\n colorSecondary: 'rgb(150, 150, 150)',\n border: '1px solid rgb(70, 70, 70)',\n formLabelColor: 'white',\n modalExitBorder: '2px solid white',\n linkColor: 'rgb(46, 126, 240)',\n hoverFilter: 'brightness(1.8)',\n focusOutline: '2px solid rgb(46, 126, 240)'\n }\n }\n localStorage.setItem('cssVars', JSON.stringify(cssVarObj))\n } */","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root')\n);\n"],"sourceRoot":""}