api-client/packages/hoppscotch-common/src/helpers/isValidUser.ts
James George 27b817f627
feat: migrate ESLint to v9 across packages (#5773)
Co-authored-by: curiouscorrelation <curiouscorrelation@gmail.com>
2026-01-20 14:48:55 +05:30

68 lines
2.2 KiB
TypeScript

import { platform } from "~/platform"
export type ValidUserResponse = {
valid: boolean
error: string
}
export const SESSION_EXPIRED = "Session expired. Please log in again."
/**
* Attempts to refresh the authentication token
* @returns Promise resolving to a ValidUserResponse with the result
*/
const attemptTokenRefresh = async (): Promise<ValidUserResponse> => {
if (!platform.auth.refreshAuthToken)
return { valid: false, error: SESSION_EXPIRED }
try {
const refreshSuccessful = await platform.auth.refreshAuthToken()
return {
valid: refreshSuccessful,
error: refreshSuccessful ? "" : SESSION_EXPIRED,
}
} catch {
return { valid: false, error: SESSION_EXPIRED }
}
}
/**
* Validates user authentication and token validity by making an API call.
* Refreshes tokens if they are expired.
*
* This function is kept separate from `handleTokenValidation()` to enable different use cases:
* - Silent validation for conditional UI states (e.g., disabling components on token expiration)
* - Background checks without triggering user notifications
* - Custom error handling based on validation results
*
* Use `handleTokenValidation()` when you need automatic toast error notifications.
* Use `isValidUser()` for silent validation or custom error handling scenarios.
*
* @returns {Promise<ValidUserResponse>} Authentication status with user existence and token validity
*/
export const isValidUser = async (): Promise<ValidUserResponse> => {
const user = platform.auth.getCurrentUser()
// If no user is logged in, consider it valid (allows public actions)
if (!user) return { valid: true, error: "" }
try {
// If the platform provides a method to verify auth tokens, use it
if (platform.auth.verifyAuthTokens) {
const hasValidTokens = await platform.auth.verifyAuthTokens()
if (hasValidTokens) {
return { valid: true, error: "" }
}
// Try token refresh if verification failed
return attemptTokenRefresh()
}
// For platforms without token verification capability
return { valid: true, error: "" }
} catch (_error) {
// Handle errors from token verification
return attemptTokenRefresh()
}
}