diff --git a/src/components/UserProfile/UserProfileForeignLayout.vue b/src/components/UserProfile/UserProfileForeignLayout.vue new file mode 100644 index 0000000000000000000000000000000000000000..153d88d415c878add5467a382611b436cd5a4c57 --- /dev/null +++ b/src/components/UserProfile/UserProfileForeignLayout.vue @@ -0,0 +1,300 @@ +<script setup lang="ts"> +// A more limited view of a users profile +import Menu from "@/components/BaseComponents/Menu.vue"; +import Footer from "@/components/BaseComponents/Footer.vue"; +import {useRoute, useRouter} from "vue-router"; +import {useUserInfoStore} from "../../stores/UserStore"; + +import {onMounted, ref} from "vue"; +import {UserService} from "@/api"; + +let numberOfHistory = 6; + + + +let cardTitles = ["Spain tour", "Food waste", "Coffee", "Concert", "New book", "Pretty clothes"] + +let points = 0; +let streak = 0; + +let username = ref() + +let friend = ref(false) + + +let id = ref() + +//Get the id from the url. viktor har eksempel + +let user = useRoute() +id.value = user.params +console.log(id.value.id) + + +let route = useRouter() + +function toRoadmap(){ + route.push('/roadmap') +} +//todo Make a store of a friend-instance +onMounted(async () => { + try { + let response = await UserService.getProfile({ + userId: id.value.id + }) + username.value = response.firstName + console.log(username) + } catch (error) { + console.error("Something went wrong getting the profile: ", error) + } +}) + +function addFriend(){ + friend.value = true + console.log("Added friend") + + //todo Send POST to backend when endpoints is made and add friend +} + +function removeFriend(){ + friend.value = false + console.log("Removed friend") + + //todo Send POST to backend when endpoints is made and remove friend + +} + + +function toUpdateUserSettings(){ + route.push('/update-user') +} +</script> + + +<template> + <div class="container py-5 h-100"> + <div class="row d-flex justify-content-center align-items-center h-100"> + <div class="col 12"> + <div class="card"> + <div class="rounded-top text-white d-flex flex-row bg-primary" style="height:200px;"> + <div class="ms-4 mt-5 d-flex flex-column" style="width: 150px;"> + <img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt="Generic placeholder image" + class="img-fluid img-thumbnail mt-4 mb-2" style="width: 150px; z-index: 1"> + <button v-if="!friend" type="button" data-mdb-button-init data-mdb-ripple-init class="btn btn-outline-primary" + data-mdb-ripple-color="dark" style="z-index: 1;" @click="addFriend"> + Add Friend + </button> + <button v-if="friend" type="button" data-mdb-button-init data-mdb-ripple-init class="btn btn-outline-danger" + data-mdb-ripple-color="dark" style="z-index: 1;" @click="removeFriend"> + Remove Friend + </button> + </div> + <div class="ms-3" style="margin-top: 130px;"> + <h1>{{username}}</h1> + </div> + </div> + <div class="p-4 text-black" style="background-color: #f8f9fa;"> + <div class="d-flex justify-content-end text-center py-1"> + <div> + <p class="mb-1 h2">253 <img src="@/assets/items/pigcoin.png" style="width: 4rem"></p> + <p class="small text-muted mb-0">Points</p> + </div> + <div class="px-3"> + <p class="mb-1 h2">1026 <img src="@/assets/icons/fire.png" style="width: 4rem"></p> + <p class="small text-muted mb-0">Streak</p> + </div> + </div> + </div> + <div class="card-body p-1 text-black"> + <div class="row"> + <div class="col"> + <div class="container-fluid"> + <h1 class="mt-5 text-start badges-text">Badges</h1> + <div class="scrolling-wrapper-badges row flex-row flex-nowrap mt-4 pb-4 pt-2"> + + <div class="col-5"> + <div class="card badges-block card-1"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-2"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-3"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-4"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-5"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-6"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-7"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-8"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-9"></div> + </div> + <div class="col-5"> + <div class="card badges-block card-10"></div> + </div> + </div> + </div> + </div> + </div> + <div class="row"> + <div class="col"> + <!-- Here is the history of saving target --> + <div class="container-fluid mb-5"> + <h1 class="mt-5 text-start history-text">History</h1> + <div class="row scrolling-wrapper-history"> + <div v-for="index in numberOfHistory" :key="index" + class="col-md-4 col-sm-4 col-lg-4 col-xs-4 col-xl-4 control-label"> + <div class="card history-block"> + <div class="card mb-3" style="max-width: 540px;"> + <div class="row g-0"> + <div class="col-md-4"> + <img src="/src/assets/icons/piggybank.svg" + class="img-fluid rounded-start h-40 mx-auto d-none d-md-block" alt="..."> + </div> + <div class="col-md-8"> + <div class="card-body"> + <h5 class="card-title">{{ cardTitles[index - 1] }}</h5> + <p class="card-text">Money saved: 200 <br />You are one challenge: 21</p> + <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p> + <a href="#" class="btn stretched-link" @click="toRoadmap"></a> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<style scoped> +.scrolling-wrapper-badges { + overflow-x: auto; +} + +.scrolling-wrapper-history { + max-height: 300px; + overflow: auto; +} + + + +.badges-text { + font-weight: 500; + font-size: 2.0em; +} + +.history-text { + font-weight: 500; + font-size: 2.0em; +} + +.badges-block { + height: 200px; + background-color: #fff; + border: none; + background-position: center; + background-size: cover; + transition: all 0.2s ease-in-out !important; + border-radius: 24px; + + &:hover { + transform: translateY(-5px); + box-shadow: none; + opacity: 0.9; + } +} + +.history-block { + height: 200px; + + background-color: #fff; + border: none; + background-position: center; + background-size: cover; + transition: all 0.2s ease-in-out !important; + border-radius: 24px; + margin: 20px; + + &:hover { + transform: translateY(-5px); + box-shadow: none; + opacity: 0.9; + } +} + +.card-1 { + background-color: #4158D0; + background-image: linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%); +} + +.card-2 { + background-color: #0093E9; + background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%); +} + +.card-3 { + background-color: #00DBDE; + background-image: linear-gradient(90deg, #00DBDE 0%, #FC00FF 100%); +} + +.card-4 { + background-color: #FBAB7E; + background-image: linear-gradient(62deg, #FBAB7E 0%, #F7CE68 100%); +} + +.card-5 { + background-color: #85FFBD; + background-image: linear-gradient(45deg, #85FFBD 0%, #FFFB7D 100%); +} + +.card-6 { + background-color: #FA8BFF; + background-image: linear-gradient(45deg, #FA8BFF 0%, #2BD2FF 52%, #2BFF88 90%); +} + +.card-7 { + background-color: #FA8BFF; + background-image: linear-gradient(45deg, #FA8BFF 0%, #2BD2FF 52%, #2BFF88 90%); +} + +.card-8 { + background-color: #FBDA61; + background-image: linear-gradient(45deg, #FBDA61 0%, #FF5ACD 100%); +} + +.card-9 { + background-color: #4158D0; + background-image: linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%); +} + +.card-10 { + background-color: #FF3CAC; + background-image: linear-gradient(225deg, #FF3CAC 0%, #784BA0 50%, #2B86C5 100%); + +} + + +/*-------*/ +.rounded-top { + background-color: #00DBDE; +} +</style> \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts index 06441260ef379f90343c17a1bfa2b57e21dad243..53e86ecf503df751299d71817ca93f147087495b 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -101,6 +101,11 @@ const routes = [ name: 'budget', component: () => import('@/views/BudgetView.vue'), }, + { + path: '/profile/:id', + name: 'friend-profile', + component: () => import('@/views/User/UserProfileForeignView.vue'), + }, { path: 'friends', name: 'friends', diff --git a/src/views/User/UserFriendsView.vue b/src/views/User/UserFriendsView.vue index bba374fd8064ec90d1971de1de640b38566042f1..e281c65b25970f4e7e29ddf897a8696f8db9a64d 100644 --- a/src/views/User/UserFriendsView.vue +++ b/src/views/User/UserFriendsView.vue @@ -1,4 +1,5 @@ <template> + <!-- Refactor with a for-loop --> <div class="container"> <h1>Your Friends</h1> <button class="btn btn-primary pull-right my-3" @click="addFriend">+ Add Friend</button> @@ -11,6 +12,7 @@ </div> </div> <h3>Amillie Price</h3> + <a href="#" @click="navigateToFriend(46)" class="btn stretched-link"></a> <div class="desc"> Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. </div> @@ -358,8 +360,8 @@ function addFriend() { } // Define the navigateToQuiz method -const navigateToFriend = (frinedID) => { - +const navigateToFriend = (friendID :string) => { +router.push('/profile/' + friendID) }; const removeFriend = (friendID) => { diff --git a/src/views/User/UserProfileForeignView.vue b/src/views/User/UserProfileForeignView.vue new file mode 100644 index 0000000000000000000000000000000000000000..0662a2c06dc7a47cea608f4172a11d009aafdefe --- /dev/null +++ b/src/views/User/UserProfileForeignView.vue @@ -0,0 +1,12 @@ +<script setup lang="ts"> + +import UserProfileForeignLayout from "@/components/UserProfile/UserProfileForeignLayout.vue"; +</script> +<!-- The path to a foreign user is /{userId} || /profile/{userId}--> +<template> +<UserProfileForeignLayout></UserProfileForeignLayout> +</template> + +<style scoped> + +</style> \ No newline at end of file