您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

middleware.ts 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { CONFERENCE_JOIN_IN_PROGRESS } from '../base/conference/actionTypes';
  2. import { getCurrentConference } from '../base/conference/functions';
  3. import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
  4. import StateListenerRegistry from '../base/redux/StateListenerRegistry';
  5. import { sanitizeUrl } from '../base/util/uri';
  6. import { TOGGLE_DOCUMENT_EDITING } from './actionTypes';
  7. import { setDocumentUrl } from './actions';
  8. const ETHERPAD_COMMAND = 'etherpad';
  9. /**
  10. * Middleware that captures actions related to collaborative document editing
  11. * and notifies components not hooked into redux.
  12. *
  13. * @param {Store} store - The redux store.
  14. * @returns {Function}
  15. */
  16. // eslint-disable-next-line no-unused-vars
  17. MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
  18. switch (action.type) {
  19. case CONFERENCE_JOIN_IN_PROGRESS: {
  20. const { conference } = action;
  21. conference.addCommandListener(ETHERPAD_COMMAND,
  22. ({ value }: { value: string; }) => {
  23. let url;
  24. const { etherpad_base: etherpadBase } = getState()['features/base/config'];
  25. const etherpadBaseUrl = sanitizeUrl(etherpadBase);
  26. if (etherpadBaseUrl) {
  27. const urlObj = new URL(value, etherpadBaseUrl.toString());
  28. // Merge query string parameters on top of internal ones
  29. if (etherpadBaseUrl.search) {
  30. const searchParams = new URLSearchParams(urlObj.search);
  31. for (const [ key, val ] of new URLSearchParams(etherpadBaseUrl.search)) {
  32. searchParams.set(key, val);
  33. }
  34. urlObj.search = searchParams.toString();
  35. }
  36. url = urlObj.toString();
  37. }
  38. dispatch(setDocumentUrl(url));
  39. }
  40. );
  41. break;
  42. }
  43. case TOGGLE_DOCUMENT_EDITING: {
  44. if (typeof APP !== 'undefined') {
  45. APP.UI.onEtherpadClicked();
  46. }
  47. break;
  48. }
  49. }
  50. return next(action);
  51. });
  52. /**
  53. * Set up state change listener to perform maintenance tasks when the conference
  54. * is left or failed, e.g. Clear messages or close the chat modal if it's left
  55. * open.
  56. */
  57. StateListenerRegistry.register(
  58. state => getCurrentConference(state),
  59. (conference, { dispatch }, previousConference) => {
  60. if (previousConference) {
  61. dispatch(setDocumentUrl(undefined));
  62. }
  63. });