defmodule MicrowavepropWeb.UserProfileLive do @moduledoc "Signed-in user's own profile + callsign linkage at `/account`." use MicrowavepropWeb, :live_view alias Microwaveprop.Accounts alias Microwaveprop.Beacons alias Microwaveprop.Beacons.Beacon alias Microwaveprop.Format alias Microwaveprop.Radio @impl true def mount(%{"callsign" => raw_callsign}, _session, socket) do case Accounts.get_user_by_callsign(raw_callsign) do nil -> {:ok, socket |> put_flash(:error, "No profile for #{raw_callsign}.") |> push_navigate(to: ~p"/")} user -> viewer = socket.assigns[:current_scope] && socket.assigns.current_scope.user contacts = Radio.list_contacts_for_user(user, viewer) beacons = Beacons.list_beacons_for_user(user, viewer) involving = Radio.list_contacts_involving_callsign(user.callsign, viewer) {:ok, assign(socket, page_title: user.callsign, profile: user, contacts: contacts, beacons: beacons, involving: involving )} end end defp initial(%{name: name}) when is_binary(name) and name != "" do name |> String.trim() |> String.first() |> String.upcase() end defp initial(%{callsign: callsign}) when is_binary(callsign), do: callsign |> String.first() |> String.upcase() defp initial(_), do: "?" @impl true def render(assigns) do ~H"""
{initial(@profile)}

{@profile.callsign}

{@profile.name} · Member since {Calendar.strftime(@profile.inserted_at, "%B %Y")}

Contacts submitted
{length(@contacts)}
Beacons submitted
{length(@beacons)}

Contacts

<%= if @contacts == [] do %>

No contacts submitted yet.

<% else %>
When Stations Band Mode Distance
{Calendar.strftime(contact.qso_timestamp, "%Y-%m-%d %H:%M UTC")} <.link navigate={~p"/contacts/#{contact.id}"} class="link link-hover font-mono"> {contact.station1} ↔ {contact.station2} {contact.band && "#{contact.band} MHz"} {contact.mode} {Format.distance_km(contact.distance_km)}
<% end %>

Beacons

<%= if @beacons == [] do %>

No beacons submitted yet.

<% else %>
Callsign Frequency Grid Keying Status
<.link navigate={~p"/beacons/#{beacon.id}"} class="link link-hover font-mono"> {beacon.callsign} {Beacon.format_freq(beacon.frequency_mhz)} MHz {beacon.grid} {Beacon.keying_label(beacon.keying)}
{if beacon.approved, do: "Approved", else: "Pending"}
<% end %>

Contacts {@profile.callsign} is in

<%= if @involving == [] do %>

No contacts on file with this callsign yet.

<% else %>

Showing the 100 most recent contacts.

When Stations Band Mode Distance
{Calendar.strftime(contact.qso_timestamp, "%Y-%m-%d %H:%M UTC")} {contact.station1} ↔ {contact.station2} {contact.band && "#{contact.band} MHz"} {contact.mode} {Format.distance_km(contact.distance_km)}
<% end %>
""" end end