89 lines
2.7 KiB
TypeScript
89 lines
2.7 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import { instructorService } from '~/services/instructor.service';
|
|
|
|
interface Course {
|
|
id: number;
|
|
title: string;
|
|
students: number;
|
|
lessons: number;
|
|
icon: string;
|
|
thumbnail: string | null;
|
|
}
|
|
|
|
interface DashboardStats {
|
|
totalCourses: number;
|
|
totalStudents: number;
|
|
completedStudents: number;
|
|
}
|
|
|
|
interface CourseStatusCounts {
|
|
approved: number;
|
|
pending: number;
|
|
draft: number;
|
|
rejected: number;
|
|
}
|
|
|
|
export const useInstructorStore = defineStore('instructor', {
|
|
state: () => ({
|
|
stats: {
|
|
totalCourses: 0,
|
|
totalStudents: 0,
|
|
completedStudents: 0
|
|
} as DashboardStats,
|
|
|
|
courseStatusCounts: {
|
|
approved: 0,
|
|
pending: 0,
|
|
draft: 0,
|
|
rejected: 0
|
|
} as CourseStatusCounts,
|
|
|
|
recentCourses: [] as Course[],
|
|
loading: false
|
|
}),
|
|
|
|
getters: {
|
|
getDashboardStats: (state) => state.stats,
|
|
getRecentCourses: (state) => state.recentCourses
|
|
},
|
|
|
|
actions: {
|
|
async fetchDashboardData() {
|
|
this.loading = true;
|
|
try {
|
|
// Fetch courses and student stats in parallel
|
|
const [courses, studentStats] = await Promise.all([
|
|
instructorService.getCourses(),
|
|
instructorService.getMyStudentsStats()
|
|
]);
|
|
|
|
// Update student stats from dedicated API
|
|
this.stats.totalCourses = courses.length;
|
|
this.stats.totalStudents = studentStats.total_students;
|
|
this.stats.completedStudents = studentStats.total_completed;
|
|
|
|
// Update course status counts
|
|
this.courseStatusCounts = {
|
|
approved: courses.filter(c => c.status === 'APPROVED').length,
|
|
pending: courses.filter(c => c.status === 'PENDING').length,
|
|
draft: courses.filter(c => c.status === 'DRAFT').length,
|
|
rejected: courses.filter(c => c.status === 'REJECTED').length
|
|
};
|
|
|
|
// Build recent courses list (first 3) from existing data
|
|
this.recentCourses = courses.slice(0, 3).map(course => ({
|
|
id: course.id,
|
|
title: course.title.th,
|
|
students: 0,
|
|
lessons: 0,
|
|
icon: 'book',
|
|
thumbnail: course.thumbnail_url || null
|
|
}));
|
|
} catch (error) {
|
|
console.error('Failed to fetch dashboard data:', error);
|
|
} finally {
|
|
this.loading = false;
|
|
}
|
|
}
|
|
}
|
|
});
|