Skip to content
Snippets Groups Projects
LeaderboardView.vue 6.58 KiB
<template>
    <br>
    <div id="dropdownContainer">
        <h1 class="box">Poengtavle</h1>
    </div>
    <div id="content">
        <div id="dropdownContainer">
            <div class="box">
                <div class="btn-group-vertical" id="radioContainer" role="group"
                     aria-label="Vertikal radio knappgruppe">
                    <input type="radio" class="btn-check" name="vbtn-radio" id="vbtn-radio1" autocomplete="off" checked>
                    <label class="btn btn-outline-primary" for="vbtn-radio1" @click="global"><img src="@/assets/globe.png" style="width: 60px" alt="globus"> Global</label>
                    <input type="radio" class="btn-check" name="vbtn-radio" id="vbtn-radio2" autocomplete="off">
                    <label data-cy="friends-leaderboard-btn" class="btn btn-outline-primary"
                           for="vbtn-radio2"
                            @click="friends"><img src="@/assets/friends.png" style="width: 60px" alt="venner"> Venner</label>
                </div>
            </div>
        </div>
        <main>
            <div id="leaderboard">
                <h1><img src="@/assets/items/pigcoin.png" style="width: 2rem" alt="pig coin"> Totale poeng</h1>
                <Leaderboard data-cy="total-points-board" :leaderboard="pointsLeaderboardData"
                              :leaderboardExtra="pointsLeaderboardDataExtra" @navigateToUserProfile="navigateToUserProfile" />
            </div>
            <div id="leaderboard">
                <h1><img src="@/assets/icons/fire.png" style="width: 2rem" alt="ild"> Nåværende rekke</h1>
                <Leaderboard data-cy="current-points-board" :leaderboard="currentLeaderboardData"
                              :leaderboardExtra="currentLeaderboardDataExtra" @navigateToUserProfile="navigateToUserProfile" />
            </div>
            <div id="leaderboard">
                <h1><img src="@/assets/icons/fire.png" style="width: 2rem" alt="ild"> Høyeste rekke</h1>
                <Leaderboard data-cy="streak-board" :leaderboard="streakLeaderboardData"
                              :leaderboardExtra="streakLeaderboardDataExtra" @navigateToUserProfile="navigateToUserProfile" />
            </div>
        </main>
    </div>
    <div id="communityContainer">
        <h1>Totale poeng opptjent som et fellesskap</h1>
        <h2>1000000 <img src="@/assets/items/v-buck.png" style="width: 2rem" alt="alt"></h2>
    </div>
</template>


<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import Leaderboard from '@/components/LeaderboardComponents/Leaderboard.vue';
import { LeaderboardService } from '@/api';

let streakLeaderboardData = ref([] as  any);
let currentLeaderboardData = ref([] as any);
let pointsLeaderboardData = ref([] as any);

let streakLeaderboardDataExtra = ref([] as any);
let currentLeaderboardDataExtra = ref([] as any);
let pointsLeaderboardDataExtra = ref([] as any);

const router = useRouter();

async function fetchQuizData() {
    await global();
}

onMounted(() => {
    fetchQuizData();
});

async function global() {
    let globalPoints = await LeaderboardService.getLeaderboard({
        type: "TOTAL_POINTS",
        filter: "GLOBAL",
    });
    let globalStreak = await LeaderboardService.getLeaderboard({
        type: "TOP_STREAK",
        filter: "GLOBAL",
    });
    let globalCurrentStreak = await LeaderboardService.getLeaderboard({
        type: "CURRENT_STREAK",
        filter: "GLOBAL",
    });
    let globalPointsYou = await LeaderboardService.getSurrounding({
        type: "TOTAL_POINTS",
        filter: "GLOBAL",
        entryCount: 2,
    });
    let globalStreakYou = await LeaderboardService.getSurrounding({
        type: "TOP_STREAK",
        filter: "GLOBAL",
        entryCount: 2,
    });
    let globalCurrentStreakYou = await LeaderboardService.getSurrounding({
        type: "CURRENT_STREAK",
        filter: "GLOBAL",
        entryCount: 2,
    });
    
    pointsLeaderboardData.value = globalPoints.entries;
    currentLeaderboardData.value = globalCurrentStreak.entries;
    streakLeaderboardData.value = globalStreak.entries;

    pointsLeaderboardDataExtra.value = globalPointsYou.entries;
    currentLeaderboardDataExtra.value = globalCurrentStreakYou.entries;
    streakLeaderboardDataExtra.value = globalStreakYou.entries;
}

async function friends() {
    let friendsPoints = await LeaderboardService.getLeaderboard({
        type: "TOTAL_POINTS",
        filter: "FRIENDS",
    });
    let friendsStreak = await LeaderboardService.getLeaderboard({
        type: "TOP_STREAK",
        filter: "FRIENDS",
    });
    let friendsCurrentStreak = await LeaderboardService.getLeaderboard({
        type: "CURRENT_STREAK",
        filter: "FRIENDS",
    });
    let friendsPointsYou = await LeaderboardService.getSurrounding({
        type: "TOTAL_POINTS",
        filter: "FRIENDS",
        entryCount: 2,
    });
    let friendsStreakYou = await LeaderboardService.getSurrounding({
        type: "TOP_STREAK",
        filter: "FRIENDS",
        entryCount: 2,
    });
    let friendsCurrentStreakYou = await LeaderboardService.getSurrounding({
        type: "CURRENT_STREAK",
        filter: "FRIENDS",
        entryCount: 2,
    });


    pointsLeaderboardData.value = friendsPoints.entries;
    currentLeaderboardData.value = friendsCurrentStreak.entries;
    streakLeaderboardData.value = friendsStreak.entries;

    pointsLeaderboardDataExtra.value = friendsPointsYou.entries;
    currentLeaderboardDataExtra.value = friendsStreakYou.entries;
    streakLeaderboardDataExtra.value = friendsCurrentStreakYou.entries;
}

const navigateToUserProfile = (userId: number) => {
    router.push({ name: 'user', params: { id: userId } });
};
</script>

<style scoped>
main {
    margin-bottom: 4rem;
    width: 80%;
    display: flex;
    justify-content: space-around;
    align-items: start;
    flex-wrap: wrap;
    flex-direction: row;
}

#leaderboard {
    width: 400px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    margin-bottom: 3rem;
}

#content {
    display: flex;
    flex-direction: row;
    justify-content: center;
    flex-wrap: wrap;
}

.box {
    width: 90%;
}

h1 {
    font-weight: 500;
    margin-bottom: 1rem;
}

#dropdownContainer {
    display: flex;
    justify-content: center;
    margin-bottom: 2rem;
}

#radioContainer {
    display: flex;
    justify-content: center;
    margin-bottom: 2rem;
    width: 100%;
    margin-top: 3.6rem;
}

#communityContainer {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    margin-bottom: 5rem;
}

</style>