aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/ducks/eventLog.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/js/ducks/eventLog.js')
-rw-r--r--web/src/js/ducks/eventLog.js178
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