'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _Event = require('./css-animation/Event'); var _Event2 = _interopRequireDefault(_Event); var _raf = require('./raf'); var _raf2 = _interopRequireDefault(_raf); var _configConsumerProps = require('../config-provider/configConsumerProps'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var styleForPesudo = void 0; // Where el is the DOM element you'd like to test for visibility function isHidden(element) { if (process.env.NODE_ENV === 'test') { return false; } return !element || element.offsetParent === null; } function isNotGrey(color) { // eslint-disable-next-line no-useless-escape var match = (color || '').match(/rgba?\((\d*), (\d*), (\d*)(, [\.\d]*)?\)/); if (match && match[1] && match[2] && match[3]) { return !(match[1] === match[2] && match[2] === match[3]); } return true; } exports['default'] = { name: 'Wave', props: ['insertExtraNode'], mounted: function mounted() { var _this = this; this.$nextTick(function () { var node = _this.$el; if (node.nodeType !== 1) { return; } _this.instance = _this.bindAnimationEvent(node); }); }, inject: { configProvider: { 'default': function _default() { return _configConsumerProps.ConfigConsumerProps; } } }, beforeDestroy: function beforeDestroy() { if (this.instance) { this.instance.cancel(); } if (this.clickWaveTimeoutId) { clearTimeout(this.clickWaveTimeoutId); } this.destroy = true; }, methods: { onClick: function onClick(node, waveColor) { if (!node || isHidden(node) || node.className.indexOf('-leave') >= 0) { return; } var insertExtraNode = this.$props.insertExtraNode; this.extraNode = document.createElement('div'); var extraNode = this.extraNode; extraNode.className = 'ant-click-animating-node'; var attributeName = this.getAttributeName(); node.removeAttribute(attributeName); node.setAttribute(attributeName, 'true'); // Not white or transparent or grey styleForPesudo = styleForPesudo || document.createElement('style'); if (waveColor && waveColor !== '#ffffff' && waveColor !== 'rgb(255, 255, 255)' && isNotGrey(waveColor) && !/rgba\(\d*, \d*, \d*, 0\)/.test(waveColor) && // any transparent rgba color waveColor !== 'transparent') { // Add nonce if CSP exist if (this.csp && this.csp.nonce) { styleForPesudo.nonce = this.csp.nonce; } extraNode.style.borderColor = waveColor; styleForPesudo.innerHTML = '\n [ant-click-animating-without-extra-node=\'true\']::after, .ant-click-animating-node {\n --antd-wave-shadow-color: ' + waveColor + ';\n }'; if (!document.body.contains(styleForPesudo)) { document.body.appendChild(styleForPesudo); } } if (insertExtraNode) { node.appendChild(extraNode); } _Event2['default'].addStartEventListener(node, this.onTransitionStart); _Event2['default'].addEndEventListener(node, this.onTransitionEnd); }, onTransitionStart: function onTransitionStart(e) { if (this.destroy) return; var node = this.$el; if (!e || e.target !== node) { return; } if (!this.animationStart) { this.resetEffect(node); } }, onTransitionEnd: function onTransitionEnd(e) { if (!e || e.animationName !== 'fadeEffect') { return; } this.resetEffect(e.target); }, getAttributeName: function getAttributeName() { var insertExtraNode = this.$props.insertExtraNode; return insertExtraNode ? 'ant-click-animating' : 'ant-click-animating-without-extra-node'; }, bindAnimationEvent: function bindAnimationEvent(node) { var _this2 = this; if (!node || !node.getAttribute || node.getAttribute('disabled') || node.className.indexOf('disabled') >= 0) { return; } var onClick = function onClick(e) { // Fix radio button click twice if (e.target.tagName === 'INPUT' || isHidden(e.target)) { return; } _this2.resetEffect(node); // Get wave color from target var waveColor = getComputedStyle(node).getPropertyValue('border-top-color') || // Firefox Compatible getComputedStyle(node).getPropertyValue('border-color') || getComputedStyle(node).getPropertyValue('background-color'); _this2.clickWaveTimeoutId = window.setTimeout(function () { return _this2.onClick(node, waveColor); }, 0); _raf2['default'].cancel(_this2.animationStartId); _this2.animationStart = true; // Render to trigger transition event cost 3 frames. Let's delay 10 frames to reset this. _this2.animationStartId = (0, _raf2['default'])(function () { _this2.animationStart = false; }, 10); }; node.addEventListener('click', onClick, true); return { cancel: function cancel() { node.removeEventListener('click', onClick, true); } }; }, resetEffect: function resetEffect(node) { if (!node || node === this.extraNode || !(node instanceof Element)) { return; } var insertExtraNode = this.$props.insertExtraNode; var attributeName = this.getAttributeName(); node.setAttribute(attributeName, 'false'); // edge has bug on `removeAttribute` #14466 if (styleForPesudo) { styleForPesudo.innerHTML = ''; } if (insertExtraNode && this.extraNode && node.contains(this.extraNode)) { node.removeChild(this.extraNode); } _Event2['default'].removeStartEventListener(node, this.onTransitionStart); _Event2['default'].removeEndEventListener(node, this.onTransitionEnd); } }, render: function render() { if (this.configProvider.csp) { this.csp = this.configProvider.csp; } return this.$slots['default'] && this.$slots['default'][0]; } };