前提
MacOS
VueCLI導入済み
Firebase導入・認証設定済み
本題
ログイン
src/store.js
//省略
//firebaseをインポート
import firebase from "firebase";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
//追記
login_user: null,
},
mutations: {
//追記
setLoginUser(state, user) {
state.login_user = user;
},
addAddress(state, { id, address }) {
address.id = id;
state.addresses.push(address);
},
updateAddress(state, { id, address }) {
const index = state.addresses.findIndex((address) => address.id === id);
state.addresses[index] = address;
},
deleteAddress(state, { id }) {
const index = state.addresses.findIndex((address) => address.id === id);
state.addresses.splice(index, 1);
},
},
actions: {
//追記
setLoginUser({ commit }, user) {
commit("setLoginUser", user);
},
login() {
const google_auth_provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithRedirect(google_auth_provider);
},
toggleSideMenu({ commit }) {
commit("toggleSideMenu");
},
addAddress({ getters, commit }, address) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.add(address)
.then((doc) => {
commit("addAddress", { id: doc.id, address });
});
}
},
updateAddress({ getters, commit }, { id, address }) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.doc(id)
.update(address)
.then(() => {
commit("updateAddress", { id, address });
});
}
},
deleteAddress({ getters, commit }, { id }) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.doc(id)
.delete()
.then(() => {
commit("deleteAddress", { id });
});
}
},
},
modules: {},
getters: {
userName: (state) => (state.login_user ? state.login_user.displayName : ""),
photoURL: (state) => (state.login_user ? state.login_user.photoURL : ""),
uid: (state) => (state.login_user ? state.login_user.uid : null),
getAddressById: (state) => (id) =>
state.addresses.find((address) => address.id === id),
},
});
続いて、ログインアクションを実行できるようにする。
views/home.vue
<template>
<v-container text-center justify-center>
<v-layout row wrap>
<v-flex xs12>
<h1>TEST</h1>
<p>
Googleアカウントでログイン
</p>
</v-flex>
<v-flex xs12 mt-5>
<v-btn color="info" @click="login">Googleアカウントでログイン</v-btn>
</v-flex>
</v-layout>
</v-container>
</template>
<script>
//mapActionsを使用してmethodsに組み込む
import { mapActions } from "vuex";
export default {
methods: {
...mapActions(["login"]),
},
};
</script>
src/App.vue
<template>
<v-app>
<v-app-bar app color="primary" dark>
<v-app-bar-nav-icon
v-show="$store.state.login_user"
@click.stop="toggleSideMenu"
></v-app-bar-nav-icon>
<v-toolbar-title>TEST</v-toolbar-title>
<v-spacer></v-spacer>
</v-app-bar>
<SideNav />
<v-content>
<v-container fluid fill-height align-start>
<router-view />
</v-container>
</v-content>
</v-app>
</template>
<script>
//追記
import firebase from "firebase";
import { mapActions } from "vuex";
//省略
export default {
name: "App",
components: {
SideNav,
},
//追記
created() {
firebase.auth().onAuthStateChanged((user) => {
if (user) {
this.setLoginUser(user);
this.fetchAddresses();
if (this.$router.currentRoute.name === "home") {
this.$router.push({ name: "addresses" }, () => {});
}
} else {
this.deleteLoginUser();
this.$router.push({ name: "home" }, () => {});
}
});
},
methods: {
...mapActions([
"toggleSideMenu",
"setLoginUser",
]),
},
};
</script>
ログアウト
src/store.js
//省略
Vue.use(Vuex);
export default new Vuex.Store({
state: {
login_user: null,
},
mutations: {
setLoginUser(state, user) {
state.login_user = user;
},
//追記
deleteLoginUser(state) {
state.login_user = null;
},
addAddress(state, { id, address }) {
address.id = id;
state.addresses.push(address);
},
updateAddress(state, { id, address }) {
const index = state.addresses.findIndex((address) => address.id === id);
state.addresses[index] = address;
},
deleteAddress(state, { id }) {
const index = state.addresses.findIndex((address) => address.id === id);
state.addresses.splice(index, 1);
},
},
actions: {
setLoginUser({ commit }, user) {
commit("setLoginUser", user);
},
login() {
const google_auth_provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithRedirect(google_auth_provider);
},
//追記
logout() {
firebase.auth().signOut();
},
//追記
deleteLoginUser({ commit }) {
commit("deleteLoginUser");
},
toggleSideMenu({ commit }) {
commit("toggleSideMenu");
},
addAddress({ getters, commit }, address) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.add(address)
.then((doc) => {
commit("addAddress", { id: doc.id, address });
});
}
},
updateAddress({ getters, commit }, { id, address }) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.doc(id)
.update(address)
.then(() => {
commit("updateAddress", { id, address });
});
}
},
deleteAddress({ getters, commit }, { id }) {
if (getters.uid) {
firebase
.firestore()
.collection(`users/${getters.uid}/addresses`)
.doc(id)
.delete()
.then(() => {
commit("deleteAddress", { id });
});
}
},
},
modules: {},
getters: {
userName: (state) => (state.login_user ? state.login_user.displayName : ""),
photoURL: (state) => (state.login_user ? state.login_user.photoURL : ""),
uid: (state) => (state.login_user ? state.login_user.uid : null),
getAddressById: (state) => (id) =>
state.addresses.find((address) => address.id === id),
},
});
src/App.vue
<template>
<v-app>
<v-app-bar app color="primary" dark>
<v-app-bar-nav-icon
v-show="$store.state.login_user"
@click.stop="toggleSideMenu"
></v-app-bar-nav-icon>
<v-toolbar-title>TEST</v-toolbar-title>
<v-spacer></v-spacer>
//追記
<v-toolbar-items v-if="$store.state.login_user">
<v-btn text @click="logout">ログアウト</v-btn>
</v-toolbar-items>
</v-app-bar>
<SideNav />
<v-content>
<v-container fluid fill-height align-start>
<router-view />
</v-container>
</v-content>
</v-app>
</template>
<script>
//追記
import firebase from "firebase";
import { mapActions } from "vuex";
//省略
export default {
name: "App",
components: {
SideNav,
},
//追記
created() {
firebase.auth().onAuthStateChanged((user) => {
if (user) {
this.setLoginUser(user);
this.fetchAddresses();
if (this.$router.currentRoute.name === "home") {
this.$router.push({ name: "addresses" }, () => {});
}
} else {
this.deleteLoginUser();
this.$router.push({ name: "home" }, () => {});
}
});
},
methods: {
...mapActions([
"toggleSideMenu",
"setLoginUser",
//追記
"logout",
"deleteLoginUser",
"fetchAddresses",
]),
},
};
</script>