import { useState } from 'react' import { ExternalLinkIcon, RefreshCcwIcon } from 'lucide-react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { formatTimestamp, formatTimestampToDate } from '@/lib/format' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Markdown } from '@/components/ui/markdown' import { SettingsSection } from '../components/settings-section' type ReleaseInfo = { tag_name: string name?: string body?: string html_url?: string published_at?: string } type UpdateCheckerSectionProps = { currentVersion?: string | null startTime?: number | null } export function UpdateCheckerSection({ currentVersion, startTime, }: UpdateCheckerSectionProps) { const { t } = useTranslation() const [checking, setChecking] = useState(false) const [dialogOpen, setDialogOpen] = useState(false) const [release, setRelease] = useState(null) const uptime = startTime ? formatTimestamp(startTime) : t('Unknown') const version = currentVersion || t('Unknown') const handleCheckUpdates = async () => { setChecking(true) try { const response = await fetch( 'https://api.github.com/repos/Calcium-Ion/new-api/releases/latest', { headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'new-api-dashboard', }, } ) if (!response.ok) { throw new Error(t('Failed to contact GitHub releases API')) } const data = (await response.json()) as ReleaseInfo if (!data?.tag_name) { throw new Error(t('Unexpected release payload')) } if (currentVersion && data.tag_name === currentVersion) { toast.success( t('You are running the latest version ({{version}}).', { version: data.tag_name, }) ) return } setRelease(data) setDialogOpen(true) } catch (error) { const message = error instanceof Error ? error.message : t('Failed to check for updates') toast.error(message) } finally { setChecking(false) } } const goToRelease = () => { if (release?.html_url) { window.open(release.html_url, '_blank', 'noopener,noreferrer') } } return ( <>
{t('Current version')}
{version}
{t('Uptime since')}
{uptime}
{release?.tag_name ? t('New version available: {{version}}', { version: release.tag_name, }) : t('Release details')} {release?.published_at && ( {t('Published')}{' '} {formatTimestampToDate( new Date(release.published_at).getTime(), 'milliseconds' )} )}
{release?.body ? ( {release.body} ) : (

{t('No release notes provided.')}

)}
{release?.html_url && ( )}
) }