I am facing problem ,when my react app is running in background in ios device, my websocket connection is breaked .It is neccessasry for my application that my socket connection should not break,Below is my code ,I have made websocket connection after my background api,it is working fine in case of andriod but fails in ios device ,what can be possible reasons for this?
import { useNavigate } from 'react-router-dom';
import { HeaderforLoginOtpSocket ,HeaderforVerifyOtpSocket,UserLinkedAccountHeader,ConsenthandleStatusCheck} from '../helper/HeaderMakerforSocket';
import { toast} from 'react-toastify';
import { LoginOtpVerify,SubmitConsent ,ConsentApprove} from '../Apiservices';
import { useMyContext } from '../../AppContext';
import { Loader } from '../helper/Loader';
import mixpanel from 'mixpanel-browser';
import OtpInput from "react-otp-input";
mixpanel.init(process.env.REACT_APP_MIXPANEL_TOKEN, { debug: true });
export default function Verifyopt({Error}) {
const [LoginConnectionData,SetLoginConnectionData]=useState();
const [one,setone]=useState("");
const [two,settwo]=useState("");
const [three,setthree]=useState("");
const [four,setfour]=useState("");
const [five,setfive]=useState("");
const [six,setsix]=useState("");
const [Pendingrequest,SetPendingRequest]=useState(false);
const [count, setCount] = useState(0);
const [time,settime]=useState(60);
const [border_style,Setstyle]=useState()
const inp1 = useRef(null);
const inp2 = useRef(null);
const inp3 = useRef(null);
const inp4 = useRef(null);
const inp5 = useRef(null);
const inp6 = useRef(null);
const numberRegex=/^-?d+$/;
// const inputRefs = [inp1,inp2,inp3,inp4,inp5,inp6];
// const numInputs = inputRefs.length;
const { Storage,SetStorage } = useMyContext();
const SubmitConsentBeforeSocketConnection=()=>{
SetPendingRequest(true);
SubmitConsent().then((response)=>{
if(response.status==200)
{
mixpanel.identify(response?.data?.user_id);
mixpanel.people.set({$name:response?.data?.user_id})
mixpanel.track("Viewed_BS_Verified_OTP", {
Platform: window.innerWidth > 991 ? "web" : (localStorage.getItem('platform')?localStorage.getItem('platform'):'M-site'),
user_type:localStorage.getItem('user_type')
});
SetPendingRequest(false);
HandleSocketConnection(response?.data);
}
}).catch((error)=>{
// console.log(error);
SetPendingRequest(false);
if(error?.response?.status==401)
{
toast.error("Your session is expired. Please try again");
setTimeout(()=>{
localStorage.clear();
window.open(process.env.REACT_APP_CLOSING_URL, "_self");
},1000)
}else{
Storage.internalservererror=true;
SetStorage(Storage);
navigate('/finalresult');
}
})
}
const [otp,setOtp]=useState('');
useEffect(() => {
// window.addEventListener("beforeunload", function (event) {
// window.opener = null;
// window.open('', '_self');
// window.close();
// });
SubmitConsentBeforeSocketConnection();
const previousPage = document.referrer;
window.history.pushState(null, null, window.location.href);
window.onpopstate = function () {
window.history.pushState(null, null, window.location.href);
}
return () => {
window.onpopstate = null;
};
}, [])
// console.log(Storage)
const HandleSocketConnection=(userData)=>{
const socket = new WebSocket(process.env.REACT_APP_WEB_SOCKET_URL);
socket.onopen = () => {
// console.log('WebSocket connection established.');
HandleMakeConnection(socket,userData);
};
socket.onmessage = (event) => {
const receivedMessage = JSON.parse(event.data);
// console.log("DATA ",receivedMessage)
};
localStorage.setItem("socket",socket);
socket.onclose = () => {
// console.log('WebSocket connection closed.');
toast.error("Your session is expired. Please try again");
setTimeout(()=>{
settime(0);
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
},1000)
};
}
const HandleMakeConnection=(Socketconnnection,userData)=>{
// console.log("sdjnsnlsdljnsd");
// const Socketconnnection=Storage.Socketconnnection;
// const userData=Storage.userData;
if(!userData)
{
setTimeout(()=>{
window.opener = null;
window.open('', '_self');
window.close();
},[2000])
}
else{
const message ={
header: HeaderforLoginOtpSocket,
payload:{
username: userData?.username,
mobileNum: userData?.mobileNum,
handleId: userData?.consentHandle},
};
const mydata=JSON.stringify(message);
Storage.Socketconnnection=Socketconnnection;
Storage.userid = userData?.username;
Storage.consentHandle = userData?.consentHandle;
Storage.mobilenumber = userData?.mobileNum;
Storage.userData=userData;
SetStorage(Storage);
Socketconnnection.send(mydata);
Socketconnnection.onmessage = (event) => {
const receivedMessage = JSON.parse(event.data);
SetLoginConnectionData(receivedMessage);
if(receivedMessage?.payload?.status=='FAILURE')
{
setTimeout(()=>{
if(receivedMessage?.payload?.message=='Consent request not in PENDING status')
{
// Storage.finalConsentApproval = true;
// SetStorage(Storage);
// navigate("/finalresult");
HandleSubmitConsentApprovaltoBackend(userData?.username,userData?.consentHandle);
}else{
navigate("/finalresult");
// window.location.href=`/?token=${localStorage.getItem('access_token')}` ;
}
},1000)
}
};
}
}
const HandleSubmitConsentApprovaltoBackend = (userid,consentHandle) => {
SetPendingRequest(true);
ConsentApprove(consentHandle, userid)
.then((response) => {
if (response.status == 200) {
if(response?.data?.status=='SUCESS')
{
SetPendingRequest(false);
Storage.finalConsentApproval = true;
Storage.consentpending=false;
SetStorage(Storage);
navigate("/finalresult");
}
else if(response?.data?.status=='FAILED')
{
SetPendingRequest(false);
Storage.finalConsentApproval = false;
Storage.consentpending=false;
SetStorage(Storage);
navigate("/finalresult");
}
else{
SetPendingRequest(false);
Storage.finalConsentApproval = false;
Storage.consentpending=true;
SetStorage(Storage);
navigate("/finalresult");
}
}
})
.catch((error) => {
navigate("/finalresult");
});
};
const handleConsentStatus = (sessionid) => {
ConsenthandleStatusCheck.sid = sessionid;
const message = {
header: ConsenthandleStatusCheck,
payload: {
handleId: Storage?.consentHandle,
},
};
const Socketconnnection = Storage?.Socketconnnection;
if(!Socketconnnection)
{
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
}
else{
Socketconnnection.onclose = () => {
localStorage.removeItem('insession');
toast.error("Your session is expired. Please try again");
setTimeout(() => {
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
}, 1000);
};
Socketconnnection.send(JSON.stringify(message));
Socketconnnection.onmessage = (event) => {
const receivedMessage = JSON.parse(event.data);
// HandleSubmitConsentApprovaltoBackend();
if(receivedMessage?.payload?.status=="SUCCESS")
{
if(receivedMessage?.payload?.handleStatus=="READY")
{
Storage.finalConsentApproval = true;
SetStorage(Storage);
navigate('/finalresult');
}
else if(receivedMessage?.payload?.handleStatus=='PENDING'){
// handleConsentStatus (sessionid);
HandleUserLinkedAccounts(sessionid);
}
else{
HandleUserLinkedAccounts(sessionid);
}
}else{
navigate('/finalresult');
}
};
}
}
const HandleUserLinkedAccounts=(sessionid)=>{
UserLinkedAccountHeader.sid=sessionid;
const message={
header:UserLinkedAccountHeader,
payload:{
userId: Storage?.userid
}
};
const Socketconnnection=Storage.Socketconnnection;
if(!Socketconnnection)
{
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
}
else{
Socketconnnection.onclose=()=>{
toast.error("Your session is expired. Please try again");
localStorage.removeItem('insession');
setTimeout(()=>{
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
},1000)
}
Socketconnnection.send(JSON.stringify(message));
Socketconnnection.onmessage = (event) => {
const receivedMessage = JSON.parse(event.data);
if(receivedMessage.payload.LinkedAccounts?.length>0)
{
// console.log("redirected");
// navigate('/selectbank');
navigate('/confirmconsent');
}
else{
navigate('/selectbank');
}
};
}
}
const HandleVerifyOtp=(otp)=>{
const message ={
header: HeaderforVerifyOtpSocket,
payload:{
otpReference:LoginConnectionData?.payload?.otpReference,
otp:otp
},
};
const mydata=JSON.stringify(message);
const Socketconnnection=Storage.Socketconnnection;
if(!Socketconnnection)
{
toast.error("Your session is expired. Please try again");
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
}
else
{
Socketconnnection.onclose=()=>{
toast.error("Your session is expired. Please try again");
localStorage.removeItem('insession');
setTimeout(()=>{
window.location.href=`/?token=${localStorage.getItem('access_token')}&platform=${localStorage.getItem('platform')}&user_type=${localStorage.getItem('user_type')}` ;
},1000)
}
SetPendingRequest(true);
Socketconnnection.send(mydata);
Socketconnnection.onmessage = (event) => {
const receivedMessage = JSON.parse(event.data);
// console.log(receivedMessage.payload.status);
Storage.sessionid=receivedMessage?.header?.sid;
// console.log(Storage);
SetStorage(Storage);
SetPendingRequest(false);
if(receivedMessage?.payload?.status=='SUCCESS')
{
localStorage.setItem('insession',true);
// console.log(receivedMessage.payload);
localStorage.setItem('sessionid',receivedMessage?.header?.sid);
handlegiveLoginOtpVerifyInfo(receivedMessage);
}
else{
setone("");
settwo("");
setthree("");
setfour("");
setfive("");
setsix("");
setOtp('');
toast.error(receivedMessage?.payload?.message);
if(receivedMessage?.payload?.message=='Maximum retries exceeded. Please re-initiate otp.')
{
settime(0);
}
}
};
}
}
const handleResend=(e)=>{
mixpanel.track("Interacted_BS_Verified_OTP", {
"Clicked on": "Re-send OTP",
Platform: window.innerWidth > 991 ? "web" : localStorage.getItem('platform')?localStorage.getItem('platform'):'M-site',
user_type:localStorage.getItem('user_type')
});
e.preventDefault();
if(time>0)
{
return ;
}
setOtp('');
settime(60);
HandleMakeConnection(Storage.Socketconnnection,Storage.userData);
}
const handlegiveLoginOtpVerifyInfo=(receivedMessage)=>{
SetPendingRequest(true);
LoginOtpVerify({data:receivedMessage}).then((response)=>{
if(response.status==200)
{
SetPendingRequest(false);
handleConsentStatus(receivedMessage?.header?.sid);
// HandleUserLinkedAccounts(receivedMessage.header.sid);
}
}).catch((error)=>{
SetPendingRequest(false);
if(error?.response?.status==401)
{
toast.error("Your session is expired. Please try again");
setTimeout(()=>{
localStorage.clear();
window.open(process.env.REACT_APP_CLOSING_URL, "_self");
},1000)
}else{
Storage.internalservererror=true;
SetStorage(Storage);
navigate('/finalresult');
}
})
}
const handlesubmit=(e)=>{
mixpanel.track("Interacted_BS_Verified_OTP", {
"Clicked on": "Verify",
Platform: window.innerWidth > 991 ? "web" : localStorage.getItem('platform')?localStorage.getItem('platform'):'M-site',
user_type:localStorage.getItem('user_type')
});
e.preventDefault();
// console.log(otp);
HandleVerifyOtp(otp);
}
const navigate=useNavigate();
useEffect(() => {
const myInterval= setInterval(handletime, 1000);
return ()=> {
clearInterval(myInterval);
};
}, [time]);
const handletime=()=>{
if(time>0)
{
settime(time-1);
}
}
const handleredirect=(e)=>{
mixpanel.track("Interacted_BS_Verified_OTP", {
"Clicked on": "T&C",
Platform: window.innerWidth > 991 ? "web" : localStorage.getItem('platform')?localStorage.getItem('platform'):'M-site',
user_type:localStorage.getItem('user_type')
});
e.preventDefault();
window.open("https://finvu.in/terms","_blank");
}
return (
<div className='verifyotp'>
{Pendingrequest && <Loader/>}
<div className='mybody'>
<div className='otppanel'>
<div className='inp'>
<p>OTP sent to your registered mobile number</p>
<OtpInput
containerStyle="otp-input"
numInputs={6}
value={otp}
inputType='number'
onChange={(value) => {
setOtp(value);
}}
renderInput={(props,index) => <input inputMode='nummeric' {...props} className={otp && otp[index] ? 'active' : ''}
autoFocus={index === 0}
/>}
/>
<div className='resend'>
<p onClick={handleResend} className={time==0?'resend':"re"}>Re-send</p>
{time>0?<p className='time'>In {time} Secs</p>:<></>}
</div>
</div>
<p className='warning'>Please <span>DO NOT</span> switch app while <br></br>reading the <span>OTP</span></p>
<button disabled={otp.length!=6} onClick={handlesubmit}> Verify</button>
</div>
</div>
)
}```