Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor social sharing helper #5417

Merged
merged 5 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 17 additions & 41 deletions app/helpers/social_share_button_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,71 +12,47 @@ module SocialShareButtonHelper
}.freeze

# Generates a set of social share buttons based on the specified options.
def render_social_share_buttons(opts = {})
sites = opts.fetch(:allow_sites, [])
valid_sites, invalid_sites = filter_allowed_sites(sites)

# Log invalid sites
invalid_sites.each do |invalid_site|
Rails.logger.error("Invalid site or icon not configured: #{invalid_site}")
end

def social_share_buttons(title:, url:)
tag.div(
:class => "social-share-button d-flex gap-1 align-items-end flex-wrap mb-3"
) do
valid_sites.map do |site|
safe_join(SOCIAL_SHARE_CONFIG.map do |site, icon|
link_options = {
:rel => ["nofollow", opts[:rel]].compact,
:rel => "nofollow",
:class => "ssb-icon rounded-circle",
:title => I18n.t("application.share.#{site}.title"),
:target => "_blank"
}

link_to generate_share_url(site, opts), link_options do
image_tag(icon_path(site), :alt => I18n.t("application.share.#{site}.alt"), :size => 28)
link_to generate_share_url(site, title, url), link_options do
image_tag(icon, :alt => I18n.t("application.share.#{site}.alt"), :size => 28)
end
end.join.html_safe
end, "\n")
end
end

private

def filter_allowed_sites(sites)
valid_sites = sites.empty? ? SOCIAL_SHARE_CONFIG.keys : sites.select { |site| valid_site?(site) }
invalid_sites = sites - valid_sites
[valid_sites, invalid_sites]
end

def icon_path(site)
SOCIAL_SHARE_CONFIG[site.to_sym] || ""
end

def valid_site?(site)
SOCIAL_SHARE_CONFIG.key?(site.to_sym)
end

def generate_share_url(site, params)
def generate_share_url(site, title, url)
site = site.to_sym
title = URI.encode_www_form_component(title)
url = URI.encode_www_form_component(url)

case site
when :email
to = params[:to] || ""
subject = CGI.escape(params[:title])
body = CGI.escape(params[:url])
"mailto:#{to}?subject=#{subject}&body=#{body}"
"mailto:?subject=#{title}&body=#{url}"
when :x
via_str = params[:via] ? "&via=#{URI.encode_www_form_component(params[:via])}" : ""
hashtags_str = params[:hashtags] ? "&hashtags=#{URI.encode_www_form_component(params[:hashtags].join(','))}" : ""
"https://x.com/intent/tweet?url=#{URI.encode_www_form_component(params[:url])}&text=#{URI.encode_www_form_component(params[:title])}#{hashtags_str}#{via_str}"
"https://x.com/intent/tweet?url=#{url}&text=#{title}"
when :linkedin
"https://www.linkedin.com/sharing/share-offsite/?url=#{URI.encode_www_form_component(params[:url])}"
"https://www.linkedin.com/sharing/share-offsite/?url=#{url}"
when :facebook
"https://www.facebook.com/sharer/sharer.php?u=#{URI.encode_www_form_component(params[:url])}&t=#{URI.encode_www_form_component(params[:title])}"
"https://www.facebook.com/sharer/sharer.php?u=#{url}&t=#{title}"
when :mastodon
"https://mastodonshare.com/?text=#{URI.encode_www_form_component(params[:title])}&url=#{URI.encode_www_form_component(params[:url])}"
"https://mastodonshare.com/?text=#{title}&url=#{url}"
when :telegram
"https://t.me/share/url?url=#{URI.encode_www_form_component(params[:url])}&text=#{URI.encode_www_form_component(params[:title])}"
"https://t.me/share/url?url=#{url}&text=#{title}"
when :bluesky
"https://bsky.app/intent/compose?text=#{URI.encode_www_form_component(params[:title])}+#{URI.encode_www_form_component(params[:url])}"
"https://bsky.app/intent/compose?text=#{title}+#{url}"
else
raise ArgumentError, "Unsupported platform: #{platform}"
end
Expand Down
5 changes: 1 addition & 4 deletions app/views/diary_entries/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
<% end %>

<%= render @entry %>
<%= render_social_share_buttons({
:title => @entry.title,
:url => diary_entry_url(@entry.user, @entry)
}) %>
<%= social_share_buttons(:title => @entry.title, :url => diary_entry_url(@entry.user, @entry)) %>

<div id="comments" class="comments mb-3 overflow-hidden">
<div class="row border-bottom border-secondary-subtle">
Expand Down
35 changes: 8 additions & 27 deletions test/helpers/social_share_button_helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,15 @@
class SocialShareButtonHelperTest < ActionView::TestCase
include SocialShareButtonHelper

def setup
@options = {
:allow_sites => %w[x facebook linkedin],
:title => "Test Title",
:url => "https://example.com",
:desc => "Test Description",
:via => "testuser"
}
end

def test_render_social_share_buttons_with_valid_sites
result = render_social_share_buttons(@options)
assert_includes result, "x"
assert_includes result, "facebook"
assert_includes result, "linkedin"
end

def test_render_social_share_buttons_with_invalid_site
@options[:allow_sites] << "invalid_site"
result = render_social_share_buttons(@options)
assert_not_includes result, "invalid_site"
end
def test_social_share_buttons
buttons = social_share_buttons(:title => "Test Title", :url => "https://example.com")
buttons_dom = Rails::Dom::Testing.html_document_fragment.parse(buttons)

def test_render_social_share_buttons_with_no_sites
@options[:allow_sites] = []
result = render_social_share_buttons(@options)
SocialShareButtonHelper::SOCIAL_SHARE_CONFIG.each_key do |site|
assert_includes result, site.to_s # Convert symbol to string
SOCIAL_SHARE_CONFIG.each_value do |icon|
assert_dom buttons_dom, "div:has(a img[src='/images/#{icon}'])", :count => 1 do
assert_dom "a[href*='Test+Title']"
assert_dom "a[href*='https%3A%2F%2Fexample.com']"
end
end
end
end
Loading