mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-01-07 11:39:01 +08:00
Eliminated the update button and related logic from the VersionInfo component in the about page. This includes removing the useRequest hook for updating, the toast notifications, and the Button component, simplifying the component to only display version information.
206 lines
7.2 KiB
TypeScript
206 lines
7.2 KiB
TypeScript
import { Card, CardBody } from '@heroui/card';
|
||
import { Image } from '@heroui/image';
|
||
import { Link } from '@heroui/link';
|
||
import { Skeleton } from '@heroui/skeleton';
|
||
import { Spinner } from '@heroui/spinner';
|
||
import { useRequest } from 'ahooks';
|
||
import { useMemo } from 'react';
|
||
import { BsTelegram, BsTencentQq } from 'react-icons/bs';
|
||
import { IoDocument } from 'react-icons/io5';
|
||
|
||
import HoverTiltedCard from '@/components/hover_titled_card';
|
||
import NapCatRepoInfo from '@/components/napcat_repo_info';
|
||
import RotatingText from '@/components/rotating_text';
|
||
|
||
import { usePreloadImages } from '@/hooks/use-preload-images';
|
||
import { useTheme } from '@/hooks/use-theme';
|
||
|
||
import logo from '@/assets/images/logo.png';
|
||
import WebUIManager from '@/controllers/webui_manager';
|
||
|
||
function VersionInfo () {
|
||
const { data, loading, error } = useRequest(WebUIManager.GetNapCatVersion);
|
||
|
||
return (
|
||
<div className='flex items-center gap-4'>
|
||
<div className='flex items-center gap-2 text-2xl font-bold'>
|
||
<div className='text-primary-500 drop-shadow-md'>NapCat</div>
|
||
{error
|
||
? (
|
||
error.message
|
||
)
|
||
: loading
|
||
? (
|
||
<Spinner size='sm' />
|
||
)
|
||
: (
|
||
<RotatingText
|
||
texts={['WebUI', data?.version ?? '']}
|
||
mainClassName='overflow-hidden flex items-center bg-primary-500 px-2 rounded-lg text-default-50 shadow-md'
|
||
staggerFrom='last'
|
||
initial={{ y: '100%' }}
|
||
animate={{ y: 0 }}
|
||
exit={{ y: '-120%' }}
|
||
staggerDuration={0.025}
|
||
splitLevelClassName='overflow-hidden'
|
||
transition={{ type: 'spring', damping: 30, stiffness: 400 }}
|
||
rotationInterval={2000}
|
||
/>
|
||
)}
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|
||
|
||
export default function AboutPage () {
|
||
const { isDark } = useTheme();
|
||
|
||
const imageUrls = useMemo(
|
||
() => [
|
||
'https://next.ossinsight.io/widgets/official/compose-recent-active-contributors/thumbnail.png?repo_id=777721566&limit=30&image_size=auto&color_scheme=light',
|
||
'https://next.ossinsight.io/widgets/official/compose-recent-active-contributors/thumbnail.png?repo_id=777721566&limit=30&image_size=auto&color_scheme=dark',
|
||
'https://next.ossinsight.io/widgets/official/compose-activity-trends/thumbnail.png?repo_id=41986369&image_size=auto&color_scheme=light',
|
||
'https://next.ossinsight.io/widgets/official/compose-activity-trends/thumbnail.png?repo_id=41986369&image_size=auto&color_scheme=dark',
|
||
],
|
||
[]
|
||
);
|
||
|
||
const { loadedUrls, isLoading } = usePreloadImages(imageUrls);
|
||
|
||
const getImageUrl = useMemo(
|
||
() => (baseUrl: string) => {
|
||
const theme = isDark ? 'dark' : 'light';
|
||
const fullUrl = baseUrl.replace(
|
||
/color_scheme=(?:light|dark)/,
|
||
`color_scheme=${theme}`
|
||
);
|
||
return isLoading ? null : loadedUrls[fullUrl] ? fullUrl : null;
|
||
},
|
||
[isDark, isLoading, loadedUrls]
|
||
);
|
||
|
||
const renderImage = useMemo(
|
||
() => (baseUrl: string, alt: string) => {
|
||
const imageUrl = getImageUrl(baseUrl);
|
||
|
||
if (!imageUrl) {
|
||
return <Skeleton className='h-16 rounded-lg' />;
|
||
}
|
||
|
||
return (
|
||
<Image
|
||
className='flex-1 pointer-events-none select-none rounded-none'
|
||
src={imageUrl}
|
||
alt={alt}
|
||
/>
|
||
);
|
||
},
|
||
[getImageUrl]
|
||
);
|
||
|
||
return (
|
||
<>
|
||
<title>关于 NapCat WebUI</title>
|
||
<section className='max-w-7xl py-8 md:py-10 px-5 mx-auto space-y-10'>
|
||
<div className='w-full flex flex-col md:flex-row gap-4'>
|
||
<div className='flex flex-col md:flex-row items-center'>
|
||
<HoverTiltedCard imageSrc={logo} overlayContent='' />
|
||
</div>
|
||
<div className='flex-1 flex flex-col gap-2 py-2'>
|
||
<VersionInfo />
|
||
<div className='space-y-1'>
|
||
<p className='font-bold text-primary-400'>NapCat 是什么?</p>
|
||
<p className='text-default-800'>
|
||
基于TypeScript构建的Bot框架,通过相应的启动器或者框架,主动调用QQ
|
||
Node模块提供给客户端的接口,实现Bot的功能.
|
||
</p>
|
||
<p className='font-bold text-primary-400'>魔法版介绍</p>
|
||
<p className='text-default-800'>
|
||
猫猫框架通过魔法的手段获得了 QQ 的发送消息、接收消息等接口。
|
||
为了方便使用,猫猫框架将通过一种名为 OneBot 的约定将你的 HTTP /
|
||
WebSocket 请求按照规范读取,
|
||
再去调用猫猫框架所获得的QQ发送接口之类的接口。
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div className='flex flex-row gap-2 flex-wrap justify-around'>
|
||
<Card
|
||
as={Link}
|
||
shadow='sm'
|
||
isPressable
|
||
isExternal
|
||
href='https://qm.qq.com/q/F9cgs1N3Mc'
|
||
>
|
||
<CardBody className='flex-row items-center gap-2'>
|
||
<span className='p-2 rounded-small bg-primary-50 text-primary-500'>
|
||
<BsTencentQq size={16} />
|
||
</span>
|
||
<span>官方社群1</span>
|
||
</CardBody>
|
||
</Card>
|
||
|
||
<Card
|
||
as={Link}
|
||
shadow='sm'
|
||
isPressable
|
||
isExternal
|
||
href='https://qm.qq.com/q/hSt0u9PVn'
|
||
>
|
||
<CardBody className='flex-row items-center gap-2'>
|
||
<span className='p-2 rounded-small bg-primary-50 text-primary-500'>
|
||
<BsTencentQq size={16} />
|
||
</span>
|
||
<span>官方社群2</span>
|
||
</CardBody>
|
||
</Card>
|
||
|
||
<Card
|
||
as={Link}
|
||
shadow='sm'
|
||
isPressable
|
||
isExternal
|
||
href='https://t.me/napcatqq'
|
||
>
|
||
<CardBody className='flex-row items-center gap-2'>
|
||
<span className='p-2 rounded-small bg-primary-50 text-primary-500'>
|
||
<BsTelegram size={16} />
|
||
</span>
|
||
<span>Telegram</span>
|
||
</CardBody>
|
||
</Card>
|
||
|
||
<Card
|
||
as={Link}
|
||
shadow='sm'
|
||
isPressable
|
||
isExternal
|
||
href='https://napcat.napneko.icu/'
|
||
>
|
||
<CardBody className='flex-row items-center gap-2'>
|
||
<span className='p-2 rounded-small bg-primary-50 text-primary-500'>
|
||
<IoDocument size={16} />
|
||
</span>
|
||
<span>使用文档</span>
|
||
</CardBody>
|
||
</Card>
|
||
</div>
|
||
<div className='flex flex-col md:flex-row md:items-start gap-4'>
|
||
<div className='w-full flex flex-col gap-4'>
|
||
{renderImage(
|
||
'https://next.ossinsight.io/widgets/official/compose-recent-active-contributors/thumbnail.png?repo_id=777721566&limit=30&image_size=auto&color_scheme=light',
|
||
'Contributors'
|
||
)}
|
||
{renderImage(
|
||
'https://next.ossinsight.io/widgets/official/compose-activity-trends/thumbnail.png?repo_id=41986369&image_size=auto&color_scheme=light',
|
||
'Activity Trends'
|
||
)}
|
||
</div>
|
||
|
||
<NapCatRepoInfo />
|
||
</div>
|
||
</section>
|
||
</>
|
||
);
|
||
}
|