UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

217 lines (216 loc) 9.82 kB
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator"; import { _ as _define_property } from "@swc/helpers/_/_define_property"; import { _ as _object_spread } from "@swc/helpers/_/_object_spread"; import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props"; import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array"; import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator"; import React, { forwardRef, useState } from "react"; import classNames from "classnames"; import { CSSTransition } from "react-transition-group"; import { Failure, Close } from "@nutui/icons-react"; import Button from "../button"; import confirm from "./confirm"; import Overlay from "../overlay"; import { Content, defaultContentProps } from "./content"; import { defaultOverlayProps } from "../overlay/overlay"; import { useConfig } from "../configprovider"; import { mergeProps } from "../../utils/merge-props"; var defaultProps = _object_spread_props(_object_spread({}, defaultOverlayProps, defaultContentProps), { title: '', content: '', header: '', footer: '', confirmText: '', cancelText: '', closeOnOverlayClick: true, hideConfirmButton: false, hideCancelButton: false, disableConfirmButton: false, footerDirection: 'horizontal', lockScroll: true, closeIconPosition: 'bottom', closeIcon: false, overlay: true, overlayStyle: {}, overlayClassName: 'nut-dialog-overlay', zIndex: 1200, beforeCancel: function() { return true; }, beforeClose: function() { return true; }, onCancel: function() {}, onClose: function() {}, onOverlayClick: function() { return true; } }); var BaseDialog = function(props, ref) { var _mergeProps = mergeProps(defaultProps, props), closeOnOverlayClick = _mergeProps.closeOnOverlayClick, confirmText = _mergeProps.confirmText, cancelText = _mergeProps.cancelText, children = _mergeProps.children, className = _mergeProps.className, closeIconPosition = _mergeProps.closeIconPosition, closeIcon = _mergeProps.closeIcon, content = _mergeProps.content, disableConfirmButton = _mergeProps.disableConfirmButton, footer = _mergeProps.footer, footerDirection = _mergeProps.footerDirection, header = _mergeProps.header, hideConfirmButton = _mergeProps.hideConfirmButton, hideCancelButton = _mergeProps.hideCancelButton, lockScroll = _mergeProps.lockScroll, overlay = _mergeProps.overlay, overlayStyle = _mergeProps.overlayStyle, overlayClassName = _mergeProps.overlayClassName, style = _mergeProps.style, title = _mergeProps.title, visible = _mergeProps.visible, zIndex = _mergeProps.zIndex, beforeCancel = _mergeProps.beforeCancel, beforeClose = _mergeProps.beforeClose, onClose = _mergeProps.onClose, onCancel = _mergeProps.onCancel, onConfirm = _mergeProps.onConfirm, onOverlayClick = _mergeProps.onOverlayClick; var classPrefix = 'nut-dialog'; var locale = useConfig().locale; var _useState = _sliced_to_array(useState(false), 2), loading = _useState[0], setLoading = _useState[1]; var renderFooter = function() { if (footer === null) return ''; var handleCancel = function(e) { e.stopPropagation(); if (!(beforeCancel === null || beforeCancel === void 0 ? void 0 : beforeCancel())) return; if (!(beforeClose === null || beforeClose === void 0 ? void 0 : beforeClose())) return; onClose(); onCancel(); }; var handleOk = /*#__PURE__*/ function() { var _ref = _async_to_generator(function(e) { var e1; return _ts_generator(this, function(_state) { switch(_state.label){ case 0: e.stopPropagation(); setLoading(true); _state.label = 1; case 1: _state.trys.push([ 1, 3, , 4 ]); return [ 4, onConfirm === null || onConfirm === void 0 ? void 0 : onConfirm(e) ]; case 2: _state.sent(); setLoading(false); onClose(); return [ 3, 4 ]; case 3: e1 = _state.sent(); setLoading(false); return [ 3, 4 ]; case 4: return [ 2 ]; } }); }); return function handleOk(e) { return _ref.apply(this, arguments); }; }(); var btnClass = hideCancelButton || hideConfirmButton ? "".concat(classPrefix, "-footer-block") : ''; var renderCancelOfVertical = function() { return !hideCancelButton && /*#__PURE__*/ React.createElement("div", { style: { order: 2 }, className: "".concat(classPrefix, "-footer-cancel ").concat(btnClass), onClick: function(e) { return handleCancel(e); } }, cancelText || locale.cancel); }; var renderCancel = function() { return !hideCancelButton && /*#__PURE__*/ React.createElement(Button, { type: "default", size: "large", className: "".concat(classPrefix, "-footer-cancel ").concat(btnClass), onClick: function(e) { return handleCancel(e); } }, cancelText || locale.cancel); }; var renderConfirm = function() { return !hideConfirmButton && /*#__PURE__*/ React.createElement(Button, { type: "primary", size: "large", className: classNames("".concat(classPrefix, "-footer-ok ").concat(btnClass), { disabled: disableConfirmButton }), disabled: disableConfirmButton, onClick: function(e) { return handleOk(e); }, loading: loading }, confirmText || locale.confirm); }; return footer || /*#__PURE__*/ React.createElement(React.Fragment, null, footerDirection === 'vertical' ? /*#__PURE__*/ React.createElement(React.Fragment, null, renderConfirm(), renderCancelOfVertical()) : /*#__PURE__*/ React.createElement(React.Fragment, null, renderCancel(), renderConfirm())); }; var renderCloseIcon = function() { if (!closeIcon) return null; var handleCancel = function() { if (!(beforeCancel === null || beforeCancel === void 0 ? void 0 : beforeCancel())) return; if (!(beforeClose === null || beforeClose === void 0 ? void 0 : beforeClose())) return; onClose(); onCancel(); }; var _obj; var closeClasses = classNames((_obj = {}, _define_property(_obj, "".concat(classPrefix, "-close"), true), _define_property(_obj, "".concat(classPrefix, "-close-").concat(closeIconPosition), true), _obj)); var systomIcon = closeIconPosition !== 'bottom' ? /*#__PURE__*/ React.createElement(Close, null) : /*#__PURE__*/ React.createElement(Failure, null); return /*#__PURE__*/ React.createElement("div", { className: closeClasses, onClick: handleCancel }, /*#__PURE__*/ React.isValidElement(closeIcon) ? closeIcon : systomIcon); }; var onHandleClickOverlay = function(e) { if (closeOnOverlayClick && visible && e.target === e.currentTarget) { var closed = onOverlayClick && onOverlayClick(e); closed && onClose(); closed && onCancel(); } }; var renderContent = function() { return /*#__PURE__*/ React.createElement(CSSTransition, { in: visible, timeout: 300, classNames: "fadeDialog", unmountOnExit: true, appear: true }, /*#__PURE__*/ React.createElement(Content, { className: className, style: _object_spread({ zIndex: zIndex }, style), title: title, header: header, close: renderCloseIcon(), footer: renderFooter(), footerDirection: footerDirection, visible: visible }, content || children)); }; return /*#__PURE__*/ React.createElement("div", { style: { display: visible ? 'block' : 'none' } }, overlay && /*#__PURE__*/ React.createElement(Overlay, { zIndex: zIndex, visible: visible, style: overlayStyle, className: overlayClassName, closeOnOverlayClick: closeOnOverlayClick, lockScroll: lockScroll, onClick: onHandleClickOverlay }), renderContent()); }; export var Dialog = /*#__PURE__*/ forwardRef(BaseDialog); Dialog.confirm = function(props) { return confirm(props); }; [ 'alert' ].forEach(function() { ; Dialog.alert = function(props) { return confirm(_object_spread({}, props)); }; }); Dialog.displayName = 'NutDialog';