UNPKG

react-events

Version:

Declarative managed event bindings for React components

4 lines 5.81 kB
/*! * [react-events](https://github.com/jhudson8/react-events) v0.7.5; MIT license; Joe Hudson<joehud_AT_gmail.com> */ !function(t){"function"==typeof define&&define.amd?define([],function(){return t}):"undefined"!=typeof exports&&"undefined"!=typeof require?module.exports=t:t(React)}(function(React){function normalizeEvents(t,e,n){e=e||{},n?n+=":":n="";var a,r;for(var i in t)a=t[i],r=typeof a,"string"===r||"function"===r?e[n+i]=a:a&&normalizeEvents(a,e,n+i);return e}function manageEvent(t,e){var n={type:t};for(var a in e)n[a]=e[a];var r=React.mixins.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"===t)for(var c,l=0;l<r.length;l++)c=r[l],c.event===e.event&&c.callback===e.callback&&getTarget(c.target,this)===i&&r.splice(l,1)}function _watchedEventsBindAll(t){var e=getState("__watchedEvents",t);if(e){var n;for(var a in e){n=e[a];var r=getTarget(n.target,t);r&&r[n.type](n.event,n.callback,n.context)}}}function _watchedEventsUnbindAll(t,e){var n=getState("__watchedEvents",e);if(n){var a;for(var r in n){a=n[r];var i=getTarget(a.target,e);i&&i.off(a.event,a.callback,a.context)}t||setState({__watchedEvents:[]},e)}}function getTarget(t,e){return"function"==typeof t?t.call(e):t}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=React.events.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+"'")}var parts=event.match(splitter),handlerName=parts[1];path=parts[2],handler=handlers[handlerName];for(var 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(t,e){eventManager.handle(t,function(t,n){var a,r,i=t.path.match(splitter),c=i[1],l=i[2];return{on:function(){var t=e.call(this,c);t&&(r=t.state||t,t.on(l,n),a=t)},off:function(){a&&(a.off(l,n),a=void 0,r=void 0)},isStale:function(){if(!a)return!!t;var t=e.call(this,c);return t&&(t.state||t)===r?void 0:!0}}})}var handlers={},patternHandlers=[],splitter=/^([^:]+):?(.*)/,specialWrapper=/^\*([^\(]+)\(([^)]*)\)[->:]*(.*)/,noArgMethods=["forceUpdate"],setState=React.mixins.setState,getState=React.mixins.getState,handlerTemplates={standard:function(t){var e={on:t.onKey||"on",off:t.offKey||"off"},n=t.target;return function(a,r){function i(t,a){return function(){var i="function"==typeof n?n.call(a,c):n;i&&i[e[t]](c,r)}}var c=a.path;return{on:i("on",this),off:i("off",this),initialize:t.initialize}}}},eventManager=React.events={specials:{},handle:function(t,e){"function"!=typeof e&&(e=handlerTemplates[e.type||"standard"](e)),t instanceof RegExp?patternHandlers.push({pattern:t,handler:e}):handlers[t]=e}};"undefined"!=typeof window&&eventManager.handle("window",{target:window,onKey:"addEventListener",offKey:"removeEventListener"});var objectHandlers={ref:function(t){return this.refs[t]},prop:function(t){return this.props[t]}},objectFactory;for(var key in objectHandlers)registerObjectHandler(key,objectHandlers[key]);eventManager.handle("repeat",function(t,e){var n,a=parseInt(t.path,10);return{on:function(){n=setInterval(e,a)},off:function(){n=!!clearInterval(n)}}}),eventManager.handle("!repeat",function(t,e){function n(t){t!==!0&&e(),setTimeout(function(){a&&requestAnimationFrame(n)},r)}var a,r=parseInt(t.path,10);return{on:function(){a=!0,n(!0)},off:function(){a=!1}}}),React.mixins.add("events",function(){function t(t,e){return function(){t.apply(e,arguments)}}var e=[{triggerWith:function(){var t=Array.prototype.slice.call(arguments),e=this;return function(){e.trigger.apply(this,t)}},getInitialState:function(){var t=[];if(this.events){var e,n=normalizeEvents(this.events);for(var a in n)e=createHandler(a,n[a],this),e.initialize&&e.initialize.call(this),t.push(e)}return{_eventHandlers:t}},componentDidUpdate:function(){for(var t,e=getState("_eventHandlers",this),n=0;n<e.length;n++)t=e[n],t.isStale&&t.isStale.call(this)&&(t.off.call(this),t.on.call(this))},componentDidMount:function(){for(var t=getState("_eventHandlers",this),e=0;e<t.length;e++)t[e].on.call(this)},componentWillUnmount:function(){for(var t=getState("_eventHandlers",this),e=0;e<t.length;e++)t[e].off.call(this)}}],n=eventManager.mixin;if(n){for(var a,r={},i={},c=["on","off","trigger"],l=0;l<c.length;l++){var a=c[l];n[a]&&(r[a]=t(n[a],i))}r.getInitialState=function(){return{__events:i}},e.push(r)}return e},"state"),React.mixins.add("listen",{componentDidMount:function(){_watchedEventsUnbindAll(!0,this),_watchedEventsBindAll(this)},componentWillUnmount:function(){_watchedEventsUnbindAll(!0,this)},listenTo:function(t,e,n,a){var r=e?{event:e,callback:n,target:t,context:a}:t;manageEvent.call(this,"on",r)},listenToOnce:function(t,e,n,a){var r={event:e,callback:n,target:t,context:a};manageEvent.call(this,"once",r)},stopListening:function(t,e,n,a){var r={event:e,callback:n,target:t,context:a};manageEvent.call(this,"off",r)}})});