78 lines
2 KiB
Elixir
78 lines
2 KiB
Elixir
|
|
defmodule PostlandWeb.OtherProfileLive do
|
||
|
|
use PostlandWeb, :live_view
|
||
|
|
|
||
|
|
alias Postland.Follows
|
||
|
|
|
||
|
|
def render(assigns) do
|
||
|
|
~H"""
|
||
|
|
<h1><%= Map.get(@profile, "name") %> (<%= @acct %>)</h1>
|
||
|
|
<%= case @follow do %>
|
||
|
|
<% nil -> %>
|
||
|
|
<.button phx-click="follow">Follow</.button>
|
||
|
|
<% %{confirmed_at: nil} -> %>
|
||
|
|
<.button disabled>Pending</.button>
|
||
|
|
<% _ -> %>
|
||
|
|
<.button phx-click="unfollow">Unfollow</.button>
|
||
|
|
<% end %>
|
||
|
|
<.list>
|
||
|
|
<:item :for={attachment <- Map.get(@profile, "attachment")} title={attachment["name"]}>
|
||
|
|
<%= attachment["value"] %>
|
||
|
|
</:item>
|
||
|
|
</.list>
|
||
|
|
"""
|
||
|
|
end
|
||
|
|
|
||
|
|
def mount(params, _session, socket) do
|
||
|
|
{:ok, resource} = ActivityPub.Webfinger.lookup_resource(Map.get(params, "acct"))
|
||
|
|
|
||
|
|
%{"href" => json_profile} =
|
||
|
|
resource
|
||
|
|
|> Map.get("links")
|
||
|
|
|> Enum.find(fn %{"rel" => rel} = link ->
|
||
|
|
rel == "self" && String.contains?(Map.get(link, "type"), "json")
|
||
|
|
end)
|
||
|
|
|
||
|
|
{:ok, profile} =
|
||
|
|
ActivityPub.get(
|
||
|
|
json_profile,
|
||
|
|
Postland.my_actor_id(),
|
||
|
|
Postland.Accounts.solo_user().private_key
|
||
|
|
)
|
||
|
|
|
||
|
|
follow = Follows.get(Postland.my_actor_id(), json_profile)
|
||
|
|
|
||
|
|
if Phoenix.LiveView.connected?(socket) do
|
||
|
|
Phoenix.PubSub.subscribe(Postland.PubSub, "follows:#{json_profile}")
|
||
|
|
end
|
||
|
|
|
||
|
|
{:ok,
|
||
|
|
assign(socket,
|
||
|
|
acct: Map.get(params, "acct"),
|
||
|
|
actor_id: json_profile,
|
||
|
|
follow: follow,
|
||
|
|
profile: profile
|
||
|
|
)}
|
||
|
|
end
|
||
|
|
|
||
|
|
def handle_event("follow", _unsigned_params, socket) do
|
||
|
|
actor_id = socket.assigns.actor_id
|
||
|
|
|
||
|
|
case Follows.record_and_send_follow_request(actor_id) do
|
||
|
|
{:ok, _} ->
|
||
|
|
{:noreply,
|
||
|
|
socket
|
||
|
|
|> put_flash(:success, "Follow request sent.")
|
||
|
|
|> assign(follow: Follows.get(Postland.my_actor_id(), actor_id))}
|
||
|
|
|
||
|
|
_other ->
|
||
|
|
{:noreply,
|
||
|
|
socket
|
||
|
|
|> put_flash(:error, "An unexpected error has occurred.")}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def handle_info({:update, follow}, socket) do
|
||
|
|
{:noreply, assign(socket, follow: follow)}
|
||
|
|
end
|
||
|
|
end
|