🎉 Initial Auth
This commit is contained in:
20
components/BallsFeed.vue
Normal file
20
components/BallsFeed.vue
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<p v-for="ball in store.ballsInFeed" :key="ball.id">
|
||||||
|
<span>{{ ball.author_name }}:</span>
|
||||||
|
{{ ball.message }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { store } from "../functions/store";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
store
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
25
components/InputForm.vue
Normal file
25
components/InputForm.vue
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<template>
|
||||||
|
<form @submit.prevent="formPost">
|
||||||
|
<input type="text" autofocus ref="inputMessage" v-model="message" />
|
||||||
|
<input type="submit" value="DUNK!" />
|
||||||
|
</form>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { store } from "../functions/store";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
message: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
formPost() {
|
||||||
|
store.writeBall(this.message);
|
||||||
|
this.message = null;
|
||||||
|
this.$refs.inputMessage.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
30
components/Login.vue
Normal file
30
components/Login.vue
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<button @click.prevent="signInWithGoogle">Log in with Google</button>
|
||||||
|
<button @click.prevent="signInWithGithub">Log in with GitHub</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import firebase from "firebase/app";
|
||||||
|
import "firebase/auth";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
methods: {
|
||||||
|
signInWithGoogle() {
|
||||||
|
var provider = new firebase.auth.GoogleAuthProvider();
|
||||||
|
firebase
|
||||||
|
.auth()
|
||||||
|
.signInWithPopup(provider)
|
||||||
|
.catch(err => alert(err.message || err));
|
||||||
|
},
|
||||||
|
signInWithGithub() {
|
||||||
|
var provider = new firebase.auth.GithubAuthProvider();
|
||||||
|
firebase
|
||||||
|
.auth()
|
||||||
|
.signInWithPopup(provider)
|
||||||
|
.catch(err => alert(err.message || err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
63
functions/store.js
Normal file
63
functions/store.js
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import Vue from "vue";
|
||||||
|
import firebase from "firebase/app";
|
||||||
|
import "firebase/firestore";
|
||||||
|
import "firebase/auth";
|
||||||
|
|
||||||
|
// Initialize Firebase, copied from cloud console
|
||||||
|
var config = {
|
||||||
|
apiKey: "AIzaSyCMsFreESs58-hRxTtiqQrIcimh4i1wbsM",
|
||||||
|
authDomain: "postwoman-api.firebaseapp.com",
|
||||||
|
databaseURL: "https://postwoman-api.firebaseio.com",
|
||||||
|
projectId: "postwoman-api",
|
||||||
|
storageBucket: "postwoman-api.appspot.com",
|
||||||
|
messagingSenderId: "421993993223",
|
||||||
|
appId: "1:421993993223:web:ec0baa8ee8c02ffa1fc6a2",
|
||||||
|
measurementId: "G-ERJ6025CEB"
|
||||||
|
};
|
||||||
|
firebase.initializeApp(config);
|
||||||
|
|
||||||
|
// a reference to the Balls collection
|
||||||
|
const ballsCollection = firebase.firestore().collection("balls");
|
||||||
|
|
||||||
|
// the shared state object that any vue component
|
||||||
|
// can get access to
|
||||||
|
export const store = {
|
||||||
|
ballsInFeed: null,
|
||||||
|
currentUser: null,
|
||||||
|
writeBall: message => {
|
||||||
|
const dt = {
|
||||||
|
createdOn: new Date(),
|
||||||
|
author: store.currentUser.uid,
|
||||||
|
author_name: store.currentUser.displayName,
|
||||||
|
author_image: store.currentUser.photoURL,
|
||||||
|
message
|
||||||
|
};
|
||||||
|
return ballsCollection
|
||||||
|
.add(dt)
|
||||||
|
.catch(e => console.error("error inserting", dt, e));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// onSnapshot is executed every time the data
|
||||||
|
// in the underlying firestore collection changes
|
||||||
|
// It will get passed an array of references to
|
||||||
|
// the documents that match your query
|
||||||
|
ballsCollection
|
||||||
|
.orderBy("createdOn", "desc")
|
||||||
|
.limit(5)
|
||||||
|
.onSnapshot(ballsRef => {
|
||||||
|
const balls = [];
|
||||||
|
ballsRef.forEach(doc => {
|
||||||
|
const ball = doc.data();
|
||||||
|
ball.id = doc.id;
|
||||||
|
balls.push(ball);
|
||||||
|
});
|
||||||
|
console.log("Received Balls feed:", balls);
|
||||||
|
store.ballsInFeed = balls;
|
||||||
|
});
|
||||||
|
|
||||||
|
// When a user logs in or out, save that in the store
|
||||||
|
firebase.auth().onAuthStateChanged(user => {
|
||||||
|
console.log("Logged in as:", user);
|
||||||
|
store.currentUser = user;
|
||||||
|
});
|
||||||
@@ -345,6 +345,17 @@
|
|||||||
</template>
|
</template>
|
||||||
</v-popover>
|
</v-popover>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<Login v-if="!store.currentUser" />
|
||||||
|
<div v-else>
|
||||||
|
<button @click="logout">Log out</button>
|
||||||
|
<InputForm />
|
||||||
|
<BallsFeed />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<nuxt />
|
<nuxt />
|
||||||
@@ -620,10 +631,22 @@ import intializePwa from "../assets/js/pwa";
|
|||||||
import * as version from "../.postwoman/version.json";
|
import * as version from "../.postwoman/version.json";
|
||||||
import { hasChromeExtensionInstalled } from "../functions/strategies/ChromeStrategy";
|
import { hasChromeExtensionInstalled } from "../functions/strategies/ChromeStrategy";
|
||||||
|
|
||||||
|
|
||||||
|
import firebase from 'firebase/app';
|
||||||
|
import 'firebase/auth';
|
||||||
|
|
||||||
|
import { store } from '../functions/store';
|
||||||
|
import Login from '../components/Login';
|
||||||
|
import InputForm from '../components/InputForm';
|
||||||
|
import BallsFeed from '../components/BallsFeed';
|
||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
logo: () => import("../components/logo"),
|
logo: () => import("../components/logo"),
|
||||||
modal: () => import("../components/modal")
|
modal: () => import("../components/modal"),
|
||||||
|
|
||||||
|
Login, InputForm, BallsFeed
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -632,7 +655,13 @@ export default {
|
|||||||
"nuxt-link-exact-active": this.$route.path === path,
|
"nuxt-link-exact-active": this.$route.path === path,
|
||||||
"nuxt-link-active": this.$route.path === path
|
"nuxt-link-active": this.$route.path === path
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
|
|
||||||
|
|
||||||
|
logout() {
|
||||||
|
firebase.auth().signOut()
|
||||||
|
.catch((err) => alert(err.message || err));
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
994
package-lock.json
generated
994
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -26,11 +26,13 @@
|
|||||||
"@nuxtjs/sitemap": "^2.0.1",
|
"@nuxtjs/sitemap": "^2.0.1",
|
||||||
"@nuxtjs/toast": "^3.3.0",
|
"@nuxtjs/toast": "^3.3.0",
|
||||||
"ace-builds": "^1.4.8",
|
"ace-builds": "^1.4.8",
|
||||||
|
"firebase": "^7.7.0",
|
||||||
"graphql": "^14.5.8",
|
"graphql": "^14.5.8",
|
||||||
"nuxt": "^2.11.0",
|
"nuxt": "^2.11.0",
|
||||||
"nuxt-i18n": "^6.4.1",
|
"nuxt-i18n": "^6.4.1",
|
||||||
"v-tooltip": "^2.0.2",
|
"v-tooltip": "^2.0.2",
|
||||||
"vue-virtual-scroll-list": "^1.4.4",
|
"vue-virtual-scroll-list": "^1.4.4",
|
||||||
|
"vuefire": "^2.2.1",
|
||||||
"vuejs-auto-complete": "^0.9.0",
|
"vuejs-auto-complete": "^0.9.0",
|
||||||
"vuex-persist": "^2.2.0",
|
"vuex-persist": "^2.2.0",
|
||||||
"yargs-parser": "^16.1.0"
|
"yargs-parser": "^16.1.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user