Skip to content
Snippets Groups Projects
Commit ea1e9c33 authored by VIktorGrev's avatar VIktorGrev
Browse files

feat: Adding premium

parents 822839be 2999ede5
No related branches found
No related tags found
1 merge request!60Premium
Pipeline #281755 passed with warnings
......@@ -3,6 +3,8 @@ import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}',
baseUrl: 'http://localhost:5173'
baseUrl: 'http://localhost:5173',
viewportHeight: 1080,
viewportWidth: 1920,
}
})
describe('BasePage test', () => {
beforeEach(() => {
cy.visit('/login');
cy.get('#emailInput input').type('user@example.com');
cy.get('#passwordInput input').type('John1');
cy.get('form').submit();
cy.wait(1000);
cy.visit('/')
});
it('uses menu to visit leaderboard', () => {
cy.get('[data-cy="menu"]').get('[data-cy="leaderboard"]').click();
cy.url().should('include', '/leaderboard');
});
it('uses menu to visit news', () => {
cy.get('[data-cy="menu"]').get('[data-cy="news"]').click();
cy.url().should('include', '/news');
});
it('uses menu to visit store', () => {
cy.get('[data-cy="menu"]').get('[data-cy="store"]').click();
cy.url().should('include', '/shop');
});
it('uses menu to visit roadmap', () => {
cy.get('[data-cy="menu"]').get('[data-cy="savingGoals"]').click();
cy.url().should('include', '/roadmap');
});
it('uses menu to visit user profile', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-cy="profile"]').click();
cy.url().should('include', '/profile');
});
it('uses menu to visit budget', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-cy="budget"]').click();
cy.url().should('include', '/budget');
});
it('uses menu to visit friends', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-cy="friends"]').click();
cy.url().should('include', '/friends');
});
it('uses menu to visit settings', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-cy="settings"]').click();
cy.url().should('include', '/settings');
});
it('uses menu to visit feedback', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-cy="feedback"]').click();
cy.url().should('include', '/feedback');
});
it('uses menu to log out', () => {
cy.get('[data-cy="menu"]').get('[data-cy="user"]').click();
cy.get('[data-testid="logout"]').click();
cy.wait(1000);
cy.url().should('include', '/login');
});
})
\ No newline at end of file
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
<svg fill="white" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 459.334 459.334" xml:space="preserve" stroke="white">
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
<g id="SVGRepo_iconCarrier"> <g> <g> <g> <path d="M175.216,404.514c-0.001,0.12-0.009,0.239-0.009,0.359c0,30.078,24.383,54.461,54.461,54.461 s54.461-24.383,54.461-54.461c0-0.12-0.008-0.239-0.009-0.359H175.216z"/> <path d="M403.549,336.438l-49.015-72.002c0-22.041,0-75.898,0-89.83c0-60.581-43.144-111.079-100.381-122.459V24.485 C254.152,10.963,243.19,0,229.667,0s-24.485,10.963-24.485,24.485v27.663c-57.237,11.381-100.381,61.879-100.381,122.459 c0,23.716,0,76.084,0,89.83l-49.015,72.002c-5.163,7.584-5.709,17.401-1.419,25.511c4.29,8.11,12.712,13.182,21.887,13.182 H383.08c9.175,0,17.597-5.073,21.887-13.182C409.258,353.839,408.711,344.022,403.549,336.438z"/> </g> </g> </g> </g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 459.334 459.334" xml:space="preserve">
<g>
<g>
<g>
<path d="M175.216,404.514c-0.001,0.12-0.009,0.239-0.009,0.359c0,30.078,24.383,54.461,54.461,54.461
s54.461-24.383,54.461-54.461c0-0.12-0.008-0.239-0.009-0.359H175.216z"/>
<path d="M403.549,336.438l-49.015-72.002c0-22.041,0-75.898,0-89.83c0-60.581-43.144-111.079-100.381-122.459V24.485
C254.152,10.963,243.19,0,229.667,0s-24.485,10.963-24.485,24.485v27.663c-57.237,11.381-100.381,61.879-100.381,122.459
c0,23.716,0,76.084,0,89.83l-49.015,72.002c-5.163,7.584-5.709,17.401-1.419,25.511c4.29,8.11,12.712,13.182,21.887,13.182
H383.08c9.175,0,17.597-5.073,21.887-13.182C409.258,353.839,408.711,344.022,403.549,336.438z"/>
</g>
</g>
</g>
</svg>
\ No newline at end of file
src/assets/icons/medal.png

28.1 KiB

<template>
<nav id="navBar" class="navbar navbar-expand-xl">
<div class="container-fluid">
<router-link class="navbar-brand" id="home" :to="toSavingGoals()">
<router-link class="navbar-brand" id="home" :to="toSavingGoals()">
<img id="logoImg" src="/src/assets/Sparesti-logo.png" alt="Sparesti-logo" width="60">
<span id="logo" class="text-white">Sparesti</span>
</router-link>
......@@ -13,45 +13,79 @@
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 ui-menu">
<li class="nav-item">
<router-link class="nav-link text-white" :to="toSavingGoals()"><img
<router-link data-cy="savingGoals" class="nav-link text-white"
:to="toSavingGoals()"><img
src="@/assets/icons/saving.svg">Saving goals</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link text-white" :to="toLeaderboard()"><img
<router-link data-cy="leaderboard" class="nav-link text-white"
:to="toLeaderboard()"><img
src="@/assets/icons/leaderboard.svg">Leaderboard</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link text-white" :to="toNews()"><img
src="@/assets/icons/newsletter.svg">News</router-link>
<router-link data-cy="news" class="nav-link text-white" :to="toNews()"><img
src="@/assets/icons/newsletter.svg">News</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link text-white" :to="toStore()"><img
src="@/assets/icons/storefront.svg">Store</router-link>
<router-link data-cy="store" class="nav-link text-white" :to="toStore()"><img
src="@/assets/icons/storefront.svg">Store</router-link>
</li>
<li class="nav-item dropdown">
<a data-mdb-dropdown-init class=" nav-link me-3 dropdown-toggle hidden-arrow notification" href="#" id="navbarDropdownMenuLink"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fas fa-bell text-white"></i>
<span class="badge rounded-pill badge-notification bg-danger">{{counter}}</span>
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li v-for="(array,key) in notifMap" :key="key" >
<div class="d-flex align-items-center">
<div v-if="array[1][0] === '1'" class="flex-shrink-0">
<img src="/src/assets/icons/medal.png" alt="Notification Icon" class="notification-icon" style="height: 20px; width: 20px">
</div>
<div v-if="array[1][0] === '2'" class="flex-shrink-0">
<img src="/src/assets/userprofile.png" alt="Notification Icon" class="notification-icon" style="height: 20px; width: 20px">
</div>
<div v-if="array[1][0] === '3'" class="flex-shrink-0">
<img src="/src/assets/icons/piggybank.svg" alt="Notification Icon" class="notification-icon" style="height: 20px; width: 20px">
</div>
<div class="flex-grow-1 ms-3">
<router-link class="not-item dropdown-item text-white" :to="getPath(array[1][0])">{{array[1][1]}}</router-link>
</div>
</div>
</li>
</ul>
</li>
<li v-if="userStore.isLoggedIn" class="nav-item dropdown">
<a class="nav-link dropdown-toggle username-text text-white " href="#" role="button"
<a data-cy="user"
class="nav-link dropdown-toggle username-text text-white "
href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<img :src="useUserInfoStore().profileImage ? 'http://localhost:8080/api/images/' + useUserInfoStore().profileImage : 'src/assets/userprofile.png'"
style="width: 50px; border: 2px solid black; border-radius: 50%">{{
useUserInfoStore().firstname }}
</a>
<ul class="dropdown-menu dropdown-username-content">
<li><router-link class="dropdown-item text-white dropdown-username-link"
:to="toUserProfile()"><img src="@/assets/icons/person.svg">User
Profile</router-link></li>
<li v-if="useUserInfoStore().isPremium"><router-link class="dropdown-item text-white dropdown-username-link"
:to="toBudget()"><img>Budget</router-link></li>
<li><router-link class="dropdown-item text-white dropdown-username-link"
:to="toFriends()"><img src="@/assets/icons/friends.svg">Friends</router-link></li>
<li><router-link class="dropdown-item text-white dropdown-username-link"
:to="toSetting()"><img src="@/assets/icons/settings.svg">Settings</router-link></li>
<li><router-link class="dropdown-item text-white dropdown-username-link"
:to="toFeedback()"><img src="@/assets/icons/feedback.svg">Feedback</router-link>
</li>
<li><router-link class="dropdown-item text-white dropdown-username-link"
:to="toSetting()"><img src="@/assets/icons/admin.svg">Admin</router-link></li>
<li><a data-testid="logout" class="dropdown-item text-white dropdown-username-link" ref="#"
@click="toLogout()"><img src="@/assets/icons/logout.svg">Log out</a></li>
<li><router-link data-cy="profile"
class="dropdown-item text-white dropdown-username-link" :to="toUserProfile()"><img
src="@/assets/icons/person.svg">User Profile</router-link></li>
<li v-if="useUserInfoStore().isPremium"><router-link data-cy="budget"
class="dropdown-item text-white dropdown-username-link" :to="toBudget()"><img>Budget</router-link></li>
<li><router-link data-cy="friends"
class="dropdown-item text-white dropdown-username-link" :to="toFriends()"><img
src="@/assets/icons/friends.svg">Friends</router-link></li>
<li><router-link data-cy="settings"
class="dropdown-item text-white dropdown-username-link" :to="toSetting()"><img
src="@/assets/icons/settings.svg">Settings</router-link></li>
<li><router-link data-cy="feedback"
class="dropdown-item text-white dropdown-username-link" :to="toFeedback()"><img
src="@/assets/icons/feedback.svg">Feedback</router-link></li>
<li><router-link data-cy="admin"
class="dropdown-item text-white dropdown-username-link" :to="toSetting()"><img
src="@/assets/icons/admin.svg">Admin</router-link></li>
<li><a data-testid="logout" class="dropdown-item text-white dropdown-username-link" ref="#" @click="toLogout()"><img
src="@/assets/icons/logout.svg">Log out</a></li>
</ul>
</li>
<li v-else class="nav-item">
......@@ -63,9 +97,11 @@
</nav>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useRouter } from "vue-router";
import { useUserInfoStore } from '@/stores/UserStore';
import {onMounted, ref} from "vue";
const router = useRouter();
......@@ -79,6 +115,65 @@ if (useUserInfoStore().profileImage !== 0) {
profileImage = 'src/assets/userprofile.png';
}
//Hashmap that contains the path to the Badges, The Friend, The dashboard etc.
//The key value pair is the message of the notification and the path of the route
let notifMap = ref (new Map<number, any[]>);
let notifId = ref(0);
let path = ref('#');
let counter = ref(0)
/* id: 0 -> /roadmap
id: 1 -> /profile
id: 2 -> /friend
*/
function getNotification(){
//axios call
let response: any = ref( ['1', 'You have recived a award for getting 200 points'])
let response2: any = ref( ['2', 'You have recived a friend request from Jens Aanestad'])
let response3: any = ref( ['3', 'You have lost your streak. Come back to try again'])
notifMap.value.set(notifId.value,response.value)
notifId.value++
notifMap.value.set(notifId.value,response2.value)
notifId.value++
notifMap.value.set(notifId.value,response3.value)
notifId.value++
counter.value = notifMap.value.size
}
function toBadges(){
}
function getPath(id : string){
if(id === '1'){
return path.value = '/profile'
}
if(id === '2'){
return path.value = '/friends'
}
if(id === '3'){
return path.value = '/roadmap'
}
return '#';
}
function updateNotification(){
//Axios get request to the getFunction
}
function removeNotification() {
}
function toHome() {
return '/'
}
......@@ -123,7 +218,9 @@ function toLogout() {
userStore.clearUserInfo();
router.push('login')
}
onMounted(() => {
getNotification()
})
</script>
<style scoped>
......@@ -144,6 +241,9 @@ function toLogout() {
.nav-item:hover {
background-color: #2b6ac7;
}
.not-item:hover {
background-color: #2b6ac7;
}
.nav-item .dropdown {
display: flex;
......@@ -167,6 +267,16 @@ function toLogout() {
right: -0.5rem;
}
#notifyBtn {
background-color: #0A58CA;
border: #0A58CA;
}
#notifyBtn:hover {
background-color: #2b6ac7;
border: #2b6ac7;
}
.dropdown-menu[data-bs-popper] {
left: auto;
}
......@@ -209,4 +319,9 @@ function toLogout() {
height: auto;
aspect-ratio: 1.3/1;
}
.notification.hidden-arrow::after{
display: none;
}
</style>
\ No newline at end of file
......@@ -7,8 +7,7 @@ import { useUserInfoStore } from '@/stores/UserStore';
</script>
<template>
<Menu></Menu>
<Menu data-cy="menu"></Menu>
<div v-if="!useUserInfoStore().isPremium && !useUserInfoStore().isNoAds" style="display: flex; flex-direction: row;">
<img v-for="item in 7" src="@/assets/coca.webp" style="width: 100%; height: 100px; margin: 5px; border-radius: 1rem;" alt="picture">
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment