import { useMutation, useQuery } from '@tanstack/react-query'; import { ArrowRightIcon } from 'lucide-react'; import { useEffect, useState } from 'react'; import { cn } from '../../lib/classname'; import { COURSE_PURCHASE_PARAM, isLoggedIn } from '../../lib/jwt'; import { coursePriceOptions } from '../../queries/billing'; import { courseProgressOptions } from '../../queries/course-progress'; import { queryClient } from '../../stores/query-client'; import { CourseLoginPopup } from '../AuthenticationFlow/CourseLoginPopup'; import { useToast } from '../../hooks/use-toast'; import { httpPost } from '../../lib/query-http'; import { deleteUrlParam, getUrlParams } from '../../lib/browser'; export const COURSE_SLUG = 'master-sql'; type CreateCheckoutSessionBody = { courseId: string; success?: string; cancel?: string; }; type CreateCheckoutSessionResponse = { checkoutUrl: string; }; type BuyButtonProps = { variant?: 'main' | 'floating' | 'top-nav'; }; export function BuyButton(props: BuyButtonProps) { const { variant = 'main' } = props; const [isLoginPopupOpen, setIsLoginPopupOpen] = useState(false); const toast = useToast(); const { data: coursePricing, isLoading: isLoadingCourse } = useQuery( coursePriceOptions({ courseSlug: COURSE_SLUG }), queryClient, ); const { data: courseProgress, isLoading: isLoadingCourseProgress } = useQuery( courseProgressOptions(COURSE_SLUG), queryClient, ); const { mutate: createCheckoutSession, isPending: isCreatingCheckoutSession, } = useMutation( { mutationFn: (body: CreateCheckoutSessionBody) => { return httpPost( '/v1-create-checkout-session', body, ); }, onMutate: () => { toast.loading('Creating checkout session...'); }, onSuccess: (data) => { window.location.href = data.checkoutUrl; }, onError: (error) => { console.error(error); toast.error(error?.message || 'Failed to create checkout session'); }, }, queryClient, ); useEffect(() => { const urlParams = getUrlParams(); const shouldTriggerPurchase = urlParams[COURSE_PURCHASE_PARAM] === '1'; if (shouldTriggerPurchase) { deleteUrlParam(COURSE_PURCHASE_PARAM); initPurchase(); } }, []); const isLoadingPricing = isLoadingCourse || !coursePricing || isLoadingCourseProgress; const isAlreadyEnrolled = !!courseProgress?.enrolledAt; function initPurchase() { if (!isLoggedIn()) { return; } createCheckoutSession({ courseId: COURSE_SLUG, success: `/courses/sql?e=1`, cancel: `/courses/sql`, }); } function onBuyClick() { if (!isLoggedIn()) { setIsLoginPopupOpen(true); return; } const hasEnrolled = !!courseProgress?.enrolledAt; if (hasEnrolled) { window.location.href = `${import.meta.env.PUBLIC_COURSE_APP_URL}/master-sql`; return; } initPurchase(); } const courseLoginPopup = isLoginPopupOpen && ( setIsLoginPopupOpen(false)} /> ); if (variant === 'main') { return (
{courseLoginPopup} {!isLoadingPricing && !isAlreadyEnrolled && coursePricing?.isEligibleForDiscount && ( {coursePricing.regionalDiscountPercentage}% regional discount applied )}
); } if (variant === 'top-nav') { return ( ); } return (
{courseLoginPopup} {!isAlreadyEnrolled && coursePricing?.isEligibleForDiscount && ( {coursePricing.regionalDiscountPercentage}% regional discount applied )}
); }