import { useState, useEffect } from 'react'; import { Text, Stack, Anchor, Group, Card, Image, Center, Badge, Button, rem, ActionIcon, Tooltip, } from '@mantine/core'; import { Github, FolderOpen, Copy } from 'lucide-react'; import { safeExecute } from '@/utils/logger'; import type { VersionInfo } from '@/types/electron'; import { PRODUCT_NAME } from '@/constants'; import iconUrl from '/icon.png'; export const AboutTab = () => { const [versionInfo, setVersionInfo] = useState(null); useEffect(() => { const loadVersionInfo = async () => { const info = await safeExecute( () => window.electronAPI.app.getVersionInfo(), 'Failed to load version info' ); if (info) { setVersionInfo(info); } }; loadVersionInfo(); }, []); if (!versionInfo) { return (
Loading version information...
); } const versionItems = [ { label: PRODUCT_NAME, value: versionInfo.appVersion }, { label: 'Electron', value: versionInfo.electronVersion }, { label: 'Node.js', value: versionInfo.nodeVersion }, { label: 'Chromium', value: versionInfo.chromeVersion }, { label: 'V8', value: versionInfo.v8Version }, { label: 'Operating System', value: `${versionInfo.platform} ${versionInfo.arch} (${versionInfo.osVersion})`, }, ]; const copyVersionInfo = async () => { const info = [ `${PRODUCT_NAME}: ${versionInfo.appVersion}`, `Electron: ${versionInfo.electronVersion}`, `Node.js: ${versionInfo.nodeVersion}`, `Chromium: ${versionInfo.chromeVersion}`, `V8: ${versionInfo.v8Version}`, `OS: ${versionInfo.platform} ${versionInfo.arch} (${versionInfo.osVersion})`, ].join('\n'); await safeExecute( () => navigator.clipboard.writeText(info), 'Failed to copy version info' ); }; return ( {PRODUCT_NAME}
{PRODUCT_NAME} v{versionInfo.appVersion} Run Large Language Models locally GitHub
{versionItems.map((item, index) => ( {item.label}: {item.value} ))}
); };