packages-fetcher/fetcher-interceptor-merger/stories/demo-default/index.tsx (139 lines of code) (raw):
import React, {
useState,
useCallback,
useEffect
} from 'react';
import {
H1,
Flex,
Button,
InputText,
InputTextarea,
InputSwitch,
PrePromise,
CodeViewerTs
} from '@alicloud/demo-rc-elements';
import ThemeSwitcher from '@alicloud/console-base-demo-helper-theme-switcher';
import {
FetcherMergerOptions
} from '../../src';
import PkgInfo from '../pkg-info';
import fetcher from '../fetcher';
import MergerStorage from '../merger-storage';
function getJsonFromString(str: string): Record<string, unknown> | null {
try {
const o = JSON.parse(str);
if (typeof o === 'object') {
return o;
}
} catch (err) {
// ignore
}
return null;
}
function getMerger(enabled: boolean, key: string): FetcherMergerOptions | boolean {
if (enabled) {
if (key) {
return {
key
};
}
return true;
}
return false;
}
function cleanJson(o: unknown): string | undefined {
return JSON.stringify(o)?.replace(/"([^"]+)":/g, '$1:');
}
export default function DemoDefault(): JSX.Element {
const [stateSequence, setStateSequence] = useState<number>(1); // 快速点击 fetch 测试顺序是否按原样
const [stateUrl, setStateUrl] = useState<string>('https://oneapi.alibaba-inc.com/mock/boshit/success');
const [stateMethod, setStateMethod] = useState<string>('get');
const [stateMergerEnabled, setStateMergerEnabled] = useState<boolean>(true);
const [stateMergerKey, setStateMergerKey] = useState<string>('');
const [stateParams, setStateParams] = useState<null | Record<string, unknown>>(null);
const [stateBody, setStateBody] = useState<null | Record<string, unknown>>(null);
const [stateJsCode, setStateJsCode] = useState<string>('fetch()');
const [statePromise, setStatePromise] = useState<Promise<unknown> | null>(null);
const handleParamsChange = useCallback((value: string): void => {
setStateParams(getJsonFromString(value));
}, []);
const handleBodyChange = useCallback((value: string): void => {
setStateBody(getJsonFromString(value));
}, []);
const handleFetch = useCallback(() => {
setStatePromise(fetcher.request({
url: stateUrl,
method: stateMethod,
params: stateParams,
body: stateBody,
merger: getMerger(stateMergerEnabled, stateMergerKey)
}).then((o: unknown) => {
console.info(stateSequence, o); // eslint-disable-line no-console
return o;
}, err => {
console.info(stateSequence, err); // eslint-disable-line no-console
throw err;
}));
setStateSequence(stateSequence + 1);
}, [stateSequence, stateBody, stateMergerEnabled, stateMergerKey, stateMethod, stateParams, stateUrl]);
const handleFetchX3 = useCallback(() => {
handleFetch();
handleFetch();
handleFetch();
}, [handleFetch]);
useEffect(() => {
setStateJsCode(`fetch({
method: '${stateMethod}',
url: '${stateUrl}',
params: ${cleanJson(stateParams)},
body: ${cleanJson(stateBody)},
merger: ${cleanJson(getMerger(stateMergerEnabled, stateMergerKey))}
});`);
}, [stateBody, stateMergerEnabled, stateMergerKey, stateMethod, stateParams, stateUrl]);
return <>
<ThemeSwitcher />
<PkgInfo />
<H1>场景测试</H1>
<div>
method <InputText {...{
placeholder: 'method',
value: stateMethod,
onChange: setStateMethod
}} />
<br />
url <InputText {...{
placeholder: 'url',
value: stateUrl,
onChange: setStateUrl
}} />
<br />
<InputSwitch {...{
label: 'merger enabled',
value: stateMergerEnabled,
onChange: setStateMergerEnabled
}} />
<br />
merger.key <InputText {...{
placeholder: 'merger.key',
value: stateMergerKey,
onChange: setStateMergerKey
}} />
</div>
<Flex>
<InputTextarea {...{
placeholder: 'params',
onChange: handleParamsChange
}} />
<InputTextarea {...{
placeholder: 'body',
onChange: handleBodyChange
}} />
</Flex>
<Button onClick={handleFetchX3}>fetch x3</Button>
<Flex>
<CodeViewerTs>{stateJsCode}</CodeViewerTs>
<PrePromise promise={statePromise} />
</Flex>
<MergerStorage />
</>;
}