0.1.0 • Published 6 years ago

@shtrihpunktir/reactive-vkconnect v0.1.0

Weekly downloads
1
License
ISC
Repository
-
Last release
6 years ago

RxJs adaptation for @vkontakte/vkui-connect

Requirements

Сustom event support with native api or polyfill

Install

npm i @shtrihpunktir/reactive-vkconnect

With node imports

const {VkConnect} = require("@shtrihpunktir/reactive-vkconnect");
const connect = new VkConnect(window);

Typings are included in package

From browser

<script src="node_modules/@shtrihpunktir/reactive-vkconnect/umd/reactive-vkconnect.min.js"></script>
<script>
    var connect = new ReactiveVkconnect.VkConnect(window);
</script>

Usage

Send events

connect.send("VKWebAppGetAuthToken", {
    "app_id": 6217559,
    "scope": "notify,friends"
});

Receive events from connect.events which is Rx.Observable

var subscription = connect.events
    // subscribe to start listening events
    .subscribe(
        // success
        (event) => console.log(event),
        // during subscription, stops subscription
        (err) => handleError(err),
        // subscription completed
        () => console.log(conpleted)
    );

// use it to stop subscription
subscription.unsubscribe();

Example

var adapter = {
  send: (handler, data) => {
    if (handler === 'VKWebAppGetAuthToken' ){
      log(`[EVENT DISPATCHED] VKWebAppGetAuthToken: ${JSON.stringify(data)}`);
      event = new CustomEvent('VKWebAppEvent', {
        detail: {
          type: 'VKWebAppAccessTokenReceived',
          data: {'authentication_token': `${data.app_id}${data.scope}`}
        }
      });
      window.dispatchEvent(event);
    }
  }
};
var connect = new ReactiveVkconnect.VkConnect(window, adapter);
var  GetAuthTokenResponse = connect.events
  .pipe(
    // restricts only specified events
    filter(event =>
      event.type === 'VKWebAppAccessTokenReceived' ||
      'VKWebAppAccessTokenFailed'
    ),
    // extract data from event
    map(event => {
      var {type, data} = event.detail;
      if (type === 'VKWebAppAccessTokenReceived') return {name: type, data};
      else throw {name: type, data};
    }),
    // unsubscribe when first data received
    take(1)
  );

GetAuthTokenResponse.subscribe(
  event => log(`[SUCCESS] ${event.name}: ${JSON.stringify(event.data)}`),
  event => log(`[ERROR] ${event.name}: ${JSON.stringify(event.data)}`),
  () => log('[COMPLETE]')
);

connect.send('VKWebAppGetAuthToken', {"app_id": 6217559, "scope": "notify,friends"});