123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- <template>
- <section class="hero is-success is-fullheight">
- <div class="hero-body">
- <div class="container has-text-centered">
- <div class="column is-4 is-offset-4">
- <h3 class="title has-text-grey">Login</h3>
- <p class="subtitle has-text-grey">Please login to proceed.</p>
- <div class="box">
- <figure class="avatar">
- <img src="https://via.placeholder.com/300">
- </figure>
- <form>
- <div class="field">
- <div class="control">
- <input class="input is-large"
- @blur="$v.form.email.$touch()"
- v-model="form.email"
- type="email"
- placeholder="Your Email"
- autofocus=""
- autocomplete="email">
- <div v-if="$v.form.email.$error" class="form-error">
- <span v-if="!$v.form.email.required" class="help is-danger">Email is required</span>
- <span v-if="!$v.form.email.emailValidator" class="help is-danger">Email address is not valid</span>
- </div>
- </div>
- </div>
- <div class="field">
- <div class="control">
- <input
- @blur="$v.form.password.$touch()"
- v-model="form.password"
- class="input is-large"
- type="password"
- placeholder="Your Password"
- autocomplete="current-password">
- <div v-if="$v.form.password.$error" class="form-error">
- <span v-if="!$v.form.password.required" class="help is-danger">Password is required</span>
- </div>
- </div>
- </div>
- <!-- Login Button -->
- <button
- @click.prevent="login"
- :disabled="$v.form.$invalid"
- class="button is-block is-info is-large is-fullwidth">
- Login
- </button>
- </form>
- </div>
- <p class="has-text-grey">
- <a>Sign In With Google</a> ·
- <nuxt-link to="/register">Sign Up</nuxt-link> ·
- <a href="../">Need Help?</a>
- </p>
- </div>
- </div>
- </div>
- </section>
- </template>
- <script>
- import { required, email } from 'vuelidate/lib/validators'
- export default {
- middleware: 'guest',
- data() {
- return {
- form : {
- email : null,
- password : null
- }
- }
- },
- validations: {
- form: {
- email: {
- emailValidator : email,
- required
- },
- password: {
- required
- }
- }
- },
- computed : {
- isFormValid() {
- return !this.$v.$invalid
- }
- },
- methods: {
- async login() {
- // console.log(this.form)
- this.$v.form.$touch()
- if(this.isFormValid){
- const result = await this.$store.dispatch('auth/login', this.form)
- console.log('login.vue login done this.$store.dispatch');
- console.log(result);
-
- if(result.isAxiosError === true){
- this.$toasted.error('Wrong email or password', {duration: 3000})
- }else{
- this.$router.push('/')
- }
- }
- }
- }
- }
- </script>
- <style scoped>
- .hero.is-success {
- background: #F2F6FA;
- }
- .hero .nav, .hero.is-success .nav {
- -webkit-box-shadow: none;
- box-shadow: none;
- }
- .box {
- margin-top: 5rem;
- }
- .avatar {
- margin-top: -70px;
- padding-bottom: 20px;
- }
- .avatar img {
- height: 128px;
- width: 128px;
- padding: 5px;
- background: #fff;
- border-radius: 50%;
- -webkit-box-shadow: 0 2px 3px rgba(10,10,10,.1), 0 0 0 1px rgba(10,10,10,.1);
- box-shadow: 0 2px 3px rgba(10,10,10,.1), 0 0 0 1px rgba(10,10,10,.1);
- }
- p.subtitle {
- padding-top: 1rem;
- }
- </style>
|