From 59f0ff9228cd39776d7fa08296442d0abf045693 Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Wed, 4 Nov 2020 13:38:43 +0100 Subject: [PATCH 1/6] Issue #314: Added BirthDate field to Profile builder and Castform template --- .../builder/left/sections/Profile.js | 7 ++++++ src/data/demoState.json | 1 + src/data/initialState.json | 1 + src/i18n/locales/en.json | 1 + src/templates/Castform.js | 23 +++++++++++++++++-- src/utils/index.js | 7 ++++-- 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/components/builder/left/sections/Profile.js b/src/components/builder/left/sections/Profile.js index 45be2af4..2c4c9422 100644 --- a/src/components/builder/left/sections/Profile.js +++ b/src/components/builder/left/sections/Profile.js @@ -38,6 +38,13 @@ const Profile = ({ id }) => { path="profile.subtitle" /> + +
{ +const Castform = ({ data, language }) => { + const { t } = useTranslation(); const layout = data.metadata.layout.castform; const Photo = () => @@ -51,6 +54,19 @@ const Castform = ({ data }) => { ); + const BirthDate = () => ( + data.profile.birthDate && ( +
+
+ {t('builder.profile.birthDate')} +
+
+ {formatDate({ date: data.profile.birthDate, language, includeDay: true })} +
+
+ ) + ); + return (
{
{data.profile.heading} - +
+ + +
{layout[0] && diff --git a/src/utils/index.js b/src/utils/index.js index 87e0daa9..273c53d3 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -20,8 +20,11 @@ export const isFileImage = (file) => { return file && acceptedImageTypes.includes(file.type); }; -export const formatDate = ({ date, language = 'en' }) => { - return dayjs(date).locale(language.substr(0, 2)).format('MMMM YYYY'); +export const formatDate = ({ date, language = 'en', includeDay = false }) => { + const monthYearTemplate = 'MMMM YYYY'; + const template = includeDay ? 'DD ' + monthYearTemplate : monthYearTemplate; + + return dayjs(date).locale(language.substr(0, 2)).format(template); }; export const formatDateRange = ({ startDate, endDate, language = 'en' }, t) => { From ea9931a14757230b40a4c27b02ca02c7809381db Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Wed, 4 Nov 2020 14:56:28 +0100 Subject: [PATCH 2/6] Issue #314: Added new BirthDate field to the i18n language files --- src/i18n/locales/ar.json | 1 + src/i18n/locales/da.json | 1 + src/i18n/locales/de.json | 1 + src/i18n/locales/es.json | 1 + src/i18n/locales/fi.json | 1 + src/i18n/locales/fr.json | 1 + src/i18n/locales/hi.json | 1 + src/i18n/locales/it.json | 1 + src/i18n/locales/ja.json | 1 + src/i18n/locales/kn.json | 1 + src/i18n/locales/nb.json | 1 + src/i18n/locales/nl.json | 1 + src/i18n/locales/pl.json | 1 + src/i18n/locales/pt-br.json | 1 + src/i18n/locales/pt-pt.json | 1 + src/i18n/locales/ru.json | 1 + src/i18n/locales/sv.json | 1 + src/i18n/locales/tr.json | 1 + src/i18n/locales/zh.json | 1 + 19 files changed, 19 insertions(+) diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json index 5d02011b..35fc66d9 100644 --- a/src/i18n/locales/ar.json +++ b/src/i18n/locales/ar.json @@ -96,6 +96,7 @@ "photograph": "صورة فوتوغرافية", "firstName": "الاسم الاول", "lastName": "اسم العائلة", + "birthDate": "تاريخ الولادة", "address": { "line1": "العنوان الأول", "line2": "العنوان الثاني", diff --git a/src/i18n/locales/da.json b/src/i18n/locales/da.json index 338d1ea0..aa643bc2 100644 --- a/src/i18n/locales/da.json +++ b/src/i18n/locales/da.json @@ -96,6 +96,7 @@ "photograph": "Fotografi", "firstName": "Fornavn", "lastName": "Efternavn", + "birthDate": "Fødselsdato", "address": { "line1": "Adresse linie 1", "line2": "Adresse linie 2", diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index f7b7994e..58e890f5 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -96,6 +96,7 @@ "photograph": "Foto", "firstName": "Vorname", "lastName": "Nachname", + "birthDate": "Geburtsdatum", "address": { "line1": "Adresszeile 1", "line2": "Adresszeile 2", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 18b7fc7c..5c33c25d 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -96,6 +96,7 @@ "photograph": "Fotografía", "firstName": "Nombre", "lastName": "Apellido", + "birthDate": "Fecha de Nacimiento", "address": { "line1": "Domicilio - Línea 1", "line2": "Dirección - Línea 2", diff --git a/src/i18n/locales/fi.json b/src/i18n/locales/fi.json index c7143296..f0c730ae 100644 --- a/src/i18n/locales/fi.json +++ b/src/i18n/locales/fi.json @@ -96,6 +96,7 @@ "photograph": "Valokuva", "firstName": "Etunimi", "lastName": "Sukunimi", + "birthDate": "Syntymäaika", "address": { "line1": "Osoiterivi 1", "line2": "Osoiterivi 2", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 1deabf06..ede52ea3 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -96,6 +96,7 @@ "photograph": "Photo", "firstName": "Prénom", "lastName": "Nom", + "birthDate": "Date de naissance", "address": { "line1": "Adresse (ligne 1)", "line2": "Adresse (ligne 2)", diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index 25c7e183..39af6647 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -96,6 +96,7 @@ "photograph": "फोटो", "firstName": "पहला नाम", "lastName": "उपनाम", + "birthDate": "जन्म की तारीख", "address": { "line1": "पता पंक्ति 1", "line2": "पता पंक्ति नं। 2", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 2e1ed04b..eabba658 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -96,6 +96,7 @@ "photograph": "Fotografia", "firstName": "Nome", "lastName": "Cognome", + "birthDate": "Data di Nascita", "address": { "line1": "Riga Indirizzo 1", "line2": "Riga Indirizzo 2", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index adf6c73c..a89cf84a 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -96,6 +96,7 @@ "photograph": "写真", "firstName": "名", "lastName": "姓", + "birthDate": "生年月日", "address": { "line1": "都道府県", "line2": "市区町村", diff --git a/src/i18n/locales/kn.json b/src/i18n/locales/kn.json index 896a9e57..59439ce1 100644 --- a/src/i18n/locales/kn.json +++ b/src/i18n/locales/kn.json @@ -96,6 +96,7 @@ "photograph": "ಫೋಟೋ", "firstName": "ಮೊದಲ ಹೆಸರು", "lastName": "ಕೊನೆಯ ಹೆಸರು", + "birthDate": "ಹುಟ್ತಿದ ದಿನ", "address": { "line1": "ವಿಳಾಸ ಸಾಲು 1", "line2": "ವಿಳಾಸ ಸಾಲು 2", diff --git a/src/i18n/locales/nb.json b/src/i18n/locales/nb.json index f04a137b..0c563fba 100644 --- a/src/i18n/locales/nb.json +++ b/src/i18n/locales/nb.json @@ -96,6 +96,7 @@ "photograph": "Foto", "firstName": "Fornavn", "lastName": "Etternavn", + "birthDate": "Fødselsdato", "address": { "line1": "Adresselinje 1", "line2": "Adresselinje 2", diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json index 8e1ef47d..6529d13d 100644 --- a/src/i18n/locales/nl.json +++ b/src/i18n/locales/nl.json @@ -96,6 +96,7 @@ "photograph": "foto", "firstName": "Voornaam", "lastName": "Achternaam", + "birthDate": "Geboortedatum", "address": { "line1": "Adresveld 1", "line2": "Adresveld 2", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 7ce06ba9..873774fd 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -96,6 +96,7 @@ "photograph": "Fotografia", "firstName": "Imię", "lastName": "Nazwisko", + "birthDate": "Data urodzenia", "address": { "line1": "Pole adresowe 1", "line2": "Pole adresowe 2", diff --git a/src/i18n/locales/pt-br.json b/src/i18n/locales/pt-br.json index d9075a40..f271b540 100644 --- a/src/i18n/locales/pt-br.json +++ b/src/i18n/locales/pt-br.json @@ -96,6 +96,7 @@ "photograph": "Foto", "firstName": "Primeiro Nome", "lastName": "Sobrenome", + "birthDate": "Data de Nascimento", "address": { "line1": "Endereço Linha 1", "line2": "Endereço Linha 2", diff --git a/src/i18n/locales/pt-pt.json b/src/i18n/locales/pt-pt.json index 4051ec74..54d86783 100644 --- a/src/i18n/locales/pt-pt.json +++ b/src/i18n/locales/pt-pt.json @@ -95,6 +95,7 @@ "photograph": "Fotografia", "firstName": "Nome", "lastName": "Apelido", + "birthDate": "Data de Nascimento", "address": { "line1": "Morada Linha 1", "line2": "Morada Linha 2", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 4d06e324..c016808c 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -96,6 +96,7 @@ "photograph": "Фотография", "firstName": "Имя", "lastName": "Фамилия", + "birthDate": "Дата рождения", "address": { "line1": "Адрес, строка 1", "line2": "Адрес, строка 2", diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json index a861f554..befaf82a 100644 --- a/src/i18n/locales/sv.json +++ b/src/i18n/locales/sv.json @@ -96,6 +96,7 @@ "photograph": "Fotografi", "firstName": "Förnamn", "lastName": "Efternamn", + "birthDate": "Födelsedatum", "address": { "line1": "Addressrad 1", "line2": "Addressrad 2", diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json index 3838f61a..df3ec753 100644 --- a/src/i18n/locales/tr.json +++ b/src/i18n/locales/tr.json @@ -96,6 +96,7 @@ "photograph": "Fotoğraf", "firstName": "Ad", "lastName": "Soyad", + "birthDate": "Doğum Tarihi", "address": { "line1": "Adres Satırı 1", "line2": "Adres Satırı 2", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index e83893e6..664cc5f7 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -96,6 +96,7 @@ "photograph": "照片", "firstName": "姓", "lastName": "名", + "birthDate": "出生日期", "address": { "line1": "地址(第一行)", "line2": "地址(第二行)", From f779ca4cbf18b8c4e15e29b572c06e148c40af60 Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Sun, 8 Nov 2020 14:56:52 +0100 Subject: [PATCH 3/6] Issue #314: Modified Castform template to handle data profile having no birthDate field (backward compatibility) --- src/templates/Castform.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/templates/Castform.js b/src/templates/Castform.js index 44d2c558..516746d5 100644 --- a/src/templates/Castform.js +++ b/src/templates/Castform.js @@ -54,18 +54,22 @@ const Castform = ({ data, language }) => {
); - const BirthDate = () => ( - data.profile.birthDate && ( -
-
- {t('builder.profile.birthDate')} -
-
- {formatDate({ date: data.profile.birthDate, language, includeDay: true })} + const BirthDate = () => { + if (data.profile.birthDate) { + return ( +
+
+ {t('builder.profile.birthDate')} +
+
+ {formatDate({ date: data.profile.birthDate, language, includeDay: true })} +
-
- ) - ); + ); + } + + return null; + } return ( From 21e499502fa93c01ffff1e0900227a733de3eeba Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Mon, 9 Nov 2020 12:42:15 +0100 Subject: [PATCH 4/6] Issue #314: Created separate component BirthDateA, with language retrieved from data.metadata.language --- src/templates/Castform.js | 25 +++---------------- src/templates/blocks/BirthDate/BirthDateA.js | 26 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 src/templates/blocks/BirthDate/BirthDateA.js diff --git a/src/templates/Castform.js b/src/templates/Castform.js index 516746d5..b78c081b 100644 --- a/src/templates/Castform.js +++ b/src/templates/Castform.js @@ -1,5 +1,4 @@ import React from 'react'; -import { useTranslation } from 'react-i18next'; import PageContext from '../contexts/PageContext'; import AwardsA from './blocks/Awards/AwardsA'; import CertificationsA from './blocks/Certifications/CertificationsA'; @@ -13,7 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA'; import ReferencesA from './blocks/References/ReferencesA'; import SkillsA from './blocks/Skills/SkillsA'; import WorkA from './blocks/Work/WorkA'; -import { formatDate } from '../utils'; +import BirthDateA from './blocks/BirthDate/BirthDateA' const Blocks = { objective: ObjectiveA, @@ -28,8 +27,7 @@ const Blocks = { references: ReferencesA, }; -const Castform = ({ data, language }) => { - const { t } = useTranslation(); +const Castform = ({ data }) => { const layout = data.metadata.layout.castform; const Photo = () => @@ -54,23 +52,6 @@ const Castform = ({ data, language }) => {
); - const BirthDate = () => { - if (data.profile.birthDate) { - return ( -
-
- {t('builder.profile.birthDate')} -
-
- {formatDate({ date: data.profile.birthDate, language, includeDay: true })} -
-
- ); - } - - return null; - } - return (
{
{data.profile.heading}
- +
diff --git a/src/templates/blocks/BirthDate/BirthDateA.js b/src/templates/blocks/BirthDate/BirthDateA.js new file mode 100644 index 00000000..486919a9 --- /dev/null +++ b/src/templates/blocks/BirthDate/BirthDateA.js @@ -0,0 +1,26 @@ +import React, { memo, useContext } from 'react'; +import { useTranslation } from 'react-i18next'; +import PageContext from '../../../contexts/PageContext'; +import { formatDate } from '../../../utils'; + +const BirthDateA = () => { + const { t } = useTranslation(); + const { data } = useContext(PageContext); + + if (data.profile.birthDate) { + return ( +
+
+ {t('builder.profile.birthDate')} +
+
+ {formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })} +
+
+ ); + } + + return null; +} + +export default memo(BirthDateA); \ No newline at end of file From df4f4e2ccd6f58f9a94ac55da05bdbfe933a37b4 Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Mon, 9 Nov 2020 17:07:48 +0100 Subject: [PATCH 5/6] Issue #314: Updated Onyx template to incorporate birthDate field through new component BirthDateB --- src/templates/Onyx.js | 6 ++++- src/templates/blocks/BirthDate/BirthDateB.js | 27 ++++++++++++++++++++ src/templates/blocks/Icons.js | 6 +++-- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/templates/blocks/BirthDate/BirthDateB.js diff --git a/src/templates/Onyx.js b/src/templates/Onyx.js index 5f44924f..04b9f983 100644 --- a/src/templates/Onyx.js +++ b/src/templates/Onyx.js @@ -12,6 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA'; import ReferencesA from './blocks/References/ReferencesA'; import SkillsA from './blocks/Skills/SkillsA'; import WorkA from './blocks/Work/WorkA'; +import BirthDateB from './blocks/BirthDate/BirthDateB' const Blocks = { objective: ObjectiveA, @@ -70,7 +71,10 @@ const Onyx = ({ data }) => {
- +
+ + +

{ + const { data } = useContext(PageContext); + const Icon = get(Icons, "birthdaycake"); + + if (data.profile.birthDate) { + return ( +
+ + {formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })} +
+ ); + } + + return null; +} + +export default memo(BirthDateB); \ No newline at end of file diff --git a/src/templates/blocks/Icons.js b/src/templates/blocks/Icons.js index 7e24dcf0..afc93f5f 100644 --- a/src/templates/blocks/Icons.js +++ b/src/templates/blocks/Icons.js @@ -8,7 +8,8 @@ import { FaInstagram, FaStackOverflow, FaBehance, - FaGitlab + FaGitlab, + FaBirthdayCake } from 'react-icons/fa'; import { MdPhone, MdEmail } from 'react-icons/md'; @@ -24,7 +25,8 @@ const Icons = { instagram: FaInstagram, stackoverflow: FaStackOverflow, behance: FaBehance, - gitlab: FaGitlab + gitlab: FaGitlab, + birthdaycake: FaBirthdayCake }; export default Icons; From 0f390ab493abdd133ec968a78a69135b6f9fc13b Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Tue, 10 Nov 2020 14:01:16 +0100 Subject: [PATCH 6/6] Issue #314: Updated Celebi, Gengar, Glalie and Pikachu templates to include new birthDate field; deleted ContactE block as it is no longer used in the Celebi template. --- src/templates/Celebi.js | 14 +++- src/templates/Gengar.js | 6 +- src/templates/Glalie.js | 7 +- src/templates/Pikachu.js | 2 + src/templates/blocks/BirthDate/BirthDateC.js | 27 ++++++++ src/templates/blocks/Contact/ContactE.js | 72 -------------------- 6 files changed, 52 insertions(+), 76 deletions(-) create mode 100644 src/templates/blocks/BirthDate/BirthDateC.js delete mode 100644 src/templates/blocks/Contact/ContactE.js diff --git a/src/templates/Celebi.js b/src/templates/Celebi.js index 285af3f5..56275fd3 100644 --- a/src/templates/Celebi.js +++ b/src/templates/Celebi.js @@ -1,9 +1,10 @@ import React from 'react'; +import { useTranslation } from 'react-i18next'; import PageContext from '../contexts/PageContext'; import { hexToRgb } from '../utils'; import AwardsA from './blocks/Awards/AwardsA'; import CertificationsA from './blocks/Certifications/CertificationsA'; -import ContactE from './blocks/Contact/ContactE'; +import ContactC from './blocks/Contact/ContactC'; import EducationA from './blocks/Education/EducationA'; import HeadingE from './blocks/Heading/HeadingE'; import HobbiesA from './blocks/Hobbies/HobbiesA'; @@ -13,6 +14,7 @@ import ProjectsA from './blocks/Projects/ProjectsA'; import ReferencesA from './blocks/References/ReferencesA'; import SkillsA from './blocks/Skills/SkillsA'; import WorkA from './blocks/Work/WorkA'; +import BirthDateA from './blocks/BirthDate/BirthDateA' const Blocks = { objective: ObjectiveA, @@ -30,6 +32,7 @@ const Blocks = { const Celebi = ({ data }) => { const layout = data.metadata.layout.celebi; const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {}; + const { t } = useTranslation(); const styles = { header: { @@ -94,8 +97,15 @@ const Celebi = ({ data }) => {
+
- +
+ {t('builder.sections.profile')} +
+ + +
+
{layout[0] && layout[0].map((x) => { diff --git a/src/templates/Gengar.js b/src/templates/Gengar.js index 07a65294..41f828e2 100644 --- a/src/templates/Gengar.js +++ b/src/templates/Gengar.js @@ -13,6 +13,7 @@ import ProjectsA from './blocks/Projects/ProjectsA'; import ReferencesB from './blocks/References/ReferencesB'; import SkillsA from './blocks/Skills/SkillsA'; import WorkA from './blocks/Work/WorkA'; +import BirthDateC from './blocks/BirthDate/BirthDateC' const Blocks = { objective: ObjectiveA, @@ -84,7 +85,10 @@ const Gengar = ({ data }) => { style={{ borderColor: data.metadata.colors.background }} /> - +
+ + +
{ >
- + +
+ + +
{layout[0] && layout[0].map((x) => { diff --git a/src/templates/Pikachu.js b/src/templates/Pikachu.js index 5b30a68e..6cf75739 100644 --- a/src/templates/Pikachu.js +++ b/src/templates/Pikachu.js @@ -12,6 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA'; import ReferencesA from './blocks/References/ReferencesA'; import SkillsA from './blocks/Skills/SkillsA'; import WorkA from './blocks/Work/WorkA'; +import BirthDateB from './blocks/BirthDate/BirthDateB' const Blocks = { work: WorkA, @@ -89,6 +90,7 @@ const Pikachu = ({ data }) => {
+ {layout[0] && diff --git a/src/templates/blocks/BirthDate/BirthDateC.js b/src/templates/blocks/BirthDate/BirthDateC.js new file mode 100644 index 00000000..8c8c04e9 --- /dev/null +++ b/src/templates/blocks/BirthDate/BirthDateC.js @@ -0,0 +1,27 @@ +import React, { memo, useContext } from 'react'; +import PageContext from '../../../contexts/PageContext'; +import { get } from 'lodash'; +import Icons from '../Icons'; +import { formatDate } from '../../../utils'; + +const BirthDateC = () => { + const { data } = useContext(PageContext); + const Icon = get(Icons, "birthdaycake"); + + if (data.profile.birthDate) { + return ( +
+ + {formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })} +
+ ); + } + + return null; +} + +export default memo(BirthDateC); \ No newline at end of file diff --git a/src/templates/blocks/Contact/ContactE.js b/src/templates/blocks/Contact/ContactE.js deleted file mode 100644 index 28413fea..00000000 --- a/src/templates/blocks/Contact/ContactE.js +++ /dev/null @@ -1,72 +0,0 @@ -import React, { memo, useContext } from 'react'; -import { useTranslation } from 'react-i18next'; -import PageContext from '../../../contexts/PageContext'; -import { safetyCheck } from '../../../utils'; - -const ContactItem = ({ value, label, link }) => { - return value ? ( -
-
{label}
- {link ? ( - - {value} - - ) : ( - {value} - )} -
- ) : null; -}; - -const ContactE = () => { - const { t } = useTranslation(); - const { data, heading: Heading } = useContext(PageContext); - - return ( -
- {t('builder.sections.profile')} -
-
-
- {t('shared.forms.address')} -
-
- {data.profile.address.line1} - {data.profile.address.line2} - - {data.profile.address.city} {data.profile.address.pincode} - -
-
- - - - - - {safetyCheck(data.social) && - data.social.items.map((x) => ( - - ))} -
-
- ); -}; - -export default memo(ContactE);