-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreact-events.min.js
4 lines (4 loc) · 6.27 KB
/
react-events.min.js
1
2
3
4
/*!
* [react-events](https://github.com/jhudson8/react-events) v1.0.1; MIT license; Joe Hudson<joehud_AT_gmail.com>
*/
!function(e){"function"==typeof define&&define.amd?define(["react-mixin-manager"],function(t){return e(t)}):"undefined"!=typeof exports&&"undefined"!=typeof require?module.exports=e(require("react-mixin-manager")):ReactEvents=e(ReactMixinManager)}(function(ReactMixinManager){function normalizeEvents(e,t,n){t=t||{},n?n+=":":n="";var a,r;for(var i in e)e.hasOwnProperty(i)&&(a=e[i],r=typeof a,"string"===r||"function"===r?t[n+i]=a:a&&normalizeEvents(a,t,n+i));return t}function manageEvent(e,t){var n={type:e};for(var a in t)t.hasOwnProperty(a)&&(n[a]=t[a]);var r=getState("__watchedEvents",this);r||(r=[],setState({__watchedEvents:r},this)),n.context=n.context||this,r.push(n);var i=getTarget(n.target,this);if(this.isMounted()&&i&&i[n.type](n.event,n.callback,n.context),"off"===e)for(var c,l=0;l<r.length;l++)c=r[l],c.event===t.event&&c.callback===t.callback&&getTarget(c.target,this)===i&&r.splice(l,1)}function _watchedEventsBindAll(e){var t=getState("__watchedEvents",e);if(t){var n;for(var a in t)if(t.hasOwnProperty(a)){n=t[a];var r=getTarget(n.target,e);r&&r[n.type](n.event,n.callback,n.context)}}}function _watchedEventsUnbindAll(e,t){var n=getState("__watchedEvents",t);if(n){var a;for(var r in n)if(n.hasOwnProperty(r)){a=n[r];var i=getTarget(a.target,t);i&&i.off(a.event,a.callback,a.context)}e||setState({__watchedEvents:[]},t)}}function getTarget(e,t){return"function"==typeof e?e.call(t):e}function createHandler(event,callback,context,dontWrapCallback){if(!dontWrapCallback){var _callback=callback,noArg;if("object"==typeof callback&&(_callback=callback.callback.call(this)),"string"==typeof callback&&(noArg=noArgMethods.indexOf(callback)>=0,_callback=context[callback]),!_callback)throw'no callback function exists for "'+callback+'"';callback=function(){return _callback.apply(context,noArg?[]:arguments)}}var match=event.match(specialWrapper);if(match){var specialMethodName=match[1],args=eval("["+match[2]+"]"),rest=match[3],specialHandler=eventManager.specials[specialMethodName];if(specialHandler)return 1===args.length&&""===args[0]&&(args=[]),callback=specialHandler.call(context,callback,args),createHandler(rest,callback,context,!0);throw new Error('invalid special event handler "'+specialMethodName+"'")}for(var parts=event.match(splitter),handlerName=parts[1],path=parts[2],handler=handlers[handlerName],i=0;!handler&&i<patternHandlers.length;i++)handlerName.match(patternHandlers[i].pattern)&&(handler=patternHandlers[i].handler);if(!handler)throw new Error('no handler registered for "'+event+'"');return handler.call(context,{key:handlerName,path:path},callback)}function registerObjectHandler(e,t){eventManager.handle(e,function(e,n){var a,r,i=e.path.match(splitter),c=i[1],l=i[2];return{on:function(){var e=t.call(this,c);e&&(r=e.state||e,e.on(l,n),a=e)},off:function(){a&&(a.off(l,n),a=void 0,r=void 0)},isStale:function(){if(!a)return!0;var e=t.call(this,c);return e&&(e.state||e)===r?void 0:!0}}})}function handleEvents(e,t,n){var a,r=getState("_eventHandlers",t)||[];e=normalizeEvents(e);for(var i in e)e.hasOwnProperty(i)&&(a=createHandler(i,e[i],t),a.initialize&&a.initialize.call(t),r.push(a),n&&t.isMounted()&&a.on.call(this));return r}var handlers={},patternHandlers=[],splitter=/^([^:]+):?(.*)/,specialWrapper=/^\*([^\(]+)\(([^)]*)\)[->:]*(.*)/,noArgMethods=["forceUpdate"],setState=ReactMixinManager.setState,getState=ReactMixinManager.getState,namespace="react-events.",handlerTemplates={standard:function(e){var t={on:e.onKey||"on",off:e.offKey||"off"},n=e.target;return function(a,r){function i(e,a){return function(){var i="function"==typeof n?n.call(a,c):n;i&&i[t[e]](c,r)}}var c=a.path;return{on:i("on",this),off:i("off",this),initialize:e.initialize}}}},eventManager={specials:{},handle:function(e,t){"function"!=typeof t&&(t=handlerTemplates[t.type||"standard"](t)),e instanceof RegExp?patternHandlers.push({pattern:e,handler:t}):handlers[e]=t}};"undefined"!=typeof window&&eventManager.handle("window",{target:window,onKey:"addEventListener",offKey:"removeEventListener"});var objectHandlers={ref:function(e){return this.refs[e]},prop:function(e){return this.props[e]}};for(var key in objectHandlers)objectHandlers.hasOwnProperty(key)&®isterObjectHandler(key,objectHandlers[key]);return eventManager.handle("repeat",function(e,t){var n,a=parseInt(e.path,10);return{on:function(){n=setInterval(t,a)},off:function(){n=!!clearInterval(n)}}}),eventManager.handle("!repeat",function(e,t){function n(e){e!==!0&&t(),setTimeout(function(){a&&requestAnimationFrame(n)},r)}var a,r=parseInt(e.path,10);return{on:function(){a=!0,n(!0)},off:function(){a=!1}}}),ReactMixinManager.add(namespace+"events",function(){function e(e,t){return function(){e.apply(t,arguments)}}var t=[{triggerWith:function(){var e=Array.prototype.slice.call(arguments),t=this;return"string"!=typeof e[0]&&(t=e[0],e.splice(0,1)),function(){t.trigger.apply(t,e)}},callWith:function(e){var t=Array.prototype.slice.call(arguments,1),n=this;return function(){e.apply(n,t)}},manageEvents:function(e){setState({_eventHandlers:handleEvents(e,this,!0)},this)},getInitialState:function(){return{_eventHandlers:handleEvents(this.events,this)}},componentDidUpdate:function(){for(var e,t=getState("_eventHandlers",this),n=0;n<t.length;n++)e=t[n],e.isStale&&e.isStale.call(this)&&(e.off.call(this),e.on.call(this))},componentDidMount:function(){for(var e=getState("_eventHandlers",this),t=0;t<e.length;t++)e[t].on.call(this)},componentWillUnmount:function(){for(var e=getState("_eventHandlers",this),t=0;t<e.length;t++)e[t].off.call(this)}}],n=eventManager.mixin;if(n){for(var a,r={},i={},c=["on","once","off","trigger"],l=0;l<c.length;l++)a=c[l],n[a]&&(r[a]=e(n[a],i));r.getInitialState=function(){return{__events:i}},t.push(r)}return t},"state"),ReactMixinManager.add(namespace+"listen",{componentDidMount:function(){_watchedEventsUnbindAll(!0,this),_watchedEventsBindAll(this)},componentWillUnmount:function(){_watchedEventsUnbindAll(!0,this)},listenTo:function(e,t,n,a){var r=t?{event:t,callback:n,target:e,context:a}:e;manageEvent.call(this,"on",r)},listenToOnce:function(e,t,n,a){var r={event:t,callback:n,target:e,context:a};manageEvent.call(this,"once",r)},stopListening:function(e,t,n,a){var r={event:t,callback:n,target:e,context:a};manageEvent.call(this,"off",r)}}),eventManager});