mirror of
https://gh-proxy.org/https://github.com/klinsmaya/new-api.git
synced 2026-11-09 09:57:06 +08:00
Fix v1 frontend regressions across channel forms, dashboard charts, wallet history, payment callbacks, invite links, API key groups, rate-limit errors, and usage-log scrolling. Fixes #4715 Fixes #4618 Fixes #4699 Fixes #4651 Fixes #4637 Fixes #4682 Fixes #4691 Fixes #4565 Fixes #4334
99 lines
3.3 KiB
TypeScript
Vendored
99 lines
3.3 KiB
TypeScript
Vendored
/*
|
|
Copyright (C) 2023-2026 QuantumNous
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact [email protected]
|
|
*/
|
|
import { useNavigate, useRouter } from '@tanstack/react-router'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { cn } from '@/lib/utils'
|
|
import { Button } from '@/components/ui/button'
|
|
|
|
const FEEDBACK_URL = 'https://github.com/QuantumNous/new-api/issues'
|
|
|
|
type GeneralErrorProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
minimal?: boolean
|
|
error?: unknown
|
|
}
|
|
|
|
function getHttpStatus(error: unknown): number | undefined {
|
|
if (typeof error !== 'object' || error === null) return undefined
|
|
const response = (error as Record<string, unknown>).response
|
|
if (typeof response !== 'object' || response === null) return undefined
|
|
const status = (response as Record<string, unknown>).status
|
|
return typeof status === 'number' ? status : undefined
|
|
}
|
|
|
|
export function GeneralError({
|
|
className,
|
|
minimal = false,
|
|
error,
|
|
}: GeneralErrorProps) {
|
|
const { t } = useTranslation()
|
|
const navigate = useNavigate()
|
|
const { history } = useRouter()
|
|
const status = getHttpStatus(error)
|
|
const isRateLimited = status === 429
|
|
const title = isRateLimited
|
|
? t('Too many requests')
|
|
: `${t('Oops! Something went wrong')} ${`:')`}`
|
|
const description = isRateLimited
|
|
? t('Please wait a moment before trying again.')
|
|
: t('Please try again later.')
|
|
|
|
return (
|
|
<div className={cn('h-svh w-full', className)}>
|
|
<div className='m-auto flex h-full w-full flex-col items-center justify-center gap-2'>
|
|
{!minimal && (
|
|
<h1 className='text-[7rem] leading-tight font-bold'>
|
|
{status ?? 500}
|
|
</h1>
|
|
)}
|
|
<span className='font-medium'>{title}</span>
|
|
<p className='text-muted-foreground text-center'>
|
|
{t('We apologize for the inconvenience.')} <br /> {description}
|
|
</p>
|
|
{!minimal && (
|
|
<p className='text-muted-foreground text-center text-sm'>
|
|
{t('If this keeps happening, please report it on GitHub Issues.')}
|
|
</p>
|
|
)}
|
|
{!minimal && (
|
|
<div className='mt-6 flex flex-wrap justify-center gap-4'>
|
|
<Button variant='outline' onClick={() => history.go(-1)}>
|
|
{t('Go Back')}
|
|
</Button>
|
|
<Button
|
|
variant='outline'
|
|
render={
|
|
<a
|
|
href={FEEDBACK_URL}
|
|
target='_blank'
|
|
rel='noopener noreferrer'
|
|
/>
|
|
}
|
|
>
|
|
{t('Report an issue')}
|
|
</Button>
|
|
<Button onClick={() => navigate({ to: '/' })}>
|
|
{t('Back to Home')}
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|