auth in lottery fix on refresh

This commit is contained in:
Kakabay 2025-01-10 17:31:34 +05:00
parent 687a7f0f81
commit 0b44904874
3 changed files with 50 additions and 16 deletions

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState } from 'react'; import { useEffect, useState } from 'react';
import { useLotteryAuth } from '@/store/useLotteryAuth'; import { useLotteryAuth } from '@/store/useLotteryAuth';
import ProtectedRoute from '@/components/lottery/auth/ProtectedRoute'; import ProtectedRoute from '@/components/lottery/auth/ProtectedRoute';
import LotteryHeader from '@/components/lottery/LotteryHeader'; import LotteryHeader from '@/components/lottery/LotteryHeader';
@ -10,11 +10,28 @@ import LotteryRulesSection from '@/components/lottery/rules/LotteryRulesSection'
import LotteryCountDown from '@/components/lottery/countDown/LotteryCountDown'; import LotteryCountDown from '@/components/lottery/countDown/LotteryCountDown';
import LotteryCountDownAllert from '@/components/lottery/countDown/countDownAllert/LotteryCountDownAllert'; import LotteryCountDownAllert from '@/components/lottery/countDown/countDownAllert/LotteryCountDownAllert';
import { LotteryWinnerDataSimplified } from '@/typings/lottery/lottery.types'; import { LotteryWinnerDataSimplified } from '@/typings/lottery/lottery.types';
import { Queries } from '@/api/queries';
const LotteryPage = () => { const LotteryPage = () => {
const { lotteryData } = useLotteryAuth(); const { lotteryData, setAuth } = useLotteryAuth();
const [status, setStatus] = useState<'not-started' | 'started' | 'ended'>('not-started'); const [status, setStatus] = useState<'not-started' | 'started' | 'ended'>('not-started');
// ✅ Fetch fresh data on page load
useEffect(() => {
const phone = localStorage.getItem('lotteryPhone');
const code = localStorage.getItem('lotteryCode');
if (phone && code) {
Queries.authenticateLottery(phone, code)
.then((response) => {
setAuth(response, phone, code);
})
.catch((err) => {
console.error('Failed to fetch lottery data:', err);
});
}
}, [setAuth]);
return ( return (
<ProtectedRoute> <ProtectedRoute>
<div className="flex flex-col md:gap-[128px] gap-[80px] font-roboto md:pt-[64px] sm:pt-[48px] pt-[40px] ms:pb-[128px] pb-[80px] text-lightOnSurface"> <div className="flex flex-col md:gap-[128px] gap-[80px] font-roboto md:pt-[64px] sm:pt-[48px] pt-[40px] ms:pb-[128px] pb-[80px] text-lightOnSurface">

View File

@ -15,18 +15,30 @@ const LotteryAuthForm = () => {
const validatePhone = (value: string) => { const validatePhone = (value: string) => {
const phoneRegex = /^993\d{8}$/; const phoneRegex = /^993\d{8}$/;
return phoneRegex.test(value); const isValid = phoneRegex.test(value);
console.log('Phone Input:', value);
console.log('Regex Check Result:', isValid);
return isValid;
}; };
const validateCode = (value: string) => { const validateCode = (value: string) => {
const codeRegex = /^\d-\d{10}$/; const codeRegex = /^\d-\d{10}$/;
return codeRegex.test(value); const isValid = codeRegex.test(value);
console.log('Code Input:', value);
console.log('Regex Check Result:', isValid);
return isValid;
}; };
const handleSubmit = async (e: FormEvent) => { const handleSubmit = async (e: FormEvent) => {
e.preventDefault(); e.preventDefault();
setError(null); setError(null);
console.log('Submitting Phone:', phone);
if (!validatePhone(phone)) { if (!validatePhone(phone)) {
setError('Telefon belgisi nädogry'); setError('Telefon belgisi nädogry');
return; return;
@ -41,10 +53,14 @@ const LotteryAuthForm = () => {
try { try {
const response = await Queries.authenticateLottery(phone, code); const response = await Queries.authenticateLottery(phone, code);
setAuth(response, phone, code);
if (response.errorMessage?.length) { if (response.errorMessage) {
setError('Telefon belgisi ýa-da açar nädogry'); setError('Telefon belgisi ýa-da açar nädogry');
} else { } else {
localStorage.setItem('lotteryPhone', phone);
localStorage.setItem('lotteryCode', code);
setAuth(response, phone, code);
router.replace('/lottery'); router.replace('/lottery');
} }
} catch (err) { } catch (err) {
@ -56,9 +72,8 @@ const LotteryAuthForm = () => {
}; };
const handlePhoneChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handlePhoneChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value.replace(/\D/g, ''); // Remove non-digits const value = e.target.value.replace(/\\D/g, '');
if (value.length <= 11) { if (value.length <= 11) {
// Limit to 11 digits (993 + 8 digits)
setPhone(value); setPhone(value);
} }
}; };
@ -66,7 +81,6 @@ const LotteryAuthForm = () => {
const handleCodeChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleCodeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value; const value = e.target.value;
if (value.length <= 12) { if (value.length <= 12) {
// Limit to 12 characters (X-XXXXXXXXXX)
setCode(value); setCode(value);
} }
}; };

View File

@ -7,37 +7,40 @@ import { Queries } from '@/api/queries';
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
const router = useRouter(); const router = useRouter();
const { isAuthenticated, phone, code, setAuth } = useLotteryAuth(); const { isAuthenticated, setAuth } = useLotteryAuth();
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
useEffect(() => { useEffect(() => {
const checkAuth = async () => { const checkAuth = async () => {
// First, check if we have credentials in localStorage // ✅ Check credentials from localStorage
const phone = localStorage.getItem('lotteryPhone');
const code = localStorage.getItem('lotteryCode');
if (phone && code) { if (phone && code) {
try { try {
// Try to authenticate with stored credentials // ✅ Authenticate using stored credentials
const response = await Queries.authenticateLottery(phone, code); const response = await Queries.authenticateLottery(phone, code);
if (response.errorMessage) { if (response.errorMessage) {
// If authentication fails, redirect to the auth page
router.replace('/lottery/auth'); router.replace('/lottery/auth');
} else { } else {
// ✅ Set the authenticated state
setAuth(response, phone, code); setAuth(response, phone, code);
setIsLoading(false); setIsLoading(false);
} }
return; // Exit early if authentication successful
} catch (err) { } catch (err) {
console.error('Authentication failed:', err); console.error('Authentication failed:', err);
// Only redirect if API request fails
router.replace('/lottery/auth'); router.replace('/lottery/auth');
} }
} else { } else {
// Only redirect if no credentials found // Redirect to the auth page if no credentials are found
router.replace('/lottery/auth'); router.replace('/lottery/auth');
} }
}; };
checkAuth(); checkAuth();
}, []); }, [router, setAuth]);
// Show nothing while checking auth // Show nothing while checking auth
if (isLoading) { if (isLoading) {