Files
Reactive-Resume/src/contexts/DatabaseContext.js
2020-07-12 19:31:22 +05:30

129 lines
2.9 KiB
JavaScript

import firebase from 'gatsby-plugin-firebase';
import { debounce } from 'lodash';
import ShortUniqueId from 'short-unique-id';
import React, { createContext, memo, useContext, useState } from 'react';
import UserContext from './UserContext';
import initialState from '../data/initialState.json';
const DEBOUNCE_WAIT_TIME = 4000;
const defaultState = {
isUpdating: false,
createResume: () => {},
duplicateResume: () => {},
deleteResume: () => {},
getResume: async () => {},
getResumes: async () => {},
updateResume: async () => {},
debouncedUpdateResume: async () => {},
};
const DatabaseContext = createContext(defaultState);
const DatabaseProvider = ({ children }) => {
const dictionary = 'abcdefghijklmnopqrstuvwxyz1234567890'.split('');
const uuid = new ShortUniqueId({ dictionary });
const [isUpdating, setUpdating] = useState(false);
const { user } = useContext(UserContext);
const getResume = async (id) => {
try {
const snapshot = await firebase
.database()
.ref(`resumes/${id}`)
.once('value');
return snapshot.val();
} catch (error) {
return null;
}
};
const createResume = ({ name }) => {
const id = uuid();
const createdAt = firebase.database.ServerValue.TIMESTAMP;
let firstName;
let lastName;
if (!user.isAnonymous) {
[firstName, lastName] = user.displayName.split(' ');
}
const resume = {
...initialState,
id,
name,
user: user.uid,
profile: {
...initialState.profile,
firstName: firstName || '',
lastName: lastName || '',
},
createdAt,
updatedAt: createdAt,
};
firebase.database().ref(`resumes/${id}`).set(resume);
};
const duplicateResume = (originalResume) => {
console.trace();
const id = uuid();
const createdAt = firebase.database.ServerValue.TIMESTAMP;
const resume = {
...originalResume,
id,
name: `${originalResume.name} Copy`,
createdAt,
updatedAt: createdAt,
};
firebase.database().ref(`resumes/${id}`).set(resume);
};
const updateResume = async (resume) => {
setUpdating(true);
await firebase
.database()
.ref(`resumes/${resume.id}`)
.update({
...resume,
updatedAt: firebase.database.ServerValue.TIMESTAMP,
});
setUpdating(false);
};
const debouncedUpdateResume = debounce(updateResume, DEBOUNCE_WAIT_TIME);
const deleteResume = async (id) => {
await firebase.database().ref(`/resumes/${id}`).remove();
};
return (
<DatabaseContext.Provider
value={{
isUpdating,
getResume,
createResume,
duplicateResume,
updateResume,
deleteResume,
debouncedUpdateResume,
}}
>
{children}
</DatabaseContext.Provider>
);
};
export default DatabaseContext;
const memoizedProvider = memo(DatabaseProvider);
export { memoizedProvider as DatabaseProvider };