packages-rc/console-base-rc-loading/stories/knobs/index.tsx (75 lines of code) (raw):
import {
useMemo,
useEffect
} from 'react';
import {
text,
boolean,
optionsKnob
} from '@storybook/addon-knobs';
import {
LoadingProps
} from '../../src';
interface IProps {
onChange(props: Partial<LoadingProps>): void;
}
function optional<T>({
value,
inUse
}: {
value: T;
inUse: boolean;
}): T | undefined {
return inUse ? value : undefined;
}
function omitUndefined(o: any): Partial<LoadingProps> {
const props = {} as any;
for (const k in o) {
// eslint-disable-next-line no-prototype-builtins
if (o.hasOwnProperty(k) && o[k] !== undefined) {
props[k] = o[k];
}
}
return props as Partial<LoadingProps>;
}
export default function Knobs({
onChange
}: IProps): null {
const message = optional<string>({
value: text('props.message', 'loading custom text'),
inUse: boolean('启用 props.message', false)
});
const status = optional<LoadingProps['status']>({
value: optionsKnob<LoadingProps['status']>('props.status', {
loading: 'loading',
error: 'error',
empty: 'empty'
}, 'loading', {
display: 'inline-radio'
}),
inUse: boolean('启用 props.status', false)
});
const align = optional<LoadingProps['align']>({
value: optionsKnob<LoadingProps['align']>('props.align', {
l: 'l',
r: 'r',
c: 'c'
}, 'c', {
display: 'inline-radio'
}),
inUse: boolean('启用 props.align', false)
});
const inline = boolean('props.inline', false);
const props = useMemo(() => omitUndefined({
message,
status,
align,
inline
}), [
message,
status,
align,
inline
]);
useEffect(() => onChange(props), [onChange, props]);
return null;
}