mumuki/mumuki-laboratory

View on GitHub
app/assets/javascripts/mumuki_laboratory/application/discussions.js

Summary

Maintainability
A
0 mins
Test Coverage
mumuki.load(() => {
  var $subscriptionButtons = $('.discussion-subscription > button');
  var $upvoteButtons = $('.discussion-upvote > button');
  var $responsibleButton = $('.discussion-responsible > button');
  let $messagePreviewButton = $('.discussion-new-message-preview-button.preview');
  let $messageEditButton = $('.discussion-new-message-preview-button.edit');
  let $newMessageContent = $('.discussion-new-message-content');
  let $newMessagePreview = $('#discussion-new-message-preview');

  function createNewMessageEditor() {
    var $textarea = $("#discussion-new-message");
    var editorContainer = $(".mu-spell-checked-editor")[0];
    if (!editorContainer) return;

    return new mumuki.editor.CodeMirrorBuilder(editorContainer)
      .setupSpellCheckedEditor()
      .setupMinLines($textarea.data('lines'))
      .setupLanguage()
      .build();
  }

  let editor = createNewMessageEditor();

  var Forum = {
    toggleButton: function (elements) {
      elements.toggleClass('d-none');
    },
    disableButton: function (elements) {
      elements.attr('disabled', true);
    },
    reenableButton: function (elements) {
      elements.attr('disabled', false);
    },
    token: new mumuki.CsrfToken(),
    tokenRequest: function (data) {
      return $.ajax(Forum.token.newRequest(data));
    },
    discussionPost: function (url) {
      return Forum.tokenRequest({
        url: url,
        method: 'POST',
        xhrFields: {withCredentials: true}
      });
    },
    discussionSubscription: function (url) {
      Forum.discussionPostAndToggle(url, $subscriptionButtons);
    },
    discussionUpvote: function (url) {
      Forum.discussionPostAndToggle(url, $upvoteButtons);
    },
    discussionResponsible: function (url) {
      Forum.disableButton($responsibleButton);
      Forum.discussionPostToggleAndRenderToast(url, $responsibleButton);
      $('.responsible-moderator-badge').toggleClass('d-none');
    },
    discussionPostAndToggle: function (url, elem) {
      Forum.discussionPost(url).done(Forum.toggleButton(elem));
    },
    discussionPostToggleAndRenderToast: function (url, elem) {
      Forum.discussionPost(url)
        .done(function (response) {
          Forum.toggleButton(elem);
          Forum.reenableButton(elem);
          mumuki.toast.addToast(response);
        })
        .fail(function (response) {
          mumuki.toast.addToast(response.responseText);
        });
    },
    discussionMessageToggleApprove: function (url, elem) {
      Forum.discussionPost(url).done(function () {
        elem.toggleClass("selected");
        elem.attr('data-bs-original-title', '');
      });
    },
    discussionMessageToggleNotActuallyAQuestion: function (url, elem) {
      Forum.discussionPost(url).done(function () {
        elem.toggleClass("selected");
      });
    },
    discussionsToggleCheckbox: function (elem) {
      const key = elem.attr('name');
      const params = new URLSearchParams(location.search);
      elem.is(':checked') ? params.set(key, elem.val()) : params.delete(key);
      location.search = params.toString();
    },
    discussionMessagePreview: function (url) {
      return Forum.tokenRequest({
        url: url,
        method: 'GET',
        processData: false,
        dataType: 'json',
        data: new URLSearchParams({ content: editor.getValue() } ),
        success: function (response) {
          showPreview(response.preview);
        },
        error: function (e) {
          error = $messagePreviewButton.attr('error-text');
          showPreview(error);
        },
        xhrFields: {withCredentials: true}
      });
    },
    hidePreviewAndShowEditor: function(elem) {
      togglePreviewAndEditButtons();
      togglePreviewAndContentMessage();
    }
  };

  function showPreview(preview) {
    $newMessagePreview.html($.parseHTML(preview));
    togglePreviewAndEditButtons();
    togglePreviewAndContentMessage();
  }

  function togglePreviewAndEditButtons() {
    $messagePreviewButton.toggleClass('d-none');
    $messageEditButton.toggleClass('d-none');
  }

  function togglePreviewAndContentMessage() {
    $newMessagePreview.toggleClass('d-none');
    $newMessageContent.toggleClass('d-none');
  }

  mumuki.Forum = Forum;

});