import React, { useState } from 'react';
import { useOrg } from '@components/Contexts/OrgContext';
import { useLHSession } from '@components/Contexts/LHSessionContext';
import { linkCourseToProduct } from '@services/payments/products';
import { Button } from "@components/ui/button";
import { Input } from "@components/ui/input";
import { Search } from 'lucide-react';
import toast from 'react-hot-toast';
import { mutate } from 'swr';
import useSWR from 'swr';
import { getOrgCourses } from '@services/courses/courses';
import { getCoursesLinkedToProduct } from '@services/payments/products';
import Link from 'next/link';
import { getCourseThumbnailMediaDirectory } from '@services/media/media';
import { getUriWithOrg } from '@services/config/config';
interface LinkCourseModalProps {
productId: string;
onSuccess: () => void;
}
interface CoursePreviewProps {
course: {
id: string;
name: string;
description: string;
thumbnail_image: string;
course_uuid: string;
};
orgslug: string;
onLink: (courseId: string) => void;
isLinked: boolean;
}
const CoursePreview = ({ course, orgslug, onLink, isLinked }: CoursePreviewProps) => {
const org = useOrg() as any;
const thumbnailImage = course.thumbnail_image
? getCourseThumbnailMediaDirectory(org?.org_uuid, course.course_uuid, course.thumbnail_image)
: '../empty_thumbnail.png';
return (
{/* Thumbnail */}
{/* Content */}
{course.name}
{course.description}
{/* Action Button */}
{isLinked ? (
) : (
)}
);
};
export default function LinkCourseModal({ productId, onSuccess }: LinkCourseModalProps) {
const [searchTerm, setSearchTerm] = useState('');
const org = useOrg() as any;
const session = useLHSession() as any;
const { data: courses } = useSWR(
() => org && session ? [org.slug, searchTerm, session.data?.tokens?.access_token] : null,
([orgSlug, search, token]) => getOrgCourses(orgSlug, null, token)
);
const { data: linkedCourses } = useSWR(
() => org && session ? [`/payments/${org.id}/products/${productId}/courses`, session.data?.tokens?.access_token] : null,
([_, token]) => getCoursesLinkedToProduct(org.id, productId, token)
);
const handleLinkCourse = async (courseId: string) => {
try {
const response = await linkCourseToProduct(org.id, productId, courseId, session.data?.tokens?.access_token);
if (response.success) {
mutate([`/payments/${org.id}/products`, session.data?.tokens?.access_token]);
toast.success('Course linked successfully');
onSuccess();
} else {
toast.error(response.data?.detail || 'Failed to link course');
}
} catch (error) {
toast.error('Failed to link course');
}
};
const isLinked = (courseId: string) => {
return linkedCourses?.data?.some((course: any) => course.id === courseId);
};
return (
{/* Course List */}
{courses?.map((course: any) => (
))}
{/* Empty State */}
{(!courses || courses.length === 0) && (
No courses found
)}
);
}