All files / src/store/features/console consoleState.ts

91.3% Statements 21/23
71.43% Branches 5/7
83.33% Functions 5/6
91.3% Lines 21/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 9922x 22x                                                           22x           22x         1x 1x   1x 1x     1x 1x 1x     1x                     1x             1x       1x             1x 1x       1x 1x           22x   22x  
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import l10n from "shared/lib/lang/l10n";
import type { EditorSelectionType } from "store/features/editor/editorState";
 
type ConsoleStatus = "idle" | "running" | "complete" | "cancelled";
 
export interface ConsoleLink {
  linkText: string;
  type: EditorSelectionType;
  entityId: string;
  sceneId: string;
}
 
interface ConsoleLine {
  type: "out" | "err";
  text: string;
  link?: ConsoleLink;
}
 
interface ConsoleErrorLine {
  type: "err";
  text: string;
  link?: ConsoleLink;
}
 
export interface ConsoleState {
  status: ConsoleStatus;
  output: ConsoleLine[];
  warnings: ConsoleErrorLine[];
}
 
export const initialState: ConsoleState = {
  status: "idle",
  output: [],
  warnings: [],
};
 
const consoleSlice = createSlice({
  name: "console",
  initialState,
  reducers: {
    clearConsole: (state, _action: PayloadAction<void>) => {
      if (state.status !== "running") {
        state.status = "idle";
      }
      state.output = [];
      state.warnings = [];
    },
    startConsole: (state, _action: PayloadAction<void>) => {
      state.status = "running";
      state.output = [];
      state.warnings = [];
    },
    completeConsole: (state, _action: PayloadAction<void>) => {
      state.status = "complete";
    },
    cancelConsole: (state, _action: PayloadAction<void>) => {
      Iif (state.status === "running") {
        state.status = "cancelled";
      }
    },
    stdOut: (
      state,
      action: PayloadAction<{ text: string; link?: ConsoleLink }>
    ) => {
      if (
        action.payload &&
        // When cancelling only allow cancelled message to be output
        // to clear backlog of progress messages
        (state.status !== "cancelled" ||
          action.payload.text === l10n("BUILD_CANCELLED"))
      ) {
        const line: ConsoleLine = {
          type: "out",
          ...action.payload,
        };
        state.output.push(line);
      }
    },
    stdErr: (
      state,
      action: PayloadAction<{ text: string; link?: ConsoleLink }>
    ) => {
      if (action.payload) {
        const line: ConsoleErrorLine = {
          type: "err",
          ...action.payload,
        };
        state.output.push(line);
        state.warnings.push(line);
      }
    },
  },
});
 
export const { actions, reducer } = consoleSlice;
 
export default reducer;