Merge pull request #313 from gitmotion/fix/update-login-toast-description

fix: replace "Test" with "Welcome," for login success toast
This commit is contained in:
Spotizerr
2025-08-23 21:56:52 -06:00
committed by GitHub

View File

@@ -1,14 +1,14 @@
import axios from "axios"; import axios from "axios";
import type { AxiosInstance } from "axios"; import type { AxiosInstance } from "axios";
import { toast } from "sonner"; import { toast } from "sonner";
import type { import type {
LoginRequest, LoginRequest,
RegisterRequest, RegisterRequest,
LoginResponse, LoginResponse,
AuthStatusResponse, AuthStatusResponse,
User, User,
CreateUserRequest, CreateUserRequest,
SSOStatusResponse SSOStatusResponse,
} from "@/types/auth"; } from "@/types/auth";
class AuthApiClient { class AuthApiClient {
@@ -38,7 +38,7 @@ class AuthApiClient {
} }
return config; return config;
}, },
(error) => Promise.reject(error) (error) => Promise.reject(error),
); );
// Response interceptor for error handling // Response interceptor for error handling
@@ -62,11 +62,11 @@ class AuthApiClient {
// Only clear token for auth-related endpoints // Only clear token for auth-related endpoints
const requestUrl = error.config?.url || ""; const requestUrl = error.config?.url || "";
const isAuthEndpoint = requestUrl.includes("/auth/") || requestUrl.endsWith("/auth"); const isAuthEndpoint = requestUrl.includes("/auth/") || requestUrl.endsWith("/auth");
if (isAuthEndpoint) { if (isAuthEndpoint) {
// Clear invalid token only for auth endpoints // Clear invalid token only for auth endpoints
this.clearToken(); this.clearToken();
// Only show auth error if not during initial token check // Only show auth error if not during initial token check
if (!this.isCheckingToken) { if (!this.isCheckingToken) {
toast.error("Session Expired", { toast.error("Session Expired", {
@@ -96,11 +96,12 @@ class AuthApiClient {
description: "The server did not respond in time. Please try again later.", description: "The server did not respond in time. Please try again later.",
}); });
} else { } else {
const errorMessage = error.response?.data?.detail || const errorMessage =
error.response?.data?.error || error.response?.data?.detail ||
error.message || error.response?.data?.error ||
"An unknown error occurred."; error.message ||
"An unknown error occurred.";
// Don't show toast errors during token validation // Don't show toast errors during token validation
if (!this.isCheckingToken) { if (!this.isCheckingToken) {
toast.error("API Error", { toast.error("API Error", {
@@ -109,14 +110,14 @@ class AuthApiClient {
} }
} }
return Promise.reject(error); return Promise.reject(error);
} },
); );
} }
// Enhanced token management with storage options // Enhanced token management with storage options
setToken(token: string | null, rememberMe: boolean = true) { setToken(token: string | null, rememberMe: boolean = true) {
this.token = token; this.token = token;
if (token) { if (token) {
if (rememberMe) { if (rememberMe) {
// Store in localStorage for persistence across browser sessions // Store in localStorage for persistence across browser sessions
@@ -149,16 +150,16 @@ class AuthApiClient {
// Try localStorage first (persistent) // Try localStorage first (persistent)
let token = localStorage.getItem("auth_token"); let token = localStorage.getItem("auth_token");
let isRemembered = localStorage.getItem("auth_remember") === "true"; let isRemembered = localStorage.getItem("auth_remember") === "true";
// If not found in localStorage, try sessionStorage // If not found in localStorage, try sessionStorage
if (!token) { if (!token) {
token = sessionStorage.getItem("auth_token"); token = sessionStorage.getItem("auth_token");
isRemembered = false; isRemembered = false;
} }
if (token) { if (token) {
this.token = token; this.token = token;
console.log(`Loaded ${isRemembered ? 'persistent' : 'session'} token from storage`); console.log(`Loaded ${isRemembered ? "persistent" : "session"} token from storage`);
} }
} }
@@ -166,7 +167,7 @@ class AuthApiClient {
// Preserve the remember me preference when clearing invalid tokens // Preserve the remember me preference when clearing invalid tokens
const wasRemembered = this.isRemembered(); const wasRemembered = this.isRemembered();
this.token = null; this.token = null;
if (wasRemembered) { if (wasRemembered) {
// Keep the remember preference but remove the invalid token // Keep the remember preference but remove the invalid token
localStorage.removeItem("auth_token"); localStorage.removeItem("auth_token");
@@ -196,7 +197,7 @@ class AuthApiClient {
try { try {
this.isCheckingToken = true; this.isCheckingToken = true;
const response = await this.apiClient.get<AuthStatusResponse>("/auth/status"); const response = await this.apiClient.get<AuthStatusResponse>("/auth/status");
// If the token is valid and user is authenticated // If the token is valid and user is authenticated
if (response.data.auth_enabled && response.data.authenticated && response.data.user) { if (response.data.auth_enabled && response.data.authenticated && response.data.user) {
console.log("Stored token is valid, user authenticated"); console.log("Stored token is valid, user authenticated");
@@ -224,24 +225,24 @@ class AuthApiClient {
async login(credentials: LoginRequest, rememberMe: boolean = true): Promise<LoginResponse> { async login(credentials: LoginRequest, rememberMe: boolean = true): Promise<LoginResponse> {
const response = await this.apiClient.post<LoginResponse>("/auth/login", credentials); const response = await this.apiClient.post<LoginResponse>("/auth/login", credentials);
const loginData = response.data; const loginData = response.data;
// Store the token with remember preference // Store the token with remember preference
this.setToken(loginData.access_token, rememberMe); this.setToken(loginData.access_token, rememberMe);
toast.success("Login Successful", { toast.success("Login Successful", {
description: `Test , ${loginData.user.username}!`, description: `Welcome, ${loginData.user.username}!`,
}); });
return loginData; return loginData;
} }
async register(userData: RegisterRequest): Promise<{ message: string }> { async register(userData: RegisterRequest): Promise<{ message: string }> {
const response = await this.apiClient.post("/auth/register", userData); const response = await this.apiClient.post("/auth/register", userData);
toast.success("Registration Successful", { toast.success("Registration Successful", {
description: "Account created successfully! You can now log in.", description: "Account created successfully! You can now log in.",
}); });
return response.data; return response.data;
} }
@@ -252,9 +253,9 @@ class AuthApiClient {
// Ignore logout errors - clear token anyway // Ignore logout errors - clear token anyway
console.warn("Logout request failed:", error); console.warn("Logout request failed:", error);
} }
this.clearAllAuthData(); // Changed from this.clearToken() this.clearAllAuthData(); // Changed from this.clearToken()
toast.success("Logged Out", { toast.success("Logged Out", {
description: "You have been logged out successfully.", description: "You have been logged out successfully.",
}); });
@@ -270,11 +271,11 @@ class AuthApiClient {
current_password: currentPassword, current_password: currentPassword,
new_password: newPassword, new_password: newPassword,
}); });
toast.success("Password Changed", { toast.success("Password Changed", {
description: "Your password has been updated successfully.", description: "Your password has been updated successfully.",
}); });
return response.data; return response.data;
} }
@@ -286,31 +287,31 @@ class AuthApiClient {
async deleteUser(username: string): Promise<{ message: string }> { async deleteUser(username: string): Promise<{ message: string }> {
const response = await this.apiClient.delete(`/auth/users/${username}`); const response = await this.apiClient.delete(`/auth/users/${username}`);
toast.success("User Deleted", { toast.success("User Deleted", {
description: `User ${username} has been deleted.`, description: `User ${username} has been deleted.`,
}); });
return response.data; return response.data;
} }
async updateUserRole(username: string, role: "user" | "admin"): Promise<{ message: string }> { async updateUserRole(username: string, role: "user" | "admin"): Promise<{ message: string }> {
const response = await this.apiClient.put(`/auth/users/${username}/role`, { role }); const response = await this.apiClient.put(`/auth/users/${username}/role`, { role });
toast.success("Role Updated", { toast.success("Role Updated", {
description: `User ${username} role updated to ${role}.`, description: `User ${username} role updated to ${role}.`,
}); });
return response.data; return response.data;
} }
async createUser(userData: CreateUserRequest): Promise<{ message: string }> { async createUser(userData: CreateUserRequest): Promise<{ message: string }> {
const response = await this.apiClient.post("/auth/users/create", userData); const response = await this.apiClient.post("/auth/users/create", userData);
toast.success("User Created", { toast.success("User Created", {
description: `User ${userData.username} created successfully.`, description: `User ${userData.username} created successfully.`,
}); });
return response.data; return response.data;
} }
@@ -318,11 +319,11 @@ class AuthApiClient {
const response = await this.apiClient.put(`/auth/users/${username}/password`, { const response = await this.apiClient.put(`/auth/users/${username}/password`, {
new_password: newPassword, new_password: newPassword,
}); });
toast.success("Password Reset", { toast.success("Password Reset", {
description: `Password for ${username} has been reset successfully.`, description: `Password for ${username} has been reset successfully.`,
}); });
return response.data; return response.data;
} }
@@ -336,7 +337,7 @@ class AuthApiClient {
async handleSSOToken(token: string, rememberMe: boolean = true): Promise<User> { async handleSSOToken(token: string, rememberMe: boolean = true): Promise<User> {
// Set the token and get user info // Set the token and get user info
this.setToken(token, rememberMe); this.setToken(token, rememberMe);
// Validate the token and get user data // Validate the token and get user data
const tokenValidation = await this.validateStoredToken(); const tokenValidation = await this.validateStoredToken();
if (tokenValidation.isValid && tokenValidation.userData?.user) { if (tokenValidation.isValid && tokenValidation.userData?.user) {
@@ -374,4 +375,4 @@ class AuthApiClient {
export const authApiClient = new AuthApiClient(); export const authApiClient = new AuthApiClient();
// Export the client as default for backward compatibility // Export the client as default for backward compatibility
export default authApiClient.client; export default authApiClient.client;