defmodule LocalspotWeb.BusinessLive.Map do use LocalspotWeb, :live_view alias Localspot.Businesses @impl true def mount(_params, _session, socket) do businesses = Businesses.list_businesses() {:ok, socket |> assign(:page_title, "Business Map") |> assign(:businesses, businesses) |> assign(:selected_business, nil)} end @impl true def handle_event("select_business", %{"slug" => slug}, socket) do business = Enum.find(socket.assigns.businesses, &(&1.slug == slug)) {:noreply, assign(socket, :selected_business, business)} end @impl true def handle_event("close_popup", _params, socket) do {:noreply, assign(socket, :selected_business, nil)} end @impl true def render(assigns) do ~H"""
<.header> Business Map <:subtitle>View all businesses on an interactive map <.link navigate={~p"/businesses"} class="btn btn-ghost btn-sm"> <.icon name="hero-list-bullet" class="w-4 h-4" /> List View

{@selected_business.name} Local

{@selected_business.category.name}

{@selected_business.description}

<.icon name="hero-map-pin" class="w-4 h-4" /> {@selected_business.street_address}, {@selected_business.city}, {@selected_business.state}
<.link navigate={~p"/businesses/#{@selected_business.slug}"} class="btn btn-primary btn-sm" > View Details

Showing {length(@businesses)} businesses on the map.

""" end defp map_businesses(businesses) do businesses |> Enum.filter(&(&1.latitude && &1.longitude)) |> Enum.map(fn b -> %{ slug: b.slug, name: b.name, lat: Decimal.to_float(b.latitude), lng: Decimal.to_float(b.longitude), category: b.category.name, locally_owned: b.locally_owned } end) end end