Midtrans-Middleware/src/lib/errorMessages.ts

82 lines
2.5 KiB
TypeScript

import type { AxiosError } from 'axios'
/**
* Maps technical error responses to user-friendly messages in Bahasa Indonesia
* for non-tech-savvy users (ibu-ibu awam)
*/
export function mapErrorToUserMessage(error: unknown): string {
// Handle AxiosError
if (error && typeof error === 'object' && 'response' in error) {
const axiosError = error as AxiosError
const status = axiosError.response?.status
// HTTP 409 - Conflict (VA/QR/Code already created)
if (status === 409) {
return 'Kode pembayaran Anda sudah dibuat! Silakan gunakan kode yang sudah ada.'
}
// HTTP 404 - Not Found
if (status === 404) {
return 'Terjadi kesalahan. Silakan coba lagi.'
}
// HTTP 500 - Internal Server Error
if (status === 500) {
return 'Terjadi kesalahan server. Silakan coba lagi nanti.'
}
// HTTP 503 - Service Unavailable
if (status === 503) {
return 'Layanan sedang sibuk. Silakan coba lagi dalam beberapa saat.'
}
// Network error (no response)
if (axiosError.message === 'Network Error' || !axiosError.response) {
return 'Tidak dapat terhubung ke server. Periksa koneksi internet Anda.'
}
// Try to get message from response data
const responseMessage = (axiosError.response?.data as any)?.message
if (typeof responseMessage === 'string' && responseMessage.length > 0) {
// If it's already in Indonesian, use it
if (/[a-zA-Z]/.test(responseMessage) === false) {
return responseMessage
}
}
}
// Handle Error object
if (error instanceof Error) {
// Network errors
if (error.message.includes('Network') || error.message.includes('network')) {
return 'Tidak dapat terhubung ke server. Periksa koneksi internet Anda.'
}
// Timeout errors
if (error.message.includes('timeout') || error.message.includes('Timeout')) {
return 'Permintaan memakan waktu terlalu lama. Silakan coba lagi.'
}
}
// Default fallback message
return 'Terjadi kesalahan. Silakan coba lagi.'
}
/**
* Gets recovery action suggestion based on error type
*/
export function getErrorRecoveryAction(error: unknown): 'retry' | 'view-existing' | 'back' {
if (error && typeof error === 'object' && 'response' in error) {
const axiosError = error as AxiosError
const status = axiosError.response?.status
// HTTP 409 - Conflict (already exists) → view existing
if (status === 409) {
return 'view-existing'
}
}
// Default: allow retry
return 'retry'
}