import $ from 'jquery' import _ from 'lodash' import URI from 'urijs' import humps from 'humps' import socket from '../socket' import { updateAllAges } from '../lib/from_now' import { createStore, connectElements, slideDownPrepend } from '../utils' export const initialState = { channelDisconnected: false, newBlock: null, beyondPageOne: null } export function reducer (state = initialState, action) { switch (action.type) { case 'PAGE_LOAD': case 'ELEMENTS_LOAD': { return Object.assign({}, state, _.omit(action, 'type')) } case 'CHANNEL_DISCONNECTED': { return Object.assign({}, state, { channelDisconnected: true }) } case 'RECEIVED_NEW_BLOCK': { if (state.channelDisconnected || state.beyondPageOne) return state return Object.assign({}, state, { newBlock: action.msg.blockHtml }) } default: return state } } const elements = { '[data-selector="channel-disconnected-message"]': { render ($el, state) { if (state.channelDisconnected) $el.show() } }, '[data-selector="blocks-list"]': { render ($el, state, oldState) { if (oldState.newBlock === state.newBlock) return slideDownPrepend($el, state.newBlock) updateAllAges() } } } const $blockListPage = $('[data-page="block-list"]') if ($blockListPage.length) { const store = createStore(reducer) store.dispatch({ type: 'PAGE_LOAD', beyondPageOne: !!humps.camelizeKeys(URI(window.location).query(true)).blockNumber }) connectElements({ store, elements }) const blocksChannel = socket.channel(`blocks:new_block`, {}) blocksChannel.join() blocksChannel.onError(() => store.dispatch({ type: 'CHANNEL_DISCONNECTED' })) blocksChannel.on('new_block', (msg) => store.dispatch({ type: 'RECEIVED_NEW_BLOCK', msg: humps.camelizeKeys(msg) })) }