From 8baecc07365c37a2a75fe7af539c9cdad9f32daa Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Wed, 7 Aug 2024 18:03:28 +0200 Subject: [PATCH] Refactor common code into composable --- client/src/composables.ts | 30 ++++++++++++++++ .../CompetenceCertificateDetailPage.vue | 28 +++++---------- .../CompetenceCertificateListPage.vue | 32 ++++------------- .../pages/competence/CompetenceIndexPage.vue | 34 ++++--------------- 4 files changed, 53 insertions(+), 71 deletions(-) diff --git a/client/src/composables.ts b/client/src/composables.ts index 6c231576..2fd0d777 100644 --- a/client/src/composables.ts +++ b/client/src/composables.ts @@ -32,6 +32,7 @@ import { useUserStore } from "@/stores/user"; import type { ActionCompetence, CircleType, + CompetenceCertificate, Course, CourseCompletion, CourseCompletionStatus, @@ -52,6 +53,8 @@ import log from "loglevel"; import type { ComputedRef, Ref } from "vue"; import { computed, onMounted, ref, watchEffect } from "vue"; import { useRouter, type RouteLocationRaw } from "vue-router"; +import { getCertificates } from "./services/competence"; +import { mergeCompetenceCertificates } from "./pages/competence/utils"; export function useCurrentCourseSession() { /** @@ -746,3 +749,30 @@ export function useVVByLink() { return { href }; } + +export function useAllCompetenceCertificates( + userId: string | undefined, + courseSlug: string +) { + const courseSessionsStore = useCourseSessionsStore(); + const certificateQueries = courseSessionsStore.allCourseSessions.map( + (courseSession) => { + return useCertificateQuery(userId, courseSlug, courseSession).certificatesQuery; + } + ); + + const competenceCertificatesPerCs = computed(() => + certificateQueries.map((query) => { + return getCertificates(query.data.value, userId ?? null) + ?.competence_certificates as unknown as CompetenceCertificate[]; + }) + ); + const isLoaded = computed(() => !certificateQueries.some((q) => q.fetching.value)); + const competenceCertificates = computed(() => + mergeCompetenceCertificates(competenceCertificatesPerCs.value.flat()) + ); + return { + competenceCertificates, + isLoaded, + }; +} diff --git a/client/src/pages/competence/CompetenceCertificateDetailPage.vue b/client/src/pages/competence/CompetenceCertificateDetailPage.vue index 227a6a0c..d9d6efac 100644 --- a/client/src/pages/competence/CompetenceCertificateDetailPage.vue +++ b/client/src/pages/competence/CompetenceCertificateDetailPage.vue @@ -1,14 +1,9 @@ diff --git a/client/src/pages/competence/CompetenceCertificateListPage.vue b/client/src/pages/competence/CompetenceCertificateListPage.vue index 49b83ba6..0fedf299 100644 --- a/client/src/pages/competence/CompetenceCertificateListPage.vue +++ b/client/src/pages/competence/CompetenceCertificateListPage.vue @@ -1,18 +1,13 @@ @@ -71,7 +51,7 @@ const router = useRouter();
{{ $t("a.Erfahrungsnote üK") }}: - {{ calcCompetencesTotalGrade(mergedCertificates ?? []) }} + {{ calcCompetencesTotalGrade(competenceCertificates ?? []) }} @@ -86,7 +66,7 @@ const router = useRouter();