import { useState, useCallback } from 'react'
import { isSDKError, SDKError, SDKErrorCode } from '@runanywhere/core'
interface ErrorState {
error: SDKError | Error | null
userMessage: string | null
canRetry: boolean
}
export function useSDKError() {
const [errorState, setErrorState] = useState<ErrorState>({
error: null,
userMessage: null,
canRetry: false,
})
const handleError = useCallback((error: unknown) => {
if (isSDKError(error)) {
const canRetry = [
SDKErrorCode.networkUnavailable,
SDKErrorCode.downloadFailed,
SDKErrorCode.generationFailed,
].includes(error.code)
setErrorState({
error,
userMessage: getErrorMessage(error),
canRetry,
})
} else {
setErrorState({
error: error as Error,
userMessage: 'An unexpected error occurred.',
canRetry: false,
})
}
}, [])
const clearError = useCallback(() => {
setErrorState({ error: null, userMessage: null, canRetry: false })
}, [])
return { ...errorState, handleError, clearError }
}
function getErrorMessage(error: SDKError): string {
// Return user-friendly messages based on error code
switch (error.code) {
case SDKErrorCode.notInitialized:
return 'The app is still loading. Please wait.'
case SDKErrorCode.modelNotLoaded:
return 'The AI model is not ready yet.'
case SDKErrorCode.networkUnavailable:
return 'No internet connection.'
case SDKErrorCode.insufficientMemory:
return 'Not enough memory. Try closing other apps.'
case SDKErrorCode.insufficientStorage:
return 'Not enough storage space.'
default:
return error.recoverySuggestion || error.message
}
}