MaxMEllon/comelon

View on GitHub
app/actions/NicoAction.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

import Nico from 'nicolive';
import AppDispatcher from '../dispatcher/AppDispatcher';
import NicoActionType from './types/NicoActionTypes';
import {notify} from './NotificationAction';

const dispatchCookie = (cookie) => {
  AppDispatcher.dispatch({
    actionType: NicoActionType.LOGIN,
    cookie: cookie,
  });
};

const dispatchIsLogin = (isLogin) => {
  AppDispatcher.dispatch({
    actionType: NicoActionType.FETCH_LOGIN_STATUS,
    isLogin: isLogin
  });
};

/**
 * @classdesc NicoAction
 * ログイン,ログアウト,ニコ生への接続などのアクションを管理します
 */
let NicoAction = {

  /**
   * fetchLoginStatus()
   * 現在のログイン状態をNicoStore::_isLoginにセットします
   */
  fetchLoginStatus() {
    Nico.ping(error => {
      if (error) dispatchIsLogin(false);
      else dispatchIsLogin(true);
    });
  },

  /**
   * login(user)
   * @param {Object} user - user情報 {user: `strings`, password: `strings`}
   * @throws {strings} error - ログイン失敗時エラーメッセージ
   * ニコニコへのログインを試みます.
   * 失敗した場合,NotificationAction.notify()で失敗の通知を行います
   * 成功した場合,cookieをNicoStore::_cookieに登録し
   * NicoStore::_isLoginをtrueにします
   */
  login(user) {
    Nico.ping(error => {
      if (! error) { return; }
      Nico.login(user.email, user.password, (error, cookie) => {
        if (error) {
          notify(`ログインに失敗しました : ${error}`);
          throw error;
        }
        notify('ログインしました');
        dispatchCookie(cookie);
        dispatchIsLogin(true);
      });
    });
  },

  /**
   * connect(liveId)
   * @param {strings} liveId - ニコ生放送番号(ex. lv000000)
   * @throws {strings} error - ニコ生接続の失敗時メッセージ
   * ニコニコ生放送への接続を試みます.
   * 失敗した場合,NotificationAction.notify()で失敗の通知を行います
   * 成功した場合,SocketであるviewerをNicoStoreに登録します.
   * これは,Commentの取得時に必要となります.
   */
  connect(liveId) {
    Nico.view(liveId, (error, viewer) => {
      if (error) {
        notify(`接続に失敗しました : ${error}`);
        throw error;
      }
      AppDispatcher.dispatch({
        actionType: NicoActionType.CONNECT,
        viewer: viewer
      });
      notify('接続に成功しました');
    });
  },

  /**
   * logout()
   * @throws {strings} error - ニコ生接続の失敗時メッセージ
   * ニコニコからログアウトします
   */
  logout() {
    Nico.logout(error => {
      if (error) throw error;
      dispatchIsLogin(false);
      dispatchCookie('');
    });
  }

};

export default NicoAction;

// vim:ft=javascript