Welcome to mirror list, hosted at ThFree Co, Russian Federation.

terminal_sync.js « plugins « stores « ide « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 944a034fe97ec6a9d0fe27508ec66eea71d9be27 (plain)
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
import { debounce } from 'lodash';
import { commitActionTypes } from '~/ide/constants';
import eventHub from '~/ide/eventhub';
import { isEndingStatus, isRunningStatus } from '../modules/terminal/utils';
import terminalSyncModule from '../modules/terminal_sync';

const UPLOAD_DEBOUNCE = 200;

/**
 * Registers and controls the terminalSync vuex module based on IDE events.
 *
 * - Watches the terminal session status state to control start/stop.
 * - Listens for file change event to control upload.
 */
export default function createMirrorPlugin() {
  return (store) => {
    store.registerModule('terminalSync', terminalSyncModule());

    const upload = debounce(() => {
      store.dispatch(`terminalSync/upload`);
    }, UPLOAD_DEBOUNCE);

    const onFilesChange = (payload) => {
      // Do nothing on a file update since we only want to trigger manually on "save".
      if (payload?.type === commitActionTypes.update) {
        return;
      }

      upload();
    };

    const stop = () => {
      store.dispatch(`terminalSync/stop`);
      eventHub.$off('ide.files.change', onFilesChange);
    };

    const start = () => {
      store
        .dispatch(`terminalSync/start`)
        .then(() => {
          eventHub.$on('ide.files.change', onFilesChange);
        })
        .catch(() => {
          // error is handled in store
        });
    };

    store.watch(
      (x) => x.terminal && x.terminal.session && x.terminal.session.status,
      (val) => {
        if (isRunningStatus(val)) {
          start();
        } else if (isEndingStatus(val)) {
          stop();
        }
      },
    );
  };
}