diff --git a/app/assets/stylesheets/leaderboard.css b/app/assets/stylesheets/leaderboard.css index fd93ee4..30b8be8 100644 --- a/app/assets/stylesheets/leaderboard.css +++ b/app/assets/stylesheets/leaderboard.css @@ -151,4 +151,19 @@ h3+.mini-leaderboard { .period-toggle-btn:hover:not(.active) { background-color: rgba(255, 255, 255, 0.1); } +} + +.mini-leaderboard.loading .leaderboard-entry { + opacity: 0.7; + animation: pulse 1.5s infinite; +} + +@keyframes pulse { + 0% { opacity: 0.7; } + 50% { opacity: 0.4; } + 100% { opacity: 0.7; } +} + +turbo-frame#mini_leaderboard[aria-busy="true"]::before { + display: none !important; } \ No newline at end of file diff --git a/app/controllers/static_pages_controller.rb b/app/controllers/static_pages_controller.rb index 6ee7c15..6a30651 100644 --- a/app/controllers/static_pages_controller.rb +++ b/app/controllers/static_pages_controller.rb @@ -5,16 +5,6 @@ class StaticPagesController < ApplicationController ] def index - @leaderboard = Leaderboard.where.associated(:entries) - .where(start_date: Date.current) - .where(deleted_at: nil) - .where(period_type: :daily) - .distinct - .first - - # Get active projects for the mini leaderboard - @active_projects = Cache::ActiveProjectsJob.perform_now - if current_user flavor_texts = FlavorText.motto + FlavorText.conditional_mottos(current_user) flavor_texts += FlavorText.rare_motto if Random.rand(10) < 1 @@ -80,6 +70,22 @@ class StaticPagesController < ApplicationController end end + def mini_leaderboard + @leaderboard = Leaderboard.where.associated(:entries) + .where(start_date: Date.current) + .where(deleted_at: nil) + .where(period_type: :daily) + .distinct + .first + + @active_projects = Cache::ActiveProjectsJob.perform_now + + render partial: "leaderboards/mini_leaderboard", locals: { + leaderboard: @leaderboard, + current_user: current_user + } + end + def project_durations return unless current_user diff --git a/app/views/leaderboards/_mini_leaderboard.html.erb b/app/views/leaderboards/_mini_leaderboard.html.erb index 83f5d8f..879bb9d 100644 --- a/app/views/leaderboards/_mini_leaderboard.html.erb +++ b/app/views/leaderboards/_mini_leaderboard.html.erb @@ -1,78 +1,80 @@ -<% - entries = leaderboard.entries.order(total_seconds: :desc) - if current_user - user_rank = entries.find_index { |entry| entry.user_id == current_user.id } - if user_rank && user_rank >= 3 - # Show top 2 entries and immediate competition - top_entries = entries[0..1] - competition_entries = entries[[user_rank - 1, 2].max..[user_rank + 1, entries.size - 1].min] - mini_leaderboard_entries = top_entries + competition_entries - show_top_entries = false +<%= turbo_frame_tag "mini_leaderboard" do %> + <% + entries = leaderboard.entries.order(total_seconds: :desc) + if current_user + user_rank = entries.find_index { |entry| entry.user_id == current_user.id } + if user_rank && user_rank >= 3 + # Show top 2 entries and immediate competition + top_entries = entries[0..1] + competition_entries = entries[[user_rank - 1, 2].max..[user_rank + 1, entries.size - 1].min] + mini_leaderboard_entries = top_entries + competition_entries + show_top_entries = false + else + # Show top 3 entries (either user is in top 3 or not on leaderboard) + mini_leaderboard_entries = entries.first(3) + show_top_entries = true + end else - # Show top 3 entries (either user is in top 3 or not on leaderboard) + # Not logged in, show top 3 mini_leaderboard_entries = entries.first(3) show_top_entries = true end - else - # Not logged in, show top 3 - mini_leaderboard_entries = entries.first(3) - show_top_entries = true - end -%> + %> -<% if mini_leaderboard_entries&.any? %> -
- This leaderboard is in <%= Leaderboard::GLOBAL_TIMEZONE %>. - <% if current_user && timezone_difference_in_seconds(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) != 0 %> - <%= timezone_difference_in_words(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) %> - <% end %> -
-+ This leaderboard is in <%= Leaderboard::GLOBAL_TIMEZONE %>. + <% if current_user && timezone_difference_in_seconds(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) != 0 %> + <%= timezone_difference_in_words(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) %> + <% end %> +
++ This leaderboard is in <%= Leaderboard::GLOBAL_TIMEZONE %>. + <% if current_user && timezone_difference_in_seconds(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) != 0 %> + <%= timezone_difference_in_words(Leaderboard::GLOBAL_TIMEZONE, current_user.timezone) %> + <% end %> +
+