summaryrefslogtreecommitdiffstats
path: root/devtools/client/framework/reducers/targets.js
blob: 2a0f3c4c36ed1e3272bc27cc9a9d3833c8596918 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* 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 initialReducerState = {
  // Array of targetFront
  targets: [],
  // The selected targetFront instance
  selected: null,
};

exports.reducer = targetsReducer;
function targetsReducer(state = initialReducerState, action) {
  switch (action.type) {
    case "SELECT_TARGET": {
      const { targetActorID } = action;

      if (state.selected?.actorID === targetActorID) {
        return state;
      }

      const selectedTarget = state.targets.find(
        target => target.actorID === targetActorID
      );

      // It's possible that the target reducer is missing a target
      // e.g. workers, remote iframes, etc. (Bug 1594754)
      if (!selectedTarget) {
        return state;
      }

      return { ...state, selected: selectedTarget };
    }

    case "REGISTER_TARGET": {
      return {
        ...state,
        targets: [...state.targets, action.targetFront],
      };
    }

    case "UNREGISTER_TARGET": {
      const targets = state.targets.filter(
        target => target !== action.targetFront
      );

      let { selected } = state;
      if (selected === action.targetFront) {
        selected = null;
      }

      return { ...state, targets, selected };
    }
  }
  return state;
}

exports.getToolboxTargets = getToolboxTargets;
function getToolboxTargets(state) {
  return state.targets.targets;
}

exports.getSelectedTarget = getSelectedTarget;
function getSelectedTarget(state) {
  return state.targets.selected;
}