defmodule MicrowavepropWeb.RoverLocationsLive.Map do @moduledoc """ `/rover-locations/map` — full-screen map of every rover-location marked Good. Each marker links to its detail page. """ use MicrowavepropWeb, :live_view import Ecto.Query alias Microwaveprop.Cache alias Microwaveprop.Radio.Maidenhead alias Microwaveprop.Repo alias Microwaveprop.Rover.Location @cache_key {__MODULE__, :points} @cache_ttl_ms 30_000 @impl true def mount(_params, _session, socket) do points = cached_points() {:ok, assign(socket, page_title: "Rover Locations Map", points: points, points_json: Jason.encode!(points) )} end defp cached_points do Cache.fetch_or_store(@cache_key, @cache_ttl_ms, fn -> Location |> where([l], l.status == :good) |> Repo.all() |> Enum.map(&point_payload/1) end) end defp point_payload(%Location{} = loc) do %{ id: loc.id, lat: loc.lat, lon: loc.lon, grid: Maidenhead.from_latlon(loc.lat, loc.lon, 6), notes: loc.notes } end @impl true def render(assigns) do ~H""" <.header> Rover Locations Map <:subtitle> {length(@points)} good location{if length(@points) == 1, do: "", else: "s"} — click a marker for details. <:actions> <.link navigate={~p"/rover-locations"} class="btn btn-ghost btn-sm"> <.icon name="hero-list-bullet" class="w-4 h-4" /> List
""" end end