UNPKG

antd-mobile

Version:

基于 React 的移动设计规范实现

206 lines (170 loc) 7.94 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _rcDialog = require('rc-dialog'); var _rcDialog2 = _interopRequireDefault(_rcDialog); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _rcTouchable = require('rc-touchable'); var _rcTouchable2 = _interopRequireDefault(_rcTouchable); var _PropsType = require('./PropsType'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function checkIfAndroid(platform) { return platform === 'android' || platform === 'cross' && typeof window !== 'undefined' && !!navigator.userAgent.match(/Android/i); } var Modal = function (_ModalComponent) { (0, _inherits3['default'])(Modal, _ModalComponent); function Modal(props) { (0, _classCallCheck3['default'])(this, Modal); var _this = (0, _possibleConstructorReturn3['default'])(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, props)); _this.state = { // in ssr, just set isAndroid false // since modal normally won't show at first render, componentDidMount will do double check isAndroid: checkIfAndroid(props.platform) }; return _this; } (0, _createClass3['default'])(Modal, [{ key: 'isInModal', value: function isInModal(e) { if (!/\biPhone\b|\biPod\b/i.test(navigator.userAgent)) { return; } // fix touch to scroll background page on iOS var prefixCls = this.props.prefixCls; var pNode = function (node) { while (node.parentNode && node.parentNode !== document.body) { if (node.classList.contains(prefixCls)) { return node; } node = node.parentNode; } }(e.target); if (!pNode) { e.preventDefault(); } return true; } }, { key: 'renderFooterButton', value: function renderFooterButton(button, prefixCls, i) { var buttonStyle = {}; if (button.style) { buttonStyle = button.style; if (typeof buttonStyle === 'string') { var styleMap = { cancel: { fontWeight: 'bold' }, 'default': {}, destructive: { color: 'red' } }; buttonStyle = styleMap[buttonStyle] || {}; } } var onClickFn = function onClickFn(e) { e.preventDefault(); if (button.onPress) { button.onPress(); } }; return _react2['default'].createElement( _rcTouchable2['default'], { activeClassName: prefixCls + '-button-active', key: i }, _react2['default'].createElement( 'a', { className: prefixCls + '-button', role: 'button', style: buttonStyle, href: '#', onClick: onClickFn }, button.text || 'Button' ) ); } }, { key: 'componentDidMount', value: function componentDidMount() { var isAndroid = checkIfAndroid(this.props.platform); if (isAndroid !== this.state.isAndroid) { this.setState({ isAndroid: isAndroid }); } } }, { key: 'render', value: function render() { var _classNames, _this2 = this; var _props = this.props, prefixCls = _props.prefixCls, className = _props.className, transparent = _props.transparent, animated = _props.animated, transitionName = _props.transitionName, maskTransitionName = _props.maskTransitionName, style = _props.style, _props$footer = _props.footer, footer = _props$footer === undefined ? [] : _props$footer, closable = _props.closable, operation = _props.operation; var isAndroid = this.state.isAndroid; var wrapCls = (0, _classnames2['default'])((_classNames = {}, (0, _defineProperty3['default'])(_classNames, className, !!className), (0, _defineProperty3['default'])(_classNames, prefixCls + '-transparent', transparent), (0, _defineProperty3['default'])(_classNames, prefixCls + '-android', isAndroid), _classNames)); var anim = transitionName || (animated ? transparent ? 'am-fade' : 'am-slide-up' : null); var maskAnim = maskTransitionName || (animated ? transparent ? 'am-fade' : 'am-slide-up' : null); var btnGroupClass = prefixCls + '-button-group-' + (footer.length === 2 && !operation ? 'h' : 'v'); var footerDom = footer.length ? _react2['default'].createElement( 'div', { className: btnGroupClass, role: 'group' }, footer.map(function (button, i) { return _this2.renderFooterButton(button, prefixCls, i); }) ) : null; // transparent 模式下, 内容默认居中 var rootStyle = transparent ? (0, _objectAssign2['default'])({ width: '5.4rem', height: 'auto' }, style) : (0, _objectAssign2['default'])({ width: '100%', height: '100%' }, style); var restProps = (0, _objectAssign2['default'])({}, this.props); ['prefixCls', 'className', 'transparent', 'animated', 'transitionName', 'maskTransitionName', 'style', 'footer', 'touchFeedback', 'wrapProps'].forEach(function (prop) { if (restProps.hasOwnProperty(prop)) { delete restProps[prop]; } }); var wrapProps = { onTouchStart: function onTouchStart(e) { return _this2.isInModal(e); } }; return _react2['default'].createElement(_rcDialog2['default'], (0, _extends3['default'])({ prefixCls: prefixCls, className: wrapCls, transitionName: anim, maskTransitionName: maskAnim, style: rootStyle, footer: footerDom, wrapProps: wrapProps, closable: closable }, restProps)); } }]); return Modal; }(_PropsType.ModalComponent); exports['default'] = Modal; Modal.defaultProps = { prefixCls: 'am-modal', // transparent change to transparent by yiminghe transparent: false, animated: true, style: {}, onShow: function onShow() {}, footer: [], closable: false, operation: false, platform: 'cross' }; module.exports = exports['default'];