import { createSelector } from 'reselect' // ------------------------------------ // Initial State // ------------------------------------ const initialState = { filter: 'ALL_ACTIVITY', filters: [ { key: 'ALL_ACTIVITY', name: 'Activity'}, { key: 'LN_ACTIVITY', name: 'Lightning Network'}, { key: 'PAYMENT_ACTIVITY', name: 'Payments'}, { key: 'INVOICE_ACTIVITY', name: 'Invoices'}, { key: 'TRANSACTION_ACTIVITY', name: 'Transactions'} ], modal: { modalType: null, modalProps: {} } } // ------------------------------------ // Constants // ------------------------------------ export const SHOW_ACTIVITY_MODAL = 'SHOW_ACTIVITY_MODAL' export const HIDE_ACTIVITY_MODAL = 'HIDE_ACTIVITY_MODAL' export const CHANGE_FILTER = 'CHANGE_FILTER' // ------------------------------------ // Actions // ------------------------------------ export function showActivityModal(modalType, modalProps) { return { type: SHOW_ACTIVITY_MODAL, modalType, modalProps } } export function hideActivityModal() { return { type: HIDE_ACTIVITY_MODAL } } export function changeFilter(filter) { type: CHANGE_FILTER, filter } // ------------------------------------ // Action Handlers // ------------------------------------ const ACTION_HANDLERS = { [SHOW_ACTIVITY_MODAL]: (state, { modalType, modalProps }) => ({ ...state, modal: { modalType, modalProps } }), [HIDE_ACTIVITY_MODAL]: (state) => ({ ...state, modal: { modalType: null, modalProps: {} } }), [CHANGE_FILTER]: (state, { filter }) => ({ ...state, filter }) } // ------------------------------------ // Selectors // ------------------------------------ const activitySelectors = {} const filtersSelector = state => state.activity.filters const filterSelector = state => state.activity.filter const paymentsSelector = state => state.payment.payments const invoicesSelector = state => state.invoice.invoices const transactionsSelector = state => state.transaction.transactions const allActivity = createSelector( paymentsSelector, invoicesSelector, transactionsSelector, (payments, invoices, transactions) => { return [...payments, ...invoices, ...transactions].sort((a, b) => { let aTimestamp = a.hasOwnProperty('time_stamp') ? a.time_stamp : a.creation_date let bTimestamp = b.hasOwnProperty('time_stamp') ? b.time_stamp : b.creation_date return bTimestamp - aTimestamp }) } ) const lnActivity = createSelector( paymentsSelector, invoicesSelector, (payments, invoices) => { return [...payments, ...invoices].sort((a, b) => { let aTimestamp = a.hasOwnProperty('time_stamp') ? a.time_stamp : a.creation_date let bTimestamp = b.hasOwnProperty('time_stamp') ? b.time_stamp : b.creation_date return bTimestamp - aTimestamp }) } ) const paymentActivity = createSelector( paymentsSelector, payments => payments ) const invoiceActivity = createSelector( invoicesSelector, invoices => invoices ) const transactionActivity = createSelector( transactionsSelector, transactions => transactions ) activitySelectors.currentActivity = createSelector( filterSelector, filter => FILTERS[filter] ) activitySelectors.nonActiveFilters = createSelector( filtersSelector, filterSelector, (filters, filter) => filters.filter(f => f.key !== filter) ) const FILTERS = { ALL_ACTIVITY: allActivity, LN_ACTIVITY: lnActivity, PAYMENT_ACTIVITY: paymentActivity, INVOICE_ACTIVITY: invoiceActivity, TRANSACTION_ACTIVITY: transactionActivity } export { activitySelectors } // ------------------------------------ // Reducer // ------------------------------------ export default function activityReducer(state = initialState, action) { const handler = ACTION_HANDLERS[action.type] return handler ? handler(state, action) : state }