* 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
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 |