feat: add complete EnCoach frontend application
Full React 18 + TypeScript + Vite frontend with: - 90+ pages (admin, student, teacher, public) - shadcn/ui component library with 50+ components - JWT authentication with role-based access control - TanStack React Query for server state management - 30+ API service modules - AI-powered features (coaching, grading, generation) - Adaptive learning UI (diagnostics, proficiency, plans) - Institutional LMS management (courses, batches, timetable) - Communication suite (discussions, announcements, DMs) - Full CRUD with validation and confirmation dialogs Made-with: Cursor
This commit is contained in:
104
src/hooks/queries/useAcademic.ts
Normal file
104
src/hooks/queries/useAcademic.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
||||
import { queryKeys } from "./keys";
|
||||
import { academicService } from "@/services/academic.service";
|
||||
import type { PaginationParams } from "@/types";
|
||||
import type {
|
||||
AcademicYearCreateRequest,
|
||||
AcademicTermCreateRequest,
|
||||
DepartmentCreateRequest,
|
||||
} from "@/types/academic";
|
||||
|
||||
export function useAcademicYears(params?: PaginationParams) {
|
||||
return useQuery({
|
||||
queryKey: queryKeys.academicYears.list(params),
|
||||
queryFn: () => academicService.listAcademicYears(params),
|
||||
});
|
||||
}
|
||||
|
||||
export function useAcademicYear(id: number) {
|
||||
return useQuery({
|
||||
queryKey: queryKeys.academicYears.detail(id),
|
||||
queryFn: () => academicService.getAcademicYear(id),
|
||||
enabled: !!id,
|
||||
});
|
||||
}
|
||||
|
||||
export function useAcademicTerms(yearId?: number) {
|
||||
return useQuery({
|
||||
queryKey: queryKeys.academicTerms.list({ year_id: yearId }),
|
||||
queryFn: () => academicService.listTerms({ year_id: yearId }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useDepartments(params?: PaginationParams) {
|
||||
return useQuery({
|
||||
queryKey: queryKeys.departments.list(params),
|
||||
queryFn: () => academicService.listDepartments(params),
|
||||
});
|
||||
}
|
||||
|
||||
export function useCreateAcademicYear() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (data: AcademicYearCreateRequest) => academicService.createAcademicYear(data),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.academicYears.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useUpdateAcademicYear() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: ({ id, data }: { id: number; data: Partial<AcademicYearCreateRequest> }) =>
|
||||
academicService.updateAcademicYear(id, data),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.academicYears.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useDeleteAcademicYear() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (id: number) => academicService.deleteAcademicYear(id),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.academicYears.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useGenerateTerms() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (yearId: number) => academicService.generateTerms(yearId),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.academicTerms.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useCreateAcademicTerm() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (data: AcademicTermCreateRequest) => academicService.createTerm(data),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.academicTerms.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useCreateDepartment() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (data: DepartmentCreateRequest) => academicService.createDepartment(data),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.departments.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useUpdateDepartment() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: ({ id, data }: { id: number; data: Partial<DepartmentCreateRequest> }) =>
|
||||
academicService.updateDepartment(id, data),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.departments.all }),
|
||||
});
|
||||
}
|
||||
|
||||
export function useDeleteDepartment() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (id: number) => academicService.deleteDepartment(id),
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: queryKeys.departments.all }),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user