Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
forbidals
/
student_panel
/
src
/
components
/
hooks
:
useCoursesQueries.ts
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { success, error } from "@/components/lib/toast"; // Mock API functions for courses const coursesAPI = { getCourses: async () => { await new Promise((resolve) => setTimeout(resolve, 1000)); return [ { id: "1", title: "Mathematics 101", description: "Basic mathematics course", instructor: "Dr. Smith", duration: "12 weeks", price: 299, enrolled: 45, rating: 4.8, }, { id: "2", title: "Physics Fundamentals", description: "Introduction to physics concepts", instructor: "Prof. Johnson", duration: "10 weeks", price: 349, enrolled: 32, rating: 4.6, }, { id: "3", title: "Chemistry Basics", description: "Basic chemistry principles", instructor: "Dr. Brown", duration: "8 weeks", price: 279, enrolled: 28, rating: 4.7, }, ]; }, getCourse: async (id: string) => { await new Promise((resolve) => setTimeout(resolve, 800)); const courses = await coursesAPI.getCourses(); const course = courses.find((c) => c.id === id); if (!course) throw new Error("Course not found"); return course; }, enrollCourse: async (courseId: string) => { await new Promise((resolve) => setTimeout(resolve, 1200)); return { success: true, enrollmentId: `enroll_${courseId}_${Date.now()}` }; }, }; // Query keys export const courseKeys = { all: ["courses"] as const, lists: () => [...courseKeys.all, "list"] as const, list: (filters: string) => [...courseKeys.lists(), { filters }] as const, details: () => [...courseKeys.all, "detail"] as const, detail: (id: string) => [...courseKeys.details(), id] as const, }; // Hook for fetching all courses export const useCoursesQuery = () => { return useQuery({ queryKey: courseKeys.lists(), queryFn: coursesAPI.getCourses, staleTime: 5 * 60 * 1000, // 5 minutes }); }; // Hook for fetching a single course export const useCourseQuery = (id: string) => { return useQuery({ queryKey: courseKeys.detail(id), queryFn: () => coursesAPI.getCourse(id), enabled: !!id, staleTime: 10 * 60 * 1000, // 10 minutes }); }; // Hook for enrolling in a course export const useEnrollCourseMutation = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (courseId: string) => coursesAPI.enrollCourse(courseId), onSuccess: (data, courseId) => { // Invalidate courses list to refresh enrollment counts queryClient.invalidateQueries({ queryKey: courseKeys.lists() }); // Update specific course detail queryClient.invalidateQueries({ queryKey: courseKeys.detail(courseId) }); success("Successfully enrolled in course!"); }, onError: (err) => { error(err.message || "Failed to enroll in course"); }, }); };