skip auth

This commit is contained in:
Rama Priyanto 2025-07-22 10:29:28 +07:00
parent 504101b91c
commit 5807e389b4
2 changed files with 220 additions and 206 deletions

View File

@ -13,7 +13,8 @@ type AuthStep = "login" | "email-setup" | "otp";
const AuthPage = ({ params: { locale } }: { params: { locale: string } }) => {
const [currentStep, setCurrentStep] = useState<AuthStep>("login");
const [loginCredentials, setLoginCredentials] = useState<LoginFormData | null>(null);
const [loginCredentials, setLoginCredentials] =
useState<LoginFormData | null>(null);
const { validateEmail } = useEmailValidation();
const { login } = useAuth();
@ -23,6 +24,9 @@ const AuthPage = ({ params: { locale } }: { params: { locale: string } }) => {
try {
const result = await validateEmail(data);
switch (result) {
case "skip":
handleOTPSuccess();
break;
case "setup":
setCurrentStep("email-setup");
break;
@ -112,11 +116,7 @@ const AuthPage = ({ params: { locale } }: { params: { locale: string } }) => {
}
};
return (
<AuthLayout>
{renderCurrentStep()}
</AuthLayout>
);
return <AuthLayout>{renderCurrentStep()}</AuthLayout>;
};
export default AuthPage;

View File

@ -9,7 +9,7 @@ import {
AuthState,
AuthContextType,
EmailValidationData,
OTPData
OTPData,
} from "@/types/auth";
import {
login,
@ -17,7 +17,7 @@ import {
postEmailValidation,
postSetupEmail,
verifyOTPByUsername,
doLogin
doLogin,
} from "@/service/auth";
import {
setAuthCookies,
@ -29,7 +29,7 @@ import {
showAuthError,
showAuthSuccess,
loginRateLimiter,
AUTH_CONSTANTS
AUTH_CONSTANTS,
} from "@/lib/auth-utils";
import { warning } from "@/lib/swal";
@ -46,33 +46,38 @@ export const useAuth = (): AuthContextType => {
useEffect(() => {
const checkAuth = async () => {
try {
setState(prev => ({ ...prev, loading: true }));
setState((prev) => ({ ...prev, loading: true }));
// Add logic to check if user is authenticated
// This could check for valid tokens, etc.
} catch (error) {
setState(prev => ({
setState((prev) => ({
...prev,
isAuthenticated: false,
user: null,
error: "Authentication check failed"
error: "Authentication check failed",
}));
} finally {
setState(prev => ({ ...prev, loading: false }));
setState((prev) => ({ ...prev, loading: false }));
}
};
checkAuth();
}, []);
const login = useCallback(async (credentials: LoginFormData): Promise<void> => {
const login = useCallback(
async (credentials: LoginFormData): Promise<void> => {
try {
setState(prev => ({ ...prev, loading: true, error: null }));
setState((prev) => ({ ...prev, loading: true, error: null }));
// Check rate limiting
if (!loginRateLimiter.canAttempt(credentials.username)) {
const remainingTime = loginRateLimiter.getRemainingTime(credentials.username);
const remainingTime = loginRateLimiter.getRemainingTime(
credentials.username
);
const minutes = Math.ceil(remainingTime / (60 * 1000));
throw new Error(`Too many login attempts. Please try again in ${minutes} minutes.`);
throw new Error(
`Too many login attempts. Please try again in ${minutes} minutes.`
);
}
// Attempt login
@ -137,17 +142,18 @@ export const useAuth = (): AuthContextType => {
// Navigate to appropriate dashboard
window.location.href = navigationPath;
} catch (error: any) {
const errorMessage = error?.message || "Login failed";
setState(prev => ({
setState((prev) => ({
...prev,
loading: false,
error: errorMessage
error: errorMessage,
}));
showAuthError(error, "Login failed");
}
}, [router]);
},
[router]
);
const logout = useCallback((): void => {
clearAllCookies();
@ -162,13 +168,13 @@ export const useAuth = (): AuthContextType => {
const refreshToken = useCallback(async (): Promise<void> => {
try {
setState(prev => ({ ...prev, loading: true }));
setState((prev) => ({ ...prev, loading: true }));
// Add token refresh logic here
// This would typically call an API to refresh the access token
} catch (error) {
logout();
} finally {
setState(prev => ({ ...prev, loading: false }));
setState((prev) => ({ ...prev, loading: false }));
}
}, [logout]);
@ -185,7 +191,8 @@ export const useEmailValidation = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const validateEmail = useCallback(async (credentials: LoginFormData): Promise<string> => {
const validateEmail = useCallback(
async (credentials: LoginFormData): Promise<string> => {
try {
setLoading(true);
setError(null);
@ -205,6 +212,8 @@ export const useEmailValidation = () => {
return "otp";
case "Username & password valid":
return "success";
case "Skip to login":
return "skip";
default:
return "login";
}
@ -216,7 +225,9 @@ export const useEmailValidation = () => {
} finally {
setLoading(false);
}
}, []);
},
[]
);
return {
validateEmail,
@ -230,7 +241,8 @@ export const useEmailSetup = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const setupEmail = useCallback(async (
const setupEmail = useCallback(
async (
credentials: LoginFormData,
emailData: EmailValidationData
): Promise<string> => {
@ -269,7 +281,9 @@ export const useEmailSetup = () => {
} finally {
setLoading(false);
}
}, []);
},
[]
);
return {
setupEmail,
@ -283,10 +297,8 @@ export const useOTPVerification = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const verifyOTP = useCallback(async (
username: string,
otp: string
): Promise<boolean> => {
const verifyOTP = useCallback(
async (username: string, otp: string): Promise<boolean> => {
try {
setLoading(true);
setError(null);
@ -310,7 +322,9 @@ export const useOTPVerification = () => {
} finally {
setLoading(false);
}
}, []);
},
[]
);
return {
verifyOTP,