export function subscribeServersideUpdates()

in src/views/agile-board/board-actions.ts [797:861]


export function subscribeServersideUpdates(): ReduxAction {
  return async (
    dispatch: ReduxThunkDispatch,
    getState: ReduxStateGetter,
    getApi: ReduxAPIGetter,
  ) => {
    const {sprint} = getState().agile;

    const updateCache = (): void => {
      cacheSprint(sprint);
    };

    serverSideEventsInstance = new ServersideEvents(getApi().config.backendUrl);
    serverSideEventsInstance.subscribeAgileBoardUpdates(
      sprint.eventSourceTicket,
    );
    serverSideEventsInstance.listenTo('error', () => {
      clearTimeout(serverSideEventsInstanceErrorTimer);
      serverSideEventsInstanceErrorTimer = setTimeout(() => {
        log.info('Agile Actions: Reloading sprint and reconnecting to LiveUpdate...');

        if (Router.getCurrentRouteName() !== routeMap.AgileBoard) {
          destroySSE(); //TODO: remove after implementing lazy screens loading
        } else if (
          serverSideEventsInstanceErrorTimer &&
          serverSideEventsInstance
        ) {
          dispatch(loadSprintIssues(sprint));
        }
      }, RECONNECT_TIMEOUT);
    });
    serverSideEventsInstance.listenTo('sprintCellUpdate', data => {
      animateLayout();
      dispatch(addOrUpdateCellOnBoard(data.issue, data.row.id, data.column.id));
      updateCache();
    });
    serverSideEventsInstance.listenTo('sprintSwimlaneUpdate', data => {
      animateLayout();
      dispatch(updateSwimlane(data.swimlane));
      updateCache();
    });
    serverSideEventsInstance.listenTo('sprintIssueRemove', data => {
      animateLayout();
      dispatch(removeIssueFromBoard(data.removedIssue.id));
      updateCache();
    });
    serverSideEventsInstance.listenTo('sprintIssueHide', data => {
      animateLayout();
      dispatch(removeIssueFromBoard(data.removedIssue.id));
      updateCache();
    });
    serverSideEventsInstance.listenTo('sprintIssueMessage', function (data) {
      data.messages.forEach(msg => notify(msg));
    });
    serverSideEventsInstance.listenTo('sprintIssuesReorder', data => {
      animateLayout();
      data.reorders.forEach(function (reorder) {
        const leadingId = reorder.leading ? reorder.leading.id : null;
        dispatch(reorderSwimlanesOrCells(leadingId, reorder.moved.id));
      });
      updateCache();
    });
    setSSEInstance(serverSideEventsInstance);
  };
}