Browse Source

Immediately display poll results to poll author (#10187)

* Immediately display poll results to poll author

* Refactor Poll#loaded_options and add Poll#voted? to improve DRYness
Eugen Rochko 5 years ago
parent
commit
054bbb3da2

+ 9 - 5
app/models/poll.rb

@@ -41,17 +41,17 @@ class Poll < ApplicationRecord
   after_commit :reset_parent_cache, on: :update
 
   def loaded_options
-    options.map.with_index { |title, key| Option.new(self, key.to_s, title, cached_tallies[key]) }
-  end
-
-  def unloaded_options
-    options.map.with_index { |title, key| Option.new(self, key.to_s, title, nil) }
+    options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) }
   end
 
   def possibly_stale?
     remote? && last_fetched_before_expiration? && time_passed_since_last_fetch?
   end
 
+  def voted?(account)
+    account.id == account_id || votes.where(account: account).exists?
+  end
+
   delegate :local?, to: :account
 
   def remote?
@@ -95,4 +95,8 @@ class Poll < ApplicationRecord
   def time_passed_since_last_fetch?
     last_fetched_at.nil? || last_fetched_at < 1.minute.ago
   end
+
+  def show_totals_now?
+    expired? || !hide_totals?
+  end
 end

+ 1 - 5
app/serializers/activitypub/note_serializer.rb

@@ -122,11 +122,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   end
 
   def poll_options
-    if !object.poll.expired? && object.poll.hide_totals?
-      object.poll.unloaded_options
-    else
-      object.poll.loaded_options
-    end
+    object.poll.loaded_options
   end
 
   def poll_and_multiple?

+ 2 - 10
app/serializers/rest/poll_serializer.rb

@@ -4,7 +4,7 @@ class REST::PollSerializer < ActiveModel::Serializer
   attributes :id, :expires_at, :expired,
              :multiple, :votes_count
 
-  has_many :dynamic_options, key: :options
+  has_many :loaded_options, key: :options
 
   attribute :voted, if: :current_user?
 
@@ -12,20 +12,12 @@ class REST::PollSerializer < ActiveModel::Serializer
     object.id.to_s
   end
 
-  def dynamic_options
-    if !object.expired? && object.hide_totals?
-      object.unloaded_options
-    else
-      object.loaded_options
-    end
-  end
-
   def expired
     object.expired?
   end
 
   def voted
-    object.votes.where(account: current_user.account).exists?
+    object.voted?(current_user.account)
   end
 
   def current_user?

+ 2 - 4
app/views/stream_entries/_poll.html.haml

@@ -1,10 +1,8 @@
-- options      = (!poll.expired? && poll.hide_totals?) ? poll.unloaded_options : poll.loaded_options
-- voted        = user_signed_in? && poll.votes.where(account: current_account).exists?
-- show_results = voted || poll.expired?
+- show_results = (user_signed_in? && poll.voted?(current_account)) || poll.expired?
 
 .poll
   %ul
-    - options.each do |option|
+    - poll.loaded_options.each do |option|
       %li
         - if show_results
           - percent = poll.votes_count > 0 ? 100 * option.votes_count / poll.votes_count : 0