mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-17 18:21:28 +10:00
- fix language issue when printing
This commit is contained in:
@ -9,6 +9,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
|
".indexOn": "isAnonymous",
|
||||||
"$uid": {
|
"$uid": {
|
||||||
".read": "$uid === auth.uid",
|
".read": "$uid === auth.uid",
|
||||||
".write": "$uid === auth.uid"
|
".write": "$uid === auth.uid"
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import 'firebase/analytics';
|
|||||||
import 'firebase/auth';
|
import 'firebase/auth';
|
||||||
import 'firebase/database';
|
import 'firebase/database';
|
||||||
import 'firebase/functions';
|
import 'firebase/functions';
|
||||||
import 'firebase/storage';
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { DatabaseProvider } from './src/contexts/DatabaseContext';
|
import { DatabaseProvider } from './src/contexts/DatabaseContext';
|
||||||
import { ModalProvider } from './src/contexts/ModalContext';
|
import { ModalProvider } from './src/contexts/ModalContext';
|
||||||
|
|||||||
@ -2,4 +2,3 @@ import 'firebase/analytics';
|
|||||||
import 'firebase/auth';
|
import 'firebase/auth';
|
||||||
import 'firebase/database';
|
import 'firebase/database';
|
||||||
import 'firebase/functions';
|
import 'firebase/functions';
|
||||||
import 'firebase/storage';
|
|
||||||
|
|||||||
@ -85,7 +85,7 @@ const ResumeProvider = ({ children }) => {
|
|||||||
return newState;
|
return newState;
|
||||||
|
|
||||||
case 'change_language':
|
case 'change_language':
|
||||||
newState = clone(state);
|
newState = set(clone(state), 'metadata.language', payload);
|
||||||
items = get(
|
items = get(
|
||||||
i18next.getDataByLanguage(payload),
|
i18next.getDataByLanguage(payload),
|
||||||
'translation.builder.sections',
|
'translation.builder.sections',
|
||||||
@ -94,6 +94,7 @@ const ResumeProvider = ({ children }) => {
|
|||||||
has(newState, `${key}.heading`) &&
|
has(newState, `${key}.heading`) &&
|
||||||
set(newState, `${key}.heading`, items[key]);
|
set(newState, `${key}.heading`, items[key]);
|
||||||
});
|
});
|
||||||
|
debouncedUpdateResume(newState);
|
||||||
return newState;
|
return newState;
|
||||||
|
|
||||||
case 'reset_layout':
|
case 'reset_layout':
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
import dayjs from 'dayjs';
|
|
||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { formatDate, safetyCheck } from '../../../utils';
|
||||||
|
|
||||||
const AwardItem = ({ item, i18n }) => (
|
const AwardItem = ({ item, language }) => (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div className="flex flex-col text-left mr-2">
|
<div className="flex flex-col text-left mr-2">
|
||||||
@ -14,9 +12,7 @@ const AwardItem = ({ item, i18n }) => (
|
|||||||
</div>
|
</div>
|
||||||
{item.date && (
|
{item.date && (
|
||||||
<h6 className="text-xs font-medium text-right">
|
<h6 className="text-xs font-medium text-right">
|
||||||
{dayjs(item.date)
|
{formatDate({ date: item.date, language })}
|
||||||
.locale(i18n.language.substr(0, 2))
|
|
||||||
.format('MMMM YYYY')}
|
|
||||||
</h6>
|
</h6>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -27,7 +23,6 @@ const AwardItem = ({ item, i18n }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const AwardsA = () => {
|
const AwardsA = () => {
|
||||||
const { i18n } = useTranslation();
|
|
||||||
const { data, heading: Heading } = useContext(PageContext);
|
const { data, heading: Heading } = useContext(PageContext);
|
||||||
|
|
||||||
return safetyCheck(data.awards) ? (
|
return safetyCheck(data.awards) ? (
|
||||||
@ -35,7 +30,7 @@ const AwardsA = () => {
|
|||||||
<Heading>{data.awards.heading}</Heading>
|
<Heading>{data.awards.heading}</Heading>
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
{data.awards.items.map((x) => (
|
{data.awards.items.map((x) => (
|
||||||
<AwardItem key={x.id} item={x} i18n={i18n} />
|
<AwardItem key={x.id} item={x} language={data.metadata.language} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
import dayjs from 'dayjs';
|
|
||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { formatDate, safetyCheck } from '../../../utils';
|
||||||
|
|
||||||
const CertificationItem = ({ item, i18n }) => (
|
const CertificationItem = ({ item, language }) => (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div className="flex flex-col text-left mr-2">
|
<div className="flex flex-col text-left mr-2">
|
||||||
@ -14,9 +12,7 @@ const CertificationItem = ({ item, i18n }) => (
|
|||||||
</div>
|
</div>
|
||||||
{item.date && (
|
{item.date && (
|
||||||
<h6 className="text-xs font-medium text-right">
|
<h6 className="text-xs font-medium text-right">
|
||||||
{dayjs(item.date)
|
{formatDate({ date: item.date, language })}
|
||||||
.locale(i18n.language.substr(0, 2))
|
|
||||||
.format('MMMM YYYY')}
|
|
||||||
</h6>
|
</h6>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -27,7 +23,6 @@ const CertificationItem = ({ item, i18n }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const CertificationsA = () => {
|
const CertificationsA = () => {
|
||||||
const { i18n } = useTranslation();
|
|
||||||
const { data, heading: Heading } = useContext(PageContext);
|
const { data, heading: Heading } = useContext(PageContext);
|
||||||
|
|
||||||
return safetyCheck(data.certifications) ? (
|
return safetyCheck(data.certifications) ? (
|
||||||
@ -35,7 +30,11 @@ const CertificationsA = () => {
|
|||||||
<Heading>{data.certifications.heading}</Heading>
|
<Heading>{data.certifications.heading}</Heading>
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
{data.certifications.items.map((x) => (
|
{data.certifications.items.map((x) => (
|
||||||
<CertificationItem key={x.id} item={x} i18n={i18n} />
|
<CertificationItem
|
||||||
|
key={x.id}
|
||||||
|
item={x}
|
||||||
|
language={data.metadata.language}
|
||||||
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { formatDateRange, safetyCheck } from '../../../utils';
|
import { formatDateRange, safetyCheck } from '../../../utils';
|
||||||
|
|
||||||
const EducationItem = ({ item, i18n }) => (
|
const EducationItem = ({ item, language }) => (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div className="flex flex-col text-left mr-2">
|
<div className="flex flex-col text-left mr-2">
|
||||||
@ -20,7 +19,7 @@ const EducationItem = ({ item, i18n }) => (
|
|||||||
{formatDateRange({
|
{formatDateRange({
|
||||||
startDate: item.startDate,
|
startDate: item.startDate,
|
||||||
endDate: item.endDate,
|
endDate: item.endDate,
|
||||||
language: i18n.language,
|
language,
|
||||||
})}
|
})}
|
||||||
)
|
)
|
||||||
</h6>
|
</h6>
|
||||||
@ -35,7 +34,6 @@ const EducationItem = ({ item, i18n }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const EducationA = () => {
|
const EducationA = () => {
|
||||||
const { i18n } = useTranslation();
|
|
||||||
const { data, heading: Heading } = useContext(PageContext);
|
const { data, heading: Heading } = useContext(PageContext);
|
||||||
|
|
||||||
return safetyCheck(data.education) ? (
|
return safetyCheck(data.education) ? (
|
||||||
@ -43,7 +41,11 @@ const EducationA = () => {
|
|||||||
<Heading>{data.education.heading}</Heading>
|
<Heading>{data.education.heading}</Heading>
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
{data.education.items.map((x) => (
|
{data.education.items.map((x) => (
|
||||||
<EducationItem key={x.id} item={x} i18n={i18n} />
|
<EducationItem
|
||||||
|
key={x.id}
|
||||||
|
item={x}
|
||||||
|
language={data.metadata.language}
|
||||||
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
import dayjs from 'dayjs';
|
|
||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { safetyCheck } from '../../../utils';
|
import { formatDate, safetyCheck } from '../../../utils';
|
||||||
|
|
||||||
const ProjectItem = ({ item, i18n }) => (
|
const ProjectItem = ({ item, language }) => (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div className="flex flex-col text-left mr-2">
|
<div className="flex flex-col text-left mr-2">
|
||||||
@ -18,9 +16,7 @@ const ProjectItem = ({ item, i18n }) => (
|
|||||||
</div>
|
</div>
|
||||||
{item.date && (
|
{item.date && (
|
||||||
<h6 className="text-xs font-medium text-right">
|
<h6 className="text-xs font-medium text-right">
|
||||||
{dayjs(item.date)
|
{formatDate({ date: item.date, language })}
|
||||||
.locale(i18n.language.substr(0, 2))
|
|
||||||
.format('MMMM YYYY')}
|
|
||||||
</h6>
|
</h6>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -31,7 +27,6 @@ const ProjectItem = ({ item, i18n }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const ProjectsA = () => {
|
const ProjectsA = () => {
|
||||||
const { i18n } = useTranslation();
|
|
||||||
const { data, heading: Heading } = useContext(PageContext);
|
const { data, heading: Heading } = useContext(PageContext);
|
||||||
|
|
||||||
return safetyCheck(data.projects) ? (
|
return safetyCheck(data.projects) ? (
|
||||||
@ -39,7 +34,7 @@ const ProjectsA = () => {
|
|||||||
<Heading>{data.projects.heading}</Heading>
|
<Heading>{data.projects.heading}</Heading>
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
{data.projects.items.map((x) => (
|
{data.projects.items.map((x) => (
|
||||||
<ProjectItem key={x.id} item={x} i18n={i18n} />
|
<ProjectItem key={x.id} item={x} language={data.metadata.language} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
import React, { memo, useContext } from 'react';
|
import React, { memo, useContext } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import PageContext from '../../../contexts/PageContext';
|
import PageContext from '../../../contexts/PageContext';
|
||||||
import { formatDateRange, safetyCheck } from '../../../utils';
|
import { formatDateRange, safetyCheck } from '../../../utils';
|
||||||
|
|
||||||
const WorkItem = ({ item, i18n }) => (
|
const WorkItem = ({ item, language }) => (
|
||||||
<div>
|
<div>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex justify-between items-center">
|
||||||
<div className="flex flex-col text-left mr-2">
|
<div className="flex flex-col text-left mr-2">
|
||||||
@ -17,7 +16,7 @@ const WorkItem = ({ item, i18n }) => (
|
|||||||
{formatDateRange({
|
{formatDateRange({
|
||||||
startDate: item.startDate,
|
startDate: item.startDate,
|
||||||
endDate: item.endDate,
|
endDate: item.endDate,
|
||||||
language: i18n.language,
|
language,
|
||||||
})}
|
})}
|
||||||
)
|
)
|
||||||
</h6>
|
</h6>
|
||||||
@ -30,7 +29,6 @@ const WorkItem = ({ item, i18n }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const WorkA = () => {
|
const WorkA = () => {
|
||||||
const { i18n } = useTranslation();
|
|
||||||
const { data, heading: Heading } = useContext(PageContext);
|
const { data, heading: Heading } = useContext(PageContext);
|
||||||
|
|
||||||
return safetyCheck(data.work) ? (
|
return safetyCheck(data.work) ? (
|
||||||
@ -38,7 +36,7 @@ const WorkA = () => {
|
|||||||
<Heading>{data.work.heading}</Heading>
|
<Heading>{data.work.heading}</Heading>
|
||||||
<div className="grid gap-4">
|
<div className="grid gap-4">
|
||||||
{data.work.items.map((x) => (
|
{data.work.items.map((x) => (
|
||||||
<WorkItem key={x.id} item={x} i18n={i18n} />
|
<WorkItem key={x.id} item={x} language={data.metadata.language} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import 'dayjs/locale/en';
|
|||||||
import 'dayjs/locale/es';
|
import 'dayjs/locale/es';
|
||||||
import 'dayjs/locale/fi';
|
import 'dayjs/locale/fi';
|
||||||
import 'dayjs/locale/fr';
|
import 'dayjs/locale/fr';
|
||||||
|
import 'dayjs/locale/ja';
|
||||||
import 'dayjs/locale/kn';
|
import 'dayjs/locale/kn';
|
||||||
import 'dayjs/locale/nl';
|
import 'dayjs/locale/nl';
|
||||||
import 'dayjs/locale/pt';
|
import 'dayjs/locale/pt';
|
||||||
|
|||||||
@ -22,7 +22,11 @@ export const isFileImage = (file) => {
|
|||||||
return file && acceptedImageTypes.includes(file.type);
|
return file && acceptedImageTypes.includes(file.type);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const formatDateRange = ({ startDate, endDate, language }) => {
|
export const formatDate = ({ date, language = 'en' }) => {
|
||||||
|
return dayjs(date).locale(language.substr(0, 2)).format('MMMM YYYY');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const formatDateRange = ({ startDate, endDate, language = 'en' }) => {
|
||||||
const start = `${dayjs(startDate)
|
const start = `${dayjs(startDate)
|
||||||
.locale(language.substr(0, 2))
|
.locale(language.substr(0, 2))
|
||||||
.format('MMMM YYYY')}`;
|
.format('MMMM YYYY')}`;
|
||||||
|
|||||||
Reference in New Issue
Block a user