tachybase_todo/packages/plugins/@nocobase/plugin-api-doc/src/client/Document.tsx
被雨水过滤的空气-Rain a57c93d35b
feat: support e2e (#2624)
* chore: upgrade vitest to v0.34.3

* feat: setup NocoBase

* chore: preparing test env

* test: add a test of rigster

* refactor: rename test dir to testUtils

* chore: add tests

* chore: add ci for e2e

* chore: fix ci

* chore: avoid error in CI

* chore: add some utils for test

* chore: make more stable

* chore: should not close server in CI

* chore: add comments

* chore: change output dir

* fix: should use current branch to run tests

* chore: should request systemSettings by api in e2e

* chore: should build first in e2e CI

* chore: remove key

* chore: use execa to replace execSync

* refactor: extract test suite

* chore: add gotoPage

* chore: update uid of pageSchema

* chore: update collection name

* chore: use faker.js to generate data

* refactor: extract page config

* chore: ignore for association fields in faker

* chore: add testid

* chore: optimize action designer

* chore: associationFilter.Item designer

* chore: AssiciationFilter & BlockItem

* Revert "chore: AssiciationFilter & BlockItem"

This reverts commit b418df650e106fd0c8e23035d2f75acf60dcafe4.

* Revert "chore: associationFilter.Item designer"

This reverts commit 7aa4d35c1af7f3a780b370d8b1b44aac01697be3.

* Revert "chore: optimize action designer"

This reverts commit ff717b972ffd64f7968d565a3a84ad617ff889e2.

* chore: optimize Designer

* chore: compat with older browsers

* chore: use describe to avoid hooks is not run

* chore: add no-floating-promises to eslint rules

* chore: support argv

* chore: demo

* chore: better testId

* chore: change .e2e.ts to .test.ts

* fix(SchemaInitializer): avoid error

* refactor: move e2eUtils.ts to @nocobase/test

* fix: move e2eUtils to client

* chore: remove uselesscode

* refactor: add .env.e2e.example

* chore: optimize log

* refactor: use mockPage to replace gotoPage

* chore: update env.e2e

* chore: add APP_BASE_URL

* chore: gitigore

* test: add test related of menu

* chore: add SOCKET_PATH in env

* fix(vscode): load env when using vscode plugin
2023-09-27 20:00:17 +08:00

106 lines
2.7 KiB
TypeScript

import { css, useAPIClient, useRequest } from '@nocobase/client';
import { Select, Space, Spin, Typography } from 'antd';
import React, { useEffect, useRef, useState } from 'react';
import SwaggerUIBundle from 'swagger-ui-dist/swagger-ui-bundle';
import 'swagger-ui-dist/swagger-ui.css';
import { useTranslation } from '../locale';
const DESTINATION_URL_KEY = 'API_DOC:DESTINATION_URL_KEY';
const getUrl = () => localStorage.getItem(DESTINATION_URL_KEY);
const Documentation = () => {
const apiClient = useAPIClient();
const { t } = useTranslation();
const swaggerUIRef = useRef();
const { data: urls } = useRequest<{ data: { name: string; url: string }[] }>({ url: 'swagger:getUrls' });
const requestInterceptor = (req) => {
if (!req.headers['Authorization']) {
req.headers['Authorization'] = `Bearer ${apiClient.auth.getToken()}`;
}
return req;
};
const [destination, onDestinationChange] = useState<string>(getUrl());
useEffect(() => {
if (destination) {
localStorage.setItem(DESTINATION_URL_KEY, destination);
}
}, [destination]);
useEffect(() => {
if (!urls?.data?.length) return;
if (!destination || !urls.data.find((item) => item.url === getUrl())) {
onDestinationChange(urls.data[0].url);
}
}, [destination, urls]);
useEffect(() => {
SwaggerUIBundle({
requestInterceptor,
url: destination,
domNode: swaggerUIRef.current,
});
}, [destination]);
if (!destination) {
return <Spin />;
}
return (
<Space
direction="vertical"
style={{
width: '100%',
}}
>
<div
style={{
display: 'flex',
justifyContent: 'center',
width: '100%',
}}
>
<div
className={css`
display: flex;
align-items: center;
gap: 8px;
max-width: 1460px;
width: 100%;
padding: 16px 20px;
`}
>
<Typography.Text
style={{
whiteSpace: 'nowrap',
}}
strong
>
{t('Select a definition')}
</Typography.Text>
<Select
data-testid="antd-select"
showSearch
value={destination}
options={urls?.data}
style={{
width: '100%',
}}
fieldNames={{
label: 'name',
value: 'url',
}}
onChange={onDestinationChange}
/>
</div>
</div>
<div ref={swaggerUIRef}></div>
{/* <SwaggerUI url={destination} requestInterceptor={requestInterceptor} persistAuthorization deepLinking /> */}
</Space>
);
};
export default Documentation;