summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/actions/tabs.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/client/debugger/src/actions/tabs.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/actions/tabs.js b/devtools/client/debugger/src/actions/tabs.js
new file mode 100644
index 0000000000..f3464a7bfb
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tabs.js
@@ -0,0 +1,109 @@
+/* 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/>. */
+
+// @flow
+
+/**
+ * Redux actions for the editor tabs
+ * @module actions/tabs
+ */
+
+import { removeDocument } from "../utils/editor";
+import { recordEvent } from "../utils/telemetry";
+import { selectSource } from "./sources";
+
+import {
+ getSourceByURL,
+ getSourceTabs,
+ getNewSelectedSourceId,
+} from "../selectors";
+
+import type { Action, ThunkArgs } from "./types";
+import type { Source, Context, SourceId, URL } from "../types";
+
+export function updateTab(source: Source, framework: string): Action {
+ const { url, id: sourceId, isOriginal } = source;
+
+ return {
+ type: "UPDATE_TAB",
+ url,
+ framework,
+ isOriginal,
+ sourceId,
+ };
+}
+
+export function addTab(source: Source): Action {
+ const { url, id: sourceId, isOriginal } = source;
+
+ return {
+ type: "ADD_TAB",
+ url,
+ isOriginal,
+ sourceId,
+ };
+}
+
+export function moveTab(url: URL, tabIndex: number): Action {
+ return {
+ type: "MOVE_TAB",
+ url,
+ tabIndex,
+ };
+}
+
+export function moveTabBySourceId(
+ sourceId: SourceId,
+ tabIndex: number
+): Action {
+ return {
+ type: "MOVE_TAB_BY_SOURCE_ID",
+ sourceId,
+ tabIndex,
+ };
+}
+
+/**
+ * @memberof actions/tabs
+ * @static
+ */
+export function closeTab(
+ cx: Context,
+ source: Source,
+ reason: string = "click"
+) {
+ return ({ dispatch, getState, client }: ThunkArgs) => {
+ removeDocument(source.id);
+
+ const tabs = getSourceTabs(getState());
+ dispatch(({ type: "CLOSE_TAB", source }: Action));
+
+ const sourceId = getNewSelectedSourceId(getState(), tabs);
+ dispatch(selectSource(cx, sourceId));
+
+ recordEvent("close_source_tab", {
+ reason,
+ num_tabs: tabs.length,
+ });
+ };
+}
+
+/**
+ * @memberof actions/tabs
+ * @static
+ */
+export function closeTabs(cx: Context, urls: string[]) {
+ return ({ dispatch, getState, client }: ThunkArgs) => {
+ const sources = urls
+ .map(url => getSourceByURL(getState(), url))
+ .filter(Boolean);
+
+ const tabs = getSourceTabs(getState());
+ sources.map(source => removeDocument(source.id));
+ dispatch(({ type: "CLOSE_TABS", sources }: Action));
+
+ const sourceId = getNewSelectedSourceId(getState(), tabs);
+ dispatch(selectSource(cx, sourceId));
+ };
+}