- complete onyx design template

- implement public sharable urls
- implement more actions
This commit is contained in:
Amruth Pillai
2020-07-11 20:42:16 +05:30
parent 0b5653fab5
commit 5ec1f21bd3
55 changed files with 1025 additions and 412 deletions

View File

@ -1,5 +1,5 @@
import firebase from 'gatsby-plugin-firebase';
import React, { memo, useEffect, useState } from 'react';
import React, { useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';
import CreateResume from '../../components/dashboard/CreateResume';
import ResumePreview from '../../components/dashboard/ResumePreview';
@ -11,11 +11,24 @@ const Dashboard = ({ user }) => {
const [loading, setLoading] = useState(true);
useEffect(() => {
const ref = `users/${user.uid}/resumes`;
const resumesRef = 'resumes';
const socketRef = '/.info/connected';
firebase
.database()
.ref(ref)
.ref(socketRef)
.on('value', (snapshot) => {
if (snapshot.val()) {
setLoading(false);
firebase.database().ref(socketRef).off();
}
});
firebase
.database()
.ref(resumesRef)
.orderByChild('user')
.equalTo(user.uid)
.on('value', (snapshot) => {
if (snapshot.val()) {
const resumesArr = [];
@ -23,13 +36,13 @@ const Dashboard = ({ user }) => {
Object.keys(data).forEach((key) => resumesArr.push(data[key]));
setResumes(resumesArr);
}
setLoading(false);
});
firebase
.database()
.ref(ref)
.ref(resumesRef)
.orderByChild('user')
.equalTo(user.uid)
.on('child_removed', (snapshot) => {
if (snapshot.val()) {
setResumes(resumes.filter((x) => x.id === snapshot.val().id));
@ -37,7 +50,7 @@ const Dashboard = ({ user }) => {
});
return () => {
firebase.database().ref(ref).off();
firebase.database().ref(resumesRef).off();
};
}, [user]);
@ -67,4 +80,4 @@ const Dashboard = ({ user }) => {
);
};
export default memo(Dashboard);
export default Dashboard;

View File

@ -65,7 +65,7 @@ const Feature = ({ title, children }) => {
return (
<div className="mt-16">
<h3 className="text-3xl">{title}</h3>
<p className="mt-6 text-lg">{children}</p>
<p className="mt-6 text-lg leading-loose">{children}</p>
</div>
);
};

17
src/pages/r.js Normal file
View File

@ -0,0 +1,17 @@
import { Redirect, Router } from '@reach/router';
import React, { memo } from 'react';
import Wrapper from '../components/shared/Wrapper';
import ResumeViewer from './r/view';
import NotFound from './404';
const ResumeRouter = () => (
<Wrapper>
<Router>
<Redirect noThrow from="/r" to="/" exact />
<ResumeViewer path="r/:id" />
<NotFound default />
</Router>
</Wrapper>
);
export default memo(ResumeRouter);

58
src/pages/r/view.js Normal file
View File

@ -0,0 +1,58 @@
import { navigate, Link } from '@reach/router';
import React, { memo, useContext, useEffect, useMemo, useState } from 'react';
import { Helmet } from 'react-helmet';
import { toast } from 'react-toastify';
import LoadingScreen from '../../components/router/LoadingScreen';
import DatabaseContext from '../../contexts/DatabaseContext';
import Onyx from '../../templates/Onyx';
import styles from './view.module.css';
const ResumeViewer = ({ id }) => {
const [resume, setResume] = useState(null);
const [loading, setLoading] = useState(true);
const { getResume } = useContext(DatabaseContext);
useEffect(() => {
(async () => {
const data = await getResume(id);
if (!data) {
navigate('/');
toast.error(
`The resume you were looking for does not exist anymore... or maybe it never did?`,
);
return null;
}
setResume(data);
return setLoading(false);
})();
}, [id]);
return useMemo(() => {
if (loading) {
return <LoadingScreen />;
}
return (
<div className={styles.container}>
<Helmet>
<title>{resume.name} | Reactive Resume</title>
<link rel="canonical" href={`https://rxresu.me/r/${id}`} />
</Helmet>
<div
className={styles.page}
style={{ backgroundColor: resume.metadata.colors.background }}
>
{resume.metadata.template === 'onyx' && <Onyx data={resume} />}
</div>
<p className={styles.footer}>
Built with <Link to="/">Reactive Resume</Link>
</p>
</div>
);
});
};
export default memo(ResumeViewer);

View File

@ -0,0 +1,13 @@
.container {
background-color: #212121;
@apply h-screen overflow-scroll col-span-5 flex flex-col items-center;
}
.page {
width: 800px;
@apply block my-16 rounded shadow-2xl;
}
.footer {
@apply mb-16 text-center opacity-50 leading-loose;
}