From dd55d9f01a01fc171970b42aa61e17ece74de185 Mon Sep 17 00:00:00 2001
From: Gilgard <Hjelljord.alida@gmail.com>
Date: Tue, 3 May 2022 16:38:42 +0200
Subject: [PATCH] rent history view

---
 .../RentHistoryComponents/RentHistory.vue     | 79 ----------------
 .../RentHistoryComponents/RentHistoryItem.vue | 93 +++++++++++--------
 src/router/index.js                           |  6 ++
 src/services/user.service.js                  | 54 +++++++++++
 src/views/TestView.vue                        | 15 +--
 .../UserProfileViews/RentHistoryView.vue      | 51 ++++++++++
 6 files changed, 168 insertions(+), 130 deletions(-)
 delete mode 100644 src/components/UserProfileComponents/RentHistoryComponents/RentHistory.vue
 create mode 100644 src/services/user.service.js
 create mode 100644 src/views/UserProfileViews/RentHistoryView.vue

diff --git a/src/components/UserProfileComponents/RentHistoryComponents/RentHistory.vue b/src/components/UserProfileComponents/RentHistoryComponents/RentHistory.vue
deleted file mode 100644
index af96c67..0000000
--- a/src/components/UserProfileComponents/RentHistoryComponents/RentHistory.vue
+++ /dev/null
@@ -1,79 +0,0 @@
-<template>
-  <section class="relative w-full max-w-md px-5 py-4 mx-auto rounded-md">
-    <div class="relative" id="searchComponent">
-      <span class="absolute inset-y-0 left-0 flex items-center pl-3">
-        <svg class="w-5 h-5 text-gray-400" viewBox="0 0 24 24" fill="none">
-          <path
-            d="M21 21L15 15M17 10C17 13.866 13.866 17 10 17C6.13401 17 3 13.866 3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10Z"
-            stroke="currentColor"
-            stroke-width="2"
-            stroke-linecap="round"
-            stroke-linejoin="round"
-          ></path>
-        </svg>
-      </span>
-
-      <input
-        type="text"
-        id="searchInput"
-        class="w-full py-3 pl-10 pr-4 text-gray-700 bg-white border rounded-md dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring"
-        placeholder="Search"
-        v-model="search"
-      />
-    </div>
-
-    <div class="absolute inset-x-0 px-6 py-3 mt-4 border-2 border-slate-500">
-      <div class="grid grid-cols-2">
-        <rent-history-item v-for="historyItem in fullHistory" :key="historyItem.rentId" />
-      </div>
-    </div>
-  </section>
-</template>
-
-<script>
-import RentHistoryItem from "@/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue"
-
-export default {
-  components: {
-    RentHistoryItem,
-  },
-  props: {
-    renterHistory: [{
-      rentId: Number,
-      fromTime: Number,
-      toTime: Number,
-      isAccepted: Boolean,
-      listingId: Number,
-      renterId: Number,
-      message: String,
-    }],
-    ownerHistory: [{
-      rentId: Number,
-      fromTime: Number,
-      toTime: Number,
-      isAccepted: Boolean,
-      listingId: Number,
-      renterId: Number,
-      message: String,
-    }],
-  },
-  computed: {
-    fullHistory() {
-      function compareHistoryItems(itemA, itemB) {
-        if(itemA.fromTime < itemB.fromTime) {
-          return -1;
-        }
-        if(itemA.fromTime > itemB.fromTime) {
-          return 1;
-        }
-        return 0;
-      };
-
-      let fullHistory = renterHistory.concat(ownerHistory);
-      fullHistory.filter((item) => item.isAccepted);
-      fullHistory.sort(compareHistoryItems);
-      return fullHistory;
-    }
-  },
-}
-</script>
diff --git a/src/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue b/src/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue
index e1cc25a..dad006b 100644
--- a/src/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue
+++ b/src/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue
@@ -1,25 +1,17 @@
 <template>
-  <div class="mt-5">
-    <div class="w-4/5 rounded bg-gray-200">
-      <img
-        class="w-full"
-        :src="listing.img || require('../assets/default-product.png')"
-        alt="Item image"
-      />
-      <div class="p-1 m-1">
-        <p class="font-bold text-sm" id="title">{{ listing.title }}</p>
-        <p class="text-gray-700 text-xs" id="price">{{ price }} kr</p>
-        <div>Leid til:</div>
-        <router-link :to="{ path: '/' + historyItem.rentedBy.id }">
-          {{ renter }}
-        </router-link>
-        <div>Leid fra:</div>
-        <router-link
-          :to="{ path: '/' + historyItem.rentedFrom.id }"
-          class="text-left pa-2"
-        >
-          {{ owner }}
+  <div
+    class="bg-white shadow dark:bg-gray-800 select-none cursor-pointer hover:bg-gray-50"
+  >
+    <p class="font-bold mx-4" id="title">
+      {{ historyItem.listing.title }}
+    </p>
+    <div class="flex flex-row items-center">
+      <div class="flex flex-col px-4 flex-1">
+        <router-link :to="{ path: '/profile/' + user.accountId }">
+          Leid til: {{ user.firstName }} {{ user.lastName }}
         </router-link>
+      </div>
+      <div class="flex flex-col flex-1">
         <div>
           Fra:
           {{ this.getDateString(historyItem.fromTime, isMultipleDays) }}
@@ -28,23 +20,40 @@
           Til: {{ this.getDateString(historyItem.toTime, isMultipleDays) }}
         </div>
       </div>
+      <colored-button :text="'Vurder'" class="px-4 flex-1" />
     </div>
   </div>
 </template>
 
 <script>
-import { parseCurrentUser } from '@/utils/token-utils';
+import ColoredButton from "@/components/BaseComponents/ColoredButton.vue";
+import { getUser } from "@/utils/apiutil";
+import { parseCurrentUser } from "@/utils/token-utils";
 
 export default {
   name: "RentHistoryItem",
+  components: {
+    ColoredButton,
+  },
+  data() {
+    return {
+      user: {},
+    };
+  },
   props: {
     historyItem: {
       rentId: Number,
-      fromTime: Date,
-      toTime: Date,
-      listingId: Number,
+      fromTime: Number,
+      toTime: Number,
+      isAccepted: Boolean,
+      listing: {
+        listingID: Number,
+        title: String,
+        pricePerDay: Number,
+        address: String,
+        userID: Number,
+      },
       renterId: Number,
-      accepted: Boolean,
     },
   },
   computed: {
@@ -52,7 +61,7 @@ export default {
       return parseCurrentUser();
     },
     isMultipleDays() {
-      if (this.agreement.toTime - this.agreement.fromTime < 86400000) {
+      if (this.historyItem.toTime - this.historyItem.fromTime < 86400000) {
         return false;
       }
       return true;
@@ -60,31 +69,39 @@ export default {
     price() {
       if (this.isMultipleDays) {
         let numDays = Math.round(
-          (this.agreement.toTime - this.agreement.fromTime) / 86400000
+          (this.historyItem.toTime - this.historyItem.fromTime) / 86400000
         );
-        return this.listing.pricePerDay * numDays;
+        return this.historyItem.listing.pricePerDay * numDays;
       }
-      return this.listing.pricePerDay;
-    },
-    isRenter(historyItem) {
-      return historyItem.renterId == currentUserId;
+      return this.historyItem.listing.pricePerDay;
     },
   },
   methods: {
-    getDateString(date, isMultipleDays) {
+    getDateString(milliseconds) {
       let today = new Date();
+      let date = new Date(milliseconds);
       let dateString = date.getDate() + "." + date.getMonth();
 
       if (date.getFullYear() != today.getFullYear()) {
         dateString += "." + date.getFullYear();
       }
-
-      if (isMultipleDays) {
-        return dateString;
+      return dateString;
+    },
+    async getUser(historyItem) {
+      if (this.isCurrentUser(historyItem.renterId)) {
+        this.user = await getUser(historyItem.listing.userID);
+      }
+      if (this.isCurrentUser(historyItem.listing.userID)) {
+        this.user = await getUser(historyItem.renterId);
       }
-
-      dateString += " " + date.getHours() + ":" + date.getMinutes();
     },
+    isCurrentUser(id) {
+      return id == this.currentUser.accountId;
+    },
+  },
+  beforeMount() {
+    this.getUser(this.historyItem);
+    console.log(this.user);
   },
 };
 </script>
diff --git a/src/router/index.js b/src/router/index.js
index f9bc42d..0152474 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -26,6 +26,12 @@ const routes = [
     component: () => import("../views/UserProfileViews/ProfileView.vue"),
     beforeEnter: guardRoute,
   },
+  {
+    path: "/profile/rent/history",
+    name: "history",
+    component: () => import("../views/UserProfileViews/RentHistoryView.vue"),
+    beforeEnter: guardRoute,
+  },
   {
     path: "/register",
     name: "register",
diff --git a/src/services/user.service.js b/src/services/user.service.js
new file mode 100644
index 0000000..5161ffa
--- /dev/null
+++ b/src/services/user.service.js
@@ -0,0 +1,54 @@
+import { tokenHeader } from "@/utils/token-utils";
+import axios from "axios";
+
+const API_URL = process.env.VUE_APP_BASEURL;
+
+class UserService {
+  async getUserFromId(userId) {
+    return await axios
+      .get(API_URL + "/users/" + userId + "/profile")
+      .then((res) => {
+        return res.data;
+      })
+      .catch((err) => console.error(err));
+  }
+
+  async getUserRatingAverage(userId) {
+    return await axios
+      .get(API_URL + "rating/" + userId + "/average")
+      .then((res) => {
+        return res.data;
+      })
+      .catch((err) => console.error(err));
+  }
+
+  //TODO
+  async getUserRatingAsOwner() {}
+
+  //TODO
+  async getUserRatingAsRenter() {}
+
+  async getRenterHistory() {
+      return await axios
+      .get(API_URL + "user/profile/rent/history/all", {
+        headers: tokenHeader(),
+      })
+      .then((res) => {
+        return res.data;
+      })
+      .catch((err) => console.error(err));
+  }
+
+  async getOwnerHistory() {
+    return await axios
+    .get(API_URL + "user/profile/rent/history/owner/all", {
+        headers: tokenHeader(),
+      })
+    .then((res) => {
+      return res.data;
+    })
+    .catch((err) => console.error(err));
+}
+}
+
+export default new UserService();
diff --git a/src/views/TestView.vue b/src/views/TestView.vue
index db95c63..644e450 100644
--- a/src/views/TestView.vue
+++ b/src/views/TestView.vue
@@ -1,25 +1,14 @@
 <template>
-  <div />
-  <rent-history :ownerHistory="ownerHistory" :renterHistory="renterHistory"/>
+<div></div>
 </template>
 
 <script>
-import RentHistory from "@/components/UserProfileComponents/RentHistoryComponents/RentHistory.vue"
-
 export default {
   data() {
     return {
-      show: false,
-      ownerHistory: [{
-
-      }],
-      renterHistory: [{
-
-      }],
-    };
+    }
   },
   components: {
-    RentHistory
   },
   methods: {
     toggleModal() {
diff --git a/src/views/UserProfileViews/RentHistoryView.vue b/src/views/UserProfileViews/RentHistoryView.vue
new file mode 100644
index 0000000..5a826fc
--- /dev/null
+++ b/src/views/UserProfileViews/RentHistoryView.vue
@@ -0,0 +1,51 @@
+<template>
+  <ul>
+    <li v-for="historyItem in fullHistory" :key="historyItem.rentId">
+      <rent-history-item :historyItem="historyItem" />
+    </li>
+  </ul>
+</template>
+
+<script>
+import RentHistoryItem from "@/components/UserProfileComponents/RentHistoryComponents/RentHistoryItem.vue";
+import UserService from "@/services/user.service"
+
+export default {
+  components: {
+    RentHistoryItem,
+  },
+  data() {
+    return {
+      renterHistory: [],
+      ownerHistory: [],
+    }
+  },
+  computed: {
+    fullHistory() {
+      function compareHistoryItems(itemA, itemB) {
+        if (itemA.fromTime < itemB.fromTime) {
+          return -1;
+        }
+        if (itemA.fromTime > itemB.fromTime) {
+          return 1;
+        }
+        return 0;
+      }
+
+      let fullHistory = this.renterHistory.concat(this.ownerHistory);
+      fullHistory.filter((item) => item.isAccepted);
+      fullHistory.sort(compareHistoryItems);
+      return fullHistory;
+    },
+  },
+  methods: {
+    getHistories() {
+      this.renterHistory = UserService.getRenterHistory();
+      this.ownerHistory = UserService.getOwnerHistory();
+    }
+  },
+  beforeMount() {
+    this.getHistories()
+  },
+};
+</script>
-- 
GitLab