ApiDocsPage.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { useMemo } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { ConfigProvider, Layout } from 'antd';
  4. import SwaggerUI from 'swagger-ui-react';
  5. import 'swagger-ui-react/swagger-ui.css';
  6. import { useTheme } from '@/hooks/useTheme';
  7. import AppSidebar from '@/layouts/AppSidebar';
  8. import './ApiDocsPage.css';
  9. const basePath = window.X_UI_BASE_PATH || '';
  10. const openApiUrl = `${basePath}panel/api/openapi.json`;
  11. export default function ApiDocsPage() {
  12. const { isDark, isUltra, antdThemeConfig } = useTheme();
  13. const { t } = useTranslation();
  14. const pageClass = useMemo(() => {
  15. const classes = ['api-docs-page'];
  16. if (isDark) classes.push('is-dark');
  17. if (isUltra) classes.push('is-ultra');
  18. return classes.join(' ');
  19. }, [isDark, isUltra]);
  20. return (
  21. <ConfigProvider theme={antdThemeConfig}>
  22. <Layout className={pageClass}>
  23. <AppSidebar />
  24. <Layout className="content-shell">
  25. <Layout.Content className="content-area">
  26. <div className="docs-wrapper" role="region" aria-label={t('menu.apiDocs')}>
  27. <SwaggerUI
  28. url={openApiUrl}
  29. docExpansion="list"
  30. deepLinking={false}
  31. tryItOutEnabled
  32. persistAuthorization
  33. />
  34. </div>
  35. </Layout.Content>
  36. </Layout>
  37. </Layout>
  38. </ConfigProvider>
  39. );
  40. }