65 lines
1.9 KiB
TypeScript
65 lines
1.9 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;
|
|
}
|
|
|
|
export const useInstructorStore = defineStore('instructor', {
|
|
state: () => ({
|
|
stats: {
|
|
totalCourses: 0,
|
|
totalStudents: 0,
|
|
completedStudents: 0
|
|
} as DashboardStats,
|
|
|
|
recentCourses: [] as Course[],
|
|
loading: false
|
|
}),
|
|
|
|
getters: {
|
|
getDashboardStats: (state) => state.stats,
|
|
getRecentCourses: (state) => state.recentCourses
|
|
},
|
|
|
|
actions: {
|
|
async fetchDashboardData() {
|
|
this.loading = true;
|
|
try {
|
|
// Fetch real courses from API
|
|
const courses = await instructorService.getCourses();
|
|
|
|
// Update stats
|
|
this.stats.totalCourses = courses.length;
|
|
// TODO: Get real student counts from API when available
|
|
this.stats.totalStudents = 0;
|
|
this.stats.completedStudents = 0;
|
|
|
|
// Map to recent courses format (take first 5)
|
|
this.recentCourses = courses.slice(0, 3).map((course, index) => ({
|
|
id: course.id,
|
|
title: course.title.th,
|
|
students: 0, // TODO: Get from API
|
|
lessons: 0, // TODO: Get from course detail API
|
|
icon: ['📘', '📗', '📙', '📕', '📒'][index % 5],
|
|
thumbnail: course.thumbnail_url || null
|
|
}));
|
|
} catch (error) {
|
|
console.error('Failed to fetch dashboard data:', error);
|
|
} finally {
|
|
this.loading = false;
|
|
}
|
|
}
|
|
}
|
|
});
|