Files
codexbar-mobile/components/ErrorMessage.tsx
T
Space-Banane dc7e497388
CodexBar Mobile Build / build-android (push) Successful in 17m26s
CodexBar Mobile Build / release (push) Successful in 12s
Fix Codex auth import and reset credit details
# Conflicts:
#	app/(tabs)/codex.tsx
#	app/(tabs)/index.tsx
#	app/(tabs)/settings.tsx
#	hooks/useCodexUsage.ts
#	lib/api/codexApi.ts
#	package-lock.json
#	package.json
2026-07-04 18:59:56 +02:00

50 lines
1.9 KiB
TypeScript

import { View, Text } from "react-native";
const ERROR_MESSAGES: Record<string, string> = {
TOKEN_EXPIRED: "Your session token has expired. Please reconfigure.",
MISSING_ACCESS_TOKEN: "auth.json is missing the accessToken field.",
INVALID_JSON: "The selected file is not valid JSON.",
DOCUMENT_NOT_READABLE:
"The selected file could not be read. Try copying auth.json into Files or Downloads and import it again.",
NO_ORGS_FOUND: "No Claude organizations found for this session key.",
INVALID_CODEX_RESPONSE:
"Codex returned an unexpected response. The app was kept safe from invalid data.",
INVALID_CLAUDE_RESPONSE:
"Claude returned an unexpected usage response. The app was kept safe from invalid data.",
INVALID_CLAUDE_ORGS_RESPONSE:
"Claude returned an unexpected organizations response.",
UNKNOWN_ERROR: "An unknown error occurred. Try refreshing.",
};
function humanize(code: string): string {
if (code.startsWith("HTTP_ERROR_")) {
const status = code.replace("HTTP_ERROR_", "");
if (status === "429") return "Rate limited by the server. Try again shortly.";
if (status === "500" || status === "502" || status === "503")
return `Server error (${status}). The service may be down.`;
return `Unexpected server response (HTTP ${status}).`;
}
if (
code === "Network request failed" ||
code.includes("fetch") ||
code.includes("network")
) {
return "Network error. Check your internet connection and try again.";
}
return ERROR_MESSAGES[code] ?? `Unexpected error: ${code}`;
}
interface ErrorMessageProps {
message: string | null;
}
export function ErrorMessage({ message }: ErrorMessageProps) {
if (!message) return null;
return (
<View className="bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-xl px-3 py-2.5 mb-3">
<Text className="text-sm text-red-700 dark:text-red-300">{humanize(message)}</Text>
</View>
);
}