LoginForm.vue 2.82 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
<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
    }

    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)

        if (payload.role === 'administrator') {
58
          waiting.value = true
abergavenny's avatar
abergavenny committed
59
60
61
62
          router.push({
            name: 'buildings'
          })
        } else if (payload.role === 'user') {
63
          waiting.value = true
abergavenny's avatar
abergavenny committed
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
          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'" />
96
97
98
99
        <button class="button primary" type="submit" :disabled="waiting">
          <span v-if="!waiting">Anmelden</span>
          <font-awesome-icon v-else icon="fa-solid fa-spinner" />
        </button>
abergavenny's avatar
abergavenny committed
100
101
102
103
104
105
106
      </div>
    </form>
    <div class="section center">
      <router-link class="link" to="/reset-password">Password vergessen?</router-link>
    </div>
  </div>
</template>