Fix recent users list for setup social proof

This commit is contained in:
Max Wofford
2025-05-08 12:41:29 -04:00
parent ccdcbe3f69
commit b855335d15
3 changed files with 48 additions and 28 deletions

View File

@@ -27,8 +27,14 @@ class StaticPagesController < ApplicationController
redirect_to FlavorText.random_time_video.sample, allow_other_host: allowed_hosts
end
@show_wakatime_setup_notice = current_user.heartbeats.empty? || params[:show_wakatime_setup_notice]
@setup_social_proof = Cache::SetupSocialProofJob.perform_now if @show_wakatime_setup_notice
if current_user.heartbeats.empty? || params[:show_wakatime_setup_notice]
@show_wakatime_setup_notice = true
setup_social_proof = Cache::SetupSocialProofJob.perform_now
@ssp_message = setup_social_proof[:message]
@ssp_users_recent = setup_social_proof[:users_recent]
@ssp_users_size = setup_social_proof[:users_size]
end
# Get languages and editors in a single query using window functions
Time.use_zone(current_user.timezone) do

View File

@@ -5,25 +5,39 @@ class Cache::SetupSocialProofJob < Cache::ActivityJob
def calculate
# Only run queries as needed, starting with the smallest time range
if (past_5min_count = users_in_past(5.minutes)) >= 1
"#{past_5min_count} #{'Hack Clubber'.pluralize(past_5min_count)} set up Hackatime in the last 5 minutes"
elsif (past_hour_count = users_in_past(1.hour)) >= 3
"#{past_hour_count} #{'Hack Clubber'.pluralize(past_hour_count)} set up Hackatime in the last hour"
elsif (past_day_count = users_in_past(1.day)) >= 5
"#{past_day_count} #{'Hack Clubber'.pluralize(past_day_count)} set up Hackatime today"
elsif (past_week_count = users_in_past(1.week)) >= 5
"#{past_week_count} #{'Hack Clubber'.pluralize(past_week_count)} set up Hackatime in the past week"
elsif (past_month_count = users_in_past(1.month)) >= 5
"#{past_month_count} #{'Hack Clubber'.pluralize(past_month_count)} set up Hackatime in the past month"
elsif (year_count = users_in_past(Time.current.beginning_of_year)) >= 5
"#{year_count} #{'Hack Clubber'.pluralize(year_count)} set up Hackatime this year"
end
check_social_proof(5.minutes, 1, "in the last 5 minutes") ||
check_social_proof(1.hour, 3, "in the last hour") ||
check_social_proof(1.day, 5, "today") ||
check_social_proof(1.week, 5, "in the past week") ||
check_social_proof(1.month, 5, "in the past month") ||
check_social_proof(Time.current.beginning_of_year, 5, "this year")
end
def users_in_past(time_period)
Heartbeat.where("time > ?", time_period.to_f)
.where(source_type: :test_entry)
.distinct
.count(:user_id)
def check_social_proof(time_period, threshold, humanized_time_period)
user_ids = Heartbeat.where("time > ?", time_period.ago.to_f)
.where("time < ?", Time.current.to_f)
.with_valid_timestamps
.where(source_type: :test_entry)
.distinct
.pluck(:user_id)
user_count = user_ids.size
return nil if user_count < threshold
recent_setup_users = User.where(id: user_ids).limit(5).map do |user|
{
id: user.id,
avatar_url: user.avatar_url,
display_name: user.display_name || "Hack Clubber"
}
end
message = "#{user_count.to_s + ' Hack Clubber'.pluralize(user_count)} set up Hackatime #{humanized_time_period}"
{
message: message,
users_size: user_count,
users_recent: recent_setup_users
}
end
end

View File

@@ -35,21 +35,21 @@
<div class="setup-notice">
<%= link_to "Set up Hackatime! Click me.", my_wakatime_setup_path, class: "auth-button setup-button primary-action" %>
<div class="setup-info">
<% if @recent_setup_users&.any? %>
<% if @ssp_users_recent&.any? %>
<div class="recent-setup-users">
<% @recent_setup_users.each do |user| %>
<% @ssp_users_recent.each do |user| %>
<div class="avatar-container">
<div class="avatar-tooltip"><%= user[:display_name] %></div>
<img src="<%= user[:avatar_url] %>" alt="<%= user[:display_name] %>" class="setup-avatar" />
</div>
<% end %>
<% if @all_setup_users && @all_setup_users.size > 5 %>
<div class="avatar-container all-users-hover" title="See all <%= @all_setup_users.size %> users">
<div class="setup-avatar more-avatars">+<%= @all_setup_users.size - 5 %></div>
<% if @ssp_users_size && @ssp_users_size > 5 %>
<div class="avatar-container all-users-hover" title="See all <%= @ssp_users_size %> users">
<div class="setup-avatar more-avatars">+<%= @ssp_users_size - 5 %></div>
<div class="users-hover-list">
<h4>All users who set up Hackatime</h4>
<div class="hover-user-list">
<% @all_setup_users.each do |user| %>
<% @ssp_users_recent.each do |user| %>
<div class="user-item">
<img src="<%= user[:avatar_url] %>" alt="<%= user[:display_name] %>" class="user-avatar" />
<span class="user-name"><%= user[:display_name] %></span>
@@ -61,8 +61,8 @@
<% end %>
</div>
<% end %>
<% if @setup_social_proof %>
<p class="setup-hint"><%= @setup_social_proof %> (this is real data)</p>
<% if @ssp_message %>
<p class="setup-hint"><%= @ssp_message %> (this is real data)</p>
<% end %>
</div>
</div>