big-learning-days
unknown
jsx
a year ago
15 kB
9
Indexable
import Image from 'next/image';
import React, { useState } from 'react';
import bldLogo from '@/public/marketing/The-Big-Learning-Days.svg';
import { useRouter } from 'next/router';
import axios from 'axios';
export async function getServerSideProps(context: {
params: { id: string };
}) {
const { id } = context.params;
try {
const { data } = await axios.get(
`${process.env.NEXT_PUBLIC_BASE_API}masterclasses/${id}`,
{
headers: {
"Accept-Encoding": "gzip",
},
}
);
return {
props: {
masterClass: data.data,
},
};
} catch (err) {
return {
props: {
masterclass: {},
},
};
}
}
function BigLearningDays({ masterClass }: any) {
const router = useRouter();
const [currentStep, setCurrentStep] = useState(0);
const slotInfo = masterClass?.slots.find(
(slot: any) => slot.active === true
);
const [collectedData, setCollectedData] = useState({
experience: '',
tradingStyle: '',
phoneNumber: '',
source: router.query.source || "direct",
comment: router.query.comment || "default_comment",
masterclassSlotId: slotInfo?.id,
masterclassId: masterClass?.id,
});
async function createLead(phoneNumber: any) {
if (collectedData.masterclassSlotId != '' && collectedData.masterclassId != '') {
try {
await axios.post(`${process.env.NEXT_PUBLIC_BASE_API}leads`, {
name: "Tradewise User",
email: "default",
phone: phoneNumber,
source: collectedData.source,
comment: collectedData.comment,
masteclassSlotId: collectedData.masterclassSlotId,
masterclassId: collectedData.masterclassId,
})
}
catch (error) {
console.error(error);
}
}
}
function joinWhatsAppGroup() {
const whatsappLink = slotInfo?.whatsappGroupLink;
if (whatsappLink) {
window.location.href = whatsappLink;
} else {
alert('WhatsApp group link not available');
}
}
async function exportToExcel(phoneNumber: any) {
const formData = new FormData();
formData.append('experience', collectedData.experience);
formData.append('tradingStyle', collectedData.tradingStyle);
formData.append('phoneNumber', phoneNumber);
formData.append('source', collectedData.source as string);
formData.append('comment', collectedData.comment as string);
try {
await axios.post(process.env.NEXT_PUBLIC_GOOGLE_SHEET_BIG_LEARNING_DAYS!, formData, {
headers: { "Content-Type": "multipart/form-data" },
})
}
catch (error) {
console.error(error);
}
}
const handleExperienceSelected = (experience: string) => {
setCollectedData((prev) => ({ ...prev, experience }));
setCurrentStep(1);
};
const handleTradingStyleSelected = (tradingStyle: string) => {
setCollectedData((prev) => ({ ...prev, tradingStyle }));
setCurrentStep(2);
};
const handlePhoneNumberEntered = (phoneNumber: string) => {
setCollectedData((prev) => ({ ...prev, phoneNumber }));
createLead(phoneNumber);
exportToExcel(phoneNumber);
setCurrentStep(3);
};
const handleWhatsAppGroupJoined = () => {
joinWhatsAppGroup();
setCurrentStep(4);
};
const handleBack = () => {
if (currentStep > 0) {
setCurrentStep(currentStep - 1);
}
};
return (
<div>
{currentStep === 0 && (
<ExperienceForm onExperienceSelected={handleExperienceSelected} />
)}
{currentStep === 1 && (
<TradingStyleForm onTradingStyleSelected={handleTradingStyleSelected} />
)}
{currentStep === 2 && (
<PhoneNumberForm onPhoneNumberEntered={handlePhoneNumberEntered} onBack={handleBack} />
)}
{currentStep === 3 && (
<ConfirmationForm onWhatsAppGroupJoined={handleWhatsAppGroupJoined} onBack={handleBack} />
)}
</div>
);
}
export default BigLearningDays;
interface ExperienceFormProps {
onExperienceSelected: (experience: string) => void;
}
const ExperienceForm: React.FC<ExperienceFormProps> = ({ onExperienceSelected }) => {
const [selectedExperience, setSelectedExperience] = useState<string | null>(null);
const handleExperienceChange = (experience: string) => {
setSelectedExperience(experience);
onExperienceSelected(experience);
};
return (
<div className=" w-full max-w-md mx-auto rounded-lg flex flex-col justify-center items-center h-screen bg-[#f6f7fb] ">
<div className="h-72 max-w-md w-full bg-[#f6f7fb] flex justify-center items-center flex-col">
<Image src={bldLogo} alt="Big Learning Days Logo" width={150} height={150} priority className='relative bottom-14' />
<div className="font-bold relative bottom-14 text-xl">28<sup>th</sup> Sep to 2<sup>nd</sup> Oct</div>
<div className="w-60 text-center text-lg relative bottom-14">
Register for India’s largest learning festival.
</div>
</div>
<div className="bg-white p-2 rounded max-w-[410px] relative bottom-14 shadow-lg flex flex-col items-center justify-center">
<h2 className="text-xl font-bold text-center mb-4 mt-14 relative bottom-14 border-b-2 py-2 w-full">STEP 1</h2>
<p className="text-center mb-4 border-slate-300 p-5 relative bottom-20 w-72 text-lg">
How many years of trading experience do you have?
</p>
<div className="space-y-6 relative bottom-24 h-32 ">
<button
onClick={() => handleExperienceChange('0-1 years')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded px-4 py-3 border w-full text-lg border-blue-500 ${selectedExperience === '0-1 years' ? 'bg-blue-600 text-white' : ''
}`}
>
0 to 1 years
</button>
<button
onClick={() => handleExperienceChange('1-3 years')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded px-4 py-3 border
w-full border-blue-500 text-lg ${selectedExperience === '1-3 years' ? 'bg-blue-600 text-white' : ''
}`}
>
1 to 3 years
</button>
<button
onClick={() => handleExperienceChange('more than 3 years')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded px-4 py-3 w-full border border-blue-500 text-lg ${selectedExperience === 'more than 3 years' ? 'bg-blue-600 text-white' : ''
}`}
>
More than 3 years
</button>
</div>
</div>
</div>
);
};
interface TradingStyleFormProps {
onTradingStyleSelected: (tradingStyle: string) => void;
}
const TradingStyleForm: React.FC<TradingStyleFormProps> = ({ onTradingStyleSelected }) => {
const [selectedTradingStyle, setSelectedTradingStyle] = useState<string | null>(null);
const handleTradingStyleChange = (tradingStyle: string) => {
setSelectedTradingStyle(tradingStyle);
onTradingStyleSelected(tradingStyle);
};
return (
<div className=" w-full max-w-md mx-auto h-screen rounded-lg flex flex-col justify-center items-center bg-[#f6f7fb]">
<div className="h-72 w-full bg-[#f6f7fb] flex justify-center items-center relative bottom-14 flex-col">
<Image src={bldLogo} alt="Big Learning Days Logo" width={150} height={150} priority />
<div className="font-bold text-xl">28<sup>th</sup> Sep to 2<sup>nd</sup> Oct</div>
<div className="w-60 text-center text-lg ">
Register for India’s largest learning festival.
</div>
</div>
<div className="bg-white p-2 rounded w-full flex flex-col justify-center items-center max-w-[410px] relative bottom-16">
<h2 className="text-xl font-bold text-center mb-4 border-b-2 w-full py-2">STEP 2</h2>
<p className="text-center mb-4 text-lg">What is your Favorite Trading style?</p>
<div className="space-y-6 max-w-[410px] shadow-xl w-full my-2 mb-5">
<button
onClick={() => handleTradingStyleChange('Swing Trading')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded-lg px-4 py-3 w-full border border-blue-500 text-lg ${selectedTradingStyle === 'Swing Trading' ? 'bg-blue-600' : ''
}`}
>
Swing Trading
</button>
<button
onClick={() => handleTradingStyleChange('Intraday Trading')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded-lg px-4 py-3 w-full border border-blue-500 text-lg ${selectedTradingStyle === 'Intraday Trading' ? 'bg-blue-600' : ''
}`}
>
Intraday Trading
</button>
<button
onClick={() => handleTradingStyleChange('Forex and Commodities')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded-lg px-4 py-3 w-full border border-blue-500 text-lg ${selectedTradingStyle === 'Forex and Commodities' ? 'bg-blue-600' : ''
}`}
>
Forex and Commodities
</button>
<button
onClick={() => handleTradingStyleChange('Options Trading')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded-lg px-4 py-3 w-full border border-blue-500 text-lg ${selectedTradingStyle === 'Options Trading' ? 'bg-blue-600' : ''
}`}
>
Options Trading
</button>
<button
onClick={() => handleTradingStyleChange('Long-term Investing')}
className={`text-blue-500 active:text-white active:bg-blue-600 rounded-lg px-4 py-3 w-full border border-blue-500 text-lg ${selectedTradingStyle === 'Long-term Investing' ? 'bg-blue-600' : ''
}`}
>
Long-term Investing
</button>
</div>
</div>
</div>
);
};
interface PhoneNumberFormProps {
onPhoneNumberEntered: (phoneNumber: string) => void;
onBack: () => void;
}
const PhoneNumberForm: React.FC<PhoneNumberFormProps> = ({ onPhoneNumberEntered, onBack }) => {
const [phoneNumber, setPhoneNumber] = useState('+91 ');
const [error, setError] = useState('');
const handleNumberClick = (num: string) => {
if (num === '<-') {
setPhoneNumber((prev) => (prev.length > 3 ? prev.slice(0, -1) : prev));
} else if (num === 'Clear') {
setPhoneNumber('+91 ');
} else {
if (phoneNumber.length < 14) {
setPhoneNumber((prev) => prev + num);
}
}
};
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
if ((/^\+91 \d*$/.test(value)) && phoneNumber.length < 14) {
setPhoneNumber(value);
}
};
const handleConfirm = () => {
const updatedPhoneNumber = phoneNumber;
const regex = /^(6|7|8|9)\d{9}$/;
const testvalue = updatedPhoneNumber.split(' ')[1];
if (regex.test(testvalue)) {
onPhoneNumberEntered(phoneNumber.split(' ')[1]);
} else {
setError('Invalid number ');
console.error('Invalid number format');
}
};
const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'Clear', 0, '<-'];
return (
<div className="max-w-md w-full mx-auto h-[100dvh] overflow-y-hidden rounded-lg flex flex-col justify-center items-center bg-[#f6f7fb]">
<Image src={bldLogo} alt="Big Learning Days Logo" width={120} height={120} priority className='max-md:pt-8' />
<div className='w-full flex flex-col flex-1 border'>
<div className='px-4 bg-white'>
<h2 className="text-xl font-bold text-center mb-4 border-b-2 py-2">STEP 3</h2>
<p className="text-center mb-4">Please enter your phone number</p>
<div className="flex flex-col items-center w-full max-w-[410px]">
<input
type="text"
value={phoneNumber}
onChange={handleInputChange}
className="border rounded-lg px-4 h-[54px] w-[80%] disabled:text-black disabled:opacity-100 "
maxLength={14}
placeholder='Enter Phone Number'
disabled
required
/>
{error && <p className="text-red-500 text-sm">{error}</p>}
</div>
<div className="flex items-center justify-center mt-4 ">
<input type="checkbox" id="whatsappUpdates" className="mr-2 mb-10 rounded-4xxl" defaultChecked />
<label htmlFor="whatsappUpdates" className='text-xs text-gray-500 mb-10'>Get updates on WhatsApp</label>
</div>
</div>
<div className="grid flex-1 grid-cols-3">
{nums.map((num) => (
<button
key={num}
className={`active:text-white active:bg-blue-600 rounded-lg p-3 w-full border flex-grow text-2xl ${num === 'Clear' || num === '<-' ? 'bg-slate-300' : ''
}`}
onClick={() => handleNumberClick(num.toString())}
>
{num}
</button>
))}
</div>
<button
className="!text-white bg-green-500 active:text-white active:bg-green-600 px-4 py-6 w-full mt-14 max-w-md sticky bottom-0 text-xl font-bold"
type='submit'
onClick={() => {
if (phoneNumber?.split(' ')[1]?.length != 10) {
setError("Not a valid number");
}
else {
handleConfirm();
}
}}
>
Complete Your Registration
</button>
</div>
</div>
);
};
interface ConfirmationFormProps {
onWhatsAppGroupJoined: () => void;
onBack: () => void;
}
const ConfirmationForm: React.FC<ConfirmationFormProps> = ({ onWhatsAppGroupJoined, onBack }) => {
return (
<div className="w-full max-w-md mx-auto h-screen rounded-lg p-4 flex flex-col justify-center items-center bg-[#f6f7fb]">
<div className="h-96 max-w-[410px] bg-[#f6f7fb] flex justify-center items-center flex-col relative bottom-40">
<Image src={bldLogo} alt="Big Learning Days Logo" width={150} height={150} priority />
<div className="font-bold text-xl">28<sup>th</sup> Sep to 2<sup>nd</sup> Oct</div>
</div>
<div className="max-w-[410px] w-full relative bottom-40 bg-white">
<h2 className="text-xl font-bold text-center mb-4 border-b-2 py-3">STEP 4</h2>
<p className="text-center mb-4 p-4 text-xl">
Thank you for confirming your registration. Please join the WhatsApp group for further details.
</p>
<button
className="text-white bg-green-500 active:bg-green-600 rounded-lg px-4 py-4 w-full max-w-[410px] active:text-white text-xl "
onClick={onWhatsAppGroupJoined}
>
<Image
src={"/whatsapp-logo.png"}
alt=""
width={30}
height={30}
className="mx-1 "
/>
Join WhatsApp
</button>
</div>
</div>
);
};Editor is loading...
Leave a Comment