Skip to content

Instantly share code, notes, and snippets.

@AZaviruha
Created January 21, 2016 12:36
Show Gist options
  • Save AZaviruha/84f38af6ccf91190b76f to your computer and use it in GitHub Desktop.
Save AZaviruha/84f38af6ccf91190b76f to your computer and use it in GitHub Desktop.
/**
*
* @module components/cbt-request-block
*/
/* global require */
const tools = require('../tools');
const DTO = window.DTO;
const STATES = {
INITIALIZING : 'initializing',
RESOLVING_NEXT_STATE : 'resolving-next-state',
CBT_REQUEST_NOT_SENT : 'cbt-request-not-sent',
CBT_REQUEST_SENT : 'cbt-request-sent',
CBT_REQUEST_APPROVED : 'cbt-request-approved',
CBT_REQUEST_CANT_BE_SENT : 'cbt-request-cant-be-sent'
};
let INPUT_EVENTS;
const LOCAL_EVENTS = {
INITIALIZED : 'initialized',
CAN_REQUEST_DETECTED : 'can-request-detected',
REQUEST_SENT_DETECTED : 'request-sent-detected',
CBT_APPROVE_DETECTED : 'cbt-approve-detected',
CBT_FROM_HERE_REQUESTED : 'cbt-from-here-requested'
};
module.exports = tools.component({
id: 'cbt-request-fsm',
//======================= PUBLIC EVENTS API =====================//
inputEvents: INPUT_EVENTS = {
CBT_FROM_TIMELINE_REQUESTED : 'cbt-from-timeline-requested',
FREE_PACK_PURCHASED : 'free-pack-purchased',
FIRST_PACK_PURCHASED : 'first-pack-purchased',
SECOND_PACK_PURCHASED : 'second-pack-purchased',
THIRD_PACK_PURCHASED : 'third-pack-purchased'
},
outputEvents: {
CBT_FROM_PACK_REQUESTED : 'cbt-from-pack-requested'
},
//========================= FSM CONFIG ==========================//
initialState: STATES.RESOLVING_NEXT_STATE,
states: {
[STATES.RESOLVING_NEXT_STATE]: {
[LOCAL_EVENTS.CAN_REQUEST_DETECTED] : STATES.CBT_REQUEST_NOT_SENT,
[LOCAL_EVENTS.REQUEST_SENT_DETECTED] : STATES.CBT_REQUEST_SENT,
[LOCAL_EVENTS.CBT_APPROVE_DETECTED] : STATES.CBT_REQUEST_APPROVED,
_onEnter : resolveNextState
},
[STATES.CBT_REQUEST_NOT_SENT]: {
[INPUT_EVENTS.CBT_FROM_TIMELINE_REQUESTED] : STATES.CBT_REQUEST_SENT,
[LOCAL_EVENTS.CBT_FROM_HERE_REQUESTED] : STATES.CBT_REQUEST_SENT,
_onEnter: updateViewState
},
[STATES.CBT_REQUEST_SENT]: {
[INPUT_EVENTS.CBT_APROVE_RECEIVED] : STATES.CBT_REQUEST_APPROVED,
[INPUT_EVENTS.FIRST_PACK_PURCHASED] : STATES.CBT_REQUEST_APPROVED,
[INPUT_EVENTS.SECOND_PACK_PURCHASED] : STATES.CBT_REQUEST_APPROVED,
[INPUT_EVENTS.THIRD_PACK_PURCHASED] : STATES.CBT_REQUEST_APPROVED,
_onEnter: updateViewState
},
[STATES.CBT_REQUEST_APPROVED]: {
_onEnter: updateViewState
}
}
});
//=======================================================//
function resolveNextState() {
let compFsm = this;
let config = compFsm.__config;
let appEventBus = config.eventBus;
let elem = document.querySelector('.cbt-request-block purchase-button2');
let elemBus = new DTO.purchaseTools.EventBus(elem);
// TODO: добавить id ачивки
DTO.achievements
.get('ДОБАВИТЬ ID АЧИВКИ')
.map('.progress')
.filter(Boolean)
.skipDuplicates()
.onValue(() => {
/**
* Unlock ачивки значит, что заявка на CBT одобрена,
* а поэтому нам нет нужды больше знать о состоянии
* кнопки purchase-button2.
*/
elemBus.off('purchaseDisabled');
elemBus.on('purchaseTransition');
compFsm.handle(LOCAL_EVENTS.CBT_APPROVE_DETECTED);
});
elemBus.on('purchaseDisabled', (event) => {
let err = event.detail;
/**
* Если продукт куплен, то это значит только то,
* что Заявка была подана Пользователем. Была ли она
* одобрена - об этом мы узнаем только после unlock
* ачивки `ДОБАВИТЬ ID АЧИВКИ`
*/
if (err.code === 'ENOVALIDOFFER') {
compFsm.handle(LOCAL_EVENTS.REQUEST_SENT_DETECTED);
elemBus.off('purchaseDisabled');
elemBus.on('purchaseTransition');
}
});
elemBus.on('purchaseTransition', ({detail}) => {
if (detail === 'ready') {
compFsm.handle(LOCAL_EVENTS.CAN_REQUEST_DETECTED);
}
});
elemBus.on('purchaseComplete', () => {
elemBus.off('purchaseComplete');
elem.disable(config.id);
appEventBus.emit(config.outputEvents.CBT_FROM_PACK_REQUESTED);
compFsm.handle(LOCAL_EVENTS.CBT_FROM_HERE_REQUESTED);
});
}
function updateViewState() {
DTO.$('.cbt-request-block').attr('data-component-state', this.state);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment