Skip to content
Snippets Groups Projects
FormLogin.vue 5.46 KiB
Newer Older
Ina Martini's avatar
Ina Martini committed
<script lang="ts" setup>
import { computed, ref, watch } from 'vue'
import { useUserStore } from '@/stores/userStore'
import ModalComponent from '@/components/ModalComponent.vue'
import axios from 'axios'

const username = ref<string>('')
const password = ref<string>('')
const showPassword = ref<boolean>(false)
const errorMessage = ref<string>('')
const isModalOpen = ref<boolean>(false)
const resetEmail = ref<string>('')
const emailRegex = /^[a-zA-Z0-9_+&*-]+(?:\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,7}$/

const userStore = useUserStore()

const isEmailValid = computed(() => emailRegex.test(resetEmail.value))
const isSendingEmail = ref(false)
const successMessage = ref<string | null>(null)
const modalErrorMessage = ref<string | null>(null)

const submitForm = () => {
    userStore.login(username.value, password.value)
}

const toggleShowPassword = () => {
    showPassword.value = !showPassword.value
}

const submitReset = async () => {
    isSendingEmail.value = true

    await axios
        .post('http://localhost:8080/forgotPassword/changePasswordRequest', {
            email: resetEmail.value
        })
        .then(() => {
            successMessage.value =
                'E-posten er sendt. Vennligst sjekk innboksen din for instrukser. OBS: E-posten kan havne i spam-mappen'
        })
        .catch((error) => {
            console.error(error)
            modalErrorMessage.value = 'Noe gikk galt. Vennligst prøv igjen.'
        })

    isSendingEmail.value = false
}

const closeModal = () => {
    isModalOpen.value = false
    isSendingEmail.value = false
    modalErrorMessage.value = null
    resetEmail.value = ''
    successMessage.value = null
}

watch(
    () => userStore.errorMessage,
    (newValue: string) => {
        errorMessage.value = newValue
    }
)
</script>

<template>
    <div class="flex flex-col justify-center gap-5 w-full">
        <div class="flex flex-col">
            <p class="mx-4">Brukernavn</p>
            <input
                v-model="username"
                name="username"
                placeholder="Skriv inn brukernavn"
                type="text"
            />
        </div>
        <div class="flex flex-col">
            <p class="mx-4">Passord</p>
            <div class="relative">
                <input
                    name="password"
                    v-model="password"
                    :type="showPassword ? 'text' : 'password'"
                    class="w-full"
                    placeholder="Skriv inn passord"
                />
                <button
                    class="absolute right-0 top-1 bg-transparent hover:bg-transparent mr-4 mt-1"
                    @click="toggleShowPassword"
                >
                    {{ showPassword ? '🔓' : '🔒' }}
                </button>
            </div>
            <a
                class="hover:underline hover:bg-transparent hover:transition-none hover:p-0 cursor-pointer text-right text-sm mr-4"
                @click="isModalOpen = true"
                >Glemt passord?</a
            >
Ina Martini's avatar
Ina Martini committed
        </div>
        <div class="flex flex-row gap-5">
            <button
                name="submit"
                :disabled="'' == username.valueOf() || '' == password.valueOf()"
                class="primary grow-0"
                @click="submitForm"
            >
                Logg inn
            </button>
            <p>{{ errorMessage }}</p>
        </div>
    </div>
    <modal-component
        v-if="isModalOpen"
        :title="'Glemt passord'"
        :message="'Vennligst skriv inn e-posten din for å endre passordet.'"
    >
        <div v-if="isSendingEmail" class="flex justify-center items-center">
            <div
                class="p-3 animate-spin bg-gradient-to-r from-lime-500 from-30% to-green-600 to-90% md:w-18 md:h-20 h-20 w-20 aspect-square rounded-full"
            >
                <div class="rounded-full h-full w-full bg-slate-100"></div>
            </div>
        </div>
        <div v-else-if="successMessage">
            <p class="text-green-500 text-center">{{ successMessage }}</p>
            <button
                class="active-button font-bold py-2 px-4 w-1/2 mt-4 border-2 disabled:border-transparent"
                @click="closeModal"
            >
                Lukk
            </button>
        </div>
        <div v-else-if="modalErrorMessage">
            <p class="text-red-500 text-center">{{ modalErrorMessage }}</p>
            <button
                class="active-button font-bold py-2 px-4 w-1/2 mt-4 border-2 disabled:border-transparent"
                @click="closeModal"
            >
                Lukk
            </button>
        </div>
        <div v-else>
            <input
                v-model="resetEmail"
                class="border border-gray-300 p-2 w-full mb-7"
                placeholder="Skriv e-postadressen din her"
                type="email"
            />
            <div class="flex gap-5 mt-4">
                <button
                    :disabled="!isEmailValid"
                    class="active-button font-bold py-2 px-4 w-1/2 border-2 disabled:border-transparent"
                    @click="submitReset"
                >
                    Send mail
                </button>
                <button
                    class="active-button font-bold py-2 px-4 w-1/2 border-2 disabled:border-transparent"
                    @click="closeModal"
                >
                    Lukk
                </button>
            </div>
        </div>
    </modal-component>
</template>