aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Foiani <mfoiani2019@communiyschoolnaples.org>2018-08-01 17:29:57 -0400
committerMichael Foiani <mfoiani2019@communiyschoolnaples.org>2018-08-01 17:29:57 -0400
commit51ccc779192bbb31c864ccc98ff9580854f60b76 (patch)
treeab8b580fab57aa026ff6c6b7e7fab7a65866e0d0
parent0faad7fc879de9de6200526afe8a4419022eaaa3 (diff)
Working on admin framework. Allows for certain uids to have extra controls if they use a key command and enter a password pulled from a database.
-rw-r--r--src/actions/firebase.js82
-rw-r--r--src/components/mao-account.js72
-rw-r--r--src/components/mao-app.js1
-rw-r--r--src/components/mao-fourms.js4
-rw-r--r--src/components/mao-tutoring.js22
-rw-r--r--src/reducers/firebase.js12
6 files changed, 167 insertions, 26 deletions
diff --git a/src/actions/firebase.js b/src/actions/firebase.js
index a9da36a..7c4a4ad 100644
--- a/src/actions/firebase.js
+++ b/src/actions/firebase.js
@@ -4,9 +4,25 @@ import { firebase, firestore } from '../firebase.js';
export const AUTH_FAIL = 'AUTH_FAIL';
export const AUTH_SUCCESS = 'AUTH_SUCCESS';
export const AUTH_SIGN_OUT = 'AUTH_SIGN_OUT';
+export const CREATE_ACCOUNT = 'CREATE_ACCOUNT';
+export const ADMIN_LISTENER = 'ADMIN_LISTENER';
+export const IS_ADMIN = 'IS_ADMIN';
+export const ADMIN_CONTROLS = 'ADMIN_CONTROLS';
+export const UPDATE_ADMIN = 'UPDATE_ADMIN';
const auth = firebase.auth();
+export const createAccount = (_email, _password) => (dispatch) => {
+ var authTrue = false;
+ firebase.auth().createUserWithEmailAndPassword(_email, _password).then(() => {
+ dispatch(signIn(_email, _password));
+ })
+ .catch((error) => {
+ // Handle Errors here.
+ alert(error.code + ": " + error.message);
+ });
+}
+
export const signIn = (_email, _password) => (dispatch) => {
auth.signInWithEmailAndPassword(_email, _password).then(() => {
var user = auth.currentUser;
@@ -22,6 +38,13 @@ export const signIn = (_email, _password) => (dispatch) => {
dispatch(authSuccess(user));
dispatch(snapshotHours())
dispatch(snapshotRegisteredCompetitions());
+ //Admin controls
+ if( user.uid === 'rxKROQAukzchWuueDLwA9c0YmsT2' || //Lucy Wood
+ user.uid === 'sAVjlnSAETaP5VtTKGhfBKHKeQF2' //Michael Foiani
+ )
+ {
+ dispatch(adminListener());
+ }
})
.catch((error) => {
dispatch(authFail(error.code));
@@ -29,6 +52,19 @@ export const signIn = (_email, _password) => (dispatch) => {
}
+export const adminListener = () => (dispatch, getState) => {
+ document.onkeyup = function(e) {
+ if(e.altKey && e.which == 65) {
+ var docRef = firestore.collection('keys').doc('adminKey');
+ docRef.get().then((doc) => {
+ if(prompt('Enter admin password') == doc.data().password) {
+ dispatch(adminControls());
+ }
+ });
+ }
+ }
+}
+
export const authFail = (errorCode) => {
alert(errorCode);
return {
@@ -50,6 +86,17 @@ export const authSuccess = (_user) => {
}
}
+export const adminControls = () => (dispatch) => {
+ dispatch(updateAdmin());
+}
+
+export const updateAdmin = () => {
+ return {
+ type: UPDATE_ADMIN,
+ payload: true
+ }
+}
+
export const signOut = () => (dispatch) => {
auth.signOut().then(() => {
dispatch(authSignOut());
@@ -62,7 +109,10 @@ export const authSignOut = () => {
payload: false,
code: "Signed Out User",
uid: "",
- userEmail: ""
+ userEmail: "",
+ isAdmin: false,
+ requests: [],
+ compList: []
}
}
//End Firebase Auth
@@ -107,6 +157,8 @@ export const updateHours = (hours, reqHours) => {
export const REGISTER_COMP = 'REGISTER_COMP';
export const SNAPSHOT_REGISTERED_COMPETITIONS = 'SNAPSHOT_REGISTERED_COMPETITIONS';
export const UPDATE_REGISTERED_COMPETITIONS = 'UPDATE_REGISTERED_COMPETITIONS';
+export const FETCH_ALL_REQUESTS = 'FETCH_ALL_REQUESTS';
+export const FETCH_ADMIN_REQUESTS = 'FETCH_ADMIN_REQUESTS';
export const registerComp = (compName) => (dispatch, getState) => {
var docRef = firestore.collection('competitions').doc(compName);
@@ -149,7 +201,28 @@ export const updateRegisteredCompetitions = (registeredComps) => {
}
}
-export const REQUEST_HOURS = 'REQUEST_HOURS';
+export const fetchAllRequests = () => (dispatch) => {
+ var docRef = firestore.collection('requests');
+
+ docRef.onSnapshot((query) => {
+ var requests = [];
+ query.forEach((doc) => {
+ requests.push(doc.data());
+ });
+ console.log(requests);
+ dispatch(fetchAdminRequests(requests));
+ });
+}
+
+export const fetchAdminRequests = (requests) => {
+ return {
+ type: FETCH_ADMIN_REQUESTS,
+ payload: requests
+ }
+}
+
+export const REQUEST_HOURS = 'REQUEST_HOURS';
+export const APPROVE_HOURS = 'APPROVE_HOURS';
export const requestHours = (_time, _trainee, _date) => (dispatch, getState) => {
var docRef = firestore.collection('requests');
@@ -174,6 +247,10 @@ export const requestHours = (_time, _trainee, _date) => (dispatch, getState) =>
});
}
+export const approveHours = () => (dispatch, getState) => {
+ alert("Admin :)");
+}
+
export const CREATE_FOURM_POST = 'CREATE_FOURM_POST';
export const SNAPSHOT_FOURM = 'SNAPSHOT_FOURM';
export const UPDATE_FOURM_POSTS = 'UPDATE_FOURM_POSTS';
@@ -197,7 +274,6 @@ export const snapshotFourms = () => (dispatch) => {
query.forEach((doc) => {
fourmPosts.push(doc.data());
});
- console.log(fourmPosts);
dispatch(updateFourmPosts(fourmPosts));
});
}
diff --git a/src/components/mao-account.js b/src/components/mao-account.js
index f6f32c6..72eb8b8 100644
--- a/src/components/mao-account.js
+++ b/src/components/mao-account.js
@@ -16,7 +16,7 @@ import { connect } from 'pwa-helpers/connect-mixin.js';
import { store } from '../store.js';
//These are the actions needed by this element.
-import { signIn, signOut, requestHours } from '../actions/firebase.js';
+import { signIn, signOut, requestHours, createAccount } from '../actions/firebase.js';
// We are lazy loading its reducer.
import firebase from '../reducers/firebase.js';
@@ -43,7 +43,7 @@ class MaoAccount extends connect(store)(PageViewElement) {
<style>
- .sign-in-card, .acc-info-card {
+ .sign-in-card, .acc-info-card, .create-acc-card {
display: block;
}
@@ -54,7 +54,7 @@ class MaoAccount extends connect(store)(PageViewElement) {
width: 50%;
}
- .account-email {
+ .account-email, span {
word-break: break-all;
}
@@ -62,6 +62,10 @@ class MaoAccount extends connect(store)(PageViewElement) {
text-align: center;
}
+ .create-acc-card {
+ --paper-card-background-color: #f7f7f7;
+ }
+
</style>
@@ -113,6 +117,29 @@ class MaoAccount extends connect(store)(PageViewElement) {
</paper-card>
</section>
+
+ <section hidden="${props.signedIn}">
+
+ <paper-card class="create-acc-card" elevation="0">
+
+ <div class="card-content">
+ <h2 class="underline">Create Account</h2>
+
+ <paper-input label="email" id="createEmailField">
+ <span slot="suffix">@communityschoolnaples.org</span>
+ </paper-input>
+
+ <paper-input type="password" label="password" id="createPasswordField">
+ </paper-input>
+ </div>
+
+ <div class="card-actions">
+ <paper-button class="info" hidden="${props.signedIn}" raised on-tap="${() => this.makeAccount()}">Create Account</paper-button>
+ </div>
+
+ </paper-card>
+
+ </section>
`;
}
@@ -134,17 +161,19 @@ class MaoAccount extends connect(store)(PageViewElement) {
}
logIn() {
- var emailElement = this.shadowRoot.getElementById('emailField');
- var passwordElement = this.shadowRoot.getElementById('passwordField');
+ if(this.shadowRoot) {
+ var emailElement = this.shadowRoot.getElementById('emailField');
+ var passwordElement = this.shadowRoot.getElementById('passwordField');
- const email = emailElement.value
- + "@communityschoolnaples.org";
- const password = passwordElement.value;
+ const email = emailElement.value
+ + "@communityschoolnaples.org";
+ const password = passwordElement.value;
- store.dispatch(signIn(email,password));
+ store.dispatch(signIn(email,password));
- emailElement.value = "";
- passwordElement.value = "";
+ emailElement.value = "";
+ passwordElement.value = "";
+ }
}
createCompetitionList(comps) {
@@ -166,6 +195,27 @@ class MaoAccount extends connect(store)(PageViewElement) {
}
}
+ makeAccount() {
+ var emailElement = this.shadowRoot.getElementById('createEmailField');
+ var passwordElement = this.shadowRoot.getElementById('createPasswordField');
+
+ if( emailElement.value.includes('2019') ||
+ emailElement.value.includes('2020')
+ )
+ {
+ const email = emailElement.value
+ + "@communityschoolnaples.org";
+ const password = passwordElement.value;
+
+ store.dispatch(createAccount(email,password));
+ } else {
+ alert('Please use a validated email.');
+ }
+
+ emailElement.value = "";
+ passwordElement.value = "";
+ }
+
}
window.customElements.define('mao-account', MaoAccount);
diff --git a/src/components/mao-app.js b/src/components/mao-app.js
index 5a02542..55e27b6 100644
--- a/src/components/mao-app.js
+++ b/src/components/mao-app.js
@@ -210,7 +210,6 @@ class MaoApp extends connect(store)(LitElement) {
<a selected?="${_page === 'home'}" href="/home">Home</a>
<a selected?="${_page === 'tutor'}" href="/tutor">Tutoring</a>
<a selected?="${_page === 'compete'}" href="/compete">Compete</a>
- <a selected?="${_page === 'compete'}" href="/compete">Compete</a>
<a selected?="${_page === 'fourms'}" href="/fourms">Fourms</a>
<a selected?="${_page === 'account'}" href="/account">Account</a>
</nav>
diff --git a/src/components/mao-fourms.js b/src/components/mao-fourms.js
index 78f0192..4aa9873 100644
--- a/src/components/mao-fourms.js
+++ b/src/components/mao-fourms.js
@@ -170,13 +170,13 @@ class MaoFourms extends connect(store)(PageViewElement) {
var postsGrid = this.shadowRoot.getElementById('posts-grid');
postsGrid.innerHTML = "";
- for(var i = 0; i < this.fourmPosts.length; i++) {
+ for(var i = this.fourmPosts.length-1; i >=0; i--) {
var paperCard = document.createElement('paper-card');
var cardContent = document.createElement('div');
var fourmAuthor = document.createElement('h4');
var fourmSubject = document.createElement('h3');
var fourmContent = document.createElement('p');
-
+
fourmAuthor.innerHTML = this.fourmPosts[i].email .replace('@communityschoolnaples.org', '');
fourmSubject.innerHTML = this.fourmPosts[i].subject;
fourmContent.innerHTML = this.fourmPosts[i].content;
diff --git a/src/components/mao-tutoring.js b/src/components/mao-tutoring.js
index 3a833c6..bca76c1 100644
--- a/src/components/mao-tutoring.js
+++ b/src/components/mao-tutoring.js
@@ -95,8 +95,8 @@ class MaoTutoring extends connect(store)(PageViewElement) {
display: block;
}
- .hopeCard {
- --paper-card-background-color: #58d68d;
+ .subjectCard, .hopeCard {
+ --paper-card-background-color: #ffffff;
}
paper-item {
@@ -147,12 +147,11 @@ class MaoTutoring extends connect(store)(PageViewElement) {
</style>
- <section>
+ <section hidden="${!props.signedIn}">
<paper-card
elevation="0"
- class="hoursCard"
- hidden="${!props.signedIn}">
+ class="hoursCard">
<div class="card-content">
@@ -235,10 +234,19 @@ class MaoTutoring extends connect(store)(PageViewElement) {
</div>
<div class="tutoring-grid">
- <paper-card class="hopeCard">
+ <paper-card class="subjectCard">
<div class="card-actions">
<h3>Our Hope</h3>
- <p>We want to encourage an enviornment of help.</p>
+ <p>
+ We want to encourage an enviornment of learnin through peer-to-peer tutoring.
+ We offer all tutoring in all subjects for mao competitions and school subjects:
+ </p>
+ <ul>
+ <li>Algebra (1 & 2)</li>
+ <li>Geometry</li>
+ <li>Pre-calculus</li>
+ <li>Calculus (AB & BC)</li>
+ </ul>
</div>
</paper-card>
diff --git a/src/reducers/firebase.js b/src/reducers/firebase.js
index 7c25d6c..2e71f44 100644
--- a/src/reducers/firebase.js
+++ b/src/reducers/firebase.js
@@ -14,11 +14,12 @@ import {
AUTH_SIGN_OUT,
UPDATE_HOURS,
UPDATE_REGISTERED_COMPETITIONS,
- UPDATE_FOURM_POSTS
+ UPDATE_FOURM_POSTS,
+ FETCH_ADMIN_REQUESTS
}
from '../actions/firebase.js';
-const firebase = (state = {initialized: false, authMessage: "", hours: -1, requestedHours: -1, uid: "", userEmail: "", registeredComps: [], fourmPosts: []}, action) => {
+const firebase = (state = {initialized: false, authMessage: "", hours: -1, requestedHours: -1, uid: "", userEmail: "", registeredComps: [], fourmPosts: [], isAdmin: false, requests: [], compList: []}, action) => {
switch (action.type) {
case AUTH_SUCCESS:
return {
@@ -67,6 +68,13 @@ const firebase = (state = {initialized: false, authMessage: "", hours: -1, reque
}
break;
+ case UPDATE_ADMIN:
+ return {
+ ...state,
+ requests : action.payload
+ }
+ break;
+
default:
return state;