| import { FC, ReactNode, useCallback, useEffect, useState } from 'react'; |
| import Loading from '@gitroom/frontend/components/layout/loading'; |
| import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; |
| import { timer } from '@gitroom/helpers/utils/timer'; |
| import { useToaster } from '@gitroom/react/toaster/toaster'; |
| import { useDecisionModal } from '@gitroom/frontend/components/layout/new-modal'; |
| export const CheckPayment: FC<{ |
| check: string; |
| mutate: () => void; |
| children: ReactNode; |
| }> = (props) => { |
| if (!props.check) { |
| return <>{props.children}</>; |
| } |
| return <CheckPaymentInner {...props} />; |
| }; |
|
|
| export const CheckPaymentInner: FC<{ |
| check: string; |
| mutate: () => void; |
| children: ReactNode; |
| }> = (props) => { |
| const [showLoader, setShowLoader] = useState(true); |
| const fetch = useFetch(); |
| const toaster = useToaster(); |
| const modal = useDecisionModal(); |
|
|
| useEffect(() => { |
| if (showLoader) { |
| document.querySelector('body')?.classList.add('overflow-hidden'); |
| Array.from(document.querySelectorAll('.blurMe') || []).map((p) => |
| p.classList.add('blur-xs', 'pointer-events-none') |
| ); |
| } else { |
| document.querySelector('body')?.classList.remove('overflow-hidden'); |
| Array.from(document.querySelectorAll('.blurMe') || []).map((p) => |
| p.classList.remove('blur-xs', 'pointer-events-none') |
| ); |
| } |
| }, [showLoader]); |
|
|
| const checkSubscription = useCallback(async () => { |
| const { status } = await ( |
| await fetch('/billing/check/' + props.check) |
| ).json(); |
| if (status === 0) { |
| await timer(1000); |
| return checkSubscription(); |
| } |
| if (status === 1) { |
| modal.open({ |
| title: 'Invalid Payment', |
| onlyApprove: true, |
| approveLabel: 'OK', |
| description: |
| 'We could not validate your payment method, please try again', |
| }); |
| setShowLoader(false); |
| } |
| if (status === 2) { |
| setShowLoader(false); |
| props.mutate(); |
| } |
| }, []); |
| useEffect(() => { |
| checkSubscription(); |
| }, []); |
| if (showLoader) { |
| return ( |
| <div className="fixed bg-black/40 w-full h-full flex justify-center items-center z-[400]"> |
| <div> |
| <Loading type="spin" color="#612AD5" height={250} width={250} /> |
| </div> |
| </div> |
| ); |
| } |
| return props.children; |
| }; |
|
|