82 lines
2.5 KiB
TypeScript
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'
|
|
}
|