export function chat()

in packages/app/shared/src/state/reducers/chat.ts [103:417]


export function chat(state: ChatState = DEFAULT_STATE, action: ChatAction | EditorAction): ChatState {
  switch (action.type) {
    case ChatActions.addTranscript: {
      const { payload } = action;
      const transcriptsCopy = [...state.transcripts];
      const transcripts = transcriptsCopy.filter(xs => xs !== payload.filename);
      transcripts.push(payload.filename);
      state = setTranscriptsState(transcripts, state);
      break;
    }

    case ChatActions.clearTranscripts: {
      state = setTranscriptsState([], state);
      break;
    }

    case ChatActions.removeTranscript: {
      const { payload } = action;
      const transcriptsCopy = [...state.transcripts];
      const transcripts = transcriptsCopy.filter(xs => xs !== payload.filename);
      state = setTranscriptsState(transcripts, state);
      break;
    }

    case ChatActions.newChat: {
      const { payload } = action;
      state = {
        ...state,
        changeKey: state.changeKey + 1,
        chats: {
          ...state.chats,
          [payload.documentId]: { ...payload, replayData: {}, isDisabled: false },
        },
      };
      break;
    }

    case ChatActions.webSpeechFactoryUpdated:
      {
        const { documentId, factory } = action.payload as WebSpeechFactoryPayload;
        const { webSpeechFactories } = state;
        state = {
          ...state,
          webSpeechFactories: { ...webSpeechFactories, [documentId]: factory },
        };
      }
      break;

    case ChatActions.webChatStoreUpdated:
      {
        const { documentId, store } = action.payload as WebChatStorePayload;
        const { webChatStores } = state;
        state = {
          ...state,
          webChatStores: { ...webChatStores, [documentId]: store },
        };
      }
      break;

    case ChatActions.updatePendingSpeechTokenRetrieval:
      {
        const { documentId, pending } = action.payload as PendingSpeechTokenRetrievalPayload;
        state = {
          ...state,
          chats: {
            ...state.chats,
            [documentId]: {
              ...state.chats[documentId],
              pendingSpeechTokenRetrieval: pending,
            },
          },
        };
      }
      break;

    case ChatActions.closeDocument: {
      const { documentId } = action.payload;
      // can't use the JSON.parse(JSON.stringify())
      // trick with chats because Subscribers are circular
      if (documentId in state.chats) {
        const copy = { ...state };
        copy.changeKey += 1;
        delete copy.chats[documentId];
        delete copy.restartStatus[documentId];
        state = { ...copy };
      }
      break;
    }

    case ChatActions.appendLog: {
      const { payload } = action;
      let document = state.chats[payload.documentId];
      if (document) {
        document = {
          ...document,
          log: {
            ...document.log,
            entries: [...document.log.entries, payload.entry],
          },
        };
        state = {
          ...state,
          chats: {
            ...state.chats,
            [payload.documentId]: {
              ...document,
            },
          },
        };
      }
      break;
    }

    case ChatActions.clearLog: {
      const { payload } = action;
      let document = state.chats[payload.documentId];
      if (document) {
        document = {
          ...document,
          log: {
            entries: [],
          },
        };
        state = {
          ...state,
          chats: {
            ...state.chats,
            [payload.documentId]: {
              ...document,
            },
          },
        };
      }
      break;
    }

    case ChatActions.setHighlightedObjects:
      {
        const { payload } = action;
        let document = state.chats[payload.documentId];
        if (document) {
          document = {
            ...document,
            highlightedObjects: payload.objs,
          };
        }
        state = {
          ...state,
          chats: {
            ...state.chats,
            [payload.documentId]: {
              ...document,
            },
          },
        };
      }
      break;

    case ChatActions.setInspectorObjects: {
      const { payload } = action;
      let document = state.chats[payload.documentId];
      if (document) {
        document = {
          ...document,
          inspectorObjects: payload.objs,
        };
      }
      state = {
        ...state,
        chats: {
          ...state.chats,
          [payload.documentId]: {
            ...document,
          },
        },
      };
      break;
    }

    case ChatActions.updateChat: {
      const { payload } = action;
      const { documentId = '', updatedValues = {} } = payload;
      let document = state.chats[documentId];
      if (document) {
        document = {
          ...document,
          ...updatedValues,
        };
        state = {
          ...state,
          chats: {
            ...state.chats,
            [payload.documentId]: {
              ...document,
            },
          },
        };
      }
      break;
    }

    case ChatActions.IncomingActivityFromWc: {
      const { documentId, activity } = action.payload as ActivityFromWebChatPayload;
      const replayData: ChatReplayData = state.chats[documentId].replayData;
      let incomingActivities: IncomingActivityRecord[] = [];
      if (replayData.incomingActivities) {
        incomingActivities = [...replayData.incomingActivities];
      }
      incomingActivities.push({
        id: activity.id,
        replyToId: activity.replyToId,
      });
      state = {
        ...state,
        chats: {
          ...state.chats,
          [documentId]: {
            ...state.chats[documentId],
            replayData: {
              ...state.chats[documentId].replayData,
              incomingActivities,
            },
          },
        },
      };
      break;
    }

    case ChatActions.PostActivityEventWc: {
      const { documentId } = action.payload as ActivityFromWebChatPayload;
      let postActivitiesSlots: number[] = [];
      if (state.chats[documentId].replayData.postActivitiesSlots) {
        postActivitiesSlots = [...state.chats[documentId].replayData.postActivitiesSlots];
      }
      const slot: number = state.chats[documentId].replayData.incomingActivities
        ? state.chats[documentId].replayData.incomingActivities.length
        : 0;
      postActivitiesSlots.push(slot);
      state = {
        ...state,
        chats: {
          ...state.chats,
          [documentId]: {
            ...state.chats[documentId],
            replayData: {
              ...state.chats[documentId].replayData,
              postActivitiesSlots,
            },
          },
        },
      };
      break;
    }

    case ChatActions.SetRestartConversationStatus: {
      const { documentId, status } = action.payload as RestartConversationStatusPayload;
      state = {
        ...state,
        restartStatus: {
          ...state.restartStatus,
          [documentId]: status,
        },
      };
      break;
    }

    case EditorActions.closeAll: {
      // HACK. Need a better system.
      return DEFAULT_STATE;
    }

    case ChatActions.SetRestartConversationOption: {
      const { documentId, option } = action.payload as SetRestartConversationOptionPayload;
      state = {
        ...state,
        chats: {
          ...state.chats,
          [documentId]: {
            ...state.chats[documentId],
            restartConversationOption: option,
          },
        },
      };
      break;
    }

    case ChatActions.updateSpeechAdapters: {
      const { payload } = action as ChatAction<UpdateSpeechAdaptersPayload>;
      const { directLine, documentId, webSpeechPonyfillFactory } = payload;
      let document = state.chats[documentId];
      if (document) {
        document = {
          ...document,
          directLine,
        };
        state = {
          ...state,
          chats: {
            ...state.chats,
            [payload.documentId]: {
              ...document,
            },
          },
          webSpeechFactories: { ...state.webSpeechFactories, [documentId]: webSpeechPonyfillFactory },
        };
      }
      break;
    }

    default:
      break;
  }

  return state;
}