location_component.ex 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. defmodule VaccinsWeb.LocationComponent do
  2. use VaccinsWeb, :live_component
  3. alias Vaccins.{LocationStore, Search}
  4. @impl true
  5. def mount(socket), do: {:ok, socket |> assign(availabilities: [])}
  6. @impl true
  7. def update(assigns, socket) do
  8. {force_refresh, assigns} = assigns |> Map.pop(:force_refresh)
  9. if is_nil(force_refresh) do
  10. {:ok, socket |> assign(assigns)}
  11. else
  12. trigger_and_signal_query(
  13. assigns |> Map.get(:location, socket.assigns.location),
  14. assigns.id
  15. )
  16. {:ok, socket |> assign(availabilities: "...") |> assign(assigns)}
  17. end
  18. end
  19. @impl true
  20. def handle_event("trigger_query", _, socket = %{assigns: %{id: id, location: location}}) do
  21. trigger_and_signal_query(location, id)
  22. {:noreply, socket |> assign(availabilities: "...")}
  23. end
  24. @impl true
  25. def render(assigns) do
  26. ~L"""
  27. <dl class="show-metadata">
  28. <dt>id</dt>
  29. <dd><%= @location.id %></dd>
  30. <dt>booking page</dt>
  31. <dd><%= link @location.booking_page, to: @location.booking_page %></dd>
  32. <dt>Availabilities</dt>
  33. <dd><%= @availabilities |> inspect %></dd>
  34. <dt>test availability</dt>
  35. <dd><button phx-click="trigger_query" phx-target="<%= @myself %>">Trigger</button></dd>
  36. </dl>
  37. """
  38. end
  39. defp trigger_and_signal_query(location, id) do
  40. ref = Search.async_trigger_query(location)
  41. send(self(), {:query_sent, id, ref})
  42. end
  43. end