LoginForm.vue 2.7 KB
Newer Older
abergavenny's avatar
abergavenny committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<script setup>
import { computed, reactive, ref } from 'vue'
import useVuelidate from '@vuelidate/core'
import { required } from '@vuelidate/validators'
import { useRouter } from 'vue-router'

import MessageBox from '@/components/MessageBox.vue'
import InputGroup from '@/components/InputGroup.vue'
import { MESSAGES } from '@/data/messages'
import { getTokenPayload, ResponseStatus } from '@/helpers'
import { auth as api } from '@/services/api'
import { useSessionStore } from '@/stores/session'

const props = defineProps(['msg'])

const message = ref(null)
const waiting = ref(false)

const router = useRouter()
const session = useSessionStore()

// Initial values
const state = reactive({
  emailOrUsername: null,
  password: null
})

const rules = computed(() => {
  return {
    emailOrUsername: { required },
    password: { required }
  }
})

const v$ = useVuelidate(rules, state)

async function onSubmit() {
  try {
    message.value = null

    const isValid = await v$.value.$validate()

    if (!isValid) {
      message.value = MESSAGES['INVALID_INPUT']

      return
    }

    waiting.value = true

    const response = await api.login(state)

    if (response?.status === ResponseStatus.Success) {
      if (response.data?.token) {
        const payload = getTokenPayload(response.data?.token)

        session.setUser({ role: payload.role, userId: payload.userId }, true)

        waiting.value = false

        if (payload.role === 'administrator') {
          router.push({
            name: 'buildings'
          })
        } else if (payload.role === 'user') {
          router.push({
            name: 'apartments'
          })
        }

        return
      }
    }

    message.value = MESSAGES[response.code]
    waiting.value = false
  } catch (error) {
    console.error('ERROR:', error.name)
  }
}
</script>

<template>
  <div class="form form-bg shadow">
    <form @submit.prevent="onSubmit">
      <div class="form-content">
        <InputGroup>
          <label for="login-username">E-Mail oder Benutzername</label>
          <input id="login-username" type="text" v-model="state.emailOrUsername" />
        </InputGroup>
        <InputGroup>
          <label for="login-password">Passwort</label>
          <input id="login-password" type="password" v-model="state.password" />
        </InputGroup>
      </div>
      <div class="form-section">
        <MessageBox v-if="message || props.msg" :msg="message || props.msg" :type="props.msg ? 'warning' : 'danger'" />
        <button class="button primary" type="submit" :disabled="waiting">Anmelden</button>
      </div>
    </form>
    <div class="section center">
      <router-link class="link" to="/reset-password">Password vergessen?</router-link>
    </div>
  </div>
</template>