From 3d5b12919eb68616e927f9daff9b81657eac9310 Mon Sep 17 00:00:00 2001 From: Hampton Lintorn-Catlin Date: Wed, 22 Jul 2026 17:04:03 -0400 Subject: [PATCH] Put author details first in Slack unfurls Amp-Thread-ID: https://ampcode.com/threads/T-019f8b50-658b-71d5-85d5-34af2e717c46 Co-authored-by: Amp --- .../slack/app/services/coplan/slack/renderer.rb | 17 +++++++++++++---- spec/services/slack_renderer_spec.rb | 14 +++++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/integrations/slack/app/services/coplan/slack/renderer.rb b/integrations/slack/app/services/coplan/slack/renderer.rb index 87c62f9..ceb31f4 100644 --- a/integrations/slack/app/services/coplan/slack/renderer.rb +++ b/integrations/slack/app/services/coplan/slack/renderer.rb @@ -45,11 +45,20 @@ def self.accent_color(preview) def self.decorated_context(preview) context = escape(preview.context) - context = context.sub("by #{escape(preview.author_name)}", "by *#{escape(preview.author_name)}*") if preview.author_name.present? - return "馃摝 *Archived*#{context.delete_prefix("Archived")}" if preview.context.to_s.start_with?("Archived") - return "馃敀 *Private*#{context.delete_prefix("Private")}" if preview.context.to_s.start_with?("Private") + return "馃搫 #{context}" if preview.author_name.blank? - "馃搫 #{context}" + author = escape(preview.author_name) + details = context.delete_suffix(" 路 by #{author}").delete_suffix("by #{author}") + if preview.context.to_s.start_with?("Archived") + details = details.delete_prefix("Archived").delete_prefix(" 路 ") + return [ "*#{author}*", details.presence, "馃摝 Archived" ].compact.join(" 路 ") + end + if preview.context.to_s.start_with?("Private") + details = details.delete_prefix("Private").delete_prefix(" 路 ") + return [ "*#{author}*", details.presence, "馃敀 Private" ].compact.join(" 路 ") + end + + [ "*#{author}*", details.presence ].compact.join(" 路 ") end def self.context_elements(preview) diff --git a/spec/services/slack_renderer_spec.rb b/spec/services/slack_renderer_spec.rb index 19f42db..0d2a2bf 100644 --- a/spec/services/slack_renderer_spec.rb +++ b/spec/services/slack_renderer_spec.rb @@ -6,7 +6,7 @@ result = described_class.call(preview, url: "https://example.test/p?thread=123&view=full") expect(result[:blocks][0][:text][:text]).to include("A < B & C", "> hello") expect(result[:blocks][1][:elements][0]).to eq(type: "image", image_url: preview.author_avatar_url, alt_text: "Ada") - expect(result[:blocks][1][:elements][1][:text]).to eq("馃搫 Live & ready 路 by *Ada*") + expect(result[:blocks][1][:elements][1][:text]).to eq("*Ada* 路 Live & ready") expect(result[:blocks][0][:text][:text]).to include("https://example.test/p?thread=123&view=full") expect(result[:blocks][0][:accessory][:image_url]).to eq(preview.image_url) expect(result[:color]).to eq("#136FF5") @@ -14,6 +14,14 @@ expect(result.dig(:preview, :title, :text)).to eq(preview.title) end + it "does not duplicate an author-only context" do + preview = CoPlan::LinkPreview.new(kind: "plan", external_id: "id", canonical_url: "https://example.test/p", title: "Untyped Plan", description: nil, context: "by Ada", image_url: nil, author_name: "Ada", author_avatar_url: nil, cache_key: "x") + + result = described_class.call(preview) + + expect(result.dig(:blocks, 1, :elements, 0, :text)).to eq("*Ada*") + end + it "visually distinguishes private and archived plans" do private_preview = CoPlan::LinkPreview.new(kind: "plan", external_id: "id", canonical_url: "https://example.test/p", title: "Private", description: nil, context: "Private 路 EDD 路 by Ada", image_url: nil, author_name: "Ada", author_avatar_url: nil, cache_key: "x") archived_preview = private_preview.with(title: "Archived", context: "Archived 路 EDD 路 by Ada") @@ -22,8 +30,8 @@ archived_result = described_class.call(archived_preview) expect(private_result[:color]).to eq("#8C4AF6") - expect(private_result.dig(:blocks, 1, :elements, 0, :text)).to eq("馃敀 *Private* 路 EDD 路 by *Ada*") + expect(private_result.dig(:blocks, 1, :elements, 0, :text)).to eq("*Ada* 路 EDD 路 馃敀 Private") expect(archived_result[:color]).to eq("#64748B") - expect(archived_result.dig(:blocks, 1, :elements, 0, :text)).to eq("馃摝 *Archived* 路 EDD 路 by *Ada*") + expect(archived_result.dig(:blocks, 1, :elements, 0, :text)).to eq("*Ada* 路 EDD 路 馃摝 Archived") end end