2026-02-25 09:58:15 +01:00
"use client" ;
import { useSearchParams } from "next/navigation" ;
2026-02-27 15:17:57 +01:00
import type React from "react" ;
import { useEffect } from "react" ;
2026-02-25 09:58:15 +01:00
import { toast } from "sonner" ;
2026-02-25 13:00:52 +01:00
export const ErrorLayout = ({ children } : { children : React.ReactNode }) => {
2026-02-25 09:58:15 +01:00
const url = useSearchParams ();
useEffect (() => {
const error = url . get ( "error" );
if ( ! error ) return ;
const errorMessages : Record < string , string > = {
pending : "Your account is not active." ,
invalid_or_expired_token : "Password reset invalid token." ,
2026-02-25 13:00:52 +01:00
account_already_linked_to_different_user :
"An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address." ,
2026-02-27 15:17:57 +01:00
USER_NOT_FOUND : "User not found" ,
FAILED_TO_CREATE_USER : "Failed to create user" ,
FAILED_TO_CREATE_SESSION : "Failed to create session" ,
FAILED_TO_UPDATE_USER : "Failed to update user" ,
FAILED_TO_GET_SESSION : "Failed to get session" ,
INVALID_PASSWORD : "Invalid password" ,
INVALID_EMAIL : "Invalid email" ,
INVALID_EMAIL_OR_PASSWORD : "Invalid email or password" ,
INVALID_USER : "Invalid user" ,
SOCIAL_ACCOUNT_ALREADY_LINKED : "Social account already linked" ,
PROVIDER_NOT_FOUND : "Provider not found" ,
INVALID_TOKEN : "Invalid token" ,
TOKEN_EXPIRED : "Token expired" ,
ID_TOKEN_NOT_SUPPORTED : "id_token not supported" ,
FAILED_TO_GET_USER_INFO : "Failed to get user info" ,
USER_EMAIL_NOT_FOUND : "User email not found" ,
EMAIL_NOT_VERIFIED : "Email not verified" ,
PASSWORD_TOO_SHORT : "Password too short" ,
PASSWORD_TOO_LONG : "Password too long" ,
USER_ALREADY_EXISTS : "User already exists." ,
USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL :
"User already exists. Use another email." ,
EMAIL_CAN_NOT_BE_UPDATED : "Email can not be updated" ,
CREDENTIAL_ACCOUNT_NOT_FOUND : "Credential account not found" ,
SESSION_EXPIRED :
"Session expired. Re-authenticate to perform this action." ,
FAILED_TO_UNLINK_LAST_ACCOUNT : "You can't unlink your last account" ,
ACCOUNT_NOT_FOUND : "Account not found" ,
USER_ALREADY_HAS_PASSWORD :
"User already has a password. Provide that to delete the account." ,
CROSS_SITE_NAVIGATION_LOGIN_BLOCKED :
"Cross-site navigation login blocked. This request appears to be a CSRF attack." ,
VERIFICATION_EMAIL_NOT_ENABLED : "Verification email isn't enabled" ,
EMAIL_ALREADY_VERIFIED : "Email is already verified" ,
EMAIL_MISMATCH : "Email mismatch" ,
SESSION_NOT_FRESH : "Session is not fresh" ,
LINKED_ACCOUNT_ALREADY_EXISTS : "Linked account already exists" ,
INVALID_ORIGIN : "Invalid origin" ,
INVALID_CALLBACK_URL : "Invalid callbackURL" ,
INVALID_REDIRECT_URL : "Invalid redirectURL" ,
INVALID_ERROR_CALLBACK_URL : "Invalid errorCallbackURL" ,
INVALID_NEW_USER_CALLBACK_URL : "Invalid newUserCallbackURL" ,
MISSING_OR_NULL_ORIGIN : "Missing or null Origin" ,
CALLBACK_URL_REQUIRED : "callbackURL is required" ,
FAILED_TO_CREATE_VERIFICATION : "Unable to create verification" ,
FIELD_NOT_ALLOWED : "Field not allowed to be set" ,
ASYNC_VALIDATION_NOT_SUPPORTED : "Async validation is not supported" ,
VALIDATION_ERROR : "Validation Error" ,
MISSING_FIELD : "Field is required" ,
METHOD_NOT_ALLOWED_DEFER_SESSION_REQUIRED :
"POST method requires deferSessionRefresh to be enabled in session config" ,
BODY_MUST_BE_AN_OBJECT : "Body must be an object" ,
PASSWORD_ALREADY_SET : "User already has a password set" ,
Sign_up_is_disabled : "Sign up is disabled by the administrator" ,
2026-02-25 09:58:15 +01:00
};
const match = Object . entries ( errorMessages ). find (([ key ]) =>
error . includes ( key ),
);
if ( ! match ) return ;
toast . error ( match [ 1 ]);
const params = new URLSearchParams ( url . toString ());
params . delete ( "error" );
const newUrl =
2026-02-25 13:00:52 +01:00
window . location . pathname +
( params . toString () ? `? ${ params . toString () } ` : "" );
2026-02-25 09:58:15 +01:00
window . history . replaceState ({}, document . title , newUrl );
}, [ url ]);
return <>{ children }</>;
};