mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	Rewrite and restyle reaction selector and enable no-sizzle eslint rule (#30453)
Enable `no-sizzle` lint rule, there was only one use in `initCompReactionSelector` and: - Remove all jQuery except the necessary fomantic dropdown init - Remove the recursion, instead bind event listeners to common parent container nodes --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		@@ -1,38 +1,36 @@
 | 
			
		||||
import $ from 'jquery';
 | 
			
		||||
import {POST} from '../../modules/fetch.js';
 | 
			
		||||
 | 
			
		||||
export function initCompReactionSelector($parent) {
 | 
			
		||||
  $parent.find(`.select-reaction .item.reaction, .comment-reaction-button`).on('click', async function (e) {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
export function initCompReactionSelector() {
 | 
			
		||||
  for (const container of document.querySelectorAll('.issue-content, .diff-file-body')) {
 | 
			
		||||
    container.addEventListener('click', async (e) => {
 | 
			
		||||
      // there are 2 places for the "reaction" buttons, one is the top-right reaction menu, one is the bottom of the comment
 | 
			
		||||
      const target = e.target.closest('.comment-reaction-button');
 | 
			
		||||
      if (!target) return;
 | 
			
		||||
      e.preventDefault();
 | 
			
		||||
 | 
			
		||||
    if (this.classList.contains('disabled')) return;
 | 
			
		||||
      if (target.classList.contains('disabled')) return;
 | 
			
		||||
 | 
			
		||||
    const actionUrl = this.closest('[data-action-url]')?.getAttribute('data-action-url');
 | 
			
		||||
    const reactionContent = this.getAttribute('data-reaction-content');
 | 
			
		||||
    const hasReacted = this.closest('.ui.segment.reactions')?.querySelector(`a[data-reaction-content="${reactionContent}"]`)?.getAttribute('data-has-reacted') === 'true';
 | 
			
		||||
      const actionUrl = target.closest('[data-action-url]').getAttribute('data-action-url');
 | 
			
		||||
      const reactionContent = target.getAttribute('data-reaction-content');
 | 
			
		||||
 | 
			
		||||
    const res = await POST(`${actionUrl}/${hasReacted ? 'unreact' : 'react'}`, {
 | 
			
		||||
      data: new URLSearchParams({content: reactionContent}),
 | 
			
		||||
      const commentContainer = target.closest('.comment-container');
 | 
			
		||||
 | 
			
		||||
      const bottomReactions = commentContainer.querySelector('.bottom-reactions'); // may not exist if there is no reaction
 | 
			
		||||
      const bottomReactionBtn = bottomReactions?.querySelector(`a[data-reaction-content="${CSS.escape(reactionContent)}"]`);
 | 
			
		||||
      const hasReacted = bottomReactionBtn?.getAttribute('data-has-reacted') === 'true';
 | 
			
		||||
 | 
			
		||||
      const res = await POST(`${actionUrl}/${hasReacted ? 'unreact' : 'react'}`, {
 | 
			
		||||
        data: new URLSearchParams({content: reactionContent}),
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      const data = await res.json();
 | 
			
		||||
      bottomReactions?.remove();
 | 
			
		||||
      if (data.html) {
 | 
			
		||||
        commentContainer.insertAdjacentHTML('beforeend', data.html);
 | 
			
		||||
        const bottomReactionsDropdowns = commentContainer.querySelectorAll('.bottom-reactions .dropdown.select-reaction');
 | 
			
		||||
        $(bottomReactionsDropdowns).dropdown(); // re-init the dropdown
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const data = await res.json();
 | 
			
		||||
    if (data && (data.html || data.empty)) {
 | 
			
		||||
      const $content = $(this).closest('.content');
 | 
			
		||||
      let $react = $content.find('.segment.reactions');
 | 
			
		||||
      if ((!data.empty || data.html === '') && $react.length > 0) {
 | 
			
		||||
        $react.remove();
 | 
			
		||||
      }
 | 
			
		||||
      if (!data.empty) {
 | 
			
		||||
        const $attachments = $content.find('.segment.bottom:first');
 | 
			
		||||
        $react = $(data.html);
 | 
			
		||||
        if ($attachments.length > 0) {
 | 
			
		||||
          $react.insertBefore($attachments);
 | 
			
		||||
        } else {
 | 
			
		||||
          $react.appendTo($content);
 | 
			
		||||
        }
 | 
			
		||||
        $react.find('.dropdown').dropdown();
 | 
			
		||||
        initCompReactionSelector($react);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,6 @@ function initRepoDiffConversationForm() {
 | 
			
		||||
        el.classList.add('tw-invisible');
 | 
			
		||||
      }
 | 
			
		||||
      $newConversationHolder.find('.dropdown').dropdown();
 | 
			
		||||
      initCompReactionSelector($newConversationHolder);
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      console.error('Error:', error);
 | 
			
		||||
      showErrorToast(i18n.network_error);
 | 
			
		||||
 
 | 
			
		||||
@@ -393,7 +393,7 @@ export function initRepository() {
 | 
			
		||||
    initRepoIssueDependencyDelete();
 | 
			
		||||
    initRepoIssueCodeCommentCancel();
 | 
			
		||||
    initRepoPullRequestUpdate();
 | 
			
		||||
    initCompReactionSelector($(document));
 | 
			
		||||
    initCompReactionSelector();
 | 
			
		||||
 | 
			
		||||
    initRepoPullRequestMergeForm();
 | 
			
		||||
    initRepoPullRequestCommitStatus();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user