Source code

Revision control

Copy as Markdown

Other Tools

/* 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/>. */
import {
getActiveSearch,
getPaneCollapse,
getQuickOpenEnabled,
getSource,
getSourceTextContent,
getIgnoreListSourceUrls,
getSourceByURL,
getBreakpointsForSource,
} from "../selectors/index";
import { selectSource } from "../actions/sources/select";
import { getEditor, updateEditorLineWrapping } from "../utils/editor/index";
import { blackboxSourceActorsForSource } from "./sources/blackbox";
import { toggleBreakpoints } from "./breakpoints/index";
import { copyToTheClipboard } from "../utils/clipboard";
import { isFulfilled } from "../utils/async-value";
import { primaryPaneTabs } from "../constants";
import { features } from "../utils/prefs";
export function setPrimaryPaneTab(tabName) {
return { type: "SET_PRIMARY_PANE_TAB", tabName };
}
export function closeActiveSearch() {
return {
type: "TOGGLE_ACTIVE_SEARCH",
value: null,
};
}
export function setActiveSearch(activeSearch) {
return ({ dispatch, getState }) => {
const activeSearchState = getActiveSearch(getState());
if (activeSearchState === activeSearch) {
return;
}
if (getQuickOpenEnabled(getState())) {
dispatch({ type: "CLOSE_QUICK_OPEN" });
}
// Open start panel if it was collapsed so the project search UI is visible
if (
activeSearch === primaryPaneTabs.PROJECT_SEARCH &&
getPaneCollapse(getState(), "start")
) {
dispatch({
type: "TOGGLE_PANE",
position: "start",
paneCollapsed: false,
});
}
dispatch({
type: "TOGGLE_ACTIVE_SEARCH",
value: activeSearch,
});
};
}
export function toggleFrameworkGrouping(toggleValue) {
return ({ dispatch }) => {
dispatch({
type: "TOGGLE_FRAMEWORK_GROUPING",
value: toggleValue,
});
};
}
export function toggleInlinePreview(toggleValue) {
return ({ dispatch }) => {
dispatch({
type: "TOGGLE_INLINE_PREVIEW",
value: toggleValue,
});
};
}
export function toggleEditorWrapping(toggleValue) {
return ({ dispatch }) => {
updateEditorLineWrapping(toggleValue);
dispatch({
type: "TOGGLE_EDITOR_WRAPPING",
value: toggleValue,
});
};
}
export function toggleSourceMapsEnabled(toggleValue) {
return ({ dispatch }) => {
dispatch({
type: "TOGGLE_SOURCE_MAPS_ENABLED",
value: toggleValue,
});
};
}
export function showSource(sourceId) {
return ({ dispatch, getState }) => {
const source = getSource(getState(), sourceId);
if (!source) {
return;
}
if (getPaneCollapse(getState(), "start")) {
dispatch({
type: "TOGGLE_PANE",
position: "start",
paneCollapsed: false,
});
}
dispatch(setPrimaryPaneTab("sources"));
dispatch(selectSource(source));
};
}
export function togglePaneCollapse(position, paneCollapsed) {
return ({ dispatch, getState }) => {
const prevPaneCollapse = getPaneCollapse(getState(), position);
if (prevPaneCollapse === paneCollapsed) {
return;
}
// Set active search to null when closing start panel if project search was active
if (
position === "start" &&
paneCollapsed &&
getActiveSearch(getState()) === primaryPaneTabs.PROJECT_SEARCH
) {
dispatch(closeActiveSearch());
}
dispatch({
type: "TOGGLE_PANE",
position,
paneCollapsed,
});
};
}
/**
* Highlight one or many lines in CodeMirror for a given source.
*
* @param {Object} location
* @param {String} location.sourceId
* The precise source to highlight.
* @param {Number} location.start
* The 1-based index of first line to highlight.
* @param {Number} location.end
* The 1-based index of last line to highlight.
*/
export function highlightLineRange(location) {
return {
type: "HIGHLIGHT_LINES",
location,
};
}
export function flashLineRange(location) {
return ({ dispatch }) => {
dispatch(highlightLineRange(location));
setTimeout(() => dispatch(clearHighlightLineRange()), 200);
};
}
export function clearHighlightLineRange() {
return {
type: "CLEAR_HIGHLIGHT_LINES",
};
}
export function openConditionalPanel(location, log = false) {
if (!location) {
return null;
}
return {
type: "OPEN_CONDITIONAL_PANEL",
location,
log,
};
}
export function closeConditionalPanel() {
return {
type: "CLOSE_CONDITIONAL_PANEL",
};
}
export function updateViewport() {
const editor = getEditor(features.codemirrorNext);
return {
type: "SET_VIEWPORT",
viewport: editor.getLocationsInViewport(),
};
}
export function updateCursorPosition(cursorPosition) {
return { type: "SET_CURSOR_POSITION", cursorPosition };
}
export function setOrientation(orientation) {
return { type: "SET_ORIENTATION", orientation };
}
export function setSearchOptions(searchKey, searchOptions) {
return { type: "SET_SEARCH_OPTIONS", searchKey, searchOptions };
}
export function copyToClipboard(location) {
return ({ getState }) => {
const content = getSourceTextContent(getState(), location);
if (content && isFulfilled(content) && content.value.type === "text") {
copyToTheClipboard(content.value.value);
}
};
}
export function setHideOrShowIgnoredSources(shouldHide) {
return { type: "HIDE_IGNORED_SOURCES", shouldHide };
}
export function toggleSourceMapIgnoreList(shouldEnable) {
return async thunkArgs => {
const { dispatch, getState } = thunkArgs;
const ignoreListSourceUrls = getIgnoreListSourceUrls(getState());
// Blackbox the source actors on the server
for (const url of ignoreListSourceUrls) {
const source = getSourceByURL(getState(), url);
await blackboxSourceActorsForSource(thunkArgs, source, shouldEnable);
// Disable breakpoints in sources on the ignore list
const breakpoints = getBreakpointsForSource(getState(), source);
await dispatch(toggleBreakpoints(shouldEnable, breakpoints));
}
await dispatch({
type: "ENABLE_SOURCEMAP_IGNORELIST",
shouldEnable,
});
};
}