mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-15 17:21:35 +10:00
129 lines
2.9 KiB
JavaScript
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 };
|