diff options
-rw-r--r-- | src/actions/firebase.js | 62 | ||||
-rw-r--r-- | src/components/button-shared-styles.js | 12 | ||||
-rw-r--r-- | src/components/competition-element.js | 38 | ||||
-rw-r--r-- | src/components/mao-competitions.js | 134 | ||||
-rw-r--r-- | src/components/test-element.js | 84 | ||||
-rw-r--r-- | src/reducers/firebase.js | 12 |
6 files changed, 299 insertions, 43 deletions
diff --git a/src/actions/firebase.js b/src/actions/firebase.js index 85ebe20..fe3ddb0 100644 --- a/src/actions/firebase.js +++ b/src/actions/firebase.js @@ -21,6 +21,7 @@ export const signIn = (_email, _password) => (dispatch) => { */ dispatch(authSuccess(user)); dispatch(getHours()) + dispatch(pullRegisteredCompetitions()); }) .catch((error) => { dispatch(authFail(error.code)); @@ -64,8 +65,8 @@ export const authSignOut = () => { //End Firebase Auth //Start Firebase Firestore -export const GET_HOURS = 'GET_HOURS'; -export const UPDATE_HOURS = 'UPDATE_HOURS' +export const GET_HOURS = 'GET_HOURS'; +export const UPDATE_HOURS = 'UPDATE_HOURS'; export const getHours = () => (dispatch, getState) => { const currentState = getState().firebase; @@ -87,4 +88,61 @@ export const updateHours = (hours) => { } } +export const REGISTER_COMP = 'REGISTER_COMP'; +export const PULL_REGISTERED_COMPETITIONS = 'PULL_REGISTERED_COMPETITIONS'; +export const UPDATE_REGISTERED_COMPETITIONS = 'UPDATE_REGISTERED_COMPETITIONS'; + +export const registerComp = (compName) => (dispatch, getState) => { + var docRef = firestore.collection('competitions').doc(compName); + var uid = getState().firebase.uid; + + docRef.get().then((doc) => { + if(doc.exists) { + var uidArr = doc.data().uids; + + uidArr.push(uid); + + docRef.set({ + uids: uidArr + }); + + dispatch(pullRegisteredCompetitions()); + } else { + docRef.set({ + uids : [uid] + }).then(() => { + dispatch(pullRegisteredCompetitions()); + }); + } + }); +} + +export const pullRegisteredCompetitions = () => (dispatch, getState) =>{ + var registeredComps = []; + + var docRef = firestore.collection('competitions'); + docRef.get().then((query) => { + query.forEach((doc) => { + if(doc.data().uids.includes(getState().firebase.uid)) { + registeredComps.push(doc.id); + } + }) + }); + + dispatch(updateRegisteredCompetitions(registeredComps)); +} + + + + +export const updateRegisteredCompetitions = (registeredComps) => { + return { + type: UPDATE_REGISTERED_COMPETITIONS, + payload: registeredComps + } +} + + + + //End Firebase Firestore diff --git a/src/components/button-shared-styles.js b/src/components/button-shared-styles.js index 2f167e4..5f426a4 100644 --- a/src/components/button-shared-styles.js +++ b/src/components/button-shared-styles.js @@ -22,5 +22,17 @@ export const ButtonSharedStyles = html` button:hover svg { fill: var(--app-primary-color); } + + paper-button { + text-align: center; + } + + paper-button.info { + background-color: #c9eaff; + } + + paper-button.success { + background-color: #b7e1cd; + } </style> `; diff --git a/src/components/competition-element.js b/src/components/competition-element.js index 072f654..17381c9 100644 --- a/src/components/competition-element.js +++ b/src/components/competition-element.js @@ -10,12 +10,17 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN import { LitElement, html } from '@polymer/lit-element'; +// Import button styles +import { ButtonSharedStyles } from './button-shared-styles.js'; + // Import paper elements import '@polymer/paper-card/paper-card.js'; class CompetitionElement extends LitElement { _render(props) { return html` + ${ButtonSharedStyles} + <style> paper-card { @@ -31,7 +36,23 @@ class CompetitionElement extends LitElement { <div class="card-content"> <h3>${props.name}</h3> <h4>${props.location}</h4> - <p hidden="${!this.infoTabOpen}"> ${props.information}</p> + <p hidden="${!props.infoTabOpen}"> ${props.information}</p> + </div> + <div hidden="${!props.infoTabOpen}" class="card-actions"> + <paper-button + class="info" + hidden="${props.isRegistered}" + raised + disabled= "${!props.initialized}" + on-tap= "${() => this.registerComp()}"> + ${props.initialized? "Register" : "Sign In"} + </paper-button> + + <paper-button class="success" + disabled + hidden="${!props.isRegistered}"> + Already Registered + </paper-button> </div> </paper-card> `; @@ -41,7 +62,9 @@ class CompetitionElement extends LitElement { name: String, information: String, location: String, - infoTabOpen: Boolean + infoTabOpen: Boolean, + initialized: Boolean, + isRegistered: Boolean }}; constructor() { @@ -51,11 +74,20 @@ class CompetitionElement extends LitElement { this.information = "Competition Information"; this.location = "Competition Location"; this.infoTabOpen = false; + this.initialized = false; + this.isRegistered = false; } toggleTab() { - this.infoTabOpen = !this.infoTabOpen; + this.infoTabOpen = !this.infoTabOpen; } + + registerComp() { + this.dispatchEvent(new CustomEvent('register-comp')); + this.isRegistered = true; + } + + } window.customElements.define('competition-element', CompetitionElement); diff --git a/src/components/mao-competitions.js b/src/components/mao-competitions.js index 6a5ae44..53e0b29 100644 --- a/src/components/mao-competitions.js +++ b/src/components/mao-competitions.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 { } from '../actions/firebase.js'; +import { registerComp } from '../actions/firebase.js'; // We are lazy loading its reducer. import firebase from '../reducers/firebase.js'; @@ -26,7 +26,8 @@ store.addReducers({ }); // These are the shared styles needed by this element. -import { SharedStyles } from './shared-styles.js'; +import { SharedStyles } from './shared-styles.js'; +import { ButtonSharedStyles } from './button-shared-styles.js'; // Import paper elements import '@polymer/paper-input/paper-input.js'; @@ -34,12 +35,14 @@ import '@polymer/paper-button/paper-button.js'; import '@polymer/paper-card/paper-card.js'; // Import custom elements -import './competition-element.js' +import './competition-element.js'; +import './test-element.js'; class MaoCompetitions extends connect(store)(PageViewElement) { _render(props) { return html` ${SharedStyles} + ${ButtonSharedStyles} <style> .underline { border-bottom: 1px solid var(--app-primary-color); @@ -112,12 +115,6 @@ class MaoCompetitions extends connect(store)(PageViewElement) { --paper-card-background-color: #fff8e1; } - - - paper-button.info { - background-color: #c9eaff; - } - .card-actions { vertical-align: bottom; } @@ -159,7 +156,21 @@ class MaoCompetitions extends connect(store)(PageViewElement) { </div> <div class="card-actions"> - <paper-button class="info" disabled>Registry Not Available</paper-button> + <paper-button + class = "info" + hidden = "${props.nationalRegistered}" + on-tap = "${() => this.registerNationals()}" + raised + disabled = "${!props.initialized}"> + ${props.initialized ? "Register" : "Sign In to Register"} + </paper-button> + + <paper-button + class = "success" + hidden = "${!props.nationalRegistered}" + disabled> + Already Registered + </paper-button> </div> </paper-card> @@ -167,6 +178,7 @@ class MaoCompetitions extends connect(store)(PageViewElement) { </section> <section> + <paper-card image="http://a57.foxnews.com/images.foxnews.com/content/fox-news/travel/2018/02/24/universal-theme-parks-hike-ticket-prices-following-disney-resorts/_jcr_content/par/featured_image/media-0.img.jpg/931/524/1519489441149.jpg?ve=1&tl=1&text=big-top-image" heading="Orlando, Florida" @@ -180,7 +192,21 @@ class MaoCompetitions extends connect(store)(PageViewElement) { </div> <div class="card-actions"> - <paper-button class="info" disabled>Registry Not Available</paper-button> + <paper-button + class = "info" + hidden = "${props.statesRegistered}" + on-tap = "${() => this.registerStates()}" + raised + disabled = "${!props.initialized}"> + ${props.initialized ? "Register" : "Sign In to Register"} + </paper-button> + + <paper-button + class = "success" + hidden = "${!props.statesRegistered}" + disabled> + Already Registered + </paper-button> </div> </paper-card> @@ -197,25 +223,37 @@ class MaoCompetitions extends connect(store)(PageViewElement) { <div class="regional-comp1"> <competition-element + id="dec-competition-element" name="December" information="Dank ass regional competition" - location="Miami, American Heritage"> + location="Miami, American Heritage" + initialized="${props.initialized}" + isRegistered="${props.registeredComps.includes('December')}" + on-register-comp="${() => store.dispatch(registerComp(this.shadowRoot.getElementById('dec-competition-element').name))}"> </competition-element> </div> <div class="regional-comp2"> <competition-element + id="jan-competition-element" name="January" information="Other dank comp" - location="Immokalee, Cypress Bay"> + location="Immokalee, Cypress Bay" + initialized="${props.initialized}" + isRegistered="${props.registeredComps.includes('January')}" + on-register-comp="${() => store.dispatch(registerComp(this.shadowRoot.getElementById('jan-competition-element').name))}"> </competition-element> </div> <div class="regional-comp3"> <competition-element + id="feb-competition-element" name="February" information="The dankest comp" - location="Orlando, Science School"> + location="Orlando, Science School" + initialized="${props.initialized}" + isRegistered="${props.registeredComps.includes('February')}" + on-register-comp="${() => store.dispatch(registerComp(this.shadowRoot.getElementById('feb-competition-element').name))}"> </competition-element> </div> @@ -232,37 +270,38 @@ class MaoCompetitions extends connect(store)(PageViewElement) { <p>All students must register and complete two of the tests to be qualified for national and/or state competitions.</p> </div> - <paper-card + <test-element + id="amc-test-element" + class="amcComp" image="https://www.maa.org/sites/default/files/AMC%20Logo.png" - elevation="0"> - <div class="card-content"> - <p>The American Mathematics Exam is a difficult national exam; - it is a 25 multiple-choice question, - 40 minute test for middle schoolers designed to promote the development and enhancement of problem solving skills.</p> - </div> + elevation="0" - <div class="card-actions"> - <paper-button class="info" raised>Register</paper-button> - </div> - </paper-card> + name = "amc" + information = "The American Mathematics Exam is a difficult national exam; + it is a 25 multiple-choice question, + 40 minute test for middle schoolers designed to promote the development and enhancement of problem solving skills." + initialized="${props.initialized}" + isRegistered="${props.registeredComps.includes('amc')}" + on-register-comp="${() => store.dispatch(registerComp(this.shadowRoot.getElementById('amc-test-element').name))}"> + </test-element> + + + <test-element + id="fml-test-element" - <paper-card class="fmlComp" image="data:image/jpeg;base64,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" - elevation="0"> - <div class="card-content"> - <h3>FML</h3> - <p>The Florida Math Leauge is a state-wide exam. - It has three parts, each being 30 minutes long.</p> - </div> + elevation="0" - <div class="card-actions"> - <paper-button class="info" raised>Register</paper-button> - </div> - </paper-card> + name = "fml" + information = "The Florida Math Leauge is a state-wide exam. + It has three parts, each being 30 minutes long." + initialized="${props.initialized}" + isRegistered="${props.registeredComps.includes('fml')}" + on-register-comp="${() => store.dispatch(registerComp(this.shadowRoot.getElementById('fml-test-element').name))}"> </div> </section> @@ -271,9 +310,32 @@ class MaoCompetitions extends connect(store)(PageViewElement) { static get properties() { return { // This is the data from the store. + registeredComps : Array, + initialized : Boolean, + + nationalRegistered : Boolean, + statesRegistered : Boolean }} _stateChanged(state) { + this.initialized = state.firebase.initialized; + this.registeredComps = state.firebase.registeredComps; + //console.log(this.registeredComps); + + this.nationalRegistered = this.registeredComps.includes('nationals'); + this.statesRegistered = this.registeredComps.includes('states'); + } + + registerNationals() { + this.nationalRegistered = true; + + store.dispatch(registerComp('nationals')) + } + + registerStates() { + this.statesRegistered = true; + + store.dispatch(registerComp('states')) } } diff --git a/src/components/test-element.js b/src/components/test-element.js new file mode 100644 index 0000000..ec4797b --- /dev/null +++ b/src/components/test-element.js @@ -0,0 +1,84 @@ +/** +@license +Copyright (c) 2018 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + +import { LitElement, html } from '@polymer/lit-element'; + +//import button styles +import { ButtonSharedStyles } from './button-shared-styles.js'; + +// Import paper elements +import '@polymer/paper-card/paper-card.js'; + +class TestElement extends LitElement { + _render(props) { + return html` + ${ButtonSharedStyles} + + <style> + + paper-card { + --paper-card-background-color: #ffffff; + width: 100%; + } + + </style> + <paper-card + image = "${props.image}" + elevation = "0"> + <div class="card-content"> + <p>${props.information}</p> + </div> + <div class="card-actions"> + <paper-button + class="info" + hidden="${props.isRegistered}" + raised + disabled= "${!props.initialized}" + on-tap= "${() => this.registerComp()}"> + ${props.initialized? "Register" : "Sign In"} + </paper-button> + + <paper-button class="success" + disabled + hidden="${!props.isRegistered}"> + Already Registered + </paper-button> + </div> + </paper-card> + `; + } + + static get properties() { return { + name: String, + information: String, + image: String, + initialized: Boolean, + isRegistered: Boolean + }}; + + constructor() { + super(); + + this.name = "Competition"; + this.information = "Competition Information"; + this.image = "Image Path"; + this.initialized = false; + this.isRegistered = false; + } + + registerComp() { + this.dispatchEvent(new CustomEvent('register-comp')); + this.isRegistered = true; + } + + +} + +window.customElements.define('test-element', TestElement); diff --git a/src/reducers/firebase.js b/src/reducers/firebase.js index 6f02c69..4b0ed9a 100644 --- a/src/reducers/firebase.js +++ b/src/reducers/firebase.js @@ -12,11 +12,12 @@ import { AUTH_FAIL, AUTH_SUCCESS, AUTH_SIGN_OUT, - UPDATE_HOURS + UPDATE_HOURS, + UPDATE_REGISTERED_COMPETITIONS } from '../actions/firebase.js'; -const firebase = (state = {initialized: false, authMessage: "", hours: -1, uid: null}, action) => { +const firebase = (state = {initialized: false, authMessage: "", hours: -1, uid: null, registeredComps: []}, action) => { switch (action.type) { case AUTH_SUCCESS: return { @@ -49,6 +50,13 @@ const firebase = (state = {initialized: false, authMessage: "", hours: -1, uid: } break; + case UPDATE_REGISTERED_COMPETITIONS: + return { + ...state, + registeredComps : action.payload + } + break; + default: return state; } |