preact-arco-design
Version:
Arco Design React UI Library.
108 lines (97 loc) • 3.46 kB
JavaScript
var __read = this && this.__read || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o),
r,
ar = [],
e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
ar.push(r.value);
}
} catch (error) {
e = {
error: error
};
} finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
} finally {
if (e) throw e.error;
}
}
return ar;
};
import React, { useState, useEffect, useContext, useCallback } from "preact/compat";
import debounce from 'lodash/debounce';
import IconLoading from "../../icon/react-icon/IconLoading";
import cs from "../_util/classNames";
import { ConfigContext } from "../ConfigProvider";
import DotLoading from "./dot-loading";
import useMergeProps from "../_util/hooks/useMergeProps";
function Spin(baseProps, ref) {
var _a;
var _b = useContext(ConfigContext),
getPrefixCls = _b.getPrefixCls,
componentConfig = _b.componentConfig;
var props = useMergeProps(baseProps, {}, componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Spin);
var style = props.style,
className = props.className,
children = props.children,
propLoading = props.loading,
size = props.size,
icon = props.icon,
element = props.element,
tip = props.tip,
dot = props.dot,
delay = props.delay,
_c = props.block,
block = _c === void 0 ? false : _c;
var _d = __read(useState(delay ? false : propLoading), 2),
loading = _d[0],
setLoading = _d[1];
var debouncedSetLoading = useCallback(debounce(setLoading, delay), [delay]);
var _usedLoading = delay ? loading : propLoading;
var prefixCls = getPrefixCls('spin');
useEffect(function () {
delay && debouncedSetLoading(propLoading);
return function () {
debouncedSetLoading && debouncedSetLoading.cancel();
};
}, [propLoading]);
var loadingIcon = React.createElement("span", {
className: "".concat(prefixCls, "-icon")
}, icon ? React.cloneElement(icon, {
className: cs("".concat(prefixCls.replace('-spin', '-icon'), "-loading")),
style: {
fontSize: size
}
}) : element || (dot ? React.createElement(DotLoading, {
size: size
}) : React.createElement(IconLoading, {
style: {
fontSize: size
}
})));
return React.createElement("div", {
ref: ref,
className: cs(prefixCls, (_a = {}, _a["".concat(prefixCls, "-block")] = block, _a["".concat(prefixCls, "-loading")] = _usedLoading, _a["".concat(prefixCls, "-with-tip")] = tip && !children, _a), className),
style: style
}, children ? React.createElement(React.Fragment, null, React.createElement("div", {
className: "".concat(prefixCls, "-children")
}, children), _usedLoading && React.createElement("div", {
className: "".concat(prefixCls, "-loading-layer"),
style: {
fontSize: size
}
}, React.createElement("span", {
className: "".concat(prefixCls, "-loading-layer-inner")
}, loadingIcon, tip ? React.createElement("div", {
className: "".concat(prefixCls, "-tip")
}, tip) : null))) : React.createElement(React.Fragment, null, loadingIcon, tip ? React.createElement("div", {
className: "".concat(prefixCls, "-tip")
}, tip) : null));
}
var SpinComponent = React.forwardRef(Spin);
SpinComponent.displayName = 'Spin';
export default SpinComponent;