Files
studysprint/lib/setupStatus.ts
2026-05-05 17:36:34 +02:00

85 lines
2.0 KiB
TypeScript

import { supabase } from '@/lib/supabase';
export type SetupStepKey = 'subject' | 'assignment' | 'task' | 'sprint';
export type SetupStatus = {
subjectId: string | null;
assignmentId: string | null;
taskId: string | null;
completedFocusSessions: number;
currentStep: SetupStepKey;
isSetupComplete: boolean;
};
export async function getSetupStatus(userId: string): Promise<SetupStatus> {
const [subjectResult, assignmentResult, taskResult, focusSessionResult] = await Promise.all([
supabase
.from('subjects')
.select('sId')
.eq('uId', userId)
.order('lastChanged', { ascending: false })
.limit(1)
.maybeSingle(),
supabase
.from('assignments')
.select('aId')
.eq('uId', userId)
.order('lastChanged', { ascending: false })
.limit(1)
.maybeSingle(),
supabase
.from('tasks')
.select('tId')
.eq('uId', userId)
.order('lastChanged', { ascending: false })
.limit(1)
.maybeSingle(),
supabase
.from('sprint_sessions')
.select('sessionId', { count: 'exact', head: true })
.eq('userId', userId)
.eq('sessionType', 'focus')
.eq('status', 'completed'),
]);
if (subjectResult.error) {
throw subjectResult.error;
}
if (assignmentResult.error) {
throw assignmentResult.error;
}
if (taskResult.error) {
throw taskResult.error;
}
if (focusSessionResult.error) {
throw focusSessionResult.error;
}
const subjectId = subjectResult.data?.sId ?? null;
const assignmentId = assignmentResult.data?.aId ?? null;
const taskId = taskResult.data?.tId ?? null;
const completedFocusSessions = focusSessionResult.count ?? 0;
let currentStep: SetupStepKey = 'sprint';
if (!subjectId) {
currentStep = 'subject';
} else if (!assignmentId) {
currentStep = 'assignment';
} else if (!taskId) {
currentStep = 'task';
}
return {
subjectId,
assignmentId,
taskId,
completedFocusSessions,
currentStep,
isSetupComplete: taskId !== null && completedFocusSessions > 0,
};
}