Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
gianantoniopini
2020-12-24 10:18:29 +01:00
15 changed files with 92 additions and 51 deletions

4
.dockerignore Normal file
View File

@ -0,0 +1,4 @@
.cache/
node_modules/
functions/
public/

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM node as builder
WORKDIR /app
COPY ./ /app/
RUN npm install
RUN npm run build
FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html
COPY --from=builder /app/public/ /usr/share/nginx/html
COPY server.conf /etc/nginx/conf.d/default.conf

View File

@ -6,7 +6,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.4.2', version: '2.4.3',
}, },
plugins: [ plugins: [
'gatsby-plugin-react-helmet', 'gatsby-plugin-react-helmet',

19
server.conf Normal file
View File

@ -0,0 +1,19 @@
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
autoindex off;
charset urtf-8;
error_page 404 /404.html;
location ~* \.(html)$ {
add_header Cache-Control "no-store";
expires off;
}
rewrite ^([^.\?]*[^/])$ $1/ permanent;
try_files $uri $uri/ $uri/index.html =404;
}

View File

@ -12,7 +12,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA';
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -77,11 +76,8 @@ const Castform = ({ data }) => {
<div> <div>
<HeadingD>{data.profile.heading}</HeadingD> <HeadingD>{data.profile.heading}</HeadingD>
<div className="grid gap-4">
<BirthDateA />
<ContactC /> <ContactC />
</div> </div>
</div>
{layout[0] && {layout[0] &&
layout[0].map((x) => { layout[0].map((x) => {

View File

@ -14,7 +14,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA';
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -102,7 +101,6 @@ const Celebi = ({ data }) => {
<div> <div>
<HeadingE>{t('builder.sections.profile')}</HeadingE> <HeadingE>{t('builder.sections.profile')}</HeadingE>
<div className="relative w-full grid gap-4 text-xs"> <div className="relative w-full grid gap-4 text-xs">
<BirthDateA />
<ContactC /> <ContactC />
</div> </div>
</div> </div>

View File

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { useTranslation } from 'react-i18next';
import PageContext from '../contexts/PageContext'; import PageContext from '../contexts/PageContext';
import { hexToRgb } from '../utils'; import { hasAddress, hexToRgb } from '../utils';
import AwardsA from './blocks/Awards/AwardsA'; import AwardsA from './blocks/Awards/AwardsA';
import CertificationsA from './blocks/Certifications/CertificationsA'; import CertificationsA from './blocks/Certifications/CertificationsA';
import ContactB from './blocks/Contact/ContactB'; import ContactB from './blocks/Contact/ContactB';
@ -13,7 +14,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesB from './blocks/References/ReferencesB'; import ReferencesB from './blocks/References/ReferencesB';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateC from './blocks/BirthDate/BirthDateC';
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -29,6 +29,7 @@ const Blocks = {
}; };
const Gengar = ({ data }) => { const Gengar = ({ data }) => {
const { t } = useTranslation();
const layout = data.metadata.layout.gengar; const layout = data.metadata.layout.gengar;
const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {}; const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {};
@ -80,9 +81,10 @@ const Gengar = ({ data }) => {
<Profile /> <Profile />
</div> </div>
{hasAddress(data.profile.address) && (
<div className="flex flex-col mt-4 text-xs"> <div className="flex flex-col mt-4 text-xs">
<h6 className="font-bold text-xs uppercase tracking-wide mb-1"> <h6 className="font-bold text-xs uppercase tracking-wide mb-1">
Address {t('shared.forms.address')}
</h6> </h6>
<span>{data.profile.address.line1}</span> <span>{data.profile.address.line1}</span>
<span>{data.profile.address.line2}</span> <span>{data.profile.address.line2}</span>
@ -90,19 +92,17 @@ const Gengar = ({ data }) => {
{data.profile.address.city} {data.profile.address.pincode} {data.profile.address.city} {data.profile.address.pincode}
</span> </span>
</div> </div>
)}
<hr <hr
className="w-1/4 my-5 opacity-25" className="w-1/4 my-5 opacity-25"
style={{ borderColor: data.metadata.colors.background }} style={{ borderColor: data.metadata.colors.background }}
/> />
<div className="grid gap-4"> <h6 className="font-bold text-xs uppercase tracking-wide mb-2">
<h6 className="font-bold text-xs uppercase tracking-wide mb-1"> Contact
Contacts
</h6> </h6>
<ContactB /> <ContactB />
<BirthDateC />
</div>
</div> </div>
<div <div

View File

@ -13,7 +13,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA';
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -71,11 +70,7 @@ const Glalie = ({ data }) => {
> >
<div className="grid gap-6 text-center p-8"> <div className="grid gap-6 text-center p-8">
<Profile /> <Profile />
<div className="grid">
<BirthDateA />
<ContactD /> <ContactD />
</div>
{layout[0] && {layout[0] &&
layout[0].map((x) => { layout[0].map((x) => {

View File

@ -1,4 +1,5 @@
import React, { memo } from 'react'; import React, { memo } from 'react';
import { useTranslation } from 'react-i18next';
import PageContext from '../contexts/PageContext'; import PageContext from '../contexts/PageContext';
import AwardsA from './blocks/Awards/AwardsA'; import AwardsA from './blocks/Awards/AwardsA';
import CertificationsA from './blocks/Certifications/CertificationsA'; import CertificationsA from './blocks/Certifications/CertificationsA';
@ -12,7 +13,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateB from './blocks/BirthDate/BirthDateB'; import { hasAddress } from '../utils';
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -28,6 +29,7 @@ const Blocks = {
}; };
const Onyx = ({ data }) => { const Onyx = ({ data }) => {
const { t } = useTranslation();
const layout = data.metadata.layout.onyx; const layout = data.metadata.layout.onyx;
return ( return (
@ -61,21 +63,23 @@ const Onyx = ({ data }) => {
</h1> </h1>
<h6 className="font-medium text-sm">{data.profile.subtitle}</h6> <h6 className="font-medium text-sm">{data.profile.subtitle}</h6>
{hasAddress(data.profile.address) && (
<div className="flex flex-col mt-4 text-xs"> <div className="flex flex-col mt-4 text-xs">
<h6 className="font-bold text-xs uppercase tracking-wide mb-1">
{t('shared.forms.address')}
</h6>
<span>{data.profile.address.line1}</span> <span>{data.profile.address.line1}</span>
<span>{data.profile.address.line2}</span> <span>{data.profile.address.line2}</span>
<span> <span>
{data.profile.address.city} {data.profile.address.pincode} {data.profile.address.city} {data.profile.address.pincode}
</span> </span>
</div> </div>
)}
</div> </div>
</div> </div>
<div className="grid gap-4">
<BirthDateB />
<Contact /> <Contact />
</div> </div>
</div>
<hr <hr
className="my-5 opacity-25" className="my-5 opacity-25"

View File

@ -12,7 +12,6 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateB from './blocks/BirthDate/BirthDateB';
const Blocks = { const Blocks = {
work: WorkA, work: WorkA,
@ -90,7 +89,6 @@ const Pikachu = ({ data }) => {
<div className="col-span-4"> <div className="col-span-4">
<div className="grid gap-4"> <div className="grid gap-4">
<BirthDateB />
<ContactA /> <ContactA />
{layout[0] && {layout[0] &&

View File

@ -4,6 +4,7 @@ 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';
import BirthDateB from '../BirthDate/BirthDateB';
import Icons from '../Icons'; import Icons from '../Icons';
const ContactItem = ({ value, icon, link }) => { const ContactItem = ({ value, icon, link }) => {
@ -53,6 +54,8 @@ const ContactA = () => {
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />
<BirthDateB />
{safetyCheck(data.social) && {safetyCheck(data.social) &&
data.social.items.map((x) => ( data.social.items.map((x) => (
<ContactItem <ContactItem

View File

@ -4,6 +4,7 @@ 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';
import BirthDateC from '../BirthDate/BirthDateC';
import Icons from '../Icons'; import Icons from '../Icons';
const ContactItem = ({ value, icon, link }) => { const ContactItem = ({ value, icon, link }) => {
@ -53,6 +54,8 @@ const ContactB = () => {
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />
<BirthDateC />
{safetyCheck(data.social) && {safetyCheck(data.social) &&
data.social.items.map((x) => ( data.social.items.map((x) => (
<ContactItem <ContactItem

View File

@ -1,7 +1,8 @@
import React, { memo, useContext } from 'react'; import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import PageContext from '../../../contexts/PageContext'; import PageContext from '../../../contexts/PageContext';
import { safetyCheck } from '../../../utils'; import { hasAddress, safetyCheck } from '../../../utils';
import BirthDateA from '../BirthDate/BirthDateA';
const ContactItem = ({ value, label, link }) => const ContactItem = ({ value, label, link }) =>
value ? ( value ? (
@ -23,7 +24,7 @@ const ContactC = () => {
return ( return (
<div className="text-xs grid gap-2"> <div className="text-xs grid gap-2">
{data.profile.address.line1 && ( {hasAddress(data.profile.address) && (
<div> <div>
<h6 className="capitalize font-semibold"> <h6 className="capitalize font-semibold">
{t('shared.forms.address')} {t('shared.forms.address')}
@ -54,6 +55,8 @@ const ContactC = () => {
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />
<BirthDateA />
{safetyCheck(data.social) && {safetyCheck(data.social) &&
data.social.items.map((x) => ( data.social.items.map((x) => (
<ContactItem <ContactItem

View File

@ -2,7 +2,8 @@ import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { MdFlare } from 'react-icons/md'; import { MdFlare } from 'react-icons/md';
import PageContext from '../../../contexts/PageContext'; import PageContext from '../../../contexts/PageContext';
import { safetyCheck } from '../../../utils'; import { hasAddress, safetyCheck } from '../../../utils';
import BirthDateA from '../BirthDate/BirthDateA';
const ContactItem = ({ value, label, link }) => const ContactItem = ({ value, label, link }) =>
value ? ( value ? (
@ -41,7 +42,7 @@ const ContactD = () => {
<MdFlare size="20px" /> <MdFlare size="20px" />
</div> </div>
{data.profile.address.line1 && ( {hasAddress(data.profile.address) && (
<div> <div>
<h6 className="capitalize font-semibold"> <h6 className="capitalize font-semibold">
{t('shared.forms.address')} {t('shared.forms.address')}
@ -72,6 +73,8 @@ const ContactD = () => {
link={`mailto:${data.profile.email}`} link={`mailto:${data.profile.email}`}
/> />
<BirthDateA />
{safetyCheck(data.social) && {safetyCheck(data.social) &&
data.social.items.map((x) => ( data.social.items.map((x) => (
<ContactItem <ContactItem

View File

@ -48,6 +48,9 @@ export const getUnsplashPhoto = async () => {
return response.url; return response.url;
}; };
export const hasAddress = (address) =>
!!address.line1 || !!address.line2 || !!address.city || !!address.pincode;
export const hexToRgb = (hex) => { export const hexToRgb = (hex) => {
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b); hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);