plebdevs/src/pages/subscribe.js

194 lines
8.5 KiB
JavaScript
Raw Normal View History

import React, { useState, useRef, useEffect } from 'react';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/router';
import { useToast } from '@/hooks/useToast';
import axios from 'axios';
import { Card } from 'primereact/card';
import useWindowWidth from '@/hooks/useWindowWidth';
import { Menu } from "primereact/menu";
import GenericButton from '@/components/buttons/GenericButton';
import { ProgressSpinner } from 'primereact/progressspinner';
import SubscriptionPaymentButtons from '@/components/bitcoinConnect/SubscriptionPaymentButton';
const Subscribe = () => {
const { data: session, update } = useSession();
const { showToast } = useToast();
const router = useRouter();
const windowWidth = useWindowWidth();
const [isProcessing, setIsProcessing] = useState(false);
const [subscribed, setSubscribed] = useState(false);
const [subscribedUntil, setSubscribedUntil] = useState(null);
const [subscriptionExpiredAt, setSubscriptionExpiredAt] = useState(null);
const menu = useRef(null);
const handleSubscriptionSuccess = async (paymentResponse) => {
setIsProcessing(true);
try {
const response = await axios.post('/api/subscription/create', {
paymentResponse,
});
if (response.data.success) {
showToast('success', 'Subscription successful!');
await update();
router.push('/dashboard');
} else {
showToast('error', 'Subscription failed. Please try again.');
}
} catch (error) {
console.error('Subscription error:', error);
showToast('error', 'An error occurred. Please try again.');
} finally {
setIsProcessing(false);
}
};
const handleSubscriptionError = (error) => {
console.error('Subscription error:', error);
showToast('error', 'An error occurred during subscription. Please try again.');
};
const handleRecurringSubscriptionSuccess = async (paymentResponse) => {
setIsProcessing(true);
try {
const response = await axios.post('/api/subscription/recurring', {
paymentResponse,
});
if (response.data.success) {
showToast('success', 'Recurring subscription set up successfully!');
await update();
router.push('/dashboard');
} else {
showToast('error', 'Failed to set up recurring subscription. Please try again.');
}
} catch (error) {
console.error('Recurring subscription error:', error);
showToast('error', 'An error occurred. Please try again.');
} finally {
setIsProcessing(false);
}
};
const menuItems = [
{
label: "Renew Subscription",
icon: "pi pi-bolt",
command: () => {
// Add your renew functionality here
},
},
{
label: "Schedule 1:1",
icon: "pi pi-calendar",
command: () => {
// Add your schedule functionality here
},
},
{
label: "Cancel Subscription",
icon: "pi pi-trash",
command: () => {
// Add your cancel functionality here
},
},
];
const subscriptionCardTitle = (
<div className="w-full flex flex-row justify-between items-center">
<span className="text-xl text-900 font-bold text-white">Plebdevs Subscription</span>
<i
className="pi pi-ellipsis-h text-2xlcursor-pointer hover:opacity-75"
onClick={(e) => menu.current.toggle(e)}
></i>
<Menu model={menuItems} popup ref={menu} />
</div>
);
return (
<div className="p-4">
{
windowWidth < 768 && (
<h1 className="text-3xl font-bold mb-6">Subscription Management</h1>
)
}
<Card title={subscriptionCardTitle} className="mb-6">
<p className='mb-4 text-xl'>
The plebdevs subscription is a monthly subscription that unlocks all of the paid content, grants you access to the plebdevs 1:1 calendar for tutoring, support, and mentorship, and gives you an exclusive invite to the pleblab bitcoin hackerspace community.
</p>
<p className='text-xl'>
The plebdevs subscription is Lightning only and you can subscribe a month at a time with the pay as you go option or easily setup an auto recurring monthly subscription using Nostr Wallet Connect.
</p>
<div className='flex flex-col w-fit mt-4 bg-gray-900 p-4 rounded-lg'>
<p className='text-xl pb-8'>Login to start your subscription</p>
<GenericButton label="Login" onClick={() => router.push('/auth/signin')} className='text-[#f8f8ff] w-fit' size="small" rounded icon="pi pi-user" />
</div>
</Card>
<Card title="Subscribe to PlebDevs" className="mb-6">
{isProcessing ? (
<div className="w-full flex flex-col mx-auto justify-center items-center mt-4">
<ProgressSpinner />
<span className="ml-2">Processing subscription...</span>
</div>
) : (
<div className="flex flex-col">
<h2 className="text-2xl font-semibold mb-4">Choose your subscription plan:</h2>
<div className="flex flex-col gap-4">
<Card className='bg-gray-900 w-fit'>
<h3 className="text-xl font-semibold mb-2">Monthly Subscription</h3>
<p className="mb-4">Get access to all PlebDevs features / content one month at a time.</p>
<SubscriptionPaymentButtons
onSuccess={handleSubscriptionSuccess}
onError={handleSubscriptionError}
amount={10}
currency="USD"
buttonText="Subscribe for $10/month"
oneTime={true}
/>
</Card>
<Card className='bg-gray-900 w-fit'>
<h3 className="text-xl font-semibold mb-2">Recurring Monthly Subscription</h3>
<p className="mb-4">Setup auto recurring monthly payments for uninterrupted access.</p>
<SubscriptionPaymentButtons
onSuccess={handleRecurringSubscriptionSuccess}
onError={handleSubscriptionError}
amount={10}
currency="USD"
buttonText="Set up recurring $10/month"
recurring={true}
/>
</Card>
</div>
</div>
)}
</Card>
<Card title="Subscription Benefits" className="mb-6">
<ul className="list-disc pl-6">
<li>Access to exclusive content</li>
<li>Priority support</li>
<li>Early access to new features</li>
<li>Community forums</li>
</ul>
</Card>
<Card title="Frequently Asked Questions" className="mb-6">
<div className="flex flex-col gap-4">
<div>
<h3 className="text-lg font-semibold">How does the subscription work?</h3>
<p>Our subscription provides monthly access to all PlebDevs features. You can choose between a one-time payment or a recurring subscription.</p>
</div>
<div>
<h3 className="text-lg font-semibold">Can I cancel my subscription?</h3>
<p>Yes, you can cancel your subscription at any time. Your access will remain active until the end of the current billing period.</p>
</div>
{/* Add more FAQ items as needed */}
</div>
</Card>
</div>
);
};
export default Subscribe;