import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useParams } from "react-router-dom"; import { useSubscription } from "../../hooks/useAuth"; import { formatFigure, frequencyLabel } from "../../utils/appUtils"; import { setSelfTenant } from "../../slices/localVariablesSlice"; import { error } from "pdf-lib"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { CouponDiscount } from "../../pages/Home/HomeSchema"; import SelectedPlanSkeleton from "./SelectedPlaneSkeleton"; const SelectPlan = ({ currentStep, setStepStatus, onNext }) => { const { frequency, planId } = useParams(); const [selectedFrequency, setSelectedFrequency] = useState( parseInt(frequency) ); const dispatch = useDispatch(); const client = useSelector( (store) => store.localVariables.selfTenant.details ); const [selectedPlan, setSelectedPlan] = useState(planId); const [currentPlan, setCurrentPlan] = useState(null); const [failPayment, setFailPayment] = useState(null); const { data: plans, isError, isLoading, error, refetch, isRefetching, } = useSubscription(selectedFrequency); const handleChange = (e) => { setSelectedPlan(e.target.value); }; useEffect(() => { if (!plans || plans.length === 0) return; // Prefer route param if exists, else default to first plan const matchingPlan = plans.find((p) => p.planId === planId) || plans[0]; setSelectedPlan(matchingPlan.id); setCurrentPlan(matchingPlan); // Dispatch correct plan + frequency only once data is ready dispatch( setSelfTenant({ planId: matchingPlan.id, frequency: selectedFrequency, }) ); }, [plans, selectedFrequency, planId, dispatch]); const handleNextStep = () => { if (!selectedPlan) { toast.warning("Please select a plan before continuing."); return; } dispatch( setSelfTenant({ planId: selectedPlan, frequency: selectedFrequency, }) ); setStepStatus((prev) => ({ ...prev, 2: "success" })); onNext(); }; const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(CouponDiscount) }); return (

Choose the Perfect Plan for Your Organization

Select a plan that fits your team’s needs and unlock the features that drive productivity.

setSelectedFrequency(Number(e.target.value)) } />
setSelectedFrequency(Number(e.target.value)) } />
setSelectedFrequency(Number(e.target.value)) } />
setSelectedFrequency(Number(e.target.value)) } />
{isError && (

{error?.message}

{error?.name} {isRefetching ? ( <> {" "} Retrying... ) : ( "Try to refetch" )}
)} {isLoading ? ( ) : ( <>
{plans?.map((plan) => (
))}
{selectedPlan && (
{(() => { const selected = plans?.find( (p) => p.id === selectedPlan ); if (!selected) return null; const { price, frequency, trialDays, maxUser, maxStorage, currency, features, } = selected; return ( <>
Max Users: {maxUser}
Max Storage: {maxStorage} MB
Trial Days: {trialDays}
Included Features
{features && Object.entries(features?.modules || {}) .filter(([key]) => key !== "id") .map(([key, mod]) => (
{mod.name}
))}
Support
    {features?.supports?.emailSupport && (
  • Email Support
  • )} {features?.supports?.phoneSupport && (
  • Phone Support
  • )} {features?.supports?.prioritySupport && (
  • Priority Support
  • )}
{" "}
{/* {errors.coupon && ({error.coupon.message})} */}{" "} Currently, no coupon codes are available!{" "}
Duration
{frequencyLabel(frequency, true)}
Total Price
{formatFigure( frequencyLabel( selectedFrequency, true, true )?.planDurationInInt * price, { type: "currency", currency: currency.currencyCode, } )}
); })()}
)} )}
{/* Image Section */}
image
); }; export default SelectPlan;