diff --git a/src/components/profile/subscription/SubscribeModal.js b/src/components/profile/subscription/SubscribeModal.js
index dcc36cb..6c5dd33 100644
--- a/src/components/profile/subscription/SubscribeModal.js
+++ b/src/components/profile/subscription/SubscribeModal.js
@@ -18,6 +18,7 @@ import NostrIcon from '../../../../public/images/nostr.png';
import Image from 'next/image';
import RenewSubscription from '@/components/profile/subscription/RenewSubscription';
import { SelectButton } from 'primereact/selectbutton';
+import { calculateExpirationDate } from '@/constants/subscriptionPeriods';
const SubscribeModal = ({ user }) => {
const { data: session, update } = useSession();
@@ -45,13 +46,20 @@ const SubscribeModal = ({ user }) => {
if (user && user.role) {
setSubscribed(user.role.subscribed);
setSubscriptionType(user.role.subscriptionType || 'monthly');
- const subscribedAt = new Date(user.role.lastPaymentAt);
- // Calculate subscription end date based on type
- const daysToAdd = subscriptionType === 'yearly' ? 365 : 31;
- const subscribedUntil = new Date(subscribedAt.getTime() + daysToAdd * 24 * 60 * 60 * 1000);
+ // Only calculate dates if lastPaymentAt exists
+ if (user.role.lastPaymentAt) {
+ const subscribedAt = new Date(user.role.lastPaymentAt);
+
+ // Use the shared helper to calculate expiration date
+ const subscribedUntil = calculateExpirationDate(subscribedAt, subscriptionType);
+
+ setSubscribedUntil(subscribedUntil);
+ } else {
+ // Reset the subscribedUntil value if no lastPaymentAt
+ setSubscribedUntil(null);
+ }
- setSubscribedUntil(subscribedUntil);
if (user.role.subscriptionExpiredAt) {
const expiredAt = new Date(user.role.subscriptionExpiredAt);
setSubscriptionExpiredAt(expiredAt);
@@ -174,7 +182,7 @@ const SubscribeModal = ({ user }) => {
Thank you for your support 🎉
- Pay-as-you-go {user?.role?.subscriptionType || 'monthly'} subscription will renew on {subscribedUntil?.toLocaleDateString()} + Pay-as-you-go {user?.role?.subscriptionType || 'monthly'} subscription will renew on {subscribedUntil ? subscribedUntil.toLocaleDateString() : 'N/A'}
)} @@ -183,7 +191,7 @@ const SubscribeModal = ({ user }) => {Thank you for your support 🎉
- Recurring {user?.role?.subscriptionType || 'monthly'} subscription will AUTO renew on {subscribedUntil?.toLocaleDateString()} + Recurring {user?.role?.subscriptionType || 'monthly'} subscription will AUTO renew on {subscribedUntil ? subscribedUntil.toLocaleDateString() : 'N/A'}
)} diff --git a/src/constants/subscriptionPeriods.js b/src/constants/subscriptionPeriods.js new file mode 100644 index 0000000..76e5f45 --- /dev/null +++ b/src/constants/subscriptionPeriods.js @@ -0,0 +1,36 @@ +// Constants for subscription periods to maintain consistency across the application +export const SUBSCRIPTION_PERIODS = { + MONTHLY: { + DAYS: 30, + BUFFER_HOURS: 1, // Buffer time for expiration checks + }, + YEARLY: { + DAYS: 365, + BUFFER_HOURS: 1, // Buffer time for expiration checks + } +}; + +// Helper to calculate expiration date (for UI display) +export const calculateExpirationDate = (startDate, subscriptionType) => { + const periodDays = subscriptionType === 'yearly' + ? SUBSCRIPTION_PERIODS.YEARLY.DAYS + : SUBSCRIPTION_PERIODS.MONTHLY.DAYS; + + return new Date(startDate.getTime() + periodDays * 24 * 60 * 60 * 1000); +}; + +// Helper to check if subscription has expired (for backend logic) +export const hasSubscriptionExpired = (lastPaymentDate, subscriptionType) => { + if (!lastPaymentDate) return true; + + const now = new Date(); + const period = subscriptionType === 'yearly' + ? SUBSCRIPTION_PERIODS.YEARLY + : SUBSCRIPTION_PERIODS.MONTHLY; + + const expirationTime = lastPaymentDate.getTime() + + (period.DAYS * 24 * 60 * 60 * 1000) + + (period.BUFFER_HOURS * 60 * 60 * 1000); + + return now.getTime() > expirationTime; +}; \ No newline at end of file diff --git a/src/db/models/userModels.js b/src/db/models/userModels.js index dd97c4e..1f97e91 100644 --- a/src/db/models/userModels.js +++ b/src/db/models/userModels.js @@ -1,4 +1,5 @@ import prisma from '../prisma'; +import { SUBSCRIPTION_PERIODS } from '@/constants/subscriptionPeriods'; export const getAllUsers = async () => { return await prisma.user.findMany({ @@ -205,12 +206,16 @@ export const findExpiredSubscriptions = async () => { try { const now = new Date(); - // Define expiration periods + // Use the constants for expiration periods const monthlyExpiration = new Date( - now.getTime() - 30 * 24 * 60 * 60 * 1000 - 1 * 60 * 60 * 1000 + now.getTime() - + (SUBSCRIPTION_PERIODS.MONTHLY.DAYS * 24 * 60 * 60 * 1000) - + (SUBSCRIPTION_PERIODS.MONTHLY.BUFFER_HOURS * 60 * 60 * 1000) ); const yearlyExpiration = new Date( - now.getTime() - 365 * 24 * 60 * 60 * 1000 - 1 * 60 * 60 * 1000 + now.getTime() - + (SUBSCRIPTION_PERIODS.YEARLY.DAYS * 24 * 60 * 60 * 1000) - + (SUBSCRIPTION_PERIODS.YEARLY.BUFFER_HOURS * 60 * 60 * 1000) ); // Find expired subscriptions of both types