summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/animation/reducers/animations.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/client/inspector/animation/reducers/animations.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/devtools/client/inspector/animation/reducers/animations.js b/devtools/client/inspector/animation/reducers/animations.js
new file mode 100644
index 0000000000..ead3e84147
--- /dev/null
+++ b/devtools/client/inspector/animation/reducers/animations.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const {
+ UPDATE_ANIMATIONS,
+ UPDATE_DETAIL_VISIBILITY,
+ UPDATE_ELEMENT_PICKER_ENABLED,
+ UPDATE_HIGHLIGHTED_NODE,
+ UPDATE_PLAYBACK_RATES,
+ UPDATE_SELECTED_ANIMATION,
+ UPDATE_SIDEBAR_SIZE,
+} = require("resource://devtools/client/inspector/animation/actions/index.js");
+
+loader.lazyRequireGetter(
+ this,
+ "TimeScale",
+ "resource://devtools/client/inspector/animation/utils/timescale.js"
+);
+
+const INITIAL_STATE = {
+ animations: [],
+ detailVisibility: false,
+ elementPickerEnabled: false,
+ highlightedNode: null,
+ playbackRates: [],
+ selectedAnimation: null,
+ sidebarSize: {
+ height: 0,
+ width: 0,
+ },
+ timeScale: null,
+};
+
+const reducers = {
+ [UPDATE_ANIMATIONS](state, { animations }) {
+ let detailVisibility = state.detailVisibility;
+ let selectedAnimation = state.selectedAnimation;
+
+ if (
+ !state.selectedAnimation ||
+ !animations.find(
+ animation => animation.actorID === selectedAnimation.actorID
+ )
+ ) {
+ selectedAnimation = animations.length === 1 ? animations[0] : null;
+ detailVisibility = !!selectedAnimation;
+ }
+
+ const playbackRates = getPlaybackRates(state.playbackRates, animations);
+
+ return Object.assign({}, state, {
+ animations,
+ detailVisibility,
+ playbackRates,
+ selectedAnimation,
+ timeScale: new TimeScale(animations),
+ });
+ },
+
+ [UPDATE_DETAIL_VISIBILITY](state, { detailVisibility }) {
+ const selectedAnimation = detailVisibility ? state.selectedAnimation : null;
+
+ return Object.assign({}, state, {
+ detailVisibility,
+ selectedAnimation,
+ });
+ },
+
+ [UPDATE_ELEMENT_PICKER_ENABLED](state, { elementPickerEnabled }) {
+ return Object.assign({}, state, {
+ elementPickerEnabled,
+ });
+ },
+
+ [UPDATE_HIGHLIGHTED_NODE](state, { highlightedNode }) {
+ return Object.assign({}, state, {
+ highlightedNode,
+ });
+ },
+
+ [UPDATE_PLAYBACK_RATES](state) {
+ return Object.assign({}, state, {
+ playbackRates: getPlaybackRates([], state.animations),
+ });
+ },
+
+ [UPDATE_SELECTED_ANIMATION](state, { selectedAnimation }) {
+ const detailVisibility = !!selectedAnimation;
+
+ return Object.assign({}, state, {
+ detailVisibility,
+ selectedAnimation,
+ });
+ },
+
+ [UPDATE_SIDEBAR_SIZE](state, { sidebarSize }) {
+ return Object.assign({}, state, {
+ sidebarSize,
+ });
+ },
+};
+
+function getPlaybackRates(basePlaybackRate, animations) {
+ return [
+ ...new Set(
+ animations.map(a => a.state.playbackRate).concat(basePlaybackRate)
+ ),
+ ];
+}
+
+module.exports = function (state = INITIAL_STATE, action) {
+ const reducer = reducers[action.type];
+ return reducer ? reducer(state, action) : state;
+};