SME-Web/src/components/dashboard/Dashboard.tsx

192 lines
8.1 KiB
TypeScript

import React, { useEffect, useLayoutEffect } from 'react'
import SideBar from './SideBar'
import { Outlet, useNavigate } from 'react-router-dom'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from '../../store/store'
import { UserState } from '../../store/slices/userSlice'
import Loader from './Loader'
import { clearTransaction, TRANSACTION_STATUS_ENUMS } from '../../store/slices/transactionSlice'
import { resetSelDoc } from '../../store/slices/selectedDocsSlice'
import { resetSelRecipient } from '../../store/slices/selectedRecipientsSlice'
import { hideLoader, showLoader } from '../../store/slices/loaderSlice'
import { Bounce, toast } from 'react-toastify'
import SignModal from '../modal/SignModal'
import confetti from 'canvas-confetti'
import { useWindowSize } from 'react-use'
import { FaCheckCircle } from 'react-icons/fa'
import { IoClose } from 'react-icons/io5'
import CommonNav from '../CommonNav'
function Dashboard() {
const [showSideBar, setShowSideBar] = React.useState(true)
const [showConfetti, setShowConfetti] = React.useState(false)
const navigate = useNavigate();
const dispatch = useDispatch();
const user: UserState = useSelector((state: RootState) => state.user);
const globalLoader = useSelector((state: RootState) => state.loader)
const globalModalIsOpen = useSelector((state: RootState) => state.modal.isOpen)
const selectedDocuments = useSelector((state: RootState) => state.selectedDocuments)
const documentSignType = useSelector((state: RootState) => state.selectedDocuments.signType)
const transactionStatus = useSelector((state: RootState) => state.transaction.status)
// Check if cookie already exists - Redirect to Dashboard
useLayoutEffect(() => {
// if (!user.authorized) {
// window.location.href = '/login';
// return;
// }
// console.log("OUT MIC CHECK", transactionStatus, TRANSACTION_STATUS_ENUMS.TRANSACTION_SEND_SUCCESS, TRANSACTION_STATUS_ENUMS.TRANSACTION_INITIATED);
// Clear all if transaction success
if (transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_SEND_SUCCESS || transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_INITIATED || transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_SEND_FAILURE) {
console.log("IN MIC CHECK");
dispatch(resetSelDoc())
dispatch(resetSelRecipient())
dispatch(clearTransaction())
if (transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_SEND_SUCCESS) {
setShowConfetti(true)
// setTimeout(() => {
// setShowConfetti(false)
// dispatch(hideLoader())
// toast.dismiss();
// toast.info("Transaction Send Successfully!", {
// position: "bottom-right",
// autoClose: 5000,
// hideProgressBar: false,
// closeOnClick: false,
// pauseOnHover: true,
// draggable: true,
// progress: undefined,
// theme: "light",
// transition: Bounce,
// });
// }, 1000)
}
return
}
}, [])
useEffect(() => {
if (transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_SEND_SUCCESS || transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_INITIATED) return;
if (selectedDocuments === null || (Array.isArray(selectedDocuments) && !selectedDocuments.length)) {
dispatch(resetSelDoc())
}
dispatch(showLoader("Loading ..."));
if (documentSignType && transactionStatus === TRANSACTION_STATUS_ENUMS.TRANSACTION_NOT_INITIATED) {
if (documentSignType === 'self-sign') {
console.log('Self Sign');
setTimeout(() => {
navigate('/process-step-one');
}, 1000)
return
} else if (documentSignType === 'multiple-sign') {
console.log('multiple-sign');
setTimeout(() => {
navigate('/process-step-one');
}, 1000)
return
}
}
dispatch(hideLoader());
}, [documentSignType])
useEffect(() => {
if (showConfetti) {
const duration = 3000;
const end = Date.now() + duration;
const interval = setInterval(() => {
if (Date.now() > end) {
clearInterval(interval);
return;
}
confetti({
particleCount: 80, // more particles
angle: Math.random() * 360, // fire in random direction
spread: 220, // wider spread
startVelocity: 15, // more power
scalar: 1.2, // bigger pieces (default is 1)
origin: {
x: Math.random(),
y: Math.random() * 0.6,
},
zIndex: 9999,
});
}, 350); // fire every 150ms
}
}, [showConfetti]);
return (
<>
<>
{
showConfetti && (
<div className="absolute top-0 left-0 w-full h-full z-[9999] bg-white/80 backdrop-blur-sm flex items-center justify-center">
{/* <Confetti width={width} height={height} /> */}
<div className="relative bg-white bg-opacity-90 backdrop-blur-lg border border-green-200 shadow-xl rounded-md px-8 py-6 w-[90%] max-w-sm text-center animate-fade-in-up">
{/* Close Icon */}
<button
onClick={() => setShowConfetti(false)} // or whatever logic hides the modal
className="absolute top-2 right-2 text-gray-500 hover:text-gray-700"
aria-label="Close"
>
<IoClose className="text-2xl" />
</button>
{/* Success Icon */}
<FaCheckCircle className="text-green-500 text-5xl mb-4 mx-auto drop-shadow-lg" />
{/* Message */}
<h2 className="text-2xl font-semibold text-gray-800 mb-1">Transaction Successful</h2>
<p className="text-gray-600 text-sm">Your transaction has been created and saved successfully.</p>
</div>
</div>
)
}
</>
{
user?.authorized &&
<div className={`relative`}>
{/* Complet DashBoard Back Side SideBar */}
<div className={`relative w-full h-screen overflow-hidden bg-[var(--dashBoardBg)] ${(globalLoader.isLoading || globalModalIsOpen) ? 'pointer-events-none' : ''}`}>
<SideBar showSideBar={showSideBar} setShowSideBar={setShowSideBar} />
{/* On Top Main Content - START */}
<div className={`overflow-y-auto absolute ${showSideBar ? 'w-[calc(100%-250px)]' : 'w-[calc(100%-60px)]'} h-full right-0 bottom-0 overflow-hidden bg-[var(--mainViewBg)] transition-all duration-300`}>
{/* Main Content */}
<div className='px-2 py-1.5'>
<CommonNav />
<Outlet />
</div>
</div>
{/* On Top Main Content - END */}
</div>
{globalLoader.isLoading && <Loader />}
{globalModalIsOpen && <SignModal />}
</div>}
</>
)
}
export default Dashboard