'use client' import { useState, MouseEvent, Dispatch, SetStateAction } from 'react' import PlanCards from '@/components/Plan' import { Plan, Subscription, SubscriptionState } from '@/types' import clsx from 'clsx' export const UpdateBillingLink = ({ subscription, elementType }: { subscription: SubscriptionState, elementType?: string } ) => { const [isMutating, setIsMutating] = useState(false) async function openUpdateModal(e: MouseEvent) { e.preventDefault() setIsMutating(true) /* Send request */ const res = await fetch(`/api/subscriptions/${subscription?.id}`) const result = await res.json() if (result.error) { alert(result.message) setIsMutating(false) } else { LemonSqueezy.Url.Open(result.subscription.update_billing_url) setIsMutating(false) } } if (elementType == 'button') { return ( Update your payment method ) } else { return ( Update your payment method ) } } export const CancelLink = ({ subscription, setSubscription }: { subscription: SubscriptionState, setSubscription: Dispatch> } ) => { const [isMutating, setIsMutating] = useState(false) async function handleCancel(e: MouseEvent) { e.preventDefault() if (confirm(`Please confirm you want to cancel your subscription.`)) { setIsMutating(true) /* Send request */ const res = await fetch(`/api/subscriptions/${subscription?.id}`, { method: 'POST', body: JSON.stringify({ action: 'cancel' }) }) const result = await res.json() if (result.error) { alert(result.message) setIsMutating(false) } else { setSubscription({ ...subscription, status: result['subscription']['status'], expiryDate: result['subscription']['ends_at'], }) alert('Your subscription has been cancelled.') } } } return ( Cancel ) } export const ResumeButton = ({ subscription, setSubscription }: { subscription: SubscriptionState, setSubscription: Dispatch> } ) => { const [isMutating, setIsMutating] = useState(false) const resumeSubscription = async (e: MouseEvent) => { e.preventDefault() if (confirm(`Please confirm you want to resume your subscription. You will be charged the regular subscription fee.`)) { setIsMutating(true) /* Send request */ const res = await fetch(`/api/subscriptions/${subscription?.id}`, { method: 'POST', body: JSON.stringify({ action: 'resume' }) }) const result = await res.json() if (result.error) { alert(result.message) setIsMutating(false) } else { setSubscription({ ...subscription, status: result['subscription']['status'], renewalDate: result['subscription']['renews_at'], }) alert('Your subscription is now active again!.') } } } return ( Resume your subscription ) } export const PauseLink = ({ subscription, setSubscription }: { subscription: SubscriptionState, setSubscription: Dispatch> } ) => { const [isMutating, setIsMutating] = useState(false) async function handlePause(e: MouseEvent) { e.preventDefault() if (confirm(`Please confirm you want to pause your subscription.`)) { setIsMutating(true) /* Send request */ const res = await fetch(`/api/subscriptions/${subscription?.id}`, { method: 'POST', body: JSON.stringify({ action: 'pause' }) }) const result = await res.json() if (result.error) { alert(result.message) setIsMutating(false) } else { setSubscription({ ...subscription, status: result['subscription']['status'], unpauseDate: result['subscription']['resumes_at'], }) alert('Your subscription has been paused.') } } } return ( Pause payments ) } export const UnpauseButton = ({ subscription, setSubscription }: { subscription: SubscriptionState, setSubscription: Dispatch> } ) => { const [isMutating, setIsMutating] = useState(false) const unpauseSubscription = async (e: MouseEvent) => { e.preventDefault() if (confirm(`Please confirm you want to unpause your subscription. Your payments will reactivate on their original schedule.`)) { setIsMutating(true) /* Send request */ const res = await fetch(`/api/subscriptions/${subscription?.id}`, { method: 'POST', body: JSON.stringify({ action: 'unpause' }) }) const result = await res.json() if (result.error) { alert(result.message) setIsMutating(false) } else { setSubscription({ ...subscription, status: result['subscription']['status'], renewalDate: result['subscription']['renews_at'], }) alert('Your subscription is now active again!') } } } return ( Unpause your subscription ) } export const PlansComponent = ({ plans, sub }: { plans: Plan[], sub: Subscription } ) => { const [subscription, setSubscription] = useState(() => { if (sub) { return { id: sub.lemonSqueezyId, planName: sub.plan?.variantName, planInterval: sub.plan?.interval, productId: sub.plan?.productId, variantId: sub.plan?.variantId, status: sub.status, renewalDate: sub.renewsAt, trialEndDate: sub.trialEndsAt, expiryDate: sub.endsAt, } } else { return undefined } }) return ( ) }