diff --git a/src/components/LoginForm.vue b/src/components/LoginForm.vue index 78824a80b8682129dcda2375d419766b7ff9a22f..cdf84d8c431ca77ceee48b16b433c8813f559274 100644 --- a/src/components/LoginForm.vue +++ b/src/components/LoginForm.vue @@ -1,81 +1,108 @@ <template> - <div class="m-6" :class="{ error: v$.user.email.$errors.length }"> - <div class="mb-6"> - <label - for="email" - class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" - >E-post</label - > - <input - type="email" - id="email" - class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" - placeholder="eksempel@eksempel.com" - v-model="v$.user.email.$model" - required - /> + <div class="App"> + <div id="logoField" class="flex justify-center m-6"> + <img src="../assets/logo3.svg" alt="BoCo logo" /> + </div> - <!-- error message --> - <div v-for="(error, index) of v$.user.email.$errors" :key="index"> - <div class="text-red-600 text-sm" v-show="showError" id="emailErrorId"> - {{ error.$message }} + <div + id="emailField" + class="m-6" + :class="{ error: v$.user.email.$errors.length }" + > + <div class="mb-6"> + <label + for="email" + class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" + >E-post</label + > + <input + type="email" + id="email" + class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + placeholder="eksempel@eksempel.no" + v-model="v$.user.email.$model" + required + /> + <!-- error message --> + <div v-for="(error, index) of v$.user.email.$errors" :key="index"> + <div + class="text-red-600 text-sm" + v-show="showError" + id="emailErrorId" + > + {{ error.$message }} + </div> </div> </div> </div> - <div class="mb-6" :class="{ error: v$.user.password.$errors.length }"> + + <div + id="passwordField" + class="m-6" + :class="{ error: v$.user.password.$errors.length }" + > <label - for="password" - class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" - >Passord</label + for="password" + class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300" + >Passord</label > <input - type="password" - id="password" - class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" - v-model="v$.user.password.$model" - required + type="password" + id="password" + class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + v-model="v$.user.password.$model" + required + @keyup.enter="loginClicked" /> - <!-- error message --> <div - class="text-red" - v-for="(error, index) of v$.user.password.$errors" - :key="index" + class="text-red" + v-for="(error, index) of v$.user.password.$errors" + :key="index" > <div - class="text-red-600 text-sm" - v-show="showError" - id="passwordErrorId" + class="text-red-600 text-sm" + v-show="showError" + id="passwordErrorId" > {{ error.$message }} </div> </div> + </div> + <div id="buttonsField" class="m-6"> <div class="align-items: flex-end; mb-6"> <div class="ml-3 text-sm"> - <a href="/" class="text-blue-600">Glemt passord</a> + <router-link to="about" class="text-blue-600" + >Glemt passord</router-link + > </div> </div> + <button + @click="loginClicked" + class="flex justify-center align-items: flex-end; text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" + > + Logg inn + </button> + <div class="align-items: flex-end; mb-6 mt-6"> + <div class="ml-3 text-sm"> + <router-link to="register" class="text-blue-600" + >Ny bruker</router-link + > + </div> + </div> + <div class="flex justify-center"> + <label>{{ message }}</label> + </div> </div> - - <button - @click="loginClicked" - class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" - > - Logg inn - </button> - </div> - - <div> - <label>{{ response }}</label> </div> </template> <script> import useVuelidate from "@vuelidate/core"; -import { required, email, minLength, helpers } from "@vuelidate/validators"; +import { required, email, helpers } from "@vuelidate/validators"; import { doLogin } from "@/utils/apiutil"; -import { mapState } from "vuex"; +//import { parseUserFromToken } from "@/utils/token-utils"; export default { name: "LoginForm.vue", @@ -93,19 +120,11 @@ export default { }, password: { required, - min: helpers.withMessage( - ({ $params }) => `Passordet må inneholde minst ${$params.min} tegn`, - minLength(8) - ), }, }, }; }, - computed: mapState({ - token: (state) => state.user.token, - }), - data() { return { message: "", @@ -114,59 +133,39 @@ export default { password: "", }, - response: '', - - showPassword: false, - valid: true, showError: false, - emailRules: [ - (v) => !!v || "E-mail is required", - (v) => /.+@.+\..+/.test(v) || "E-mail must be valid", - ], - rules: { - required: (value) => !!value || "Required.", - min: (v) => v.length >= 0 || "Min 8 characters", - }, }; }, methods: { async loginClicked() { - console.log(this.user.email + " " + this.user.password); this.showError = true; this.v$.user.email.$touch(); + if (this.v$.user.email.$invalid) { - console.log("Invalid, avslutter..."); + console.log("Ugyldig, avslutter..."); return; } - console.log("videre!"); - const loginRequest = { email: this.user.email, password: this.user.password, }; - console.log("før"); - - console.log("env: " + process.env.VUE_APP_BASEURL); - const loginResponse = await doLogin(loginRequest); - - console.log("respons" + loginResponse); - - this.response = loginResponse.data; - - if (loginResponse === "Failed login") { - this.message = "kunne ikke logge inn"; + if (loginResponse.isLoggedIn === false) { + this.message = "Feil e-post/passord"; this.$store.commit("logout"); - return; } - - this.$store.commit("saveToken", loginResponse); - console.log(loginResponse); + else if (loginResponse.isLoggedIn === true) { + this.$store.commit("saveToken", loginResponse.token); + await this.$router.push("/"); + } + else { + console.log("Something went wrong"); + } }, validate() { @@ -175,3 +174,4 @@ export default { }, }; </script> + diff --git a/src/utils/apiutil.js b/src/utils/apiutil.js index 392cdac50790000e21b7f405fd5be4b8a80a939e..76fb9a8f5940aa102f2a02648ab5644667c69495 100644 --- a/src/utils/apiutil.js +++ b/src/utils/apiutil.js @@ -1,13 +1,73 @@ import axios from "axios"; +import { tokenHeader } from "./token-utils"; + +const API_URL = process.env.VUE_APP_BASEURL; export function doLogin(loginRequest) { + const auth = {isLoggedIn: false, token: ""}; + return axios + .post(API_URL + "login/authentication", loginRequest) + .then((response) => { + auth.isLoggedIn = true; + auth.token = response.data; + return auth; + }) + .catch((error) => { + console.log(error.response); + return auth; + }); +} + +export function registerUser(registerInfo) { + return axios + .post(API_URL + "register", { + email: registerInfo.email, + firstName: registerInfo.firstName, + lastname: registerInfo.lastname, + password: registerInfo.password, + address: registerInfo.address, + }) + .then((response) => { + return response; + }) + .catch((err) => console.log(err)); +} + +export async function getUser(userid) { + return axios + .get(API_URL + "users/" + userid + "/profile", { + headers: tokenHeader(), + }) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error(error); + }); +} + +export function getRenterRating(userid) { + return axios + .get(API_URL + "users/" + userid + "", { + headers: tokenHeader(), + }) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error(error); + }); +} + +export function getOwnerRating(userid) { return axios - .post(process.env.VUE_APP_BASEURL + 'login/authentication', loginRequest) - .then((response) => { - return response.data; - }) + .get(API_URL + "users/" + userid + "", { + headers: tokenHeader(), + }) + .then((response) => { + return response.data; + }) .catch((error) => { - console.log(error.response); - return error.response; + console.error(error); }); }