From 544f991dd3326d157f949bf9382bf29f1421b2ae Mon Sep 17 00:00:00 2001
From: Mauricio Hernan Cabrera
<6373415-hernandracoder@users.noreply.gitlab.com>
Date: Sat, 22 Aug 2020 19:03:31 -0300
Subject: [PATCH 1/4] keep cache updated
---
src/pages/index.js | 654 ++++++++++++++++++++++++++++++---------------
1 file changed, 436 insertions(+), 218 deletions(-)
diff --git a/src/pages/index.js b/src/pages/index.js
index f839c4b..b18eac0 100644
--- a/src/pages/index.js
+++ b/src/pages/index.js
@@ -1,317 +1,535 @@
import React, { useState, useEffect } from "react"
-import MarkdownPreview from "../components/markdownPreview";
-import Markdown from '../components/markdown';
-import Header from '../components/header';
-import Title from '../components/title';
-import Subtitle from '../components/subtitle';
-import Work from '../components/work';
-import Social from '../components/social';
-import Addons from '../components/addons';
-import Skills from '../components/skills';
-import { initialSkillState } from '../constants/skills';
-import gsap from 'gsap';
-import Loader from '../components/loader';
-import Footer from '../components/footer';
-import './index.css'
-import { ArrowLeftIcon, CopyIcon, DownloadIcon, EyeIcon, CheckIcon, MarkdownIcon } from '@primer/octicons-react';
-import SEO from '../components/seo';
-import { isGithubUsernameValid, isMediumUsernameValid } from '../utils/validation';
+import MarkdownPreview from "../components/markdownPreview"
+import Markdown from "../components/markdown"
+import Header from "../components/header"
+import Title from "../components/title"
+import Subtitle from "../components/subtitle"
+import Work from "../components/work"
+import Social from "../components/social"
+import Addons from "../components/addons"
+import Skills from "../components/skills"
+import { initialSkillState } from "../constants/skills"
+import gsap from "gsap"
+import Loader from "../components/loader"
+import Footer from "../components/footer"
+import "./index.css"
+import {
+ ArrowLeftIcon,
+ CopyIcon,
+ DownloadIcon,
+ EyeIcon,
+ CheckIcon,
+ MarkdownIcon,
+} from "@primer/octicons-react"
+import SEO from "../components/seo"
+import {
+ isGithubUsernameValid,
+ isMediumUsernameValid,
+} from "../utils/validation"
+
+const DEFAULT_PREFIX = {
+ title: "Hi š, I'm",
+ currentWork: "š Iām currently working on",
+ currentLearn: "š± Iām currently learning",
+ collaborateOn: "šÆ Iām looking to collaborate on",
+ helpWith: "š¤ Iām looking for help with",
+ ama: "š¬ Ask me about",
+ contact: "š« How to reach me",
+ funFact: "ā” Fun fact",
+ portfolio: "šØāš» All of my projects are available at",
+ blog: "š I regulary write articles on",
+}
+
+const DEFAULT_DATA = {
+ title: "",
+ subtitle: "A passionate frontend developer from India",
+ currentWork: "",
+ currentLearn: "",
+ collaborateOn: "",
+ helpWith: "",
+ ama: "",
+ contact: "",
+ funFact: "",
+ visitorsBadge: false,
+ githubStats: false,
+ topLanguages: false,
+ devDynamicBlogs: false,
+ mediumDynamicBlogs: false,
+}
+
+const DEFAULT_LINK = {
+ currentWork: "",
+ collaborateOn: "",
+ helpWith: "",
+ portfolio: "",
+ blog: "",
+}
+
+const DEFAULT_SOCIAL = {
+ github: "",
+ dev: "",
+ linkedin: "",
+ codepen: "",
+ stackoverflow: "",
+ kaggle: "",
+ codesandbox: "",
+ fb: "",
+ instagram: "",
+ twitter: "",
+ dribbble: "",
+ behance: "",
+ medium: "",
+ youtube: "",
+}
+
+const KeepCacheUpdated = ({ prefix, data, link, social, skills }) => {
+ useEffect(() => {
+ localStorage.setItem(
+ "cache",
+ JSON.stringify({
+ prefix,
+ data,
+ link,
+ social,
+ skills,
+ })
+ )
+ }, [prefix, data, link, social, skills])
+}
+
+const DEFAULT_SKILLS = initialSkillState
+
const IndexPage = () => {
- const [prefix, setPrefix] = useState({
- title: "Hi š, I'm",
- currentWork: 'š Iām currently working on',
- currentLearn: 'š± Iām currently learning',
- collaborateOn: 'šÆ Iām looking to collaborate on',
- helpWith: 'š¤ Iām looking for help with',
- ama: 'š¬ Ask me about',
- contact: 'š« How to reach me',
- funFact: 'ā” Fun fact',
- portfolio: 'šØāš» All of my projects are available at',
- blog: 'š I regulary write articles on',
- });
- const [data, setData] = useState({
- title: '',
- subtitle: 'A passionate frontend developer from India',
- currentWork: '',
- currentLearn: '',
- collaborateOn: '',
- helpWith: '',
- ama: '',
- contact: '',
- funFact: '',
- visitorsBadge: false,
- githubStats: false,
- topLanguages: false,
- devDynamicBlogs: false,
- mediumDynamicBlogs: false,
- });
- const [link, setLink] = useState({
- currentWork: '',
- collaborateOn: '',
- helpWith: '',
- portfolio: '',
- blog: '',
- });
- const [social, setSocial] = useState({
- github: '',
- dev: '',
- linkedin: '',
- codepen: '',
- stackoverflow: '',
- kaggle: '',
- codesandbox: '',
- fb: '',
- instagram: '',
- twitter: '',
- dribbble: '',
- behance: '',
- medium: '',
- youtube: ''
- });
- const [skills, setSkills] = useState(initialSkillState)
- const [generatePreview, setGeneratePreview] = useState(false);
- const [generateMarkdown, setGenerateMarkdown] = useState(false);
- const [displayLoader, setDisplayLoader] = useState(false);
+ const [prefix, setPrefix] = useState(DEFAULT_PREFIX)
+ const [data, setData] = useState(DEFAULT_DATA)
+ const [link, setLink] = useState(DEFAULT_LINK)
+ const [social, setSocial] = useState(DEFAULT_SOCIAL)
+ const [skills, setSkills] = useState(DEFAULT_SKILLS)
+
+ const [generatePreview, setGeneratePreview] = useState(false)
+ const [generateMarkdown, setGenerateMarkdown] = useState(false)
+ const [displayLoader, setDisplayLoader] = useState(false)
const [copyObj, setcopyObj] = useState({
isCopied: false,
- copiedText: 'copy-markdown'
- });
+ copiedText: "copy-markdown",
+ })
const [previewMarkdown, setPreviewMarkdown] = useState({
isPreview: false,
- buttonText: 'preview'
- });
- const handleSkillsChange = (field) => {
+ buttonText: "preview",
+ })
+
+ const handleSkillsChange = field => {
let change = { ...skills }
- change[field] = !change[field];
- setSkills(change);
+ change[field] = !change[field]
+ setSkills(change)
}
+
const handlePrefixChange = (field, e) => {
let change = { ...prefix }
- change[field] = e.target.value;
- setPrefix(change);
+ change[field] = e.target.value
+ setPrefix(change)
}
+
const handleDataChange = (field, e) => {
let change = { ...data }
- change[field] = e.target.value;
- setData(change);
+ change[field] = e.target.value
+ setData(change)
}
+
const handleLinkChange = (field, e) => {
let change = { ...link }
- change[field] = e.target.value;
- setLink(change);
+ change[field] = e.target.value
+ setLink(change)
}
+
const handleSocialChange = (field, e) => {
let change = { ...social }
- change[field] = e.target.value.toLowerCase();
- setSocial(change);
+ change[field] = e.target.value.toLowerCase()
+ setSocial(change)
}
- const handleCheckChange = (field) => {
+
+ const handleCheckChange = field => {
let change = { ...data }
- change[field] = !change[field];
- setData(change);
+ change[field] = !change[field]
+ setData(change)
}
+
const generate = () => {
- var tl = new gsap.timeline();
- tl.to('.generate', {
+ var tl = new gsap.timeline()
+ tl.to(".generate", {
scale: 0,
duration: 0.5,
- ease: 'Linear.easeNone',
- });
- tl.set('.form', { display: 'none' });
- setDisplayLoader(true);
+ ease: "Linear.easeNone",
+ })
+ tl.set(".form", { display: "none" })
+ setDisplayLoader(true)
setTimeout(() => {
- setDisplayLoader(false);
- setGenerateMarkdown(!generateMarkdown);
- gsap.fromTo('.markdown-box', {
- scale: 0.2,
- }, {
- scale: 1,
- duration: 0.5,
- ease: 'Linear.easeNone',
- });
- document.body.scrollTop = 0; // For Safari
- document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
- }, 3000);
+ setDisplayLoader(false)
+ setGenerateMarkdown(!generateMarkdown)
+ gsap.fromTo(
+ ".markdown-box",
+ {
+ scale: 0.2,
+ },
+ {
+ scale: 1,
+ duration: 0.5,
+ ease: "Linear.easeNone",
+ }
+ )
+ document.body.scrollTop = 0 // For Safari
+ document.documentElement.scrollTop = 0 // For Chrome, Firefox, IE and Opera
+ }, 3000)
}
+
const trimDataValues = (item, setItem) => {
- const dataObj = { ...item };
- Object.keys(dataObj).forEach(k => (typeof dataObj[k] === 'string') ? dataObj[k] = dataObj[k].trim() : null);
- setItem(dataObj);
+ const dataObj = { ...item }
+ Object.keys(dataObj).forEach(k =>
+ typeof dataObj[k] === "string" ? (dataObj[k] = dataObj[k].trim()) : null
+ )
+ setItem(dataObj)
}
+
const handleGenerate = () => {
- trimDataValues(data, setData);
- trimDataValues(social, setSocial);
- trimDataValues(link, setLink);
- resetCopyMarkdownButton();
+ trimDataValues(data, setData)
+ trimDataValues(social, setSocial)
+ trimDataValues(link, setLink)
+ resetCopyMarkdownButton()
if (data.visitorsBadge || data.githubStats || data.topLanguages) {
if (social.github && isGithubUsernameValid(social.github)) {
- generate();
+ generate()
}
} else if (social.github) {
if (isGithubUsernameValid(social.github)) {
- generate();
+ generate()
}
} else {
- generate();
+ generate()
}
}
+
const handleGeneratePreview = () => {
- setGenerateMarkdown(!generateMarkdown);
- setGeneratePreview(!generatePreview);
+ setGenerateMarkdown(!generateMarkdown)
+ setGeneratePreview(!generatePreview)
if (!generatePreview) {
- gsap.set('.copy-button, .download-button', {
- visibility: 'hidden'
- });
+ gsap.set(".copy-button, .download-button", {
+ visibility: "hidden",
+ })
setPreviewMarkdown({
isPreview: true,
- buttonText: 'markdown'
+ buttonText: "markdown",
})
} else {
- gsap.set('.copy-button, .download-button', {
- visibility: 'visible'
- });
- gsap.to('.copy-button', {
- border: '2px solid #3b3b4f',
- duration: 1
- });
+ gsap.set(".copy-button, .download-button", {
+ visibility: "visible",
+ })
+ gsap.to(".copy-button", {
+ border: "2px solid #3b3b4f",
+ duration: 1,
+ })
setPreviewMarkdown({
isPreview: false,
- buttonText: 'preview'
+ buttonText: "preview",
})
- resetCopyMarkdownButton();
+ resetCopyMarkdownButton()
}
}
+
const resetCopyMarkdownButton = () => {
- var el = document.getElementById('copy-markdown')
+ var el = document.getElementById("copy-markdown")
if (el) {
- gsap.set('#copy-markdown', {
- color: '#0a0a23',
- });
+ gsap.set("#copy-markdown", {
+ color: "#0a0a23",
+ })
}
setcopyObj({
isCopied: false,
- copiedText: 'copy-markdown'
- });
+ copiedText: "copy-markdown",
+ })
}
+
const setCopyMarkdownButton = () => {
- var el = document.getElementById('copy-markdown')
+ var el = document.getElementById("copy-markdown")
if (el) {
- gsap.set('#copy-markdown', {
- color: '#00471b',
- });
+ gsap.set("#copy-markdown", {
+ color: "#00471b",
+ })
}
- gsap.fromTo('.copy-button', {
- scale: 0.5,
- }, {
- scale: 1,
- ease: 'elastic.in',
- border: '2px solid #00471b',
- duration: 0.5
- });
+ gsap.fromTo(
+ ".copy-button",
+ {
+ scale: 0.5,
+ },
+ {
+ scale: 1,
+ ease: "elastic.in",
+ border: "2px solid #00471b",
+ duration: 0.5,
+ }
+ )
setcopyObj({
isCopied: true,
- copiedText: 'copied'
- });
+ copiedText: "copied",
+ })
}
- const handleCopyToClipboard = () => {
- var range = document.createRange();
- range.selectNode(document.getElementById("markdown-content"));
- window.getSelection().removeAllRanges(); // clear current selection
- window.getSelection().addRange(range); // to select text
- document.execCommand("copy");
- window.getSelection().removeAllRanges();
- setCopyMarkdownButton();
+ const handleCopyToClipboard = () => {
+ var range = document.createRange()
+ range.selectNode(document.getElementById("markdown-content"))
+ window.getSelection().removeAllRanges() // clear current selection
+ window.getSelection().addRange(range) // to select text
+ document.execCommand("copy")
+ window.getSelection().removeAllRanges()
+
+ setCopyMarkdownButton()
}
const handleDownload = () => {
- var markdownContent = document.getElementById("markdown-content");
- var tempElement = document.createElement('a');
- tempElement.setAttribute('href', 'data:text/markdown;charset=utf-8,' + encodeURIComponent(markdownContent.innerText));
- tempElement.setAttribute('download', 'README.md');
- tempElement.style.display = 'none';
- document.body.appendChild(tempElement);
- tempElement.click();
- document.body.removeChild(tempElement);
+ var markdownContent = document.getElementById("markdown-content")
+ var tempElement = document.createElement("a")
+ tempElement.setAttribute(
+ "href",
+ "data:text/markdown;charset=utf-8," +
+ encodeURIComponent(markdownContent.innerText)
+ )
+ tempElement.setAttribute("download", "README.md")
+ tempElement.style.display = "none"
+ document.body.appendChild(tempElement)
+ tempElement.click()
+ document.body.removeChild(tempElement)
}
const handleBackToEdit = () => {
- setGeneratePreview(false);
- setGenerateMarkdown(false);
- gsap.set('.form', {
- display: ''
- });
- gsap.to('.generate', {
+ setGeneratePreview(false)
+ setGenerateMarkdown(false)
+ gsap.set(".form", {
+ display: "",
+ })
+ gsap.to(".generate", {
scale: 1,
- });
+ })
}
+
+ const setInitialValues = () => {
+ const cache = JSON.parse(localStorage.getItem("cache"))
+
+ if (!cache) {
+ return
+ }
+
+ setPrefix(cache.prefix || DEFAULT_PREFIX)
+ setData(cache.data || DEFAULT_DATA)
+ setLink(cache.link || DEFAULT_LINK)
+ setSocial(cache.social || DEFAULT_SOCIAL)
+
+ const cacheSkills = Object.keys(DEFAULT_SKILLS).reduce(
+ (previous, currentKey) => {
+ let currentSelected = false
+
+ if (cache.skills[currentKey]) {
+ currentSelected = true
+ }
+
+ return {
+ ...previous,
+ [currentKey]: currentSelected,
+ }
+ },
+ {}
+ )
+
+ setSkills(cacheSkills || DEFAULT_SKILLS)
+ }
+
useEffect(() => {
- gsap.fromTo(".generate", {
- boxShadow: "0 0 0 0px rgba(59, 59, 79, 0.4)"
- }, {
- boxShadow: "0 0 0 10px rgba(59, 59, 79, 0)",
- repeat: -1,
- duration: 1
- });
- });
+ gsap.fromTo(
+ ".generate",
+ {
+ boxShadow: "0 0 0 0px rgba(59, 59, 79, 0.4)",
+ },
+ {
+ boxShadow: "0 0 0 10px rgba(59, 59, 79, 0)",
+ repeat: -1,
+ duration: 1,
+ }
+ )
+
+ // set initial values
+ setInitialValues()
+ }, [])
+
+ // keep cache updated
+ KeepCacheUpdated({ prefix, data, link, social, skills })
+
return (
<>