File "useCoursesQueries-20260606101603.ts"

Full Path: /home/trinadezambia/public_html/student_panel/src/components/hooks/useCoursesQueries-20260606101603.ts
File size: 2.93 KB
MIME-type: text/x-java
Charset: utf-8

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");
    },
  });
};