defmodule LocalspotWeb.BusinessLive.Index do
use LocalspotWeb, :live_view
alias Localspot.Businesses
@impl true
def mount(_params, _session, socket) do
categories = Businesses.list_categories()
{:ok,
socket
|> assign(:page_title, "Local Businesses")
|> assign(:categories, categories)
|> assign(:filters, %{})
|> stream(:businesses, [])}
end
@impl true
def handle_params(params, _uri, socket) do
businesses = Businesses.list_businesses(params)
{:noreply,
socket
|> assign(:filters, params)
|> stream(:businesses, businesses, reset: true)}
end
@impl true
def handle_event("search", %{"search" => search_params}, socket) do
params = build_url_params(socket.assigns.filters, search_params)
{:noreply, push_patch(socket, to: ~p"/businesses?#{params}")}
end
@impl true
def handle_event("clear_filters", _params, socket) do
{:noreply, push_patch(socket, to: ~p"/businesses")}
end
@impl true
def handle_event("set_location", %{"latitude" => lat, "longitude" => lng}, socket) do
params =
socket.assigns.filters
|> Map.put("latitude", lat)
|> Map.put("longitude", lng)
{:noreply, push_patch(socket, to: ~p"/businesses?#{params}")}
end
defp build_url_params(existing, new) do
Map.merge(existing, new)
|> Enum.reject(fn {_k, v} -> v == "" or is_nil(v) end)
|> Map.new()
end
@impl true
def render(assigns) do
~H"""
{@business.description}