Browse Source

Insert local links for remote actors in FE

master
Shadowfacts 1 year ago
parent
commit
0f7eb99efb
Signed by: shadowfacts GPG Key ID: 94A5AB95422746E5
4 changed files with 63 additions and 2 deletions
  1. +4
    -0
      assets/css/clacks.scss
  2. +5
    -1
      lib/clacks_web/templates/frontend/_action_status.html.eex
  3. +5
    -1
      lib/clacks_web/templates/frontend/_status.html.eex
  4. +49
    -0
      lib/clacks_web/views/frontend_view.ex

+ 4
- 0
assets/css/clacks.scss View File

@ -157,6 +157,10 @@ ul.notifications-list {
a {
text-decoration: underline;
&.local-actor-link {
text-decoration: none;
}
}
}
}


+ 5
- 1
lib/clacks_web/templates/frontend/_action_status.html.eex View File

@ -31,7 +31,11 @@
</p>
</div>
<div class="status-content">
<%= raw(@original_note["content"]) %>
<%= unless is_nil(@conn.assigns[:user]) do %>
<%= render_status_content(@original_activity) %>
<% else %>
<%= raw(@original_note["content"]) %>
<% end %>
</div>
<div class="status-actions">
<a href="<%= Routes.frontend_path(@conn, :reply, @original_activity.id) %>">Reply</a>


+ 5
- 1
lib/clacks_web/templates/frontend/_status.html.eex View File

@ -16,7 +16,11 @@
</p>
</div>
<div class="status-content e-content">
<%= raw(@note["content"]) %>
<%= unless is_nil(@conn.assigns[:user]) do %>
<%= render_status_content(@status) %>
<% else %>
<%= raw(@note["content"]) %>
<% end %>
</div>
<%= unless is_nil(@conn.assigns[:user]) do %>
<div class="status-actions">


+ 49
- 0
lib/clacks_web/views/frontend_view.ex View File

@ -3,6 +3,7 @@ defmodule ClacksWeb.FrontendView do
alias Clacks.{Actor, Activity, Repo, Notification}
alias ClacksWeb.Router.Helpers, as: Routes
alias ClacksWeb.Endpoint
require Logger
@spec display_username(actor :: Actor.t()) :: String.t()
@ -126,4 +127,52 @@ defmodule ClacksWeb.FrontendView do
end
defp mentions_for_replying_to(_), do: ""
@spec render_status_content(activity :: Activity.t()) :: String.t()
defp render_status_content(%Activity{
data: %{
"type" => "Create",
"object" => %{"type" => "Note", "content" => content} = note
}
}) do
with %{"tag" => tags} <- note,
{:ok, tree} <- Floki.parse_fragment(content) do
tree
|> Floki.traverse_and_update(fn
{"a", attrs, _children} = orig_tree ->
{"href", href} = Enum.find(attrs, fn {name, _} -> name == "href" end)
has_matching_tag =
Enum.any?(tags, fn
%{"type" => "Mention", "href" => ^href} -> true
_ -> false
end)
with true <- has_matching_tag,
%Actor{local: false} = actor <- Actor.get_cached_by_ap_id(href) do
{
"span",
[],
[
orig_tree,
{"a", [{"href", local_actor_link(actor)}, {"class", "local-actor-link"}], ["🔗"]}
]
}
else
_ ->
orig_tree
end
tree ->
tree
end)
|> Floki.raw_html()
# remove the <html> and </html> from the floki rendered output
|> String.slice(6..-8)
|> raw()
else
_ ->
content
end
end
end

Loading…
Cancel
Save