- fix label in contact

- fix importing from json
- fix reset everything
- update dependencies
This commit is contained in:
Amruth Pillai
2020-07-31 13:33:11 +05:30
parent 714d37deca
commit 09ea3b95ab
15 changed files with 1195 additions and 3984 deletions

View File

@ -5,7 +5,7 @@ module.exports = {
title: 'Reactive Resume', title: 'Reactive Resume',
siteUrl: 'https://rxresu.me', siteUrl: 'https://rxresu.me',
description: 'A free and open source resume builder.', description: 'A free and open source resume builder.',
version: '2.1.1', version: '2.1.2',
}, },
plugins: [ plugins: [
'gatsby-plugin-react-helmet', 'gatsby-plugin-react-helmet',

1120
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -18,31 +18,30 @@
"dependencies": { "dependencies": {
"@material-ui/core": "^4.11.0", "@material-ui/core": "^4.11.0",
"@reach/router": "^1.3.4", "@reach/router": "^1.3.4",
"ajv": "^6.12.3",
"animate.css": "^4.1.0", "animate.css": "^4.1.0",
"array-move": "^3.0.0", "array-move": "^3.0.0",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"dayjs": "^1.8.30", "dayjs": "^1.8.31",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"downloadjs": "^1.4.7", "downloadjs": "^1.4.7",
"firebase": "^7.17.1", "firebase": "^7.17.1",
"formik": "^2.1.5", "formik": "^2.1.5",
"gatsby": "^2.24.11", "gatsby": "^2.24.15",
"gatsby-image": "^2.4.13", "gatsby-image": "^2.4.14",
"gatsby-plugin-create-client-paths": "^2.3.10", "gatsby-plugin-create-client-paths": "^2.3.10",
"gatsby-plugin-firebase": "^0.2.0-beta.4", "gatsby-plugin-firebase": "^0.2.0-beta.4",
"gatsby-plugin-manifest": "^2.4.21", "gatsby-plugin-manifest": "^2.4.21",
"gatsby-plugin-material-ui": "^2.1.9", "gatsby-plugin-material-ui": "^2.1.10",
"gatsby-plugin-postcss": "^2.3.11", "gatsby-plugin-postcss": "^2.3.11",
"gatsby-plugin-prefetch-google-fonts": "^1.4.3", "gatsby-plugin-prefetch-google-fonts": "^1.4.3",
"gatsby-plugin-react-helmet": "^3.3.10", "gatsby-plugin-react-helmet": "^3.3.10",
"gatsby-plugin-remove-serviceworker": "^1.0.0", "gatsby-plugin-remove-serviceworker": "^1.0.0",
"gatsby-plugin-sharp": "^2.6.22", "gatsby-plugin-sharp": "^2.6.24",
"gatsby-plugin-sitemap": "^2.4.11", "gatsby-plugin-sitemap": "^2.4.11",
"gatsby-source-filesystem": "^2.3.23", "gatsby-source-filesystem": "^2.3.23",
"gatsby-source-gravatar": "^1.0.0", "gatsby-source-gravatar": "^1.0.0",
"gatsby-transformer-remark": "^2.8.27", "gatsby-transformer-remark": "^2.8.27",
"gatsby-transformer-sharp": "^2.5.11", "gatsby-transformer-sharp": "^2.5.12",
"i18next": "^19.6.3", "i18next": "^19.6.3",
"lodash": "^4.17.19", "lodash": "^4.17.19",
"nanoevents": "^5.1.8", "nanoevents": "^5.1.8",
@ -60,17 +59,17 @@
"yup": "^0.29.2" "yup": "^0.29.2"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^9.8.5", "autoprefixer": "^9.8.6",
"eslint": "^7.5.0", "eslint": "^7.5.0",
"eslint-config-airbnb": "^18.2.0", "eslint-config-airbnb": "^18.2.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^6.11.0",
"eslint-loader": "^4.0.2", "eslint-loader": "^4.0.2",
"eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-prettier": "^3.1.4", "eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.20.4", "eslint-plugin-react": "^7.20.5",
"gatsby-plugin-eslint": "^2.0.8", "gatsby-plugin-eslint": "^2.0.8",
"prettier": "2.0.5", "prettier": "2.0.5",
"tailwindcss": "^1.5.2" "tailwindcss": "^1.6.0"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,335 +1,411 @@
{ {
"awards": { "awards": {
"heading": "Awards", "heading": "Awards",
"items": [ "items": [
{ {
"awarder": "Google", "awarder": "Google",
"date": "2019-04-01", "date": "2019-04-01",
"id": "6f857f2b-6312-4a0d-907d-2e17991954eb", "id": "6f857f2b-6312-4a0d-907d-2e17991954eb",
"summary": "", "summary": "",
"title": "International Flutter Hackathon" "title": "International Flutter Hackathon"
}, },
{ {
"awarder": "Venturesity", "awarder": "Venturesity",
"date": "2016-06-01", "date": "2016-06-01",
"id": "f6efa3f9-9741-4e36-a538-ba0d9779bc61", "id": "f6efa3f9-9741-4e36-a538-ba0d9779bc61",
"summary": "", "summary": "",
"title": "Venturesity Banyan Hack" "title": "Venturesity Banyan Hack"
}, },
{ {
"awarder": "Govt. of India", "awarder": "Govt. of India",
"date": "2017-04-01", "date": "2017-04-01",
"id": "89c0171a-eae9-403e-9f4c-a757fb535c2b", "id": "89c0171a-eae9-403e-9f4c-a757fb535c2b",
"summary": "", "summary": "",
"title": "Smart India Hackathon" "title": "Smart India Hackathon"
} }
], ],
"visible": true "visible": true
}, },
"certifications": { "certifications": {
"heading": "Certifications", "heading": "Certifications",
"items": [ "items": [
{ {
"date": "2018-02-01", "date": "2018-02-01",
"id": "d2ec12bc-7876-46bc-afd4-11ae06faf3bd", "id": "d2ec12bc-7876-46bc-afd4-11ae06faf3bd",
"issuer": "Cisco Systems", "issuer": "Cisco Systems",
"summary": "", "summary": "",
"title": "CCNP" "title": "CCNP"
}, },
{ {
"date": "2019-06-01", "date": "2019-06-01",
"id": "f8312288-53ae-4504-a768-4b67aea95926", "id": "f8312288-53ae-4504-a768-4b67aea95926",
"issuer": "VMWare", "issuer": "VMWare",
"summary": "", "summary": "",
"title": "VCP6-DCV" "title": "VCP6-DCV"
}, },
{ {
"date": "2014-04-01", "date": "2014-04-01",
"id": "11107df6-5f3c-49ae-bcd4-62b8baa181a1", "id": "11107df6-5f3c-49ae-bcd4-62b8baa181a1",
"issuer": "Cisco Systems", "issuer": "Cisco Systems",
"summary": "", "summary": "",
"title": "DCUCI 642-999" "title": "DCUCI 642-999"
} }
], ],
"visible": true "visible": true
}, },
"education": { "education": {
"heading": "Education", "heading": "Education",
"items": [ "items": [
{ {
"degree": "Masters", "degree": "Masters",
"endDate": "2002-08-01", "endDate": "2002-08-01",
"field": "Computer Science", "field": "Computer Science",
"gpa": "7.2 CGPA", "gpa": "7.2 CGPA",
"id": "c42e2a5a-3f0d-497e-838b-ac2019dcf045", "id": "c42e2a5a-3f0d-497e-838b-ac2019dcf045",
"institution": "The City College of New York, NYC, NY", "institution": "The City College of New York, NYC, NY",
"startDate": "2001-09-01", "startDate": "2001-09-01",
"summary": "" "summary": ""
}, },
{ {
"degree": "Bachelors", "degree": "Bachelors",
"endDate": "2001-08-01", "endDate": "2001-08-01",
"field": "Computer Science", "field": "Computer Science",
"gpa": "8.4 CGPA", "gpa": "8.4 CGPA",
"id": "278490a2-c327-4e83-8be8-adf913a9b36c", "id": "278490a2-c327-4e83-8be8-adf913a9b36c",
"institution": "University of California, Berkeley, CA", "institution": "University of California, Berkeley, CA",
"startDate": "1997-09-01", "startDate": "1997-09-01",
"summary": "" "summary": ""
} }
], ],
"visible": true "visible": true
}, },
"hobbies": { "hobbies": {
"heading": "Hobbies", "heading": "Hobbies",
"items": [ "items": [
{ "id": "788dcf5a-78ca-4866-8397-c7a29073d9a1", "name": "Poetry" }, {
{ "id": "e3523371-f50c-4348-8c5e-35fe84c0006d", "name": "Travelling" }, "id": "788dcf5a-78ca-4866-8397-c7a29073d9a1",
{ "id": "92c35e3b-6cd7-4cea-b505-61347ec61b68", "name": "Photography" }, "name": "Poetry"
{ },
"id": "d36f2089-93a9-4f30-a425-3dd81c6b89df", {
"name": "Playing Badminton" "id": "e3523371-f50c-4348-8c5e-35fe84c0006d",
}, "name": "Travelling"
{ },
"id": "d1da41a9-ae83-48fb-8047-d45ebd869a69", {
"name": "Developing Reactive Resume" "id": "92c35e3b-6cd7-4cea-b505-61347ec61b68",
} "name": "Photography"
], },
"visible": true {
}, "id": "d36f2089-93a9-4f30-a425-3dd81c6b89df",
"languages": { "name": "Playing Badminton"
"heading": "Languages", },
"items": [ {
{ "id": "d1da41a9-ae83-48fb-8047-d45ebd869a69",
"fluency": "Very Fluent", "name": "Developing Reactive Resume"
"id": "78d8cf32-84c7-431d-969b-fdf277968026", }
"name": "English" ],
}, "visible": true
{ },
"fluency": "Native Tongue", "languages": {
"id": "9e0bd5ed-b88d-4046-8fb9-ecba54d29924", "heading": "Languages",
"name": "Tamil" "items": [
}, {
{ "fluency": "Very Fluent",
"fluency": "Native Tongue", "id": "78d8cf32-84c7-431d-969b-fdf277968026",
"id": "cb895aa9-c485-4bf3-a9e3-08e8f219451a", "name": "English"
"name": "Kannada" },
}, {
{ "fluency": "Native Tongue",
"fluency": "Learning on Duolingo", "id": "9e0bd5ed-b88d-4046-8fb9-ecba54d29924",
"id": "8fff60fc-0cd6-47e2-b64f-fb249d1af0d1", "name": "Tamil"
"name": "German" },
} {
], "fluency": "Native Tongue",
"visible": true "id": "cb895aa9-c485-4bf3-a9e3-08e8f219451a",
}, "name": "Kannada"
"metadata": { },
"colors": { {
"background": "#FFFFFF", "fluency": "Learning on Duolingo",
"primary": "#009688", "id": "8fff60fc-0cd6-47e2-b64f-fb249d1af0d1",
"text": "#212121" "name": "German"
}, }
"font": "Open Sans", ],
"layout": { "visible": true
"castform": [ },
["awards", "certifications", "languages", "hobbies"], "metadata": {
["objective", "work", "education", "skills", "projects", "references"] "colors": {
], "background": "#FFFFFF",
"celebi": [ "primary": "#009688",
["awards", "certifications", "languages", "hobbies"], "text": "#212121"
["objective", "work", "education", "skills", "projects", "references"] },
], "font": "Open Sans",
"gengar": [ "language": "en",
["objective", "skills"], "layout": {
["awards", "certifications", "languages", "references", "hobbies"], "castform": [
["work", "education", "projects"] [
], "awards",
"glalie": [ "certifications",
["awards", "certifications", "hobbies"], "languages",
[ "hobbies"
"objective", ],
"work", [
"education", "objective",
"skills", "work",
"projects", "education",
"languages", "skills",
"references" "projects",
] "references"
], ]
"onyx": [ ],
["objective", "work", "education", "projects"], "celebi": [
["hobbies", "languages", "awards", "certifications"], [
["skills", "references"] "awards",
], "certifications",
"pikachu": [ "languages",
["skills", "languages", "hobbies", "awards", "certifications"], "hobbies"
["work", "education", "projects", "references"] ],
] [
}, "objective",
"template": "castform" "work",
}, "education",
"objective": { "skills",
"body": "To obtain a job within my chosen field that will challenge me and allow me to use my education, skills and past experiences in a way that is mutually beneficial to both myself and my employer and allow for future growth and advancement.", "projects",
"heading": "Objective", "references"
"visible": true ]
}, ],
"profile": { "gengar": [
"address": { [
"city": "Bangalore, India -", "objective",
"line1": "#5/A, Banashankari Nivas,", "skills"
"line2": "Brindavan Layout, Subramanyapura,", ],
"pincode": "560061" [
}, "awards",
"email": "hello@amruthpillai.com", "certifications",
"firstName": "Amruth", "languages",
"heading": "Profile", "references",
"lastName": "Pillai", "hobbies"
"phone": "+91 98453 36113", ],
"photograph": "https://i.imgur.com/2dmLSCT.jpg", [
"subtitle": "Full Stack Web Developer", "work",
"website": "amruthpillai.com" "education",
}, "projects"
"projects": { ]
"heading": "Projects", ],
"items": [ "glalie": [
{ [
"date": "2020-07-01", "awards",
"id": "c768dcca-90f5-4242-a608-6759b4f667fb", "certifications",
"link": "https://github.com/AmruthPillai/Reactive-Resume", "hobbies"
"summary": "Reactive Resume, a free and open-source resume builder that works for you. A few of the important features that make it awesome are minimalistic UI/UX, extensive customizability, portability, regularly updated templates, etc.\n\nFor more information, check out [rxresu.me](https://github.com/AmruthPillai/Reactive-Resume)", ],
"title": "Reactive Resume" [
}, "objective",
{ "work",
"date": "2020-04-01", "education",
"id": "6ca600b1-c21f-4d7b-8431-f7144d537dd3", "skills",
"link": "https://amruthpillai.com", "projects",
"summary": "Resume on the Web has been a project that I've been focused on since the early 2014s. I didn't want my information to be displayed on just a sheet of paper that only HRs or Talent Scouts had the privilege of reading, I wanted it to be accessible to everyone. And that's how this project was conceptualized.", "languages",
"title": "Resume on the Web" "references"
} ]
], ],
"visible": true "onyx": [
}, [
"public": true, "objective",
"references": { "work",
"heading": "References", "education",
"items": [ "projects"
{ ],
"email": "willywonka@goldenticket.com", [
"id": "168339fd-3c4b-4f2f-bd3a-ef184be81700", "hobbies",
"name": "Willy Wonka", "languages",
"phone": "+1 (802) 234-2398", "awards",
"position": "CEO at Chocolate Factory", "certifications"
"summary": "" ],
}, [
{ "skills",
"email": "elanmusk@nottesla.com", "references"
"id": "350465b9-9989-43cc-b97e-4115b8980304", ]
"name": "Elangovan Musk", ],
"phone": "+91 93893 34353", "pikachu": [
"position": "CEO at Newton Motors", [
"summary": "" "skills",
}, "languages",
{ "hobbies",
"email": "l.beasley@carsonlogistics.com", "awards",
"id": "94e3447b-0a78-4fb7-b14d-591982d35320", "certifications"
"name": "Lorraine Beasley", ],
"phone": "+1 661-808-4188", [
"position": "Head of HR, Carson Logistics", "work",
"summary": "" "education",
} "projects",
], "references"
"visible": true ]
}, ]
"skills": { },
"heading": "Skills", "template": "castform"
"items": [ },
{ "objective": {
"id": "54e5bceb-d0e9-4f04-98d1-48a34f7cf920", "body": "To obtain a job within my chosen field that will challenge me and allow me to use my education, skills and past experiences in a way that is mutually beneficial to both myself and my employer and allow for future growth and advancement.",
"level": "Advanced", "heading": "Objective",
"name": "Customer Service Expertise" "visible": true
}, },
{ "preview": "https://images.unsplash.com/photo-1594483672645-895b77326094?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=600&ixid=eyJhcHBfaWQiOjF9&ixlib=rb-1.2.1&q=80&w=400",
"id": "f0274f62-2252-4cc0-bf12-9e1070942c50", "profile": {
"level": "Intermediate", "address": {
"name": "High-Volume Call Center" "city": "Bangalore, India -",
}, "line1": "#5/A, Banashankari Nivas,",
{ "line2": "Brindavan Layout, Subramanyapura,",
"id": "689e2852-df1b-4d41-bda8-c41c88196264", "pincode": "560061"
"level": "Intermediate", },
"name": "Team Leader/Problem Solver" "email": "hello@amruthpillai.com",
}, "firstName": "Amruth",
{ "heading": "Profile",
"id": "3a4f73b1-50c1-4a85-a4b0-2a55dfe5053a", "lastName": "Pillai",
"level": "Novice", "phone": "+91 98453 36113",
"name": "Call Center Management" "photograph": "https://i.imgur.com/2dmLSCT.jpg",
}, "subtitle": "Full Stack Web Developer",
{ "website": "amruthpillai.com"
"id": "08d6c739-1465-41f7-8825-b8d94faa38d6", },
"level": "Novice", "projects": {
"name": "Teambuilding & Training" "heading": "Projects",
}, "items": [
{ {
"id": "261b8fc3-aeec-4347-88a8-bcacb1a17aa3", "date": "2020-07-01",
"level": "Fundamental Awareness", "id": "c768dcca-90f5-4242-a608-6759b4f667fb",
"name": "Continuous Improvement" "link": "https://github.com/AmruthPillai/Reactive-Resume",
} "summary": "Reactive Resume, a free and open-source resume builder that works for you. A few of the important features that make it awesome are minimalistic UI/UX, extensive customizability, portability, regularly updated templates, etc.\n\nFor more information, check out [rxresu.me](https://github.com/AmruthPillai/Reactive-Resume)",
], "title": "Reactive Resume"
"visible": true },
}, {
"social": { "date": "2020-04-01",
"heading": "Social Network", "id": "6ca600b1-c21f-4d7b-8431-f7144d537dd3",
"items": [ "link": "https://amruthpillai.com",
{ "summary": "Resume on the Web has been a project that I've been focused on since the early 2014s. I didn't want my information to be displayed on just a sheet of paper that only HRs or Talent Scouts had the privilege of reading, I wanted it to be accessible to everyone. And that's how this project was conceptualized.",
"id": "a832b37d-f11d-4a80-8b4d-24796e571b17", "title": "Resume on the Web"
"network": "Instagram", }
"url": "https://pillai.xyz/instagram", ],
"username": "AmruthPillai" "visible": true
}, },
{ "public": true,
"id": "a72107fa-a4a5-407d-9e85-39bdb9c0b11a", "references": {
"network": "Twitter", "heading": "References",
"url": "https://pillai.xyz/twitter", "items": [
"username": "KingOKings" {
}, "email": "willywonka@goldenticket.com",
{ "id": "168339fd-3c4b-4f2f-bd3a-ef184be81700",
"id": "1dd46fdd-b3a3-4786-89ce-2e77c0823aba", "name": "Willy Wonka",
"network": "LinkedIn", "phone": "+1 (802) 234-2398",
"url": "https://pillai.xyz/linkedin", "position": "CEO at Chocolate Factory",
"username": "AmruthPillai" "summary": ""
} },
], {
"visible": true "email": "elanmusk@nottesla.com",
}, "id": "350465b9-9989-43cc-b97e-4115b8980304",
"work": { "name": "Elangovan Musk",
"heading": "Work Experience", "phone": "+91 93893 34353",
"items": [ "position": "CEO at Newton Motors",
{ "summary": ""
"company": "On Point Electronics, NYC, NY", },
"endDate": "2018-07-01", {
"id": "d7c64937-0cb9-41b1-a3a6-0679c882fe63", "email": "l.beasley@carsonlogistics.com",
"position": "Customer Service Representative", "id": "94e3447b-0a78-4fb7-b14d-591982d35320",
"startDate": "2013-01-01", "name": "Lorraine Beasley",
"summary": "- Organized customer information and account data for business planning and customer service purposes.\n- Created excel spreadsheets to track customer data and perform intense reconciliation process.\n- Received 97% positive customer survey results.\n- Speed on calls was 10% above team average. \n**Key Achievement:** Designed and executed an automatized system for following up with customers, increasing customer retention by 22%.", "phone": "+1 661-808-4188",
"website": "https://onpoint.com" "position": "Head of HR, Carson Logistics",
}, "summary": ""
{ }
"company": "Excelsior Communications, NYC, NY", ],
"endDate": "2012-12-01", "visible": true
"id": "f5c5dcfe-2a60-4169-a2f1-b305355518ea", },
"position": "Customer Service Representative", "skills": {
"startDate": "2009-10-01", "heading": "Skills",
"summary": "- Worked as a full time customer service rep in a high volume call center.\n- Received \"Associate of the Month\" award six times.\n- Chosen as an example for other associates in trainings. \n**Key Achievement:** Received Customer Appreciation bonus in three of four years.", "items": [
"website": "https://excelsior.com" {
}, "id": "54e5bceb-d0e9-4f04-98d1-48a34f7cf920",
{ "level": "Advanced",
"company": "Pizza Hut, Newark, NJ", "name": "Customer Service Expertise"
"endDate": "2009-09-01", },
"id": "dd935088-6fe7-4a4b-8ff5-7417c32d2add", {
"position": "Waiter", "id": "f0274f62-2252-4cc0-bf12-9e1070942c50",
"startDate": "2005-08-01", "level": "Intermediate",
"summary": "- Worked passionately in customer service in a high volume restaurant.\n- Completed the FAST customer service training class.\n- Maintained a high tip average thanks to consistent customer satisfaction.", "name": "High-Volume Call Center"
"website": "https://pizzahut.com" },
} {
], "id": "689e2852-df1b-4d41-bda8-c41c88196264",
"visible": true "level": "Intermediate",
} "name": "Team Leader/Problem Solver"
},
{
"id": "3a4f73b1-50c1-4a85-a4b0-2a55dfe5053a",
"level": "Novice",
"name": "Call Center Management"
},
{
"id": "08d6c739-1465-41f7-8825-b8d94faa38d6",
"level": "Novice",
"name": "Teambuilding & Training"
},
{
"id": "261b8fc3-aeec-4347-88a8-bcacb1a17aa3",
"level": "Fundamental Awareness",
"name": "Continuous Improvement"
}
],
"visible": true
},
"social": {
"heading": "Social Network",
"items": [
{
"id": "a832b37d-f11d-4a80-8b4d-24796e571b17",
"network": "Instagram",
"url": "https://pillai.xyz/instagram",
"username": "AmruthPillai"
},
{
"id": "a72107fa-a4a5-407d-9e85-39bdb9c0b11a",
"network": "Twitter",
"url": "https://pillai.xyz/twitter",
"username": "KingOKings"
},
{
"id": "1dd46fdd-b3a3-4786-89ce-2e77c0823aba",
"network": "LinkedIn",
"url": "https://pillai.xyz/linkedin",
"username": "AmruthPillai"
}
],
"visible": true
},
"work": {
"heading": "Work Experience",
"items": [
{
"company": "On Point Electronics, NYC, NY",
"endDate": "2018-07-01",
"id": "d7c64937-0cb9-41b1-a3a6-0679c882fe63",
"position": "Customer Service Representative",
"startDate": "2013-01-01",
"summary": "- Organized customer information and account data for business planning and customer service purposes.\n- Created excel spreadsheets to track customer data and perform intense reconciliation process.\n- Received 97% positive customer survey results.\n- Speed on calls was 10% above team average. \n**Key Achievement:** Designed and executed an automatized system for following up with customers, increasing customer retention by 22%.",
"website": "https://onpoint.com"
},
{
"company": "Excelsior Communications, NYC, NY",
"endDate": "2012-12-01",
"id": "f5c5dcfe-2a60-4169-a2f1-b305355518ea",
"position": "Customer Service Representative",
"startDate": "2009-10-01",
"summary": "- Worked as a full time customer service rep in a high volume call center.\n- Received \"Associate of the Month\" award six times.\n- Chosen as an example for other associates in trainings. \n**Key Achievement:** Received Customer Appreciation bonus in three of four years.",
"website": "https://excelsior.com"
},
{
"company": "Pizza Hut, Newark, NJ",
"endDate": "2009-09-01",
"id": "dd935088-6fe7-4a4b-8ff5-7417c32d2add",
"position": "Waiter",
"startDate": "2005-08-01",
"summary": "- Worked passionately in customer service in a high volume restaurant.\n- Completed the FAST customer service training class.\n- Maintained a high tip average thanks to consistent customer satisfaction.",
"website": "https://pizzahut.com"
}
],
"visible": true
}
} }

View File

@ -70,6 +70,7 @@
"items": [] "items": []
}, },
"metadata": { "metadata": {
"language": "en",
"template": "onyx", "template": "onyx",
"font": "Montserrat", "font": "Montserrat",
"layout": { "layout": {

View File

@ -1,466 +0,0 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"$id": "http://json-schema.org/draft-04/schema#",
"definitions": {
"iso8601": {
"type": "string",
"description": "e.g. 2014-06-29",
"pattern": "^([1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]|[1-2][0-9]{3}-[0-1][0-9]|[1-2][0-9]{3})$"
}
},
"properties": {
"basics": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string",
"description": "e.g. Web Developer"
},
"image": {
"type": "string",
"description": "URL (as per RFC 3986) to a image in JPEG or PNG format"
},
"email": {
"type": "string",
"description": "e.g. thomas@gmail.com",
"format": "email"
},
"phone": {
"type": "string",
"description": "Phone numbers are stored as strings so use any format you like, e.g. 712-117-2923"
},
"url": {
"type": "string",
"description": "URL (as per RFC 3986) to your website, e.g. personal homepage",
"format": "uri"
},
"summary": {
"type": "string",
"description": "Write a short 2-3 sentence biography about yourself"
},
"location": {
"type": "object",
"additionalProperties": true,
"properties": {
"address": {
"type": "string",
"description": "To add multiple address lines, use \n. For example, 1234 Glücklichkeit Straße\nHinterhaus 5. Etage li."
},
"postalCode": {
"type": "string"
},
"city": {
"type": "string"
},
"countryCode": {
"type": "string",
"description": "code as per ISO-3166-1 ALPHA-2, e.g. US, AU, IN"
},
"region": {
"type": "string",
"description": "The general region where you live. Can be a US state, or a province, for instance."
}
}
},
"profiles": {
"type": "array",
"description": "Specify any number of social networks that you participate in",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"network": {
"type": "string",
"description": "e.g. Facebook or Twitter"
},
"username": {
"type": "string",
"description": "e.g. neutralthoughts"
},
"url": {
"type": "string",
"description": "e.g. http://twitter.example.com/neutralthoughts",
"format": "uri"
}
}
}
}
}
},
"work": {
"type": "array",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. Facebook"
},
"location": {
"type": "string",
"description": "e.g. Menlo Park, CA"
},
"description": {
"type": "string",
"description": "e.g. Social Media Company"
},
"position": {
"type": "string",
"description": "e.g. Software Engineer"
},
"url": {
"type": "string",
"description": "e.g. http://facebook.example.com",
"format": "uri"
},
"startDate": {
"$ref": "#/definitions/iso8601"
},
"endDate": {
"$ref": "#/definitions/iso8601"
},
"summary": {
"type": "string",
"description": "Give an overview of your responsibilities at the company"
},
"highlights": {
"type": "array",
"description": "Specify multiple accomplishments",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
}
}
}
}
},
"volunteer": {
"type": "array",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"organization": {
"type": "string",
"description": "e.g. Facebook"
},
"position": {
"type": "string",
"description": "e.g. Software Engineer"
},
"url": {
"type": "string",
"description": "e.g. http://facebook.example.com",
"format": "uri"
},
"startDate": {
"$ref": "#/definitions/iso8601"
},
"endDate": {
"$ref": "#/definitions/iso8601"
},
"summary": {
"type": "string",
"description": "Give an overview of your responsibilities at the company"
},
"highlights": {
"type": "array",
"description": "Specify accomplishments and achievements",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
}
}
}
}
},
"education": {
"type": "array",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"institution": {
"type": "string",
"description": "e.g. Massachusetts Institute of Technology"
},
"url": {
"type": "string",
"description": "e.g. http://facebook.example.com",
"format": "uri"
},
"area": {
"type": "string",
"description": "e.g. Arts"
},
"studyType": {
"type": "string",
"description": "e.g. Bachelor"
},
"startDate": {
"$ref": "#/definitions/iso8601"
},
"endDate": {
"$ref": "#/definitions/iso8601"
},
"gpa": {
"type": "string",
"description": "grade point average, e.g. 3.67/4.0"
},
"courses": {
"type": "array",
"description": "List notable courses/subjects",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. H1302 - Introduction to American history"
}
}
}
}
},
"awards": {
"type": "array",
"description": "Specify any awards you have received throughout your professional career",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"title": {
"type": "string",
"description": "e.g. One of the 100 greatest minds of the century"
},
"date": {
"$ref": "#/definitions/iso8601"
},
"awarder": {
"type": "string",
"description": "e.g. Time Magazine"
},
"summary": {
"type": "string",
"description": "e.g. Received for my work with Quantum Physics"
}
}
}
},
"publications": {
"type": "array",
"description": "Specify your publications through your career",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. The World Wide Web"
},
"publisher": {
"type": "string",
"description": "e.g. IEEE, Computer Magazine"
},
"releaseDate": {
"$ref": "#/definitions/iso8601"
},
"url": {
"type": "string",
"description": "e.g. http://www.computer.org.example.com/csdl/mags/co/1996/10/rx069-abs.html",
"format": "uri"
},
"summary": {
"type": "string",
"description": "Short summary of publication. e.g. Discussion of the World Wide Web, HTTP, HTML."
}
}
}
},
"skills": {
"type": "array",
"description": "List out your professional skill-set",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. Web Development"
},
"level": {
"type": "string",
"description": "e.g. Master"
},
"keywords": {
"type": "array",
"description": "List some keywords pertaining to this skill",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. HTML"
}
}
}
}
},
"languages": {
"type": "array",
"description": "List any other languages you speak",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"language": {
"type": "string",
"description": "e.g. English, Spanish"
},
"fluency": {
"type": "string",
"description": "e.g. Fluent, Beginner"
}
}
}
},
"interests": {
"type": "array",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. Philosophy"
},
"keywords": {
"type": "array",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. Friedrich Nietzsche"
}
}
}
}
},
"references": {
"type": "array",
"description": "List references you have received",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. Timothy Cook"
},
"reference": {
"type": "string",
"description": "e.g. Joe blogs was a great employee, who turned up to work at least once a week. He exceeded my expectations when it came to doing nothing."
}
}
}
},
"projects": {
"type": "array",
"description": "Specify career projects",
"additionalItems": false,
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"name": {
"type": "string",
"description": "e.g. The World Wide Web"
},
"description": {
"type": "string",
"description": "Short summary of project. e.g. Collated works of 2017."
},
"highlights": {
"type": "array",
"description": "Specify multiple features",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. Directs you close but not quite there"
}
},
"keywords": {
"type": "array",
"description": "Specify special elements involved",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. AngularJS"
}
},
"startDate": {
"$ref": "#/definitions/iso8601"
},
"endDate": {
"$ref": "#/definitions/iso8601"
},
"url": {
"type": "string",
"format": "uri",
"description": "e.g. http://www.computer.org/csdl/mags/co/1996/10/rx069-abs.html"
},
"roles": {
"type": "array",
"description": "Specify your role on this project or in company",
"additionalItems": false,
"items": {
"type": "string",
"description": "e.g. Team Lead, Speaker, Writer"
}
},
"entity": {
"type": "string",
"description": "Specify the relevant company/entity affiliations e.g. 'greenpeace', 'corporationXYZ'"
},
"type": {
"type": "string",
"description": " e.g. 'volunteering', 'presentation', 'talk', 'application', 'conference'"
}
}
}
},
"meta": {
"type": "object",
"description": "The schema version and any other tooling configuration lives here",
"additionalProperties": true,
"properties": {
"canonical": {
"type": "string",
"description": "URL (as per RFC 3986) to latest version of this document",
"format": "uri"
},
"version": {
"type": "string",
"description": "A version field which follows semver - e.g. v1.0.0"
},
"lastModified": {
"type": "string",
"description": "Using ISO 8601 with YYYY-MM-DDThh:mm:ss"
}
}
}
},
"title": "Resume Schema",
"type": "object"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,15 @@
import { Tooltip } from '@material-ui/core'; import { Tooltip } from '@material-ui/core';
import Ajv from 'ajv';
import React, { memo, useContext, useEffect, useRef, useState } from 'react'; import React, { memo, useContext, useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { toast } from 'react-toastify';
import Button from '../../components/shared/Button'; import Button from '../../components/shared/Button';
import ModalContext from '../../contexts/ModalContext'; import ModalContext from '../../contexts/ModalContext';
import { useDispatch } from '../../contexts/ResumeContext'; import { useDispatch } from '../../contexts/ResumeContext';
import reactiveResumeSchema from '../../data/schema/reactiveResume.json';
import jsonResumeSchema from '../../data/schema/jsonResume.json';
import BaseModal from '../BaseModal'; import BaseModal from '../BaseModal';
const ImportModal = () => { const ImportModal = () => {
const ajv = new Ajv();
const { t } = useTranslation(); const { t } = useTranslation();
const fileInputRef = useRef(null); const reactiveResumeFileInputRef = useRef(null);
const jsonResumeFileInputRef = useRef(null);
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -29,11 +25,6 @@ const ImportModal = () => {
const fr = new FileReader(); const fr = new FileReader();
fr.addEventListener('load', () => { fr.addEventListener('load', () => {
const payload = JSON.parse(fr.result); const payload = JSON.parse(fr.result);
const valid = ajv.validate(reactiveResumeSchema, payload);
if (!valid) {
ajv.errors.forEach((x) => toast.error(`Invalid Data: ${x.message}`));
return;
}
dispatch({ type: 'on_import', payload }); dispatch({ type: 'on_import', payload });
setOpen(false); setOpen(false);
}); });
@ -44,11 +35,6 @@ const ImportModal = () => {
const fr = new FileReader(); const fr = new FileReader();
fr.addEventListener('load', () => { fr.addEventListener('load', () => {
const payload = JSON.parse(fr.result); const payload = JSON.parse(fr.result);
const valid = ajv.validate(jsonResumeSchema, payload);
if (!valid) {
ajv.errors.forEach((x) => toast.error(`Invalid Data: ${x.message}`));
return;
}
dispatch({ type: 'on_import_jsonresume', payload }); dispatch({ type: 'on_import_jsonresume', payload });
setOpen(false); setOpen(false);
}); });
@ -70,11 +56,14 @@ const ImportModal = () => {
{t('modals.import.reactiveResume.text')} {t('modals.import.reactiveResume.text')}
</p> </p>
<Button className="mt-5" onClick={() => fileInputRef.current.click()}> <Button
className="mt-5"
onClick={() => reactiveResumeFileInputRef.current.click()}
>
{t('modals.import.button')} {t('modals.import.button')}
</Button> </Button>
<input <input
ref={fileInputRef} ref={reactiveResumeFileInputRef}
type="file" type="file"
className="hidden" className="hidden"
onChange={importReactiveResumeJson} onChange={importReactiveResumeJson}
@ -90,11 +79,14 @@ const ImportModal = () => {
<p className="leading-loose">{t('modals.import.jsonResume.text')}</p> <p className="leading-loose">{t('modals.import.jsonResume.text')}</p>
<Button className="mt-5" onClick={() => fileInputRef.current.click()}> <Button
className="mt-5"
onClick={() => jsonResumeFileInputRef.current.click()}
>
{t('modals.import.button')} {t('modals.import.button')}
</Button> </Button>
<input <input
ref={fileInputRef} ref={jsonResumeFileInputRef}
type="file" type="file"
className="hidden" className="hidden"
onChange={importJsonResume} onChange={importJsonResume}

View File

@ -14,7 +14,7 @@ import styles from './view.module.css';
import Celebi from '../../templates/Celebi'; import Celebi from '../../templates/Celebi';
const ResumeViewer = ({ id }) => { const ResumeViewer = ({ id }) => {
const { t } = useTranslation(); const { t, i18n } = useTranslation();
const [resume, setResume] = useState(null); const [resume, setResume] = useState(null);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const { getResume } = useContext(DatabaseContext); const { getResume } = useContext(DatabaseContext);
@ -32,6 +32,7 @@ const ResumeViewer = ({ id }) => {
} }
setResume(data); setResume(data);
i18n.changeLanguage(data.metadata.language || 'en');
return setLoading(false); return setLoading(false);
})(); })();
}, [id]); }, [id]);

View File

@ -1,5 +1,6 @@
import { get } from 'lodash'; import { get } from 'lodash';
import React, { memo, useContext } from 'react'; import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next';
import { FaCaretRight } from 'react-icons/fa'; import { FaCaretRight } from 'react-icons/fa';
import PageContext from '../../../contexts/PageContext'; import PageContext from '../../../contexts/PageContext';
import { safetyCheck } from '../../../utils'; import { safetyCheck } from '../../../utils';
@ -7,7 +8,7 @@ import Icons from '../Icons';
const ContactItem = ({ value, icon, link }) => { const ContactItem = ({ value, icon, link }) => {
const { data } = useContext(PageContext); const { data } = useContext(PageContext);
const Icon = get(Icons, icon.toLowerCase(), FaCaretRight); const Icon = get(Icons, icon && icon.toLowerCase(), FaCaretRight);
return value ? ( return value ? (
<div className="flex items-center"> <div className="flex items-center">
@ -28,22 +29,23 @@ const ContactItem = ({ value, icon, link }) => {
}; };
const ContactA = () => { const ContactA = () => {
const { t } = useTranslation();
const { data } = useContext(PageContext); const { data } = useContext(PageContext);
return ( return (
<div className="text-xs grid gap-2"> <div className="text-xs grid gap-2">
<ContactItem <ContactItem
icon="phone" label={t('shared.forms.phone')}
value={data.profile.phone} value={data.profile.phone}
link={`tel:${data.profile.phone}`} link={`tel:${data.profile.phone}`}
/> />
<ContactItem <ContactItem
icon="website" label={t('shared.forms.website')}
value={data.profile.website} value={data.profile.website}
link={data.profile.website} link={data.profile.website}
/> />
<ContactItem <ContactItem
icon="email" label={t('shared.forms.email')}
value={data.profile.email} value={data.profile.email}
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />

View File

@ -1,5 +1,6 @@
import { get } from 'lodash'; import { get } from 'lodash';
import React, { memo, useContext } from 'react'; import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next';
import { FaCaretRight } from 'react-icons/fa'; import { FaCaretRight } from 'react-icons/fa';
import PageContext from '../../../contexts/PageContext'; import PageContext from '../../../contexts/PageContext';
import { safetyCheck } from '../../../utils'; import { safetyCheck } from '../../../utils';
@ -28,22 +29,23 @@ const ContactItem = ({ value, icon, link }) => {
}; };
const ContactA = () => { const ContactA = () => {
const { t } = useTranslation();
const { data } = useContext(PageContext); const { data } = useContext(PageContext);
return ( return (
<div className="text-xs grid gap-2"> <div className="text-xs grid gap-2">
<ContactItem <ContactItem
icon="phone" label={t('shared.forms.phone')}
value={data.profile.phone} value={data.profile.phone}
link={`tel:${data.profile.phone}`} link={`tel:${data.profile.phone}`}
/> />
<ContactItem <ContactItem
icon="website" label={t('shared.forms.website')}
value={data.profile.website} value={data.profile.website}
link={data.profile.website} link={data.profile.website}
/> />
<ContactItem <ContactItem
icon="email" label={t('shared.forms.email')}
value={data.profile.email} value={data.profile.email}
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />

View File

@ -40,17 +40,17 @@ const ContactC = () => {
)} )}
<ContactItem <ContactItem
label="phone" label={t('shared.forms.phone')}
value={data.profile.phone} value={data.profile.phone}
link={`tel:${data.profile.phone}`} link={`tel:${data.profile.phone}`}
/> />
<ContactItem <ContactItem
label="website" label={t('shared.forms.website')}
value={data.profile.website} value={data.profile.website}
link={data.profile.website} link={data.profile.website}
/> />
<ContactItem <ContactItem
label="email" label={t('shared.forms.email')}
value={data.profile.email} value={data.profile.email}
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />

View File

@ -58,17 +58,17 @@ const ContactD = () => {
)} )}
<ContactItem <ContactItem
label="phone" label={t('shared.forms.phone')}
value={data.profile.phone} value={data.profile.phone}
link={`tel:${data.profile.phone}`} link={`tel:${data.profile.phone}`}
/> />
<ContactItem <ContactItem
label="website" label={t('shared.forms.website')}
value={data.profile.website} value={data.profile.website}
link={data.profile.website} link={data.profile.website}
/> />
<ContactItem <ContactItem
label="email" label={t('shared.forms.email')}
value={data.profile.email} value={data.profile.email}
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />

View File

@ -40,17 +40,17 @@ const ContactE = () => {
</div> </div>
<ContactItem <ContactItem
label="phone" label={t('shared.forms.phone')}
value={data.profile.phone} value={data.profile.phone}
link={`tel:${data.profile.phone}`} link={`tel:${data.profile.phone}`}
/> />
<ContactItem <ContactItem
label="website" label={t('shared.forms.website')}
value={data.profile.website} value={data.profile.website}
link={data.profile.website} link={data.profile.website}
/> />
<ContactItem <ContactItem
label="email" label={t('shared.forms.email')}
value={data.profile.email} value={data.profile.email}
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />

View File

@ -1,4 +1,5 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import 'dayjs/locale/ar';
import 'dayjs/locale/da'; import 'dayjs/locale/da';
import 'dayjs/locale/de'; import 'dayjs/locale/de';
import 'dayjs/locale/en'; import 'dayjs/locale/en';