packages-fetcher/console-fetcher-interceptor-fecs/stories/demo-default/index.tsx (83 lines of code) (raw):
/* eslint-disable no-console */
import React, {
useState,
useCallback
} from 'react';
import {
H1,
H2,
P,
List,
Button,
PrePromise
} from '@alicloud/demo-rc-elements';
import ThemeSwitcher from '@alicloud/console-base-demo-helper-theme-switcher';
import {
FetcherDemoRcFecsTip
} from '@alicloud/fetcher-demo-helpers';
import cookieGetToken from '../../src/util/cookie-get-token';
import cookieSetToken from '../../src/util/cookie-set-token';
import refreshToken from '../../src/util/refresh-token';
import PkgInfo from '../pkg-info';
import fetcher, {
fetcherNoFecs
} from '../fetcher';
function manyRefreshes(): void {
refreshToken().then(() => console.info(1));
refreshToken().then(() => console.info(2));
refreshToken().then(() => console.info(3));
refreshToken().then(() => console.info(4));
refreshToken().then(() => console.info(5));
}
export default function DemoDefault(): JSX.Element {
const [stateToken, setStateToken] = useState<string>(cookieGetToken());
const [statePromisePost, setStatePromisePost] = useState<Promise<unknown> | null>(null);
const [statePromiseGet, setStatePromiseGet] = useState<Promise<unknown> | null>(null);
const [statePromiseOpenApi, setStatePromiseOpenApi] = useState<Promise<unknown> | null>(null);
const handleClearToken = useCallback(() => {
cookieSetToken('');
setStateToken('');
}, [setStateToken]);
const handleRefreshTokenLocally = useCallback(() => {
setStateToken(cookieGetToken());
}, [setStateToken]);
const handleRefreshTokenRemotely = useCallback(() => refreshToken().then(() => {
handleRefreshTokenLocally();
}), [handleRefreshTokenLocally]);
const handleTestPost = useCallback(() => setStatePromisePost(fetcher.post('/api/console-base/product/recent/add', {
productIds: ['oss']
})), []);
const handleTestGet = useCallback(() => setStatePromiseGet(fetcher.get('/api/console-base/config')), []);
const handleTestOpenApi = useCallback(() => setStatePromiseOpenApi(fetcherNoFecs.post('/data/api.json', {
product: 'slb',
action: 'DescribeRegions'
})), []);
return <>
<ThemeSwitcher />
<PkgInfo />
<FetcherDemoRcFecsTip />
<H1>如何测试</H1>
<List>
<>如果没有 token,POST 请求会否自行 refreshToken,后会否重新请求</>
<>如果有 token,POST 请求的 body 是否含有 <code>sec_token</code>,值看下方</>
<>GET 请求不受影响</>
</List>
<P>当前 Token 值:<code>{stateToken}</code></P>
<div>
<Button onClick={handleClearToken}>clear token</Button>
<Button onClick={handleRefreshTokenLocally}>get token locally</Button>
<Button onClick={handleRefreshTokenRemotely}>refresh token remotely</Button>
</div>
<H2>POST 请求</H2>
<Button onClick={handleTestPost}>测试 POST</Button>
<PrePromise promise={statePromisePost} />
<H2>GET 不会受影响</H2>
<Button onClick={handleTestGet}>测试 GET</Button>
<PrePromise promise={statePromiseGet} />
<H2>并发刷新</H2>
<P>同时很多个 refreshToken 仅会发送一个请求</P>
<Button onClick={manyRefreshes}>一次性触发多次仅发一个请求</Button>
<H2>OpenAPI 自动转接到 FECS(因为当前不是 OneConsole)</H2>
<Button onClick={handleTestOpenApi}>OpenAPI</Button>
<PrePromise promise={statePromiseOpenApi} />
</>;
}