From 7f0c877d8ac30089ff1b925f1a099229b4b8a813 Mon Sep 17 00:00:00 2001 From: Sandra Guerreiro Date: Wed, 25 Feb 2026 15:07:09 +0100 Subject: [PATCH 1/2] feat(auth): makes sure correct session info is registered each time (#93) * feat(auth): makes sure correct session info is registered each time * user id is now really passed --- src/stores/user.ts | 16 +++++++++----- src/utils/auth.ts | 54 ++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/stores/user.ts b/src/stores/user.ts index 9c2e349..c6c626b 100644 --- a/src/stores/user.ts +++ b/src/stores/user.ts @@ -12,15 +12,21 @@ const defaultOnboardingState: OnboardingState = { }; export const useUserStore = defineStore('user', () => { - const userId: Ref = ref(localStorage.getItem('userId')); - const sessionId: Ref = ref(localStorage.getItem('sessionId')); + const userId: Ref = ref(localStorage.getItem('userId') || undefined); + const sessionId: Ref = ref(localStorage.getItem('sessionId') || undefined); - const setUserIdAndSessionId = async (referer: string | null) => { + const setUserIdAndSessionId = async (referer?: string) => { const userAndSession = await getUserAndSession(userId.value, sessionId.value, referer); userId.value = userAndSession?.userId; sessionId.value = userAndSession?.sessionId; - localStorage.setItem('userId', userAndSession?.userId || ''); - localStorage.setItem('sessionId', userAndSession?.sessionId || ''); + + if (userId.value !== localStorage.getItem('userId')) { + localStorage.setItem('userId', userId.value || ''); + } + + if (sessionId.value !== localStorage.getItem('sessionId')) { + localStorage.setItem('sessionId', sessionId.value || ''); + } return { userId: userId.value, diff --git a/src/utils/auth.ts b/src/utils/auth.ts index 94f7dab..b2d7d10 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -4,40 +4,48 @@ export const getUserAndSession = async ( userId?: string, sessionId?: string, referer?: string -): { userId: string; sessionId: string } => { +): Promise<{ userId: string; sessionId: string }> => { try { - if (userId && sessionId) return { userId, sessionId }; - if (!userId && sessionId) { localStorage.removeItem('sessionId'); } - let newUserId = userId; - let newSessionId = sessionId; - - if (!newUserId) { - const parts: string[] = []; - if (userId) parts.push(`user_id=${encodeURIComponent(userId)}`); - if (referer) parts.push(`referer=${encodeURIComponent(referer)}`); + const newUserId = await getUserId(userId, referer); + const newSessionId = await getSessionId(newUserId, sessionId, referer); - const query = parts.length ? `?${parts.join('&')}` : ''; - const respUserId = await postAxios(`/user/user${query}`); - newUserId = respUserId.data.user_id; + if (!newUserId || !newSessionId) { + throw new Error('Failed to retrieve user ID or session ID'); } - if (newUserId) { - const parts: string[] = []; - parts.push(`user_id=${encodeURIComponent(newUserId)}`); - if (referer) parts.push(`referer=${encodeURIComponent(referer)}`); - - const query = `?${parts.join('&')}`; - const respSessionId = await postAxios(`/user/session${query}`); - - newSessionId = respSessionId.data.session_id; - } return { userId: newUserId, sessionId: newSessionId }; } catch (error) { console.warn('Failed to get user and session:', error); throw error; } }; + +const getUserId = async (userId?: string, referer?: string): Promise => { + const parts: string[] = []; + + if (userId) parts.push(`user_id=${encodeURIComponent(userId)}`); + if (referer) parts.push(`referer=${encodeURIComponent(referer)}`); + + const query = parts.length ? `?${parts.join('&')}` : ''; + const respUserId = await postAxios(`/user/user${query}`); + return respUserId.data.user_id; +}; + +const getSessionId = async ( + userId: string, + sessionId?: string, + referer?: string +): Promise => { + const parts: string[] = []; + parts.push(`user_id=${encodeURIComponent(userId)}`); + if (sessionId) parts.push(`session_id=${encodeURIComponent(sessionId)}`); + if (referer) parts.push(`referer=${encodeURIComponent(referer)}`); + + const query = `?${parts.join('&')}`; + const respSessionId = await postAxios(`/user/session${query}`); + return respSessionId.data.session_id; +}; From bcb42fa2660ce06d73ddc8779ce852c32207c09d Mon Sep 17 00:00:00 2001 From: Sandra Guerreiro Date: Thu, 26 Feb 2026 16:13:00 +0100 Subject: [PATCH 2/2] feat(metric): add metrics for search and tutor --- src/components/tutor/ThirdStep.vue | 19 ++++++++++++++----- src/stores/metrics.ts | 18 +++++++++++++++--- src/stores/search.ts | 10 +++++++--- src/stores/tutor.ts | 30 +++++++++++++++++++++++++++--- src/views/TutorPage.vue | 1 + 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/components/tutor/ThirdStep.vue b/src/components/tutor/ThirdStep.vue index d999aa2..f2625ce 100644 --- a/src/components/tutor/ThirdStep.vue +++ b/src/components/tutor/ThirdStep.vue @@ -9,8 +9,9 @@ const props = defineProps<{ action: () => {}; actionText?: string; disabled: boolean; - updateSyllabus: () => void; + updateSyllabus: (content: string) => void; restart: () => void; + updateSyllabusInDB: () => void; }>(); const isEditable: Ref = ref(false); @@ -26,9 +27,17 @@ const toggleFeedback = async () => { enableFeedback.value = !enableFeedback.value; }; -const handleTextEdit = (event, index) => { +const handleTextEdit = (event) => { const newValue = event.target.innerText; - props.updateSyllabus(index, newValue); + props.updateSyllabus(newValue); +}; + +const handleSyllabusEdition = () => { + if (isEditable.value) { + // Save the edited syllabus + props.updateSyllabusInDB(); + } + isEditable.value = !isEditable.value; };