• Handles network errors and converts them to application error format. Differentiates between connection errors, timeouts, auth failures, and server errors.

    Parameters

    • error: unknown

      The error to handle.

    Returns AppError

    The converted AppError object.

    export function handleNetworkError(error: unknown): AppError {
    console.warn("[ErrorHandling] ⚠️ Handling network error:", error);

    // Handle fetch errors and timeouts
    if (
    error instanceof TypeError &&
    (error.message.includes("fetch") || error.message.includes("network"))
    ) {
    return createError(
    ErrorType.NETWORK,
    "Unable to connect to the server. Please check your internet connection.",
    error,
    "NETWORK_UNAVAILABLE",
    ErrorRecoveryAction.CHECK_CONNECTION,
    "Please check your internet connection and try again.",
    );
    }

    // Handle API responses with error status codes
    if (
    error instanceof Response ||
    (typeof error === "object" && error !== null && "status" in error)
    ) {
    const response = error as
    | Response
    | { status: number; statusText?: string };
    const status = response.status;
    const message = "An error occurred while communicating with the server.";
    const code = "API_ERROR";

    if (status === 401 || status === 403) {
    return createError(
    ErrorType.AUTH,
    "Authentication failed. Please log in again.",
    error,
    "AUTH_FAILED",
    ErrorRecoveryAction.REFRESH_TOKEN,
    "Your session has expired. Please log in again.",
    );
    }

    if (status === 404) {
    return createError(
    ErrorType.SERVER,
    "The requested resource was not found.",
    error,
    "NOT_FOUND",
    ErrorRecoveryAction.NONE,
    "The requested resource was not found.",
    );
    }

    if (status === 429) {
    return createError(
    ErrorType.SERVER,
    "API rate limit exceeded. Please wait before trying again.",
    error,
    "RATE_LIMITED",
    ErrorRecoveryAction.WAIT_RATE_LIMIT,
    "Too many requests. Please wait a moment before retrying.",
    );
    }

    if (status >= 500) {
    return createError(
    ErrorType.SERVER,
    "The server encountered an error. Please try again in a few moments.",
    error,
    "SERVER_ERROR",
    ErrorRecoveryAction.RETRY,
    "The server encountered an error. Please try again in a few moments.",
    );
    }

    return createError(ErrorType.SERVER, message, error, code);
    }

    // For timeout errors
    if (error instanceof Error && error.name === "TimeoutError") {
    return createError(
    ErrorType.NETWORK,
    "The request timed out. Please try again.",
    error,
    "TIMEOUT",
    ErrorRecoveryAction.RETRY,
    "The request timed out. Please try again.",
    );
    }

    // For any other unknown errors
    return createError(
    ErrorType.UNKNOWN,
    "An unexpected error occurred.",
    error,
    "UNKNOWN_ERROR",
    );
    }