2026-02-10 16:35:19 +05:30
|
|
|
|
import { useEffect, useRef, useState } from 'react';
|
|
|
|
|
|
import { useDispatch } from 'react-redux';
|
|
|
|
|
|
import {
|
|
|
|
|
|
ChangeAppExpDateData,
|
|
|
|
|
|
changeHeightforExpDate,
|
|
|
|
|
|
getAppSubscriptionDate,
|
|
|
|
|
|
} from './Features/BookingScreen/BookingData/BookingData.js';
|
2026-02-11 12:45:21 +05:30
|
|
|
|
import { sendSms } from './Features/Payment/PaymentDetails/PaymentDetails.js';
|
2026-02-23 12:18:31 +05:30
|
|
|
|
import {
|
|
|
|
|
|
getPurchasedAppDetails,
|
|
|
|
|
|
postInvoice,
|
|
|
|
|
|
} from './Features/BookingScreen/Pricing/Pricing.js';
|
2026-02-11 12:45:21 +05:30
|
|
|
|
import { getSession } from './Services/Others.js';
|
|
|
|
|
|
import { useNavigate } from 'react-router-dom';
|
2026-02-23 12:18:31 +05:30
|
|
|
|
|
2026-02-10 16:35:19 +05:30
|
|
|
|
const useSubscriptionManager = (sessionData, logout) => {
|
|
|
|
|
|
const dispatch = useDispatch();
|
2026-02-11 12:45:21 +05:30
|
|
|
|
const navigate = useNavigate();
|
2026-02-10 16:35:19 +05:30
|
|
|
|
const prevRemainingDays = useRef(null);
|
|
|
|
|
|
const [remainingDays, setRemainingDays] = useState(null);
|
2026-02-11 12:45:21 +05:30
|
|
|
|
const [extendModel, setExtendModel] = useState(false);
|
|
|
|
|
|
const handleCancel = () => {
|
|
|
|
|
|
logout();
|
2026-02-23 12:18:31 +05:30
|
|
|
|
setExtendModel(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
const handlePay = () => {
|
|
|
|
|
|
setExtendModel(false);
|
|
|
|
|
|
let AppName = getSession('AppName');
|
|
|
|
|
|
navigate(`${subDirectory}PricingPage`, { state: { AppName: AppName } });
|
|
|
|
|
|
};
|
2026-02-11 12:45:21 +05:30
|
|
|
|
function formatDate(date) {
|
|
|
|
|
|
const year = date.getFullYear();
|
|
|
|
|
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
|
|
|
const day = String(date.getDate()).padStart(2, '0');
|
|
|
|
|
|
const hours = String(date.getHours()).padStart(2, '0');
|
|
|
|
|
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
|
|
|
|
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
|
|
|
|
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
|
|
|
|
|
|
|
|
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-23 12:18:31 +05:30
|
|
|
|
function addDays(dateString, days) {
|
|
|
|
|
|
// Make it ISO-safe for iOS / WebView
|
|
|
|
|
|
const isoDate = dateString.replace(' ', 'T');
|
|
|
|
|
|
const currentDate = new Date(isoDate);
|
|
|
|
|
|
|
|
|
|
|
|
currentDate.setDate(currentDate.getDate() + Number(days));
|
|
|
|
|
|
|
|
|
|
|
|
return formatDate(currentDate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ---------------- MAIN FUNCTION ----------------
|
|
|
|
|
|
const freeExtend = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const UserId = getSession('UserId');
|
|
|
|
|
|
const AppId = getSession('AppId');
|
|
|
|
|
|
// Current date
|
|
|
|
|
|
const now = new Date();
|
|
|
|
|
|
const currentDate = formatDate(now);
|
|
|
|
|
|
|
|
|
|
|
|
// 1️⃣ Get purchased app details
|
|
|
|
|
|
const response1 = await dispatch(
|
|
|
|
|
|
getPurchasedAppDetails({ AppId, UserId })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
const PurchasedDetails = response1?.data?.data;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PurchasedDetails || !PurchasedDetails.length) {
|
|
|
|
|
|
console.error('No purchased details found');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2️⃣ Prepare post data
|
|
|
|
|
|
const postData = {
|
|
|
|
|
|
UserId: UserId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
PricingId: PurchasedDetails[0]?.PricingId,
|
|
|
|
|
|
PurDate: currentDate,
|
|
|
|
|
|
NoofDays: 30,
|
|
|
|
|
|
PaymentMode: 27,
|
|
|
|
|
|
PaymentStatus: 'S',
|
|
|
|
|
|
LicenseStatus: PurchasedDetails[0]?.LicenseStatus,
|
|
|
|
|
|
Price: PurchasedDetails[0]?.Price ?? 0,
|
|
|
|
|
|
TaxId: PurchasedDetails[0]?.TaxId ?? 0,
|
|
|
|
|
|
NetPrice: PurchasedDetails[0]?.ExistingPlanNetPrice ?? 0,
|
|
|
|
|
|
ValidityStart: currentDate,
|
|
|
|
|
|
ValidityEnd: addDays(currentDate, PurchasedDetails[0]?.NoOfDays),
|
|
|
|
|
|
CreatedBy: UserId,
|
|
|
|
|
|
TaxAmount: PurchasedDetails[0]?.TaxAmount ?? 0,
|
|
|
|
|
|
MobileNo: getSession('MobileNo'),
|
|
|
|
|
|
MailId: 'ts@gmmail.com',
|
|
|
|
|
|
Type: 'FreeExtend',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 3️⃣ Post invoice
|
|
|
|
|
|
const response = await dispatch(postInvoice(postData)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
// 4️⃣ Send SMS if required
|
|
|
|
|
|
if (response?.data?.statusCode === 1 && response?.data?.SMSbody) {
|
|
|
|
|
|
await dispatch(sendSms({ body: response.data.SMSbody }));
|
|
|
|
|
|
setExtendModel(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('freeExtend error:', error);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2026-02-10 16:35:19 +05:30
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (!sessionData) return;
|
|
|
|
|
|
|
|
|
|
|
|
const fetchExpDate = async () => {
|
|
|
|
|
|
const { CompId, AppId, BranchId, UserType } = sessionData;
|
|
|
|
|
|
|
|
|
|
|
|
const res = await dispatch(
|
|
|
|
|
|
getAppSubscriptionDate({ CompId, BranchId, AppId })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
const expData = res?.data?.data?.[0];
|
|
|
|
|
|
if (!expData) return logout();
|
|
|
|
|
|
|
|
|
|
|
|
if (prevRemainingDays.current !== expData.RemainingDays) {
|
|
|
|
|
|
prevRemainingDays.current = expData.RemainingDays;
|
|
|
|
|
|
|
|
|
|
|
|
setRemainingDays(expData.RemainingDays);
|
|
|
|
|
|
dispatch(ChangeAppExpDateData(expData));
|
|
|
|
|
|
dispatch(changeHeightforExpDate(expData.RemainingDays));
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
expData.RemainingDays < 1 &&
|
|
|
|
|
|
expData.RemainingHours < 1 &&
|
|
|
|
|
|
expData.RemainingMinutes < 1 &&
|
|
|
|
|
|
expData.RemainingSeconds < 1 &&
|
|
|
|
|
|
UserType !== 'Super Admin'
|
|
|
|
|
|
) {
|
2026-02-11 18:10:44 +05:30
|
|
|
|
if (
|
2026-02-23 12:18:31 +05:30
|
|
|
|
(UserType !== 'Super Admin' || UserType !== 'Super Admin User') &&
|
|
|
|
|
|
expData?.PlanType?.toLowerCase() == 'extend expired'
|
2026-02-11 18:10:44 +05:30
|
|
|
|
) {
|
|
|
|
|
|
console.log('Subscription expired, logging out...');
|
|
|
|
|
|
alert('Subscription expired');
|
|
|
|
|
|
logout();
|
2026-02-23 12:18:31 +05:30
|
|
|
|
} else if (
|
|
|
|
|
|
(UserType !== 'Super Admin' || UserType !== 'Super Admin User') &&
|
|
|
|
|
|
expData?.PlanType?.toLowerCase() == 'plan expired'
|
2026-02-11 18:10:44 +05:30
|
|
|
|
) {
|
2026-02-23 12:18:31 +05:30
|
|
|
|
setExtendModel(true);
|
2026-02-11 18:10:44 +05:30
|
|
|
|
}
|
2026-02-10 16:35:19 +05:30
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
fetchExpDate();
|
|
|
|
|
|
const interval = setInterval(fetchExpDate, 60 * 60 * 1000);
|
|
|
|
|
|
return () => clearInterval(interval);
|
|
|
|
|
|
}, [sessionData]);
|
|
|
|
|
|
|
2026-02-23 12:18:31 +05:30
|
|
|
|
return { remainingDays, handleCancel, handlePay, freeExtend, extendModel };
|
2026-02-10 16:35:19 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export default useSubscriptionManager;
|