FIX: preload poll voters

FIX: preload poll voters

diff --git a/plugins/poll/app/serializers/poll_serializer.rb b/plugins/poll/app/serializers/poll_serializer.rb
index fb8cd26..2048f6b 100644
--- a/plugins/poll/app/serializers/poll_serializer.rb
+++ b/plugins/poll/app/serializers/poll_serializer.rb
@@ -9,7 +9,8 @@ class PollSerializer < ApplicationSerializer
              :step,
              :options,
              :voters,
-             :close
+             :close,
+             :preloaded_voters
 
   def public
     true
@@ -47,4 +48,12 @@ class PollSerializer < ApplicationSerializer
     object.close_at.present?
   end
 
+  def preloaded_voters
+    DiscoursePoll::Poll.serialized_voters(object)
+  end
+
+  def include_preloaded_voters?
+    object.can_see_voters?(scope)
+  end
+
 end
diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
index 9d74877..39d4d16 100644
--- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
+++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
@@ -120,6 +120,7 @@ createWidget("discourse-poll-voters", {
           : result.voters[attrs.optionId];
 
       const existingVoters = new Set(state.voters.map(voter => voter.username));
+
       newVoters.forEach(voter => {
         if (!existingVoters.has(voter.username)) {
           existingVoters.add(voter.username);
@@ -202,8 +203,8 @@ createWidget("discourse-poll-standard-results", {
       });
 
       if (isPublic && !state.loaded) {
+        state.voters = poll.get("preloaded_voters");
         state.loaded = true;
-        this.fetchVoters();
       }
 
       const percentages =
@@ -290,8 +291,8 @@ createWidget("discourse-poll-number-results", {
 
     if (poll.get("public")) {
       if (!state.loaded) {
+        state.voters = poll.get("preloaded_voters");
         state.loaded = true;
-        this.fetchVoters();
       }
 
       contents.push(
diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb
index b0bc4cd..20de8e6 100644
--- a/plugins/poll/plugin.rb
+++ b/plugins/poll/plugin.rb
@@ -149,13 +149,7 @@ after_initialize do
         end
       end
 
-      def voters(post_id, poll_name, user, opts = {})
-        post = Post.find_by(id: post_id)
-        raise Discourse::InvalidParameters.new("post_id is invalid") unless post
-
-        poll = Poll.find_by(post_id: post_id, name: poll_name)
-        raise Discourse::InvalidParameters.new("poll_name is invalid") unless poll&.can_see_voters?(user)
-
+      def serialized_voters(poll, opts = {})
         limit = (opts["limit"] || 25).to_i
         limit = 0  if limit < 0
         limit = 50 if limit > 50
@@ -208,7 +202,7 @@ after_initialize do
               WHERE row BETWEEN #{offset} AND #{offset + limit}
           SQL
 
-          user_ids = votes.map { |v| v.user_id }.to_set
+          user_ids = votes.map(&:user_id).uniq
 
           user_hashes = User
             .where(id: user_ids)
@@ -225,6 +219,16 @@ after_initialize do
         result
       end
 
+      def voters(post_id, poll_name, user, opts = {})
+        post = Post.find_by(id: post_id)
+        raise Discourse::InvalidParameters.new("post_id is invalid") unless post
+
+        poll = Poll.find_by(post_id: post_id, name: poll_name)
+        raise Discourse::InvalidParameters.new("poll_name is invalid") unless poll&.can_see_voters?(user)
+
+        serialized_voters(poll, opts)
+      end
+
       def schedule_jobs(post)
         Poll.where(post: post).find_each do |poll|
           job_args = {

GitHub sha: 0a708ba0

This commit has been mentioned on Discourse Meta. There might be relevant details there: