diff --git a/app/assets/javascripts/initializePage.js.erb b/app/assets/javascripts/initializePage.js.erb index a63dc5d2d..3269e1274 100644 --- a/app/assets/javascripts/initializePage.js.erb +++ b/app/assets/javascripts/initializePage.js.erb @@ -16,6 +16,7 @@ function callInitalizers(){ initializeAllTagEditButtons(); } initializeAllFollowButts(); + initializeUserFollowButts(); initializeReadingListIcons(); initializeSponsorshipVisibility(); if ( document.getElementById("sidebar-additional") ) { diff --git a/app/assets/javascripts/initializers/initializeAdditionalContentBoxes.js b/app/assets/javascripts/initializers/initializeAdditionalContentBoxes.js index 42e8420bf..7ad59788a 100644 --- a/app/assets/javascripts/initializers/initializeAdditionalContentBoxes.js +++ b/app/assets/javascripts/initializers/initializeAdditionalContentBoxes.js @@ -1,4 +1,4 @@ -'use strict'; +/* global initializeUserFollowButts */ function initializeAdditionalContentBoxes() { var el = document.getElementById('additional-content-area'); @@ -32,6 +32,7 @@ function initializeAdditionalContentBoxes() { el.innerHTML = html; initializeReadingListIcons(); initializeAllFollowButts(); + initializeUserFollowButts(); initializeSponsorshipVisibility(); }); } else { diff --git a/app/assets/javascripts/initializers/initializeAllFollowButts.js b/app/assets/javascripts/initializers/initializeAllFollowButts.js index ee1defafd..d3f3e309d 100644 --- a/app/assets/javascripts/initializers/initializeAllFollowButts.js +++ b/app/assets/javascripts/initializers/initializeAllFollowButts.js @@ -1,10 +1,59 @@ function initializeAllFollowButts() { var followButts = document.getElementsByClassName('follow-action-button'); for (var i = 0; i < followButts.length; i++) { - initializeFollowButt(followButts[i]); + if (!followButts[i].className.includes("follow-user")) { + initializeFollowButt(followButts[i]); + }; } } +function fetchUserFollowStatuses(idButtonHash) { + const url = new URL("/follows/bulk_show", document.location); + const searchParams = new URLSearchParams(); + Object.keys(idButtonHash).forEach((id) => { + searchParams.append("ids[]", id); + }); + searchParams.append("followable_type", "User"); + url.search = searchParams; + + fetch(url, { + method: 'GET', + headers: { + Accept: 'application/json', + 'X-CSRF-Token': window.csrfToken, + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + }).then((response) => response.json()) + .then((idStatuses) => { + Object.keys(idStatuses).forEach(function(id) { + addButtClickHandle(idStatuses[id], idButtonHash[id]); + }) + }); +} + +function initializeUserFollowButtons(buttons) { + if (buttons.length > 0) { + var userIds = {}; + for (var i = 0; i < buttons.length; i++) { + var userStatus = document.body.getAttribute('data-user-status'); + if (userStatus === 'logged-out') { + addModalEventListener(buttons[i]); + } else { + var userId = JSON.parse(buttons[i].dataset.info).id + userIds[userId] = buttons[i]; + } + } + + if (Object.keys(userIds).length > 0) { fetchUserFollowStatuses(userIds); } + } +} + +function initializeUserFollowButts() { + var buttons = document.getElementsByClassName('follow-action-button follow-user'); + initializeUserFollowButtons(buttons); +} + //private function initializeFollowButt(butt) { diff --git a/app/assets/javascripts/initializers/initializeLocalStorageRender.js b/app/assets/javascripts/initializers/initializeLocalStorageRender.js index 53a77ad3a..e6a8b7480 100644 --- a/app/assets/javascripts/initializers/initializeLocalStorageRender.js +++ b/app/assets/javascripts/initializers/initializeLocalStorageRender.js @@ -1,4 +1,4 @@ -'use strict'; +/* global initializeUserFollowButts */ function initializeLocalStorageRender() { try { @@ -8,6 +8,7 @@ function initializeLocalStorageRender() { initializeBaseUserData(); initializeReadingListIcons(); initializeAllFollowButts(); + initializeUserFollowButts(); initializeSponsorshipVisibility(); } } catch (err) { diff --git a/app/assets/javascripts/utilities/buildArticleHTML.js.erb b/app/assets/javascripts/utilities/buildArticleHTML.js.erb index aff014bf6..ac8d42999 100644 --- a/app/assets/javascripts/utilities/buildArticleHTML.js.erb +++ b/app/assets/javascripts/utilities/buildArticleHTML.js.erb @@ -84,7 +84,7 @@ function buildArticleHTML(article) { SAVED\ ' } else if (article.class_name === "User") { - saveButton = '' diff --git a/app/controllers/follows_controller.rb b/app/controllers/follows_controller.rb index 3689c67d0..ac0130b73 100644 --- a/app/controllers/follows_controller.rb +++ b/app/controllers/follows_controller.rb @@ -25,6 +25,29 @@ class FollowsController < ApplicationController end end + def bulk_show + skip_authorization + render(plain: "not-logged-in") && return unless current_user + + response = params.require(:ids).map(&:to_i).each_with_object({}) do |id, hsh| + hsh[id] = if current_user.id == id + "self" + else + following_them_check = FollowChecker.new(current_user, params[:followable_type], id).cached_follow_check + following_you_check = FollowChecker.new(User.find_by(id: id), params[:followable_type], current_user.id).cached_follow_check + if following_them_check && following_you_check + "mutual" + elsif following_you_check + "follow-back" + else + following_them_check.to_s + end + end + end + + render json: response + end + def create authorize Follow diff --git a/app/services/search/user.rb b/app/services/search/user.rb index 12131b573..29b55d65c 100644 --- a/app/services/search/user.rb +++ b/app/services/search/user.rb @@ -25,7 +25,8 @@ module Search "comments_count" => source["comments_count"], "badge_achievements_count" => source["badge_achievements_count"], "last_comment_at" => source["last_comment_at"], - "roles" => source["roles"] + "roles" => source["roles"], + "user_id" => source["id"] } end diff --git a/app/views/articles/_search.html.erb b/app/views/articles/_search.html.erb index 99130ecb7..d6bb17ed1 100644 --- a/app/views/articles/_search.html.erb +++ b/app/views/articles/_search.html.erb @@ -116,6 +116,7 @@ document.getElementById("substories").innerHTML = resultDivs.join(""); initializeReadingListIcons(); initializeAllFollowButts(); + initializeUserFollowButts(); document.getElementById("substories").classList.add("search-results-loaded"); if (content.result.length == 0) { document.getElementById("substories").innerHTML = '