mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-24 11:34:26 +08:00
There is no point showing rewind for a user who is less than a month old, they will have no data to see. This hides the preferences, activity tab, and avatar decorations for rewind.
82 lines
2.7 KiB
Ruby
Vendored
82 lines
2.7 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
# name: discourse-rewind
|
|
# about: A fun end-of-year summary for members' activity in the community.
|
|
# meta_topic_id: 390847
|
|
# version: 2025.12.0
|
|
# authors: Discourse
|
|
# url: https://github.com/discourse/discourse/tree/main/plugins/discourse-rewind
|
|
# required_version: 2.7.0
|
|
|
|
enabled_site_setting :discourse_rewind_enabled
|
|
|
|
register_svg_icon "repeat"
|
|
register_svg_icon "volume-high"
|
|
register_svg_icon "volume-xmark"
|
|
|
|
register_asset "stylesheets/common/_index.scss"
|
|
register_asset "stylesheets/mobile/_index.scss", :mobile
|
|
|
|
module ::DiscourseRewind
|
|
PLUGIN_NAME = "discourse-rewind"
|
|
|
|
def self.public_asset_path(name)
|
|
File.expand_path(File.join(__dir__, "public", name))
|
|
end
|
|
|
|
def self.rewind_year(date = nil)
|
|
date ||= Time.zone.now
|
|
date.month == 1 ? date.year - 1 : date.year
|
|
end
|
|
|
|
def self.year_date_range(date_override = nil)
|
|
current_date = date_override.presence || Time.zone.now
|
|
|
|
# Outside December/January, only available in development
|
|
is_rewind_period = current_date.month == 1 || current_date.month == 12
|
|
return false if !is_rewind_period && !Rails.env.development?
|
|
|
|
Date.new(current_date.year).all_year
|
|
end
|
|
end
|
|
|
|
require_relative "lib/discourse_rewind/engine"
|
|
|
|
after_initialize do
|
|
UserUpdater::OPTION_ATTR.push(:discourse_rewind_enabled, :discourse_rewind_share_publicly)
|
|
|
|
# TODO: Remove once 20260105171115_rename_discourse_rewind_disabled_to_enabled has been promoted to pre-deploy
|
|
UserOption.ignored_columns += %i[discourse_rewind_disabled]
|
|
|
|
add_to_class(:user, :discourse_rewind_and_profile_public?) do
|
|
self.user_option.discourse_rewind_share_publicly && !self.user_option.hide_profile
|
|
end
|
|
|
|
# add_to_serializer(:current_user) / add_to_serializer(:current_user_option)
|
|
%i[user_option current_user_option].each do |serializer|
|
|
add_to_serializer(serializer, :discourse_rewind_enabled) { object.discourse_rewind_enabled }
|
|
|
|
add_to_serializer(serializer, :discourse_rewind_dismissed) do
|
|
dismissed_at = object.discourse_rewind_dismissed_at
|
|
dismissed_at.present? &&
|
|
DiscourseRewind.rewind_year(dismissed_at) >= DiscourseRewind.rewind_year
|
|
end
|
|
|
|
add_to_serializer(serializer, :discourse_rewind_share_publicly) do
|
|
scope.user.discourse_rewind_and_profile_public?
|
|
end
|
|
end
|
|
|
|
add_to_serializer(:current_user, :is_rewind_active) do
|
|
is_rewind_period = Rails.env.development? || Date.today.month == 1 || Date.today.month == 12
|
|
user_old_enough = scope.user.created_at <= 1.month.ago
|
|
is_rewind_period && user_old_enough
|
|
end
|
|
|
|
Discourse::Application.routes.append do
|
|
get "u/:username/preferences/rewind" => "users#preferences",
|
|
:constraints => {
|
|
username: RouteFormat.username,
|
|
}
|
|
end
|
|
end
|