diff --git a/package.json b/package.json index 35099b4..9058c22 100644 --- a/package.json +++ b/package.json @@ -9,17 +9,21 @@ }, "dependencies": { "core-js": "^3.6.5", + "firebase": "^8.6.3", "register-service-worker": "^1.7.1", "vue": "^2.6.11", + "vue-offline": "^2.0.8", "vue-router": "^3.2.0", "vue-tailwind": "^2.2.1", + "vue2-transitions": "^0.3.0", + "vuelidate": "^0.7.6", "vuex": "^3.4.0" }, "devDependencies": { "@tailwindcss/postcss7-compat": "^2.1.2", "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-plugin- ": "~4.5.0", + "@vue/cli-plugin-pwa": "~4.5.0", "@vue/cli-plugin-router": "~4.5.0", "@vue/cli-plugin-vuex": "~4.5.0", "@vue/cli-service": "~4.5.0", @@ -34,4 +38,4 @@ "tailwindcss": "npm:@tailwindcss/postcss7-compat", "vue-template-compiler": "^2.6.11" } -} \ No newline at end of file +} diff --git a/public/img/1.png b/public/img/1.png new file mode 100644 index 0000000..0507f37 Binary files /dev/null and b/public/img/1.png differ diff --git a/public/img/2.png b/public/img/2.png new file mode 100644 index 0000000..be91de2 Binary files /dev/null and b/public/img/2.png differ diff --git a/public/img/3.png b/public/img/3.png new file mode 100644 index 0000000..6d24e5d Binary files /dev/null and b/public/img/3.png differ diff --git a/public/index.html b/public/index.html index 3e5a139..e79e2d0 100644 --- a/public/index.html +++ b/public/index.html @@ -1,15 +1,21 @@ - - - - + + + + <%= htmlWebpackPlugin.options.title %> + +
diff --git a/src/App.vue b/src/App.vue index 6be09cc..4753b5e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,13 +1,90 @@ + + diff --git a/src/assets/icon/Helmet.png b/src/assets/icon/Helmet.png new file mode 100644 index 0000000..31a6c8c Binary files /dev/null and b/src/assets/icon/Helmet.png differ diff --git a/src/assets/icon/Pakaian.png b/src/assets/icon/Pakaian.png new file mode 100644 index 0000000..846996a Binary files /dev/null and b/src/assets/icon/Pakaian.png differ diff --git a/src/assets/icon/Sepatu.png b/src/assets/icon/Sepatu.png new file mode 100644 index 0000000..7a744e1 Binary files /dev/null and b/src/assets/icon/Sepatu.png differ diff --git a/src/assets/icon/pembayaran.png b/src/assets/icon/pembayaran.png new file mode 100644 index 0000000..a8eeb5f Binary files /dev/null and b/src/assets/icon/pembayaran.png differ diff --git a/src/assets/icon/transaksi.png b/src/assets/icon/transaksi.png new file mode 100644 index 0000000..64059d2 Binary files /dev/null and b/src/assets/icon/transaksi.png differ diff --git a/src/assets/img/google-icon.svg b/src/assets/img/google-icon.svg new file mode 100644 index 0000000..06dc52f --- /dev/null +++ b/src/assets/img/google-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/profile.jpg b/src/assets/img/profile.jpg new file mode 100644 index 0000000..cdb5ebb Binary files /dev/null and b/src/assets/img/profile.jpg differ diff --git a/src/assets/logo.png b/src/assets/logo.png index f3d2503..f928bca 100644 Binary files a/src/assets/logo.png and b/src/assets/logo.png differ diff --git a/src/assets/tailwind.css b/src/assets/tailwind.css index 65fb5a7..4ba609c 100644 --- a/src/assets/tailwind.css +++ b/src/assets/tailwind.css @@ -1,5 +1,18 @@ +* { + margin: 0; + padding: 0; +} + @tailwind base; @layer base { + body, + html { + @apply overflow-x-hidden; + } + button, + button:focus { + @apply outline-none; + } h1 { @apply text-2xl font-bold; } @@ -13,10 +26,160 @@ @apply text-blue-600 underline; } } -@tailwind components; -@tailwind utilities; -* { - margin: 0; - padding: 0; +@tailwind components; +@layer components { + .login-form-input { + @apply h-14 relative z-0 bg-gray-50 appearance-none border border-gray-100 rounded-md w-full py-2 px-3 text-gray-800 text-lg leading-tight; + transition: 0.3s ease; + } + .login-form-input:focus { + @apply outline-none border-teal-500; + transition: 0.3s ease; + } + .login-form-error { + @apply h-14 relative z-0 bg-gray-50 appearance-none border border-red-500 rounded-md w-full py-2 px-3 text-gray-800 text-lg leading-tight; + transition: 0.3s ease; + } + .login-form-error:focus { + @apply outline-none; + transition: 0.3s ease; + } + .login-form-icon { + @apply text-xl w-12 h-10 my-auto -mr-12 pl-5 relative z-10; + } + .text-gray { + @apply text-lg text-gray-500 font-bold; + text-decoration: none; + } + .text-link { + @apply text-lg text-teal-500 font-bold; + text-decoration: none; + } + .btn { + @apply py-3 rounded-lg border-2 border-transparent text-lg mx-auto font-bold; + transition: 0.2s ease-out; + } + .btn-icon { + @apply h-12 w-12; + } + .btn-menu { + @apply px-3 text-teal-600 bg-teal-50 rounded-2xl flex items-center; + } + .btn-icon:focus, + .btn-menu:focus, + .btn-icontext:focus { + @apply bg-black rounded-lg bg-opacity-5; + transition: 0.2s ease-out; + } + .btn-primary { + @apply bg-teal-500 text-white; + } + .btn-info { + @apply bg-blue-500 text-white; + } + .btn-black { + @apply bg-black text-white; + } + .btn-primary:focus, + .btn-black:focus { + @apply bg-opacity-75; + transition: 0.2s ease-out; + } + .btn-outline-primary { + @apply border-teal-500 text-teal-500; + } + .btn-outline-black { + @apply border-black text-black; + } + .btn-icontext { + @apply h-24 w-24 rounded-lg; + } + .btn-transparent { + @apply px-3 py-2 rounded-lg text-teal-500; + } + .btn-transparent:hover { + @apply text-teal-500 bg-teal-100; + } + .btn-tabbar { + @apply w-full pt-4 pb-3; + } + .btn-tabbar:disabled { + @apply font-bold text-teal-500 border-b-4 border-teal-500 border-solid; + } + .badge-primary { + @apply p-1 rounded-md text-teal-500 bg-teal-100; + } + .badge-danger { + @apply p-1 rounded-md text-red-500 bg-red-100; + } + .badge-warning { + @apply p-1 rounded-md text-yellow-500 bg-yellow-100; + } + .badge-info { + @apply p-1 rounded-md text-blue-500 bg-blue-100; + } + .item-list:hover { + @apply bg-gray-50 cursor-pointer; + } + .appbar { + @apply flex items-center; + height: 4rem; + } + .body { + @apply pb-5; + /* height: calc(~"100vh-40px"); */ + height: calc(100vh - 4rem); + overflow: scroll; + } + .header-app { + @apply h-14; + } + .home-body { + @apply pb-5; + height: calc(100vh - 6.5rem); + overflow: scroll; + } + .header-app::before { + @apply bg-teal-500 absolute w-screen h-36 top-0 left-0; + content: ""; + border-radius: 0 0 50% 50%; + transform: scale(1.5); + z-index: -1; + } + .profile-image { + @apply rounded-full; + } + .clamp-1 { + -webkit-line-clamp: 1; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } + .card { + @apply bg-white rounded-xl shadow-lg p-6; + } + .card-border { + @apply border-2 bg-white border-gray-100 rounded-lg; + } + .horizontal-scroll { + @apply overflow-x-scroll inline-flex w-full; + /* width: calc(100vw - 1.5rem); */ + } + .horizontal-scroll::-webkit-scrollbar, + .overflow-y-scroll::-webkit-scrollbar, + .body::-webkit-scrollbar { + @apply hidden; + } + .tips-item h2 { + @apply break-words; + width: 12rem; + word-wrap: break-word; + hyphens: auto; + } + .tips-item { + @apply text-white h-48; + } } + +@tailwind utilities; diff --git a/src/components/AlertMsg.vue b/src/components/AlertMsg.vue new file mode 100644 index 0000000..cbfc436 --- /dev/null +++ b/src/components/AlertMsg.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/src/components/ErrorInput.vue b/src/components/ErrorInput.vue new file mode 100644 index 0000000..8fd66db --- /dev/null +++ b/src/components/ErrorInput.vue @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/src/components/Home/Category.vue b/src/components/Home/Category.vue new file mode 100644 index 0000000..cdda056 --- /dev/null +++ b/src/components/Home/Category.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/Home/Rekomendasi.vue b/src/components/Home/Rekomendasi.vue new file mode 100644 index 0000000..a52f8d5 --- /dev/null +++ b/src/components/Home/Rekomendasi.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/Home/Tips.vue b/src/components/Home/Tips.vue new file mode 100644 index 0000000..bec8b3f --- /dev/null +++ b/src/components/Home/Tips.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/ListItem.vue b/src/components/ListItem.vue new file mode 100644 index 0000000..7648ed6 --- /dev/null +++ b/src/components/ListItem.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/Loading.vue b/src/components/Loading.vue new file mode 100644 index 0000000..71c84f9 --- /dev/null +++ b/src/components/Loading.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/MenuList.vue b/src/components/MenuList.vue new file mode 100644 index 0000000..5f43c9b --- /dev/null +++ b/src/components/MenuList.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue new file mode 100644 index 0000000..d099831 --- /dev/null +++ b/src/components/Modal.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue new file mode 100644 index 0000000..ddf40f3 --- /dev/null +++ b/src/components/Navbar.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/Offline.vue b/src/components/Offline.vue new file mode 100644 index 0000000..86ec8a5 --- /dev/null +++ b/src/components/Offline.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/Pesan/PesanList.vue b/src/components/Pesan/PesanList.vue new file mode 100644 index 0000000..19fe4e0 --- /dev/null +++ b/src/components/Pesan/PesanList.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/components/Review.vue b/src/components/Review.vue new file mode 100644 index 0000000..e18812c --- /dev/null +++ b/src/components/Review.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/components/Riwayat/RiwayatList.vue b/src/components/Riwayat/RiwayatList.vue new file mode 100644 index 0000000..d12ae89 --- /dev/null +++ b/src/components/Riwayat/RiwayatList.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/Verifikasi.vue b/src/components/Verifikasi.vue new file mode 100644 index 0000000..a568bde --- /dev/null +++ b/src/components/Verifikasi.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/VerifikasiSukses.vue b/src/components/VerifikasiSukses.vue deleted file mode 100644 index 00f5594..0000000 --- a/src/components/VerifikasiSukses.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/firebase.js b/src/firebase.js new file mode 100644 index 0000000..e44a61e --- /dev/null +++ b/src/firebase.js @@ -0,0 +1,23 @@ +import firebase from "firebase/app"; +import "firebase/firestore"; +import "firebase/auth"; +import "firebase/messaging"; + +// For Firebase JS SDK v7.20.0 and later, measurementId is optional +const firebaseConfig = { + apiKey: "AIzaSyB-B_bKiQRMGoFKKAuqE_2ofxyjyL0nUZc", + authDomain: "easywash-274e9.firebaseapp.com", + projectId: "easywash-274e9", + storageBucket: "easywash-274e9.appspot.com", + messagingSenderId: "727707947533", + appId: "1:727707947533:web:cd53efa5225f85b779bb44", + measurementId: "G-P7CNLHWZVD", +}; +// Initialize Firebase +let firebaseInit = firebase.initializeApp(firebaseConfig); + +// firebase.analytics(); + +export const db = firebase.firestore(); +export const auth = firebase.auth; +export default firebaseInit; diff --git a/src/main.js b/src/main.js index 0bbaf87..d644eb2 100644 --- a/src/main.js +++ b/src/main.js @@ -4,11 +4,53 @@ import "./registerServiceWorker"; import router from "./router"; import store from "./store"; import "./assets/tailwind.css"; +import Vuelidate from "vuelidate"; +import VueOffline from "vue-offline"; +import "./firebase"; +// import { db } from "./firebase"; +import { auth } from "./firebase"; +Vue.use(VueOffline); +Vue.use(Vuelidate); +Vue.mixin({ + methods: { + changeTitleName() { + if (this.$route.name != "Home") { + document.title = "Easywash - " + this.$route.name; + } else document.title = "Easywash"; + }, + formatRupiah(value) { + let number_string = value + .toString() + .replace(/[^,\d]/g, "") + .toString(), + split = number_string.split(","), + sisa = split[0].length % 3, + rupiah = split[0].substr(0, sisa), + ribuan = split[0].substr(sisa).match(/\d{3}/gi); + + // tambahkan titik jika yang di input sudah menjadi angka ribuan + if (ribuan) { + let separator = sisa ? "." : ""; + rupiah += separator + ribuan.join("."); + } + + rupiah = split[1] != undefined ? rupiah + "," + split[1] : rupiah; + return rupiah ? "Rp. " + rupiah : ""; + }, + }, +}); Vue.config.productionTip = false; -new Vue({ - router, - store, - render: (h) => h(App), -}).$mount("#app"); +auth().onAuthStateChanged((firebaseUser) => { + new Vue({ + router, + store, + render: (h) => h(App), + mounted() { + if (firebaseUser) { + store.dispatch("autoSignIn", firebaseUser); + } + }, + }).$mount("#app"); +}); diff --git a/src/router/index.js b/src/router/index.js index e6f7287..8fdf9a8 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -5,35 +5,117 @@ import Login from "../views/Login.vue"; import Register from "../views/Register.vue"; import Setting from "../views/Setting.vue"; import Onboarding from "../views/Onboarding.vue"; +import Rekomendasi from "../views/Rekomendasi.vue"; +import Riwayat from "../views/Riwayat.vue"; +import Pesan from "../views/Pesan.vue"; +import Profil from "../views/Profil.vue"; +import DetailPesanan from "../views/DetailPesanan.vue"; +import LaundryType from "../views/Laundry/LaundryType.vue"; +import MitraInfo from "../views/Laundry/MitraInfo.vue"; +import Tentang from "../views/Tentang.vue"; +import SnK from "../views/SnK.vue"; +import KebijakanPrivasi from "../views/KebijakanPrivasi.vue"; +import { auth } from "../firebase"; Vue.use(VueRouter); const routes = [ { - path: "/", + path: "/login", name: "Login", component: Login, + meta: { + withoutAuth: true, + }, }, { path: "/register", name: "Register", component: Register, + meta: { + withoutAuth: true, + }, }, { path: "/onboarding", name: "Onboarding", component: Onboarding, + meta: { + withoutAuth: true, + }, }, { - path: "/app", + path: "/", name: "Home", component: Home, + meta: { + withoutAuth: true, + }, + }, + { + path: "/rekomendasi", + name: "Rekomendasi", + component: Rekomendasi, + meta: { + withoutAuth: true, + }, }, { - path: "/app/setting", + path: "/riwayat", + name: "Riwayat", + component: Riwayat, + }, + { + path: "/pesan", + name: "Pesan", + component: Pesan, + }, + { + path: "/profil", + name: "Profil", + component: Profil, + }, + { + path: "/detail_pesanan/:id", + name: "Detail Pesanan", + component: DetailPesanan, + }, + { + path: "/laundry/:type", + name: "Laundry", + component: LaundryType, + meta: { + withoutAuth: true, + }, + }, + { + path: "/mitra/:id", + name: "Laundry Mitra Info", + component: MitraInfo, + meta: { + withoutAuth: true, + }, + }, + { + path: "/setting", name: "Setting", component: Setting, }, + { + path: "/tentang", + name: "Tentang Kami", + component: Tentang, + }, + { + path: "/s&k", + name: "Syarat & Ketentuan", + component: SnK, + }, + { + path: "/kebijakan_privasi", + name: "Kebijaakn Privasi", + component: KebijakanPrivasi, + }, ]; const router = new VueRouter({ @@ -50,4 +132,21 @@ router.beforeEach((to, from, next) => { // console.log("next: ", next); }); +router.beforeResolve((to, from, next) => { + const withoutAuth = to.matched.some((record) => record.meta.withoutAuth); + const isLoggedIn = auth().currentUser; + + if (!withoutAuth && !isLoggedIn) next("/login"); + else if ((to.path == "/login" || to.path == "/register") && isLoggedIn) + next("/"); + else next(); + // if ((withoutAuth && !isLoggedIn) || (!withoutAuth && isLoggedIn)) { + // next(); + // } else if (withoutAuth && isLoggedIn) { + // // to root + // next("/"); + // } + // // // console.log(from); +}); + export default router; diff --git a/src/store/index.js b/src/store/index.js index ba2f84a..0311a7e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,11 +1,116 @@ import Vue from "vue"; import Vuex from "vuex"; +import { db } from "../firebase"; +import { auth } from "../firebase"; +// import router from "@/router"; Vue.use(Vuex); export default new Vuex.Store({ - state: {}, - mutations: {}, - actions: {}, + state: { + token: null, + user: null, + uid: null, + error: null, + loading: false, + verified: true, + authStatus: "", + }, + mutations: { + setUser(state, payload) { + state.user = payload; + }, + setUID(state, payload) { + state.uid = payload; + }, + setError(state, payload) { + state.error = payload; + }, + setLoading(state, payload) { + state.loading = payload; + }, + updateUser(state, payload) { + state.user = payload; + }, + isVerified(state, payload) { + state.verified = payload; + }, + setAuthStatus(state, payload) { + state.authStatus = payload; + }, + // setUsername(state, payload) { + // state.user.username = payload; + // }, + }, + actions: { + getUserData({ commit }, payload) { + db.collection("users") + .where("uid", "==", payload) + .get() + .then((querySnapshot) => { + if (querySnapshot.empty) { + commit( + "setAuthStatus", + "User belum terdaftar, silahkan mendaftar terlebih dahulu" + ); + } + commit("setLoading", false); + querySnapshot.forEach((doc) => { + commit("setUser", doc.data()); + }); + }) + .catch((error) => { + commit("setLoading", false); + console.log(error); + }); + }, + autoSignIn({ commit, state, dispatch }, payload) { + if (!state.user) { + if (!payload.emailVerified) commit("isVerified", false); + + commit("setLoading", true); + dispatch("getUserData", payload.uid); + // commit("setUser", { email: payload.uid }); + } + }, + registerWithGoogle({ commit }) { + return new Promise((resolve, reject) => { + var provider = new auth.GoogleAuthProvider(); + auth() + .signInWithPopup(provider) + .then(async (result) => { + let user = { + name: result.user.displayName, + email: result.user.email, + uid: result.user.uid, + }; + + await commit("isVerified", result.user.emailVerified); + if (!result.user.emailVerified) { + await auth() + .currentUser.sendEmailVerification() + .catch((error) => console.log(error)); + } + + await commit("setLoading", false); + await db + .collection("users") + .doc(user.uid) + .set(user) + .then(async () => { + await commit("setUser", user); + resolve(); + }) + .catch((error) => { + console.log(error); + }); + }) + .catch((error) => { + commit("setLoading", false); + reject(error); + }); + }); + }, + }, modules: {}, }); diff --git a/src/views/DetailPesanan.vue b/src/views/DetailPesanan.vue new file mode 100644 index 0000000..49f009e --- /dev/null +++ b/src/views/DetailPesanan.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/views/Home.vue b/src/views/Home.vue index d2adcd1..bca77e3 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -1,17 +1,86 @@ diff --git a/src/views/KebijakanPrivasi.vue b/src/views/KebijakanPrivasi.vue new file mode 100644 index 0000000..4e9297e --- /dev/null +++ b/src/views/KebijakanPrivasi.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/src/views/Laundry/LaundryType.vue b/src/views/Laundry/LaundryType.vue new file mode 100644 index 0000000..50284d5 --- /dev/null +++ b/src/views/Laundry/LaundryType.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/views/Laundry/MitraInfo.vue b/src/views/Laundry/MitraInfo.vue new file mode 100644 index 0000000..b138909 --- /dev/null +++ b/src/views/Laundry/MitraInfo.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/views/Login.vue b/src/views/Login.vue index be2a375..937de19 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -1,19 +1,200 @@ - - \ No newline at end of file diff --git a/src/views/Onboarding.vue b/src/views/Onboarding.vue index f6f4b92..1a513c2 100644 --- a/src/views/Onboarding.vue +++ b/src/views/Onboarding.vue @@ -13,28 +13,22 @@ @@ -47,20 +41,17 @@ export default { { img: "tracking", title: "Tracking", - body: - "Kamu bisa melakukan tracking melalui detail pesanan jadi kamu bisa terus memantau proses pencucian dan jika ada keluhan bisa contact mitra laundry.", + body: "Kamu bisa melakukan tracking melalui detail pesanan jadi kamu bisa terus memantau proses pencucian dan jika ada keluhan bisa contact mitra laundry.", }, { img: "jaminan-kualitas", title: "Jaminan Cucian", - body: - "Jika cuci di official laundry kami memberikan jaminan barang cucian jika ada kerusakan atau barang cucian hilang uang akan kami kembalikan 100%.", + body: "Jika cuci di official laundry kami memberikan jaminan barang cucian jika ada kerusakan atau barang cucian hilang uang akan kami kembalikan 100%.", }, { img: "easy-payment", title: "Mudah Pembayaran", - body: - "Laundry menyediakan banyak pilihan pembayaran seperti bank virtual account, cash, pembayaran online lainya dan dijamin keamanannya.", + body: "Laundry menyediakan banyak pilihan pembayaran seperti bank virtual account, cash, pembayaran online lainya dan dijamin keamanannya.", }, ], }), @@ -75,5 +66,4 @@ export default { }; - \ No newline at end of file + diff --git a/src/views/Pesan.vue b/src/views/Pesan.vue new file mode 100644 index 0000000..fe7af9e --- /dev/null +++ b/src/views/Pesan.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/views/Profil.vue b/src/views/Profil.vue new file mode 100644 index 0000000..96bd259 --- /dev/null +++ b/src/views/Profil.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/views/Register.vue b/src/views/Register.vue index 4f775df..938c94b 100644 --- a/src/views/Register.vue +++ b/src/views/Register.vue @@ -1,10 +1,289 @@ +import { required, email, minLength } from "vuelidate/lib/validators"; +import ErrorInput from "@/components/ErrorInput"; +import AlertMsg from "@/components/AlertMsg"; +import Modal from "@/components/Modal"; +import Verifikasi from "@/components/Verifikasi"; +import { db } from "../firebase"; +import { auth } from "../firebase"; - \ No newline at end of file +export default { + components: { + ErrorInput, + AlertMsg, + Modal, + Verifikasi, + }, + data: () => ({ + form: { + username: "", + email: "", + password: "", + repeat_password: "", + }, + showModal: false, + + errors: { + username: { + msg: "Username minimal harus 6 karakter", + status: false, + }, + email: { + msg: "Format email salah", + status: false, + }, + password: { + msg: "Password minimal harus 6 karakter", + status: false, + }, + repeat_password: { + msg: "Password tidak sama", + status: false, + }, + register: { + msg: null, + status: false, + }, + }, + }), + validations: { + form: { + username: { required, min: minLength(6) }, + email: { required, email }, + password: { required, min: minLength(6) }, + repeat_password: { required, min: minLength(6) }, + }, + }, + methods: { + submit() { + let form = this.$v.form; + this.$v.form.$touch(); + this.errors.username.status = !form.username.min; + this.errors.email.status = !form.email.email; + this.errors.password.status = !form.password.min; + + if (this.form.password != this.form.repeat_password) + this.errors.repeat_password.status = true; + else { + this.errors.repeat_password.status = false; + + if (!this.$v.form.$error) { + this.errors.register.status = false; + if (!this.errors.register.status) { + this.userSignUp(); + } + } + } + }, + userSignUp() { + this.$store.commit("setLoading", true); + auth() + .createUserWithEmailAndPassword(this.form.email, this.form.password) + .then(async (val) => { + let user = { + name: this.form.username, + email: this.form.email, + uid: val.user.uid, + }; + await auth() + .currentUser.sendEmailVerification() + // .then(() => ()) + .catch((error) => console.log(error)); + await this.$store.commit("setLoading", false); + await db + .collection("users") + .doc(user.uid) + .set(user) + .then(async () => { + await this.$store.commit("setUser", user); + await this.$store.commit("isVerified", val.user.emailVerified); + this.showModal = true; + setTimeout(() => { + this.$router.push("/"); + }, 2500); + }) + .catch((error) => { + console.log(error); + }); + }) + .catch((error) => { + this.$store.commit("setLoading", false); + this.errors.register.status = true; + this.errors.register.msg = error.message; + }); + }, + actionChildClicked(val) { + this.showModal = val.status; + }, + signInWithGoogle() { + this.$store + .dispatch("registerWithGoogle") + .then(() => { + this.showModal = true; + setTimeout(() => { + this.$router.push("/"); + }, 2500); + }) + .catch((error) => { + this.errors.register.status = true; + this.errors.register.msg = error.message; + }); + }, + }, +}; + diff --git a/src/views/Rekomendasi.vue b/src/views/Rekomendasi.vue new file mode 100644 index 0000000..1b13454 --- /dev/null +++ b/src/views/Rekomendasi.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/views/Riwayat.vue b/src/views/Riwayat.vue new file mode 100644 index 0000000..a8caed6 --- /dev/null +++ b/src/views/Riwayat.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/views/Setting/Alamat.vue b/src/views/Setting/Alamat.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/Setting/EditProfile.vue b/src/views/Setting/EditProfile.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/SnK.vue b/src/views/SnK.vue new file mode 100644 index 0000000..8b69df3 --- /dev/null +++ b/src/views/SnK.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/views/Tentang.vue b/src/views/Tentang.vue new file mode 100644 index 0000000..665d9bf --- /dev/null +++ b/src/views/Tentang.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/vue.config.js b/src/vue.config.js new file mode 100644 index 0000000..f96aac1 --- /dev/null +++ b/src/vue.config.js @@ -0,0 +1,12 @@ +module.exports = { + transpileDependencies: ["vuetify"], + pwa: { + name: "Easywash", + themeColor: "#15B9A6", + start_url: "/", + manifestOptions: { + background_color: "#15B9A6 ", + orientation: "portrait", + }, + }, +}; diff --git a/tailwind.config.js b/tailwind.config.js index ba74a4f..3b3a499 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,8 +1,36 @@ +const colors = require("tailwindcss/colors"); + module.exports = { purge: ["./public/**/*.html", "./src/**/*.vue"], darkMode: false, // or 'media' or 'class' theme: { extend: {}, + colors: { + transparent: "transparent", + current: "currentColor", + black: colors.black, + white: colors.white, + gray: colors.coolGray, + green: colors.green, + red: colors.red, + yellow: colors.amber, + blue: colors.blue, + teal: colors.teal, + orange: colors.orange, + }, + + boxShadow: { + sm: "0 1px 2px 0 rgba(0, 0, 0, 0.05)", + DEFAULT: + "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)", + md: "0 5px 95px -10px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)", + lg: "0 10px 125px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)", + xl: "0 20px 170px -3px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)", + "2xl": "0 25px 50px -12px rgba(0, 0, 0, 0.25)", + "3xl": "0 15px 60px -15px rgba(0, 0, 0, 0.3)", + inner: "inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)", + none: "none", + }, }, variants: { extend: {}, diff --git a/yarn.lock b/yarn.lock index 3c40c91..49bef89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -902,6 +902,252 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" +"@firebase/analytics-types@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.4.0.tgz#d6716f9fa36a6e340bc0ecfe68af325aa6f60508" + integrity sha512-Jj2xW+8+8XPfWGkv9HPv/uR+Qrmq37NPYT352wf7MvE9LrstpLVmFg3LqG6MCRr5miLAom5sen2gZ+iOhVDeRA== + +"@firebase/analytics@0.6.10": + version "0.6.10" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.6.10.tgz#e2438d57fa289d1f05ca1a2ea7aedee10501fc3e" + integrity sha512-dLOAfeHYKkt1mhFNzrST6X0W5Og/VKhH7VP03YlUwz1STKtPve/KV32IynjMEBgnI6DC1NIAX3V0jYK6KBum4A== + dependencies: + "@firebase/analytics-types" "0.4.0" + "@firebase/component" "0.5.0" + "@firebase/installations" "0.4.26" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/app-check-interop-types@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz#83afd9d41f99166c2bdb2d824e5032e9edd8fe53" + integrity sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA== + +"@firebase/app-check-types@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.1.0.tgz#75602650c5f118891834280b72addcac513c4b7d" + integrity sha512-jf92QzVkj9ulyp/K01h/GpVYNSjuk6DP9nHkq4AUyM+35e96cl9gL3+qOTD0//5CVfrWjRo7+lbVlW2OpG/JDQ== + +"@firebase/app-check@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.1.1.tgz#26c15df13048a86c025590f8b8b579f3f9b8b99c" + integrity sha512-nBNiyhbCBpaVfVNjwGor+f0LZkn5kf1QRdMPbRyZUJG6BjTByMhNmbezEaCWNO0MNBhsNqYqiXUivHJU4A3+2Q== + dependencies: + "@firebase/app-check-interop-types" "0.1.0" + "@firebase/app-check-types" "0.1.0" + "@firebase/component" "0.5.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/app-types@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.2.tgz#8578cb1061a83ced4570188be9e225d54e0f27fb" + integrity sha512-2VXvq/K+n8XMdM4L2xy5bYp2ZXMawJXluUIDzUBvMthVR+lhxK4pfFiqr1mmDbv9ydXvEAuFsD+6DpcZuJcSSw== + +"@firebase/app@0.6.22": + version "0.6.22" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.22.tgz#099f51d2c4302d2c99da82994cd176b5a568cfcc" + integrity sha512-9E0KP7Z+LpBOx/oQauLYvf3XleYpbfoi058wStADUtP+eOX5GIImAFNDTOO4ZNuJfLgyrHpKi7Cct6mDdxrz+g== + dependencies: + "@firebase/app-types" "0.6.2" + "@firebase/component" "0.5.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.1.0" + dom-storage "2.1.0" + tslib "^2.1.0" + xmlhttprequest "1.8.0" + +"@firebase/auth-interop-types@0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz#5ce13fc1c527ad36f1bb1322c4492680a6cf4964" + integrity sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g== + +"@firebase/auth-types@0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.10.3.tgz#2be7dd93959c8f5304c63e09e98718e103464d8c" + integrity sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA== + +"@firebase/auth@0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.16.6.tgz#0fc7a11561b939865fd486cd1909a3e81742fd82" + integrity sha512-1Lj3AY40Z2weCK6FuJqUEkeVJpRaaCo1LT6P5s3VIR99PDYLHeMm2m02rBaskE7ralJA975Vkv7sHrpykRfDrA== + dependencies: + "@firebase/auth-types" "0.10.3" + +"@firebase/component@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.0.tgz#f5b577d6c6f78d0f12fdc45046108921507f49c9" + integrity sha512-v18csWtXb0ri+3m7wuGLY/UDgcb89vuMlZGQ//+7jEPLIQeLbylvZhol1uzW9WzoOpxMxOS2W5qyVGX36wZvEA== + dependencies: + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/database-types@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.7.2.tgz#449c4b36ec59a1ad9089797b540e2ba1c0d4fcbf" + integrity sha512-cdAd/dgwvC0r3oLEDUR+ULs1vBsEvy0b27nlzKhU6LQgm9fCDzgaH9nFGv8x+S9dly4B0egAXkONkVoWcOAisg== + dependencies: + "@firebase/app-types" "0.6.2" + +"@firebase/database@0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.10.2.tgz#2c1b3ab2764fd1116a1c0a1681d022d17c53c318" + integrity sha512-jMGtl5eBES9k0rOIZd6/EAuVB6m3LzRei1lvEiqWWBje2Xoz//7sjZcxOYtAKCCLldEI1EUrzW8Tv5yEAoPPpg== + dependencies: + "@firebase/auth-interop-types" "0.1.6" + "@firebase/component" "0.5.0" + "@firebase/database-types" "0.7.2" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.1.0" + faye-websocket "0.11.3" + tslib "^2.1.0" + +"@firebase/firestore-types@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.3.0.tgz#baf5c9470ba8be96bf0d76b83b413f03104cf565" + integrity sha512-QTW7NP7nDL0pgT/X53lyj+mIMh4nRQBBTBlRNQBt7eSyeqBf3ag3bxdQhCg358+5KbjYTC2/O6QtX9DlJZmh1A== + +"@firebase/firestore@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-2.3.2.tgz#4a5efdf42fc719cf1c0796de83be98e6ee9865ce" + integrity sha512-xS5dBa1GWzzUBjyrUen81tKgJF6U81owMvmmh6AwTIVIcz5Sd+Dt2MCuyj2vpSRGEgR2SJXNOvHBw/2ORfjN+Q== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/firestore-types" "2.3.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "1.1.0" + "@firebase/webchannel-wrapper" "0.4.1" + "@grpc/grpc-js" "^1.3.2" + "@grpc/proto-loader" "^0.5.0" + node-fetch "2.6.1" + tslib "^2.1.0" + +"@firebase/functions-types@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.4.0.tgz#0b789f4fe9a9c0b987606c4da10139345b40f6b9" + integrity sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ== + +"@firebase/functions@0.6.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.6.9.tgz#6e38c9aa411949d8697bf662bb8da8a0837addae" + integrity sha512-WgrT3EG+O70pYpX2KQM2S2Is2WJbKE6XImoloMglIqiaquOCXNR9LUVbGPWQr7qEqY+QojfTgF/bGH0awqm2KA== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/functions-types" "0.4.0" + "@firebase/messaging-types" "0.5.0" + node-fetch "2.6.1" + tslib "^2.1.0" + +"@firebase/installations-types@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.3.4.tgz#589a941d713f4f64bf9f4feb7f463505bab1afa2" + integrity sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q== + +"@firebase/installations@0.4.26": + version "0.4.26" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.26.tgz#34133944123d92077674dcec81e32b4fccd92021" + integrity sha512-bHc6jlV8p1cX+GK38key4BooeZZ42//nKPmf3POWren0bACjnfHJuMnOBDuyw22ss3z6wUdiFNQjeUxvD4btGg== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/installations-types" "0.3.4" + "@firebase/util" "1.1.0" + idb "3.0.2" + tslib "^2.1.0" + +"@firebase/logger@0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.6.tgz#3aa2ca4fe10327cabf7808bd3994e88db26d7989" + integrity sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw== + +"@firebase/messaging-types@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.5.0.tgz#c5d0ef309ced1758fda93ef3ac70a786de2e73c4" + integrity sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg== + +"@firebase/messaging@0.7.10": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.7.10.tgz#a46fb689d7feed46b2112cb08dd44993c6ceecec" + integrity sha512-Z5ui3kc1GbPf2+kwNvr0HjguBbi0xTkR7/BHodHHGpz0ycuY/J2/Cl9SgwhEuB52kme4ca9sKwV1g0Ln2/iARw== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/installations" "0.4.26" + "@firebase/messaging-types" "0.5.0" + "@firebase/util" "1.1.0" + idb "3.0.2" + tslib "^2.1.0" + +"@firebase/performance-types@0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.0.13.tgz#58ce5453f57e34b18186f74ef11550dfc558ede6" + integrity sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA== + +"@firebase/performance@0.4.12": + version "0.4.12" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.4.12.tgz#fe4068ad29682d127e4ef1efc6dcca7c68f3ac39" + integrity sha512-dFV0OR5IpHZwfOLFkEZuUVFmaJQresmS5G4UNFGk1E0VwU4feZ3roq75dJVYehclJxmbzgMM9M/U1bZ1/9wt3g== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/installations" "0.4.26" + "@firebase/logger" "0.2.6" + "@firebase/performance-types" "0.0.13" + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/polyfill@0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" + integrity sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg== + dependencies: + core-js "3.6.5" + promise-polyfill "8.1.3" + whatwg-fetch "2.0.4" + +"@firebase/remote-config-types@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz#fe6bbe4d08f3b6e92fce30e4b7a9f4d6a96d6965" + integrity sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA== + +"@firebase/remote-config@0.1.37": + version "0.1.37" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.37.tgz#b79fe81231d3ca1325836a8aa9756cb7aa587d3a" + integrity sha512-SYjDOsEoUeqX1CYnUtXqVtM8MpVm2qx2Dp8NLRlLcPp/FieEza/mjRNVHBojMKuFjmyQp/RdPG8R0I9xDJ4PsQ== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/installations" "0.4.26" + "@firebase/logger" "0.2.6" + "@firebase/remote-config-types" "0.1.9" + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/storage-types@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.4.1.tgz#da6582ae217e3db485c90075dc71100ca5064cc6" + integrity sha512-IM4cRzAnQ6QZoaxVZ5MatBzqXVcp47hOlE28jd9xXw1M9V7gfjhmW0PALGFQx58tPVmuUwIKyoEbHZjV4qRJwQ== + +"@firebase/storage@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.5.2.tgz#146cb4c7838c6e3602b32a43786dcabd16f668fb" + integrity sha512-D2lZixL6E2iXE4jObtlA3UnAbcMd3657erotiuZt5ap95m1fogiPV/gIq3KLIaT5sFdfbbDQn9mm6hVKhobYHA== + dependencies: + "@firebase/component" "0.5.0" + "@firebase/storage-types" "0.4.1" + "@firebase/util" "1.1.0" + tslib "^2.1.0" + +"@firebase/util@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.1.0.tgz#add2d57d0b2307a932520abdee303b66be0ac8b0" + integrity sha512-lfuSASuPKNdfebuFR8rjFamMQUPH9iiZHcKS755Rkm/5gRT0qC7BMhCh3ZkHf7NVbplzIc/GhmX2jM+igDRCag== + dependencies: + tslib "^2.1.0" + +"@firebase/webchannel-wrapper@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.4.1.tgz#600f2275ff54739ad5ac0102f1467b8963cd5f71" + integrity sha512-0yPjzuzGMkW1GkrC8yWsiN7vt1OzkMIi9HgxRmKREZl2wnNPOKo/yScTjXf/O57HM8dltqxPF6jlNLFVtc2qdw== + "@fullhuman/postcss-purgecss@^3.1.3": version "3.1.3" resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz#47af7b87c9bfb3de4bc94a38f875b928fffdf339" @@ -909,6 +1155,21 @@ dependencies: purgecss "^3.1.3" +"@grpc/grpc-js@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.2.tgz#eae97e6daf5abd49a7818aadeca0744dfb1ebca1" + integrity sha512-UXepkOKCATJrhHGsxt+CGfpZy9zUn1q9mop5kfcXq1fBkTePxVNPOdnISlCbJFlCtld+pSLGyZCzr9/zVprFKA== + dependencies: + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.5.0": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d" + integrity sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ== + dependencies: + lodash.camelcase "^4.3.0" + protobufjs "^6.8.6" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -984,6 +1245,59 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + "@soda/friendly-errors-webpack-plugin@^1.7.1": version "1.8.0" resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240" @@ -1000,6 +1314,7 @@ integrity sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w== "@tailwindcss/postcss7-compat@^2.1.2", "tailwindcss@npm:@tailwindcss/postcss7-compat": + name tailwindcss version "2.1.2" resolved "https://registry.yarnpkg.com/@tailwindcss/postcss7-compat/-/postcss7-compat-2.1.2.tgz#4ae2a3a3c05622ee04307997b0f8bea5c8dbc2b6" integrity sha512-bH2kw6uyqLnDMP8wzDUsis5ovrsRzfHEyiL1McADvqlW54g6y0KVHX1xzO7PH8Fl5s0Sq8vDOAp4+3V8MEcZ9g== @@ -1101,6 +1416,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -1121,6 +1441,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.0.tgz#d6fed7d6bc6854306da3dea1af9f874b00783e26" integrity sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ== +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "15.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" + integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -2840,6 +3165,11 @@ core-js-compat@^3.6.5, core-js-compat@^3.9.0, core-js-compat@^3.9.1: browserslist "^4.16.6" semver "7.0.0" +core-js@3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + core-js@^2.4.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -3339,6 +3669,11 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-storage@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" + integrity sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -3938,7 +4273,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.3: +faye-websocket@0.11.3, faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== @@ -4062,6 +4397,27 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +firebase@^8.6.3: + version "8.6.3" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-8.6.3.tgz#e6e985e78f15543f399f13d476ac6738d35dc7bb" + integrity sha512-VjaHkR+BsTpXXrQec84FJQiGz/x7K7a+V9JHWDRUbd+XANgxBiCC+p5WDUUv0bgCw5Swg02xLGdFRkqx2LIjSg== + dependencies: + "@firebase/analytics" "0.6.10" + "@firebase/app" "0.6.22" + "@firebase/app-check" "0.1.1" + "@firebase/app-types" "0.6.2" + "@firebase/auth" "0.16.6" + "@firebase/database" "0.10.2" + "@firebase/firestore" "2.3.2" + "@firebase/functions" "0.6.9" + "@firebase/installations" "0.4.26" + "@firebase/messaging" "0.7.10" + "@firebase/performance" "0.4.12" + "@firebase/polyfill" "0.3.36" + "@firebase/remote-config" "0.1.37" + "@firebase/storage" "0.5.2" + "@firebase/util" "1.1.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -4683,6 +5039,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" +idb@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" + integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== + ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -5441,6 +5802,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -5558,6 +5924,11 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" @@ -5934,6 +6305,11 @@ node-emoji@^1.8.1: dependencies: lodash.toarray "^4.4.0" +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -6981,6 +7357,30 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-polyfill@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" + integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== + +protobufjs@^6.8.6: + version "6.11.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -8295,6 +8695,11 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8628,6 +9033,11 @@ vue-loader@^15.9.2: vue-hot-reload-api "^2.3.0" vue-style-loader "^4.1.0" +vue-offline@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/vue-offline/-/vue-offline-2.0.8.tgz#d3a01b3bc5e6bb46fb9fd914443064d837915300" + integrity sha512-r9sU3HTnnaWEv6Wgl8RC/mrSRceSE6jIEkLNsNKR1uzCkVizvbG7X2EEU3uMcEsHqOfDLjl1TakUtlXb/xgUWg== + vue-router@^3.2.0: version "3.5.1" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.1.tgz#edf3cf4907952d1e0583e079237220c5ff6eb6c9" @@ -8674,11 +9084,21 @@ vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== +vue2-transitions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/vue2-transitions/-/vue2-transitions-0.3.0.tgz#765fc0d743103fcfe2d10f431697d8873a075c17" + integrity sha512-m1ad8K8kufqiEhj5gXHkkqOioI5sW0FaMbRiO0Tv2WFfGbO2eIKrfkFiO3HPQtMJboimaLCN4p/zL81clLbG4w== + vue@^2.6, vue@^2.6.11: version "2.6.12" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== +vuelidate@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/vuelidate/-/vuelidate-0.7.6.tgz#84100c13b943470660d0416642845cd2a1edf4b2" + integrity sha512-suzIuet1jGcyZ4oUSW8J27R2tNrJ9cIfklAh63EbAkFjE380iv97BAiIeolRYoB9bF9usBXCu4BxftWN1Dkn3g== + vuex@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71" @@ -8859,6 +9279,11 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -9082,6 +9507,11 @@ ws@^6.0.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"