diff --git a/src/assets/icons/admin.svg b/src/assets/icons/admin.svg new file mode 100644 index 0000000000000000000000000000000000000000..e75e106806f0bf9e3d18092b4b60efdd75fe7a0e --- /dev/null +++ b/src/assets/icons/admin.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 -960 960 960" width="48"><path d="M680-280q25 0 42.5-17.5T740-340q0-25-17.5-42.5T680-400q-25 0-42.5 17.5T620-340q0 25 17.5 42.5T680-280Zm0 120q31 0 57-14.5t42-38.5q-22-13-47-20t-52-7q-27 0-52 7t-47 20q16 24 42 38.5t57 14.5ZM480-80q-139-35-229.5-159.5T160-516v-244l320-120 320 120v227q-19-8-39-14.5t-41-9.5v-147l-240-90-240 90v188q0 47 12.5 94t35 89.5Q310-290 342-254t71 60q11 32 29 61t41 52q-1 0-1.5.5t-1.5.5Zm200 0q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80ZM480-494Z" fill="#ffffff"/></svg> \ No newline at end of file diff --git a/src/assets/icons/friends.svg b/src/assets/icons/friends.svg new file mode 100644 index 0000000000000000000000000000000000000000..477ecd983896167b9096b67b753919ec0c693a0e --- /dev/null +++ b/src/assets/icons/friends.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 -960 960 960" width="48"><path d="M40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm720 0v-120q0-44-24.5-84.5T666-434q51 6 96 20.5t84 35.5q36 20 55 44.5t19 53.5v120H760ZM360-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47Zm400-160q0 66-47 113t-113 47q-11 0-28-2.5t-28-5.5q27-32 41.5-71t14.5-81q0-42-14.5-81T544-792q14-5 28-6.5t28-1.5q66 0 113 47t47 113ZM120-240h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0 320Zm0-400Z" fill="#ffffff"/></svg> \ No newline at end of file diff --git a/src/assets/icons/remove-white.svg b/src/assets/icons/remove-white.svg new file mode 100644 index 0000000000000000000000000000000000000000..1abbf52b6a7043c78bb9c09ba2a23d9927367f13 --- /dev/null +++ b/src/assets/icons/remove-white.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M640-520v-80h240v80H640Zm-280 40q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm80-80h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0-80Zm0 400Z" fill="#ffffff"/></svg> \ No newline at end of file diff --git a/src/assets/icons/remove.svg b/src/assets/icons/remove.svg new file mode 100644 index 0000000000000000000000000000000000000000..725da3649b62a3cb50d518536a66eadf9b0f9bb1 --- /dev/null +++ b/src/assets/icons/remove.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M640-520v-80h240v80H640Zm-280 40q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm80-80h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0-80Zm0 400Z"/></svg> \ No newline at end of file diff --git a/src/components/BaseComponents/Menu.vue b/src/components/BaseComponents/Menu.vue index 01f51f6d27942905236879a50568050475cfe3e8..c98a41c225e89cb0df4ddc69d378d9c74b75c197 100644 --- a/src/components/BaseComponents/Menu.vue +++ b/src/components/BaseComponents/Menu.vue @@ -36,10 +36,14 @@ <ul class="dropdown-menu dropdown-username-content"> <li><a class="dropdown-item text-white dropdown-username-link" href="#" @click="toUserProfile"><img src="@/assets/icons/person.svg">User Profile</a></li> + <li><a class="dropdown-item text-white dropdown-username-link" href="#" + @click="toFriends"><img src="@/assets/icons/friends.svg">Friends</a></li> <li><a class="dropdown-item text-white dropdown-username-link" href="#" @click="toSetting"><img src="@/assets/icons/settings.svg">Setting</a></li> <li><a class="dropdown-item text-white dropdown-username-link" href="#" @click="toFeedback"><img src="@/assets/icons/feedback.svg">Feedback</a></li> + <li><a class="dropdown-item text-white dropdown-username-link" href="#" + @click="toSetting"><img src="@/assets/icons/admin.svg">Admin table</a></li> <li><a class="dropdown-item text-white dropdown-username-link" href="#" @click="toLogout"><img src="@/assets/icons/logout.svg">Log out</a></li> </ul> @@ -88,6 +92,9 @@ function toFeedback() { router.push('/feedback') } +function toFriends() { + router.push('/friends') +} function toUserProfile() { router.push('/profile') diff --git a/src/router/index.ts b/src/router/index.ts index 153ab82c970772c63b946fa0a0936bb8a44c40a8..1f5b39ed6f608232c44060a8e73a7ace61d144ae 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -60,10 +60,20 @@ const routes = [ component: () => import('@/views/ShopView.vue'), }, { - path: '/profile', + path: 'profile', name: 'profile', component: UserProfileView }, + { + path: 'friends', + name: 'friends', + component: () => import('@/views/User/UserFriendsView.vue'), + }, + { + path: 'add-friend', + name: 'add-friend', + component: () => import('@/views/User/UserAddFriend.vue'), + }, { path: 'admin', name: 'admin', @@ -87,6 +97,16 @@ const routes = [ name: 'login', component: LoginView, }, + { + path: '/forgotten-password', + name: 'forgotten-password', + component: () => import('@/views/Authentication/ForgottenPasswordView.vue'), + }, + { + path: '/change-password/:token', + name: 'change-password', + component: () => import('@/views/Authentication/ChangePasswordView.vue'), + }, { path: '/sign-up', name: 'sign up', diff --git a/src/views/Authentication/ChangePasswordView.vue b/src/views/Authentication/ChangePasswordView.vue new file mode 100644 index 0000000000000000000000000000000000000000..ad52ab1b300380fa1c665e882c88b83f217424ac --- /dev/null +++ b/src/views/Authentication/ChangePasswordView.vue @@ -0,0 +1,61 @@ +<template> + <div class="container"> + <div class="row justify-content-center"> + <div class="col-lg-5"> + <div class="card shadow-lg border-0 rounded-lg mt-5"> + <div class="card-header"><h3 class="text-center font-weight-light my-4">Password Recovery</h3></div> + <div class="card-body"> + <div class="small mb-3 text-muted">Enter the new password for your account</div> + <form @submit.prevent="submitForm"> + <div class="form-floating mb-3"> + <input v-model="newPassword" class="form-control" id="newPassword" type="password" placeholder="New Password" required> + <label for="newPassword">Enter your new password</label> + </div> + <div class="form-floating mb-3"> + <input v-model="confirmPassword" class="form-control" id="confirmPassword" type="password" placeholder="Confirm Password" required> + <label for="confirmPassword">Confirm your new password</label> + </div> + <div class="d-flex align-items-center justify-content-between mt-4 mb-0"> + <router-link to="/login" class="small">Return to login</router-link> + <button class="btn btn-primary" type="submit">Confirm Password</button> + </div> + </form> + </div> + <div class="card-footer text-center py-3"> + <div class="small"><router-link to="/sign-up">Need an account? Sign up!</router-link></div> + </div> + </div> + </div> + </div> + </div> + </template> + + <script setup lang="ts"> + import { ref } from 'vue'; + import { useRouter } from 'vue-router'; + import axios from 'axios'; + + const router = useRouter(); + + const newPassword = ref(''); + const confirmPassword = ref(''); + + const submitForm = async () => { + if (newPassword.value !== confirmPassword.value) { + alert('Passwords do not match!'); + return; + } + try { + const response = await axios.post('/api/reset-password', { + password: newPassword.value, + confirmPassword: confirmPassword.value + }); + console.log('Success:', response.data); + router.push('/login'); + } catch (error) { + console.error('Error:', error); + } + }; + + </script> + \ No newline at end of file diff --git a/src/views/Authentication/ForgottenPasswordView.vue b/src/views/Authentication/ForgottenPasswordView.vue new file mode 100644 index 0000000000000000000000000000000000000000..521c2aa54b52169ae720d94d9862f8464cb10ebf --- /dev/null +++ b/src/views/Authentication/ForgottenPasswordView.vue @@ -0,0 +1,52 @@ +<template> + <div class="container"> + <div class="row justify-content-center"> + <div class="col-lg-5"> + <div class="card shadow-lg border-0 rounded-lg mt-5"> + <div class="card-header"><h3 class="text-center font-weight-light my-4">Password Recovery</h3></div> + <div class="card-body"> + <div class="small mb-3 text-muted">Enter your email address and we will send you a link to reset your password.</div> + <form @submit.prevent="submitForm"> + <div class="form-floating mb-3"> + <input v-model="email" class="form-control" id="inputEmail" type="email" placeholder="name@example.com" required> + <label for="inputEmail">Enter email address</label> + </div> + <div class="d-flex align-items-center justify-content-between mt-4 mb-0"> + <router-link to="/login" class="small">Return to login</router-link> + <button class="btn btn-primary" type="submit">Reset Password</button> + </div> + <div class="text-success"> + {{ confirmationMessage }} + </div> + </form> + </div> + <div class="card-footer text-center py-3"> + <div class="small"><router-link to="/sign-up">Need an account? Sign up!</router-link></div> + </div> + </div> + </div> + </div> + </div> + </template> + + <script setup lang="ts"> + import { ref } from 'vue'; + import { useRouter } from 'vue-router'; + import axios from 'axios'; + + const router = useRouter(); + const email = ref(''); + + let confirmationMessage = ref(''); + + const submitForm = async () => { + try { + const response = await axios.post('/api/password-reset', { email: email.value }); + console.log('Success:', response.data); + confirmationMessage.value = 'An email has been sent to your email address with a link to reset your password.'; + } catch (error) { + console.error('Error:', error); + } + }; + </script> + \ No newline at end of file diff --git a/src/views/LeaderboardView.vue b/src/views/LeaderboardView.vue index 5a7adf09279d07a24d470098e85a1dd6c491ada2..769c67973bae2d8b15612e38a1141279d845ed3e 100644 --- a/src/views/LeaderboardView.vue +++ b/src/views/LeaderboardView.vue @@ -70,6 +70,23 @@ async function global() { type: "CURRENT_STREAK", filter: "GLOBAL", }); + let globalPointsYou = await LeaderboardService.getSurrounding({ + type: "TOTAL_POINTS", + filter: "GLOBAL", + }); + let globalStreakYou = await LeaderboardService.getSurrounding({ + type: "TOP_STREAK", + filter: "GLOBAL", + }); + let globalCurrentStreakYou = await LeaderboardService.getSurrounding({ + type: "CURRENT_STREAK", + filter: "GLOBAL", + }); + + console.log(globalPointsYou); + console.log(globalStreakYou); + console.log(globalCurrentStreakYou); + pointsLeaderboardData.value = globalPoints.entries; currentLeaderboardData.value = globalCurrentStreak.entries; streakLeaderboardData.value = globalStreak.entries; diff --git a/src/views/User/UserAddFriend.vue b/src/views/User/UserAddFriend.vue new file mode 100644 index 0000000000000000000000000000000000000000..cb8eb7872e11cf3ee6bfde1ca6f9a9d319f50667 --- /dev/null +++ b/src/views/User/UserAddFriend.vue @@ -0,0 +1,226 @@ +<template> + <div class="container"> + <h1>Add Friend</h1> + <div class="row"> + <form class="col-md-5" id="searchBox" role="search"> + <input class="form-control me-2 custom-border" type="search" placeholder="Search" aria-label="Search"> + <button class="btn btn-success" type="submit">Search</button> +</form> + <div class="col-md-8"> + <div class="people-nearby"> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar7.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Sophia Page</a></h5> + <p>Software Engineer</p> + <p class="text-muted">500m away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar6.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Emma Johnson</a></h5> + <p>Model at Fashion</p> + <p class="text-muted">800m away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar5.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Nora Wilson</a></h5> + <p>Writer at Newspaper</p> + <p class="text-muted">2.5km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar4.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Diana Amber</a></h5> + <p>Student</p> + <p class="text-muted">700m away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Addison Thomas</a></h5> + <p>Barber at Fashion</p> + <p class="text-muted">1.5km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar2.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Jonathon Thompson</a></h5> + <p>Fashion Designer</p> + <p class="text-muted">2km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar7.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Olivia Steward</a></h5> + <p>Creative Director</p> + <p class="text-muted">2km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar6.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Elena Foster</a></h5> + <p>Executive Officer</p> + <p class="text-muted">4km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar1.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Brian Walton</a></h5> + <p>Designer at Designer</p> + <p class="text-muted">3km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + <div class="nearby-user"> + <div class="row"> + <div class="col-md-2 col-sm-2"> + <img src="https://bootdey.com/img/Content/avatar/avatar7.png" alt="user" + class="profile-photo-lg"> + </div> + <div class="col-md-7 col-sm-7"> + <h5><a href="#" class="profile-link">Cris Haris</a></h5> + <p>General Manager at Manager</p> + <p class="text-muted">1km away</p> + </div> + <div class="col-md-3 col-sm-3"> + <button class="btn btn-primary pull-right">Add Friend</button> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<style scoped> +body { + margin-top: 20px; + background: #FAFAFA; +} + +.people-nearby .google-maps { + background: #f8f8f8; + border-radius: 4px; + border: 1px solid #f1f2f2; + padding: 20px; + margin-bottom: 20px; +} + +.people-nearby .google-maps .map { + height: 300px; + width: 100%; + border: none; +} + +.people-nearby .nearby-user { + padding: 20px 0; + border-top: 1px solid #f1f2f2; + border-bottom: 1px solid #f1f2f2; + margin-bottom: 20px; +} + +img.profile-photo-lg { + height: 80px; + width: 80px; + border-radius: 50%; +} + +#searchBox { + margin-bottom: 20px; + display: flex; + text-wrap: nowrap; +} + +.row { + width: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.form-control.custom-border { + border-color: #222223; /* Change to your desired color */ +} +</style> \ No newline at end of file diff --git a/src/views/User/UserFriendsView.vue b/src/views/User/UserFriendsView.vue new file mode 100644 index 0000000000000000000000000000000000000000..bba374fd8064ec90d1971de1de640b38566042f1 --- /dev/null +++ b/src/views/User/UserFriendsView.vue @@ -0,0 +1,661 @@ +<template> + <div class="container"> + <h1>Your Friends</h1> + <button class="btn btn-primary pull-right my-3" @click="addFriend">+ Add Friend</button> + <div class="row"> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar2.png" alt=""> + </div> + </div> + <h3>Amillie Price</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar1.png" alt=""> + </div> + </div> + <h3>Victoria Fox</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt=""> + </div> + </div> + <h3>Coray Shoe</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar2.png" alt=""> + </div> + </div> + <h3>Christiano Mooray</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + </div> + + <div class="row"> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar4.png" alt=""> + </div> + </div> + <h3>Lynda West</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar2.png" alt=""> + </div> + </div> + <h3>Jayden G</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt=""> + </div> + </div> + <h3>Julia Ann</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar1.png" alt=""> + </div> + </div> + <h3>Ava Ray</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar7.png" alt=""> + </div> + </div> + <h3>Maria Shwenstiger</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt=""> + </div> + </div> + <h3>Kate Perry</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar6.png" alt=""> + </div> + </div> + <h3>Robart Gibbs</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + </div> + <div class="col-lg-3"> + <div class="card card-one"> + <div class="header"> + <div class="avatar"> + <img src="https://bootdey.com/img/Content/avatar/avatar5.png" alt=""> + </div> + </div> + <h3>Anna Winslet</h3> + <div class="desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit et cupiditate deleniti. + </div> + <div class="contacts"> + <a class="text removeFriend" data-bs-toggle="collapse" href="#collapseExample" role="button" + aria-expanded="false" aria-controls="collapseExample"> + See more + </a> + + <div class="collapse" id="collapseExample"> + <button class="btn btn-danger"> + + <h5> <img src="@/assets/icons/remove-white.svg" style="width: 30px"> Remove friend</h5> + </button> + </div> + </div> + </div> + + </div> + <nav aria-label="Page navigation example"> + <ul class="pagination"> + <li class="page-item"><a class="page-link" href="#">Previous</a></li> + <li class="page-item"><a class="page-link" href="#">1</a></li> + <li class="page-item"><a class="page-link" href="#">2</a></li> + <li class="page-item"><a class="page-link" href="#">3</a></li> + <li class="page-item"><a class="page-link" href="#">Next</a></li> + </ul> + </nav> + </div> + </div> +</template> + +<script setup lang="ts"> +import { useRouter, useRoute } from 'vue-router'; +import { ref, onMounted, computed } from "vue"; + + +import { useUserInfoStore } from '@/stores/UserStore'; + +const userStore = useUserInfoStore(); + +const createdQuizzes = ref(1); +const createdQuizzesIsEmpty = ref(null); +const coAuthorQuizzes = ref(null); +const coAuthorQuizzesIsEmpty = ref(null); +const router = useRouter(); + +let userid = ref(""); + +async function fetchUserData() { + +} + +function addFriend() { + router.push('/add-friend'); +} + +// Define the navigateToQuiz method +const navigateToFriend = (frinedID) => { + +}; + +const removeFriend = (friendID) => { + +}; + +onMounted(fetchUserData); +</script> + +<style scoped> +body { + background-color: #f0f6ff; + color: #28384d; + +} + +/*social */ +.card-one { + position: relative; + width: 300px; + background: #fff; + box-shadow: 0 10px 7px -5px rgba(0, 0, 0, 0.4); +} + +.card { + margin-bottom: 35px; + padding-bottom: 1rem; + box-shadow: 0 10px 20px 0 rgba(26, 44, 57, 0.14); + border: none; +} + +.follower-wrapper li { + list-style-type: none; + color: #fff; + display: inline-block; + float: left; + margin-right: 20px; +} + +.social-profile { + color: #fff; +} + +.social-profile a { + color: #fff; +} + +.social-profile { + position: relative; + margin-bottom: 150px; +} + +.social-profile .user-profile { + position: absolute; + bottom: -75px; + width: 150px; + height: 150px; + border-radius: 50%; + left: 50px; +} + +.social-nav { + position: absolute; + bottom: 0; +} + +.social-prof { + color: #333; + text-align: center; +} + +.social-prof .wrapper { + width: 70%; + margin: auto; + margin-top: -100px; +} + +.social-prof img { + width: 150px; + height: 150px; + border-radius: 50%; + margin-bottom: 20px; + border: 5px solid #fff; + /*border: 10px solid #70b5e6ee;*/ +} + +.social-prof h3 { + font-size: 36px; + font-weight: 700; + margin-bottom: 0; +} + +.social-prof p { + font-size: 18px; +} + +.social-prof .nav-tabs { + border: none; +} + +.card .nav>li { + position: relative; + display: block; +} + +.card .nav>li>a { + position: relative; + display: block; + padding: 10px 15px; + font-weight: 300; + border-radius: 4px; +} + +.card .nav>li>a:focus, +.card .nav>li>a:hover { + text-decoration: none; + background-color: #eee; +} + +.card .s-nav>li>a.active { + text-decoration: none; + background-color: #3afe; + color: #fff; +} + +.text-blue { + color: #3afe; +} + +ul.friend-list { + margin: 0; + padding: 0; +} + +ul.friend-list li { + list-style-type: none; + display: flex; + align-items: center; +} + +ul.friend-list li:hover { + background: rgba(0, 0, 0, .1); + cursor: pointer; +} + +ul.friend-list .left img { + width: 45px; + height: 45px; + border-radius: 50%; + margin-right: 20px; +} + +ul.friend-list li { + padding: 10px; +} + +ul.friend-list .right h3 { + font-size: 16px; + font-weight: 700; + margin-bottom: 0; +} + +ul.friend-list .right p { + font-size: 11px; + color: #6c757d; + margin: 0; +} + +.social-timeline-card .dropdown-toggle::after { + display: none; +} + +.info-card h4 { + font-size: 15px; +} + +.info-card h2 { + font-size: 18px; + margin-bottom: 20px; +} + +.social-about .social-info { + font-size: 16px; + margin-bottom: 20px; +} + +.social-about p { + margin-bottom: 20px; +} + +.info-card i { + color: #3afe; +} + +.card-one { + position: relative; + width: 300px; + background: #fff; + box-shadow: 0 10px 7px -5px rgba(0, 0, 0, 0.4); +} + +.card-one .header { + position: relative; + width: 100%; + height: 60px; + background-color: #3afe; +} + +.card-one .header::before, +.card-one .header::after { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: inherit; +} + +.card-one .header::before { + -webkit-transform: skewY(-8deg); + transform: skewY(-8deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.card-one .header::after { + -webkit-transform: skewY(8deg); + transform: skewY(8deg); + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; +} + +.card-one .header .avatar { + position: absolute; + left: 50%; + top: 30px; + margin-left: -50px; + z-index: 5; + width: 100px; + height: 100px; + border-radius: 50%; + overflow: hidden; + background: #ccc; + border: 3px solid #fff; +} + +.card-one .header .avatar img { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + width: 100px; + height: auto; +} + +.card-one h3 { + position: relative; + margin: 80px 0 30px; + text-align: center; +} + +.card-one h3::after { + content: ''; + position: absolute; + bottom: -15px; + left: 50%; + margin-left: -15px; + width: 30px; + height: 1px; + background: #000; +} + +.card-one .desc { + padding: 0 1rem 2rem; + text-align: center; + line-height: 1.5; + color: #777; +} + +#gallery li { + width: 24%; + float: left; + margin: 6px; + +} + +.removeFriend { + text-wrap: nowrap; +} + +.contacts { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} +</style> \ No newline at end of file