packages-fetcher/fetcher-interceptor-cache-local/stories/demo-default/index.tsx (156 lines of code) (raw):
import React, {
useState,
useCallback,
useEffect
} from 'react';
import {
H1,
PrePromise,
Button,
Flex,
InputText,
InputNumber,
InputTextarea,
InputSwitch,
CodeViewerTs
} from '@alicloud/demo-rc-elements';
import ThemeSwitcher from '@alicloud/console-base-demo-helper-theme-switcher';
import {
FetcherCacheLocalOptions
} from '../../src';
import PkgInfo from '../pkg-info';
import fetcher from '../fetcher';
import CacheStorage from '../cache-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 getCacheLocal(enabled: boolean, key: string, ttl: number | undefined, overwrite: boolean): FetcherCacheLocalOptions | true | undefined {
if (enabled) {
if (key || ttl || overwrite) {
return {
key,
ttl,
overwrite
};
}
return true;
}
return undefined;
}
function cleanJson(o: unknown): string | undefined {
return JSON.stringify(o)?.replace(/"([^"]+)":/g, '$1:');
}
export default function DemoSpecial(): 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 [stateCacheLocalEnabled, setStateCacheLocalEnabled] = useState<boolean>(true);
const [stateCacheLocalKey, setStateCacheLocalKey] = useState<string>('');
const [stateCacheLocalTtl, setStateCacheLocalTtl] = useState<number | undefined>(undefined);
const [stateCacheLocalOverwrite, setStateCacheLocalOverwrite] = useState<boolean>(false);
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 handleParamChange = 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,
cacheLocal: getCacheLocal(stateCacheLocalEnabled, stateCacheLocalKey, stateCacheLocalTtl, stateCacheLocalOverwrite)
}).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, stateCacheLocalEnabled, stateCacheLocalKey, stateCacheLocalOverwrite, stateCacheLocalTtl, stateMethod, stateParams, stateUrl]);
const handleFetchX3 = useCallback(() => {
handleFetch();
handleFetch();
handleFetch();
}, [handleFetch]);
useEffect(() => {
setStateJsCode(`fetch({
method: '${stateMethod}',
url: '${stateUrl}',
params: ${cleanJson(stateParams)},
body: ${cleanJson(stateBody)},
cacheLocal: ${cleanJson(getCacheLocal(stateCacheLocalEnabled, stateCacheLocalKey, stateCacheLocalTtl, stateCacheLocalOverwrite))}
});`);
}, [stateBody, stateCacheLocalEnabled, stateCacheLocalKey, stateCacheLocalOverwrite, stateCacheLocalTtl, 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: 'cache local enabled',
value: stateCacheLocalEnabled,
onChange: setStateCacheLocalEnabled
}} />
<br />
cacheLocal.key <InputText {...{
placeholder: 'cacheLocal.key',
value: stateCacheLocalKey,
onChange: setStateCacheLocalKey
}} />
<br />
cacheLocal.ttl <InputNumber {...{
placeholder: 'cacheLocal.ttl',
value: stateCacheLocalTtl,
onChange: setStateCacheLocalTtl
}} />
<br />
<InputSwitch {...{
label: 'cacheLocal.overwrite',
value: stateCacheLocalOverwrite,
onChange: setStateCacheLocalOverwrite
}} />
</div>
<Flex>
<InputTextarea {...{
placeholder: 'params',
onChange: handleParamChange
}} />
<InputTextarea {...{
placeholder: 'body',
onChange: handleBodyChange
}} />
</Flex>
<Button onClick={handleFetchX3}>fetch x3</Button>
<Flex>
<CodeViewerTs>{stateJsCode}</CodeViewerTs>
<PrePromise promise={statePromise} />
</Flex>
<CacheStorage />
</>;
}