2026-02-13 12:47:25 +05:30
|
|
|
import { useSelector } from 'react-redux';
|
|
|
|
|
import { GlobalAppExpDateData } from '../../../Features/BookingScreen/BookingData/BookingData';
|
|
|
|
|
import { useNavigate } from 'react-router-dom';
|
2026-02-11 14:03:52 +05:30
|
|
|
import { ArrowUpOutlined } from '@ant-design/icons';
|
2026-02-13 12:47:25 +05:30
|
|
|
import { StoredSessionData } from '../../../Features/ThemeChange/ThemeChange';
|
|
|
|
|
import ExtendSubscriptionModal from '../../ExtentedModal/ExtendSubscriptionModal';
|
|
|
|
|
import { useDispatch } from 'react-redux';
|
|
|
|
|
import {
|
|
|
|
|
getPurchasedAppDetails,
|
|
|
|
|
postInvoice,
|
|
|
|
|
} from '../../../Features/BookingScreen/Pricing/Pricing';
|
|
|
|
|
import { sendSms } from '../../../Features/Payment/PaymentDetails/PaymentDetails';
|
|
|
|
|
import { useEffect, useState, useMemo } from 'react';
|
|
|
|
|
import { encryptObject, getSession } from '../../../Services/Others';
|
|
|
|
|
import { GenerateLogout } from '../../../Features/BrachLogin/BranchLogin';
|
|
|
|
|
import { PublicQrCodepost } from '../../../Features/ConfigMasterPage/ConfigMasterPage';
|
|
|
|
|
|
|
|
|
|
const subDirectory = import.meta.env.ENV_BASE_URL;
|
|
|
|
|
const commonDirectory = import.meta.env.ENV_COMMON_BASE_URL;
|
|
|
|
|
console.log('commonDirectory', commonDirectory);
|
|
|
|
|
const PlanExpireNotification = () => {
|
2026-02-11 14:03:52 +05:30
|
|
|
const navigate = useNavigate();
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
|
|
|
|
const AppExpDate = useSelector(GlobalAppExpDateData);
|
|
|
|
|
const SessionData = useSelector(StoredSessionData);
|
|
|
|
|
const [extendModel, setExtendModel] = useState(false);
|
2026-02-13 12:47:25 +05:30
|
|
|
const {
|
|
|
|
|
AppId,
|
|
|
|
|
UserId,
|
|
|
|
|
AppName,
|
|
|
|
|
SessionId,
|
|
|
|
|
AuthToken,
|
|
|
|
|
CompId,
|
|
|
|
|
SessionMobileNo,
|
|
|
|
|
UserName,
|
|
|
|
|
UserType,
|
|
|
|
|
} = SessionData;
|
|
|
|
|
console.log('SessionData', AppExpDate);
|
|
|
|
|
const [count, setcount] = useState(0);
|
|
|
|
|
const animations = ['example1', 'example2', 'example3'];
|
|
|
|
|
let ss = animations[count];
|
2026-02-11 14:03:52 +05:30
|
|
|
|
2026-02-13 12:47:25 +05:30
|
|
|
useEffect(() => {
|
|
|
|
|
if (
|
|
|
|
|
AppExpDate?.RemainingDays <= 7 ||
|
|
|
|
|
AppExpDate?.PlanType?.toLowerCase() === 'extend'
|
|
|
|
|
) {
|
|
|
|
|
const interval = setInterval(() => {
|
|
|
|
|
setcount((prevCount) => (prevCount >= 2 ? 0 : prevCount + 1));
|
|
|
|
|
}, 22000);
|
|
|
|
|
return () => clearInterval(interval);
|
|
|
|
|
}
|
|
|
|
|
}, [count == 2]);
|
2026-02-11 14:03:52 +05:30
|
|
|
|
|
|
|
|
// ================= DATE FORMAT =================
|
|
|
|
|
const formatDate = (dateStr) => {
|
|
|
|
|
const date = new Date(dateStr);
|
2026-02-13 12:47:25 +05:30
|
|
|
return `${String(date.getDate()).padStart(2, '0')}-${String(date.getMonth() + 1).padStart(2, '0')}-${date.getFullYear()}`;
|
2026-02-11 14:03:52 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ================= CHECK STATUS FLAGS =================
|
|
|
|
|
const isExpired = useMemo(() => {
|
|
|
|
|
return (
|
|
|
|
|
AppExpDate?.RemainingDays <= 1 &&
|
|
|
|
|
AppExpDate?.RemainingHours <= 1 &&
|
|
|
|
|
AppExpDate?.RemainingMinutes <= 1 &&
|
|
|
|
|
AppExpDate?.RemainingSeconds <= 1
|
|
|
|
|
);
|
|
|
|
|
}, [AppExpDate]);
|
|
|
|
|
|
2026-02-13 12:47:25 +05:30
|
|
|
const isExtend = useMemo(() => {
|
|
|
|
|
return AppExpDate?.PlanType?.toLowerCase() === 'extend';
|
2026-02-11 14:03:52 +05:30
|
|
|
}, [AppExpDate]);
|
|
|
|
|
|
2026-02-13 12:47:25 +05:30
|
|
|
const isExpiringToday =
|
|
|
|
|
AppExpDate?.RemainingDays < 1 && !isExpired && !isExtend;
|
|
|
|
|
const isExpiringSoon =
|
|
|
|
|
AppExpDate?.RemainingDays >= 1 &&
|
|
|
|
|
AppExpDate?.RemainingDays <= 30 &&
|
|
|
|
|
!isExtend;
|
2026-02-11 14:03:52 +05:30
|
|
|
|
|
|
|
|
// ================= AUTO OPEN EXTEND MODAL =================
|
|
|
|
|
useEffect(() => {
|
2026-02-13 12:47:25 +05:30
|
|
|
if (isExpired && !isExtend) {
|
2026-02-11 14:03:52 +05:30
|
|
|
setExtendModel(true);
|
|
|
|
|
}
|
2026-02-13 12:47:25 +05:30
|
|
|
}, [isExpired, isExtend]);
|
2026-02-11 14:03:52 +05:30
|
|
|
|
|
|
|
|
const handleCancel = () => {
|
|
|
|
|
Logout();
|
|
|
|
|
setExtendModel(false);
|
|
|
|
|
};
|
2026-02-13 12:47:25 +05:30
|
|
|
const Logout = async () => {
|
2026-02-11 14:03:52 +05:30
|
|
|
const status = 'N';
|
|
|
|
|
try {
|
|
|
|
|
const res = await dispatch(GenerateLogout({ UserId, status })).unwrap();
|
|
|
|
|
if (res?.data?.statusCode === 1) {
|
|
|
|
|
sessionStorage.clear();
|
2026-02-13 12:47:25 +05:30
|
|
|
window.location.replace(`${commonDirectory}`);
|
2026-02-11 14:03:52 +05:30
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Logout failed:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
2026-02-13 12:47:25 +05:30
|
|
|
const handlePay = async () => {
|
|
|
|
|
const response1 = await dispatch(
|
|
|
|
|
getPurchasedAppDetails({ AppId, UserId })
|
|
|
|
|
).unwrap();
|
|
|
|
|
const PurchasedDetails = response1?.data?.data;
|
|
|
|
|
let data = {
|
|
|
|
|
MN: SessionMobileNo,
|
|
|
|
|
UN: UserName,
|
|
|
|
|
UD: UserId,
|
|
|
|
|
UT: UserType,
|
|
|
|
|
CD: CompId,
|
|
|
|
|
SD: SessionId || '',
|
|
|
|
|
AU: AuthToken,
|
|
|
|
|
Plandetails: PurchasedDetails?.[0],
|
|
|
|
|
};
|
|
|
|
|
const encrypted = encryptObject(data);
|
|
|
|
|
const postData = { Url: encrypted, CreatedBy: UserId };
|
|
|
|
|
try {
|
|
|
|
|
const res = await dispatch(PublicQrCodepost(postData)).unwrap();
|
|
|
|
|
// navigate(`${commonDirectory}invoice-details`);
|
|
|
|
|
if (res?.data?.statusCode == 1) {
|
|
|
|
|
navigate(`${commonDirectory}invoice-details/${res?.data?.ReferenceNo}`);
|
|
|
|
|
setExtendModel(false);
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Error generating QR code:', error);
|
|
|
|
|
}
|
2026-02-11 14:03:52 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ================= UI BLOCKS =================
|
|
|
|
|
const ExpiredBlock = () => (
|
2026-02-13 12:47:25 +05:30
|
|
|
<div
|
|
|
|
|
className="ExpiredMessage"
|
|
|
|
|
style={{
|
|
|
|
|
backgroundColor: '#ff4d4f',
|
|
|
|
|
color: '#fff',
|
|
|
|
|
fontSize: '13px',
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
width: '100%',
|
|
|
|
|
}}
|
|
|
|
|
>
|
2026-02-11 14:03:52 +05:30
|
|
|
Subscription expired
|
2026-02-13 12:47:25 +05:30
|
|
|
<a onClick={handlePay} className="upgrdbtn">
|
2026-02-11 14:03:52 +05:30
|
|
|
RENEWAL NOW <ArrowUpOutlined />
|
|
|
|
|
</a>
|
2026-02-13 12:47:25 +05:30
|
|
|
</div>
|
2026-02-11 14:03:52 +05:30
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const ExpiringTodayBlock = () => (
|
|
|
|
|
<p>
|
|
|
|
|
Your application subscription will expire within
|
|
|
|
|
<span className="Expired">
|
2026-02-13 12:47:25 +05:30
|
|
|
{AppExpDate?.RemainingHours >= 1
|
|
|
|
|
? AppExpDate?.RemainingHours
|
|
|
|
|
: AppExpDate?.RemainingMinutes}
|
|
|
|
|
</span>{' '}
|
|
|
|
|
{AppExpDate?.RemainingHours >= 1 ? 'Hrs' : 'Min'}
|
|
|
|
|
<a onClick={handlePay} className="upgrdbtn">
|
2026-02-11 14:03:52 +05:30
|
|
|
RENEWAL NOW <ArrowUpOutlined />
|
|
|
|
|
</a>
|
|
|
|
|
</p>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const ExpiringDaysBlock = () => (
|
2026-02-13 12:47:25 +05:30
|
|
|
<p
|
|
|
|
|
style={{
|
|
|
|
|
backgroundColor: '#ff4d4f',
|
|
|
|
|
color: '#fff',
|
|
|
|
|
fontSize: '13px',
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
}}
|
|
|
|
|
>
|
2026-02-11 14:03:52 +05:30
|
|
|
Your application subscription will expire within
|
|
|
|
|
<span className="NosDays">{AppExpDate?.RemainingDays}</span> days.
|
2026-02-13 12:47:25 +05:30
|
|
|
<a onClick={handlePay} className="upgrdbtn">
|
2026-02-11 14:03:52 +05:30
|
|
|
RENEWAL NOW <ArrowUpOutlined />
|
|
|
|
|
</a>
|
|
|
|
|
</p>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// ================= RETURN =================
|
|
|
|
|
return (
|
|
|
|
|
<>
|
2026-02-13 12:47:25 +05:30
|
|
|
{/* <div className={ ss : 'dd'}> */}
|
|
|
|
|
<div className={isExtend ? 'dd' : ss} style={{ width: '100%' }}>
|
|
|
|
|
{isExtend && <ExpiredBlock />}
|
2026-02-11 14:03:52 +05:30
|
|
|
|
|
|
|
|
{isExpiringToday && <ExpiringTodayBlock />}
|
|
|
|
|
|
|
|
|
|
{isExpiringSoon && <ExpiringDaysBlock />}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{extendModel && (
|
|
|
|
|
<ExtendSubscriptionModal
|
|
|
|
|
onClose={handleCancel}
|
2026-02-13 12:47:25 +05:30
|
|
|
setExtendModel={setExtendModel}
|
|
|
|
|
// onPayNow={handlePay}
|
|
|
|
|
// onContinueWithCredits={freeExtend}
|
2026-02-11 14:03:52 +05:30
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default PlanExpireNotification;
|