From 329d51a68f0527ff9652fffdb27d7e04aa8295ae Mon Sep 17 00:00:00 2001 From: Patrick Kaminski Date: Tue, 23 Oct 2018 21:17:03 -0300 Subject: [PATCH] Add `off` method to unsubscribe events Fixes #193 Inspired by tristen commit ref #40 --- API.md | 22 +++++++++++++++++++++- src/actions/index.js | 28 ++++++++++++++++++++++++++++ src/directions.js | 11 +++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/API.md b/API.md index 36fd853..6b18db6 100644 --- a/API.md +++ b/API.md @@ -16,6 +16,7 @@ - [getWaypoints](#getwaypoints) - [removeRoutes](#removeroutes) - [on](#on) + - [off](#off) ## MapboxDirections @@ -168,7 +169,8 @@ Subscribe to events that happen within the plugin. **Parameters** -- `type` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** name of event. Available events and the data passed into their respective event objects are:- **clear** `{ type: } Type is one of 'origin' or 'destination'` +- `type` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** name of event. Available events and the data passed into their respective event objects are: + - **clear** `{ type: } Type is one of 'origin' or 'destination'` - **loading** `{ type: } Type is one of 'origin' or 'destination'` - **profile** `{ profile } Profile is one of 'driving', 'walking', or 'cycling'` - **origin** `{ feature } Fired when origin is set` @@ -178,3 +180,21 @@ Subscribe to events that happen within the plugin. - `fn` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** function that's called when the event is emitted. Returns **[MapboxDirections](#mapboxdirections)** this; + +### off + +Unsubscribe to events previously registered. + +**Parameters** + +- `type` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** name of event. Available events and the data passed into their respective event objects are: + - **clear** `{ type: } Type is one of 'origin' or 'destination'` + - **loading** `{ type: } Type is one of 'origin' or 'destination'` + - **profile** `{ profile } Profile is one of 'driving', 'walking', or 'cycling'` + - **origin** `{ feature } Fired when origin is set` + - **destination** `{ feature } Fired when destination is set` + - **route** `{ route } Fired when a route is updated` + - **error** \`{ error } Error as string +- `fn` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** function used when the event was registered. + +Returns **[MapboxDirections](#mapboxdirections)** this; diff --git a/src/actions/index.js b/src/actions/index.js index 4d11856..d1ed88a 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -315,6 +315,34 @@ export function eventSubscribe(type, fn) { }; } +export function eventUnsubscribe(type, fn) { + return (dispatch, getState) => { + const { events } = getState(); + + if (!events[type]) { + return { + type: types.EVENTS, + events + }; + } + + if (fn) { + // Drop the event if it exists in the events object + const fnToDelete = events[type].indexOf(fn); + if (fnToDelete >= 0) { + events[type].splice(fnToDelete, 1); + } + } else { + delete events[type]; + } + + return { + type: types.EVENTS, + events: events + }; + }; +} + export function eventEmit(type, data) { return (dispatch, getState) => { const { events } = getState(); diff --git a/src/directions.js b/src/directions.js index 819cd99..39bc756 100644 --- a/src/directions.js +++ b/src/directions.js @@ -551,4 +551,15 @@ export default class MapboxDirections { this.actions.eventSubscribe(type, fn); return this; } + + /** + * Unsubscribe to events + * @param {String} type name of event. Available events are outlined in `on` + * @param {Function} fn optional. The function that's called when the event is emitted. + * @returns {Directions} this; + */ + off(type, fn) { + this.actions.eventUnsubscribe(type, fn); + return this; + } }