From 72b647bc14344134e6c5b1441038e2428462449d Mon Sep 17 00:00:00 2001 From: metalex9 Date: Sat, 11 Jul 2020 19:07:23 -0500 Subject: [PATCH] Add feature analytics --- .../main-controls/timer-config/index.jsx | 15 ++++-- .../actions/creators/update-timer.creator.js | 6 ++- src/store/reducers/analytics.reducer.js | 50 +++++++++++++++++++ src/store/reducers/root.reducer.js | 2 + 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/store/reducers/analytics.reducer.js diff --git a/src/components/app/controls/main-controls/timer-config/index.jsx b/src/components/app/controls/main-controls/timer-config/index.jsx index 2c1392c..b2697b6 100644 --- a/src/components/app/controls/main-controls/timer-config/index.jsx +++ b/src/components/app/controls/main-controls/timer-config/index.jsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, useCallback } from 'react'; import propTypes from 'prop-types'; import TextButton from '@components/shared/text-button'; import './timer-config.scss'; @@ -15,6 +15,10 @@ const StartTimerContent = ({ lastDurationsMS, startTimer }) => { startTimer(durationMS); }; + const handleDurationInputChange = useCallback(event => { + setCustomDuration(event.target.value); + }, []); + return (
cancelTimer()} + onClick={handleCancelClick} title="Cancel timer and resume endless playback" > Cancel Timer diff --git a/src/store/actions/creators/update-timer.creator.js b/src/store/actions/creators/update-timer.creator.js index 1ef7c1c..5b88fb6 100644 --- a/src/store/actions/creators/update-timer.creator.js +++ b/src/store/actions/creators/update-timer.creator.js @@ -1,5 +1,9 @@ import UPDATE_TIMER from '../types/update-timer.type'; -const updateTimer = deltaMS => ({ type: UPDATE_TIMER, payload: deltaMS }); +const updateTimer = (deltaMS, isUserUpdate = false) => ({ + type: UPDATE_TIMER, + payload: deltaMS, + meta: { isUserUpdate }, +}); export default updateTimer; diff --git a/src/store/reducers/analytics.reducer.js b/src/store/reducers/analytics.reducer.js new file mode 100644 index 0000000..3f93f87 --- /dev/null +++ b/src/store/reducers/analytics.reducer.js @@ -0,0 +1,50 @@ +import START_TIMER from '../actions/types/start-timer.type'; +import NEXT from '../actions/types/next.type'; +import PREVIOUS from '../actions/types/previous.type'; +import UPDATE_TIMER from '../actions/types/update-timer.type'; +import CANCEL_TIMER from '../actions/types/cancel-timer.type'; + +const updateCount = (state, propName) => + Object.assign({}, state, { + [propName]: (state[propName] || 0) + 1, + }); + +const analyticsReducer = (state = {}, action) => { + switch (action.type) { + case START_TIMER: { + const { payload: durationMs } = action; + const newState = updateCount(state, 'timerStartCount'); + newState.timerDurationCounts = updateCount( + newState.timerDurationCounts || {}, + durationMs + ); + return newState; + } + case UPDATE_TIMER: { + const { payload: deltaMs, meta } = action; + if (!meta || !meta.isUserUpdate) { + return state; + } + const newState = updateCount(state, 'timerUpdateCount'); + newState.timerDeltaCounts = updateCount( + newState.timerDeltaCounts || {}, + deltaMs + ); + return newState; + } + case CANCEL_TIMER: { + return updateCount(state, 'timerCancelCount'); + } + case NEXT: { + return updateCount(state, 'nextCount'); + } + case PREVIOUS: { + return updateCount(state, 'previousCount'); + } + default: { + return state; + } + } +}; + +export default analyticsReducer; diff --git a/src/store/reducers/root.reducer.js b/src/store/reducers/root.reducer.js index 001339e..40aab78 100644 --- a/src/store/reducers/root.reducer.js +++ b/src/store/reducers/root.reducer.js @@ -22,6 +22,7 @@ import visiblePieceIdsReducer from './visible-piece-ids.reducer'; import isInstallable from './is-installable.reducer'; import globalPlayTime from './global-play-time.reducer'; import favoriteCount from './favorite-count.reducer'; +import analytics from './analytics.reducer'; const combinedReducer = combineReducers({ isMuted, @@ -46,6 +47,7 @@ const combinedReducer = combineReducers({ isInstallable, globalPlayTime, favoriteCount, + analytics, }); const rootReducer = (state = {}, action) => {