import { useQuery } from '@tanstack/react-query' import { Construction } from 'lucide-react' import { useTranslation } from 'react-i18next' import { Markdown } from '@/components/ui/markdown' import { Skeleton } from '@/components/ui/skeleton' import { PublicLayout } from '@/components/layout' import { getAboutContent } from './api' function isValidUrl(value: string) { try { const url = new URL(value) return url.protocol === 'http:' || url.protocol === 'https:' } catch { return false } } function isLikelyHtml(value: string) { return /<\/?[a-z][\s\S]*>/i.test(value) } function EmptyAboutState() { const { t } = useTranslation() const currentYear = new Date().getFullYear() return (

{t('No About Content Set')}

{t( 'The administrator has not configured any about content yet. You can set it in the settings page, supporting HTML or URL.' )}

{t('New API Project Repository:')}{' '} {t('https://github.com/QuantumNous/new-api')}

{t('NewAPI')} {' '} © {currentYear}{' '} {t('QuantumNous')} {' '} {t('| Based on')}{' '} {t('One API')} {' '} © 2023{' '} {t('JustSong')}

{t('This project must be used in compliance with the')}{' '} {t('AGPL v3.0 License')} .

) } export function About() { const { t } = useTranslation() const { data, isLoading } = useQuery({ queryKey: ['about-content'], queryFn: getAboutContent, }) const rawContent = data?.data?.trim() ?? '' const hasContent = rawContent.length > 0 const isUrl = hasContent && isValidUrl(rawContent) const isHtml = hasContent && !isUrl && isLikelyHtml(rawContent) if (isLoading) { return (
) } if (!hasContent) { return ( ) } if (isUrl) { return (