style: update util
parent
94c2887c81
commit
0399ce0ec7
|
@ -5,6 +5,7 @@ import type { ButtonProps } from '../button';
|
|||
import type { LegacyButtonType } from '../button/buttonTypes';
|
||||
import { convertLegacyProps } from '../button/buttonTypes';
|
||||
import useDestroyed from './hooks/useDestroyed';
|
||||
import { objectType } from './type';
|
||||
|
||||
const actionButtonProps = {
|
||||
type: {
|
||||
|
@ -14,15 +15,15 @@ const actionButtonProps = {
|
|||
close: Function,
|
||||
autofocus: Boolean,
|
||||
prefixCls: String,
|
||||
buttonProps: Object as PropType<ButtonProps>,
|
||||
buttonProps: objectType<ButtonProps>(),
|
||||
emitEvent: Boolean,
|
||||
quitOnNullishReturnValue: Boolean,
|
||||
};
|
||||
|
||||
export type ActionButtonProps = ExtractPropTypes<typeof actionButtonProps>;
|
||||
|
||||
function isThenable(thing?: PromiseLike<any>): boolean {
|
||||
return !!(thing && !!thing.then);
|
||||
function isThenable<T>(thing?: PromiseLike<T>): boolean {
|
||||
return !!(thing && thing.then);
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
|
@ -44,8 +45,11 @@ export default defineComponent({
|
|||
clearTimeout(timeoutId);
|
||||
});
|
||||
|
||||
const onInternalClose = (...args: any[]) => {
|
||||
props.close?.(...args);
|
||||
};
|
||||
|
||||
const handlePromiseOnOk = (returnValueOfOnOk?: PromiseLike<any>) => {
|
||||
const { close } = props;
|
||||
if (!isThenable(returnValueOfOnOk)) {
|
||||
return;
|
||||
}
|
||||
|
@ -55,48 +59,46 @@ export default defineComponent({
|
|||
if (!isDestroyed.value) {
|
||||
loading.value = false;
|
||||
}
|
||||
close(...args);
|
||||
onInternalClose(...args);
|
||||
clickedRef.value = false;
|
||||
},
|
||||
(e: Error) => {
|
||||
// Emit error when catch promise reject
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(e);
|
||||
// See: https://github.com/ant-design/ant-design/issues/6183
|
||||
if (!isDestroyed.value) {
|
||||
loading.value = false;
|
||||
}
|
||||
clickedRef.value = false;
|
||||
return Promise.reject(e);
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
const onClick = (e: MouseEvent) => {
|
||||
const { actionFn, close = () => {} } = props;
|
||||
const { actionFn } = props;
|
||||
if (clickedRef.value) {
|
||||
return;
|
||||
}
|
||||
clickedRef.value = true;
|
||||
if (!actionFn) {
|
||||
close();
|
||||
onInternalClose();
|
||||
return;
|
||||
}
|
||||
let returnValueOfOnOk;
|
||||
let returnValueOfOnOk: PromiseLike<any>;
|
||||
if (props.emitEvent) {
|
||||
returnValueOfOnOk = actionFn(e);
|
||||
if (props.quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) {
|
||||
clickedRef.value = false;
|
||||
close(e);
|
||||
onInternalClose(e);
|
||||
return;
|
||||
}
|
||||
} else if (actionFn.length) {
|
||||
returnValueOfOnOk = actionFn(close);
|
||||
returnValueOfOnOk = actionFn(props.close);
|
||||
// https://github.com/ant-design/ant-design/issues/23358
|
||||
clickedRef.value = false;
|
||||
} else {
|
||||
returnValueOfOnOk = actionFn();
|
||||
if (!returnValueOfOnOk) {
|
||||
close();
|
||||
onInternalClose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
export function isWindow(obj: any) {
|
||||
export function isWindow(obj: any): obj is Window {
|
||||
return obj !== null && obj !== undefined && obj === obj.window;
|
||||
}
|
||||
|
||||
|
@ -12,16 +12,22 @@ export default function getScroll(
|
|||
const method = top ? 'scrollTop' : 'scrollLeft';
|
||||
let result = 0;
|
||||
if (isWindow(target)) {
|
||||
result = (target as Window)[top ? 'pageYOffset' : 'pageXOffset'];
|
||||
result = target[top ? 'pageYOffset' : 'pageXOffset'];
|
||||
} else if (target instanceof Document) {
|
||||
result = target.documentElement[method];
|
||||
} else if (target instanceof HTMLElement) {
|
||||
result = target[method];
|
||||
} else if (target) {
|
||||
result = (target as HTMLElement)[method];
|
||||
// According to the type inference, the `target` is `never` type.
|
||||
// Since we configured the loose mode type checking, and supports mocking the target with such shape below::
|
||||
// `{ documentElement: { scrollLeft: 200, scrollTop: 400 } }`,
|
||||
// the program may falls into this branch.
|
||||
// Check the corresponding tests for details. Don't sure what is the real scenario this happens.
|
||||
result = target[method];
|
||||
}
|
||||
|
||||
if (target && !isWindow(target) && typeof result !== 'number') {
|
||||
result = ((target as HTMLElement).ownerDocument || (target as Document)).documentElement?.[
|
||||
method
|
||||
];
|
||||
result = ((target.ownerDocument ?? target) as any).documentElement?.[method];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import raf from './raf';
|
||||
import getScroll, { isWindow } from './getScroll';
|
||||
import { easeInOutCubic } from './easings';
|
||||
import getScroll, { isWindow } from './getScroll';
|
||||
|
||||
interface ScrollToOptions {
|
||||
/** Scroll container, default as window */
|
||||
|
@ -23,8 +23,8 @@ export default function scrollTo(y: number, options: ScrollToOptions = {}) {
|
|||
const nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y, duration);
|
||||
if (isWindow(container)) {
|
||||
(container as Window).scrollTo(window.pageXOffset, nextScrollTop);
|
||||
} else if (container instanceof HTMLDocument || container.constructor.name === 'HTMLDocument') {
|
||||
(container as HTMLDocument).documentElement.scrollTop = nextScrollTop;
|
||||
} else if (container instanceof Document || container.constructor.name === 'HTMLDocument') {
|
||||
(container as Document).documentElement.scrollTop = nextScrollTop;
|
||||
} else {
|
||||
(container as HTMLElement).scrollTop = nextScrollTop;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import type { ValidateStatus } from '../form/FormItem';
|
||||
import classNames from './classNames';
|
||||
import { tuple } from './type';
|
||||
|
||||
const InputStatuses = tuple('warning', 'error', '');
|
||||
const InputStatuses = ['warning', 'error', ''] as const;
|
||||
|
||||
export type InputStatus = typeof InputStatuses[number];
|
||||
|
||||
export function getStatusClassNames(
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
import raf from './raf';
|
||||
|
||||
export default function throttleByAnimationFrame<T extends unknown[]>(fn: (...args: T) => void) {
|
||||
type throttledFn = (...args: any[]) => void;
|
||||
|
||||
type throttledCancelFn = { cancel: () => void };
|
||||
|
||||
function throttleByAnimationFrame<T extends any[]>(fn: (...args: T) => void) {
|
||||
let requestId: number | null;
|
||||
|
||||
const later = (args: T) => () => {
|
||||
|
@ -8,10 +12,7 @@ export default function throttleByAnimationFrame<T extends unknown[]>(fn: (...ar
|
|||
fn(...args);
|
||||
};
|
||||
|
||||
const throttled: {
|
||||
(...args: T): void;
|
||||
cancel: () => void;
|
||||
} = (...args: T) => {
|
||||
const throttled: throttledFn & throttledCancelFn = (...args: T) => {
|
||||
if (requestId == null) {
|
||||
requestId = raf(later(args));
|
||||
}
|
||||
|
@ -25,29 +26,4 @@ export default function throttleByAnimationFrame<T extends unknown[]>(fn: (...ar
|
|||
return throttled;
|
||||
}
|
||||
|
||||
export function throttleByAnimationFrameDecorator() {
|
||||
// eslint-disable-next-line func-names
|
||||
return function (target: any, key: string, descriptor: any) {
|
||||
const fn = descriptor.value;
|
||||
let definingProperty = false;
|
||||
return {
|
||||
configurable: true,
|
||||
get() {
|
||||
// eslint-disable-next-line no-prototype-builtins
|
||||
if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {
|
||||
return fn;
|
||||
}
|
||||
|
||||
const boundFn = throttleByAnimationFrame(fn.bind(this));
|
||||
definingProperty = true;
|
||||
Object.defineProperty(this, key, {
|
||||
value: boundFn,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
});
|
||||
definingProperty = false;
|
||||
return boundFn;
|
||||
},
|
||||
};
|
||||
};
|
||||
}
|
||||
export default throttleByAnimationFrame;
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
import warning, { resetWarned } from '../vc-util/warning';
|
||||
|
||||
export { resetWarned };
|
||||
|
||||
export default (valid, component, message = '') => {
|
||||
warning(valid, `[antdv: ${component}] ${message}`);
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
import vcWarning, { resetWarned } from '../vc-util/warning';
|
||||
|
||||
export { resetWarned };
|
||||
export function noop() {}
|
||||
|
||||
type Warning = (valid: boolean, component: string, message?: string) => void;
|
||||
|
||||
// eslint-disable-next-line import/no-mutable-exports
|
||||
let warning: Warning = noop;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
warning = (valid, component, message) => {
|
||||
vcWarning(valid, `[antd: ${component}] ${message}`);
|
||||
|
||||
// StrictMode will inject console which will not throw warning in React 17.
|
||||
if (process.env.NODE_ENV === 'test') {
|
||||
resetWarned();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export default warning;
|
Loading…
Reference in New Issue