diff options
Diffstat (limited to 'web/src/js/ducks/eventLog.js')
-rw-r--r-- | web/src/js/ducks/eventLog.js | 178 |
1 files changed, 125 insertions, 53 deletions
diff --git a/web/src/js/ducks/eventLog.js b/web/src/js/ducks/eventLog.js index 44b67b2c..0c875689 100644 --- a/web/src/js/ducks/eventLog.js +++ b/web/src/js/ducks/eventLog.js @@ -1,80 +1,152 @@ -import makeList from "./utils/list" -import {updateViewFilter, updateViewList} from "./utils/view" +import { fetchApi } from '../utils' +import reduceList, * as listActions from './utils/list' +import reduceView, * as viewActions from './utils/view' +import * as websocketActions from './websocket' -const TOGGLE_FILTER = 'TOGGLE_EVENTLOG_FILTER' -const TOGGLE_VISIBILITY = 'TOGGLE_EVENTLOG_VISIBILITY' -export const UPDATE_LOG = "UPDATE_EVENTLOG" - -const { - reduceList, - updateList, - fetchList, - addItem, -} = makeList(UPDATE_LOG, "/events") +export const WS_MSG_TYPE = 'UPDATE_EVENTLOG' +export const ADD = 'EVENTLOG_ADD' +export const REQUEST = 'EVENTLOG_REQUEST' +export const RECEIVE = 'EVENTLOG_RECEIVE' +export const TOGGLE_VISIBILITY = 'EVENTLOG_TOGGLE_VISIBILITY' +export const TOGGLE_FILTER = 'EVENTLOG_TOGGLE_FILTER' +export const UNKNOWN_CMD = 'EVENTLOG_UNKNOWN_CMD' +export const FETCH_ERROR = 'EVENTLOG_FETCH_ERROR' const defaultState = { + logId: 0, visible: false, - filter: { - "debug": false, - "info": true, - "web": true - }, - events: reduceList(), - filteredEvents: [], + filters: { debug: false, info: true, web: true }, + list: undefined, + view: undefined, } -export default function reducer(state = defaultState, action) { +export default function reduce(state = defaultState, action) { switch (action.type) { + + case TOGGLE_VISIBILITY: + return { + ...state, + visible: !state.visible + } + case TOGGLE_FILTER: - const filter = { - ...state.filter, - [action.filter]: !state.filter[action.filter] + const filters = { ...state.filters, [action.filter]: !state.filters[action.filter] } + return { + ...state, + filters, + view: reduceView(state.view, viewActions.updateFilter(state.list, log => filters[log.level])), + } + + case ADD: + const item = { + id: `log-${state.logId}`, + message: action.message, + level: action.level, } return { ...state, - filter, - filteredEvents: updateViewFilter( - state.events, - x => filter[x.level] - ) + logId: state.logId + 1, + list: reduceList(state.list, listActions.add(item)), + view: reduceView(state.view, viewActions.add(item, log => state.filters[log.level])), } - case TOGGLE_VISIBILITY: + + case REQUEST: return { ...state, - visible: !state.visible + list: reduceList(state.list, listActions.request()), + } + + case RECEIVE: + const list = reduceList(state.list, listActions.receive(action.list)) + return { + ...state, + list, + view: reduceView(state.view, viewActions.receive(list, log => state.filters[log.level])), } - case UPDATE_LOG: - const events = reduceList(state.events, action) + + default: return { ...state, - events, - filteredEvents: updateViewList( - state.filteredEvents, - state.events, - events, - action, - x => state.filter[x.level] - ) + list: reduceList(state.list, action), + view: reduceView(state.view, action), } + } +} + +/** + * @public + */ +export function toggleFilter(filter) { + return { type: TOGGLE_FILTER, filter } +} + +/** + * @public + * + * @todo move to ui? + */ +export function toggleVisibility() { + return { type: TOGGLE_VISIBILITY } +} + +/** + * @public + */ +export function add(message, level = 'web') { + return { type: ADD, message, level } +} + +/** + * This action creater takes all WebSocket events + * + * @public websocket + */ +export function handleWsMsg(msg) { + switch (msg.cmd) { + + case websocketActions.CMD_ADD: + return add(msg.data.message, msg.data.level) + + case websocketActions.CMD_RESET: + return fetchData() + default: - return state + return { type: UNKNOWN_CMD, msg } } } +/** + * @public websocket + */ +export function fetchData() { + return dispatch => { + dispatch(request()) -export function toggleEventLogFilter(filter) { - return {type: TOGGLE_FILTER, filter} + return fetchApi('/events') + .then(res => res.json()) + .then(json => dispatch(receive(json.data))) + .catch(error => dispatch(fetchError(error))) + } } -export function toggleEventLogVisibility() { - return {type: TOGGLE_VISIBILITY} + +/** + * @private + */ +export function request() { + return { type: REQUEST } +} + +/** + * @private + */ +export function receive(list) { + return { type: RECEIVE, list } } -let id = 0 -export function addLogEntry(message, level = "web") { - return addItem({ - message, - level, - id: `log-${id++}` - }) + +/** + * @private + */ +export function fetchError(error) { + return { type: FETCH_ERROR, error } } -export {updateList as updateLogEntries, fetchList as fetchLogEntries}
\ No newline at end of file |