import { firestore, fireStorage } from '../firebase.js'; export const UPDATE_DIVISON = 'UPDATE_DIVISON'; export const UPDATE_HOURS = 'UPDATE_HOURS'; export const UPDATE_REGISTERED_COMPETITIONS = 'UPDATE_REGISTERED_COMPETITIONS'; export const UPDATE_FORUM_POSTS = 'UPDATE_FORUM_POSTS'; export const UPDATE_NOTIFICATION = 'UPDATE_NOTIFICATION'; export const updateDivison = (divison) => { return { type: UPDATE_DIVISON, payload: divison } } export const updateHours = (hours, reqHours) => { return { type: UPDATE_HOURS, approvedHours: hours, requestedHours: reqHours } } export const updateRegisteredCompetitions = (registeredComps) => { return { type: UPDATE_REGISTERED_COMPETITIONS, payload: registeredComps } } export const updateForumPosts = (_forumPosts) => { return { type: UPDATE_FORUM_POSTS, payload: _forumPosts } } export const updateNotification = (status) => { return { type: UPDATE_NOTIFICATION, payload: status } } //Middleware to dispatches export const fetchDivison = () => (dispatch, getState) => { const uid = getState().firebaseAuth.uid; var docRef = firestore.collection('users').doc(uid); docRef.get().then((doc) => { dispatch(updateDivison(doc.data().divison)); }); } export const snapshotHours = () => (dispatch, getState) => { const currentAuthState = getState().firebaseAuth; if(currentAuthState.signedIn) { var totalHours; var docRefUsers = firestore.collection('users').doc(currentAuthState.uid); var docRefReq = firestore.collection('requests').where('uid', '==', currentAuthState.uid); docRefUsers.onSnapshot((doc) => { totalHours = doc.data().hours; docRefReq.onSnapshot((query) => { if(getState().firebaseFirestore.isAdminUpdate) { alert("One of your hours requests has been approved or denied.\nGo to dashboard to see changes.") } var requestedHours = 0; query.forEach((docs) => { requestedHours += docs.data().time; }); dispatch(updateHours(totalHours, requestedHours)); dispatch(updateNotification(true)); }); }); } } export const snapshotRegisteredCompetitions = () => (dispatch, getState) => { var docRef = firestore.collection('competitions'); docRef.onSnapshot((querySnapshot) => { var registeredComps = []; querySnapshot.forEach((doc) => { if(doc.exists && doc.data().uids.includes(getState().firebaseAuth.uid)) { registeredComps.push(doc.id); } }); dispatch(updateRegisteredCompetitions(registeredComps)); }); } export const snapshotForums = () => (dispatch) => { var docRef = firestore.collection('posts'); docRef.onSnapshot((query) => { var forumPosts = []; query.forEach((doc) => { forumPosts.push({ ...doc.data(), postId: doc.id }); }); dispatch(updateForumPosts(forumPosts)); }); } //Do not dipatch to store, only update firebaseFirestore export const setUserData = (_divison) => (dispatch, getState) => { var _uid = getState().firebaseAuth.uid; var username = getState().firebaseAuth.userEmail.replace('@communityschoolnaples.org', ''); firestore.collection('users').doc(_uid) .set({ hours: 0, divison: _divison, username }).catch((error) => { console.log(error); }) } export const requestHours = (_time, _trainee, _location, _subject, _date, _pictureName) => (dispatch, getState) => { if(getState().app.offline) { alert("Failed to create hour request. Must have internet connection.") } else { dispatch(updateNotification(false)); var docRef = firestore.collection('requests'); const _uid = getState().firebaseAuth.uid; const _email = getState().firebaseAuth.userEmail; const _path = 'requests/' + _uid + '/' + _pictureName; var fireStorageRef = fireStorage.ref().child(_path); fireStorageRef.getDownloadURL().then((url) => { docRef.add({ time: _time, trainee: _trainee, location: _location, subject: _subject, day: _date, imgUrl: url, path: _path, uid: _uid, email: _email }).then(()=> { alert("Successfuly sent hours request for " + _time*60 + " minutes.\n" + "If it is approved, it will update on your dashboard."); }).catch((error) => { alert(error); }); }); } } export const registerComp = (compName) => (dispatch, getState) => { if(getState().app.offline) { alert("Failed to register. Please establish internet connection.") } else { var docRef = firestore.collection('competitions').doc(compName); var uid = getState().firebaseAuth.uid; var email = getState().firebaseAuth.userEmail; docRef.get().then((doc) => { if(doc.exists) { var uidArr = doc.data().uids; var emailArr = doc.data().emails; uidArr.push(uid); emailArr.push(email); docRef.set({ uids: uidArr, emails: emailArr }).then(()=> { alert("Successfuly registered for " + compName.replace(/[0-9]/g, '').replace('_', ' ') + "."); }).catch((error) => { alert(error); }); } else { docRef.set({ uids : [uid], emails: [email] }).then(()=> { alert("Successfuly registered for " + compName.replace(/[0-9]/g, '').replace('_', ' ') + "."); }).catch((error) => { alert(error); }); } }).catch((error) => { alert(error); }); } } export const createForumPost = (_subject, _content) => (dispatch, getState) => { if(getState().app.offline) { alert("Failed to create forum post. Please establish internet connection.") } else { var docRef = firestore.collection('posts'); const userEmail = getState().firebaseAuth.userEmail; docRef.add({ email: userEmail, subject: _subject, content: _content, day: new Date() }).then(()=> { alert("Successfuly posted forum with subject " + _subject + "."); }).catch((error) => { alert(error); }); } } export const createComment = (postId, content) => (dispatch, getState) => { if(getState().app.offline) { alert("Failed to create comment post. Please establish internet connection.") } else { var docRef = firestore.collection('posts').doc(postId); docRef.get().then((doc) => { var comments = doc.data().comments ? doc.data().comments : []; comments.push({ content, user : getState().firebaseAuth.userEmail.replace('@communityschoolnaples.org', ''), date: new Date() }); docRef.update({ comments }); }) .catch((error) => { alert(error); }); } } //TODO: Make it per year, not hard coded... export const archiveClass2019 = () => (dispatch, getState) => { if(getState().app.offline) { alert('Failed to archive class. Please establish internet connection.'); } else { var docRef = firestore.collection('users'); docRef.get().then((oldUsers) => { oldUsers.forEach((user) => { var newPath = firestore.collection('archived').doc('2019').collection('users'); newPath.doc(user.id).set(user.data()); if(user.data().username && user.data().username.includes('2019')) { console.log(user.data().username, user.id); docRef.doc(user.id).delete(); } docRef.doc(user.id).update({hours: 0}); }); }); } } export const archiveCompetitions2019 = () => (dispatch, getState) => { if(getState().app.offline) { alert('Failed to archive competitions. Please establish internet connection.'); } else { var docRef = firestore.collection('competitions'); docRef.get().then((oldCompetitions) => { oldCompetitions.forEach((comp) => { console.log(comp.id, comp.data()); var newPath = firestore.collection('archived').doc('2019').collection('competitions'); newPath.doc(comp.id).set(comp.data()); //This will delete the document in its old place... docRef.doc(comp.id).delete(); }); }); } }