index.ex 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. defmodule VaccinsWeb.IndexLive do
  2. use VaccinsWeb, :live_view
  3. alias Vaccins.{LocationStore, Search}
  4. @refresh_period_ms 30 * 1000
  5. @impl true
  6. def mount(_params, _session, socket) do
  7. locations = LocationStore.get_locations()
  8. {:ok,
  9. socket
  10. |> assign(
  11. locations: locations,
  12. pending: %{},
  13. location_cs: LocationStore.LocationRaw.changeset(%{}),
  14. display_cs: false
  15. )
  16. |> trigger_global_refresh
  17. |> trigger_periodic_refresh}
  18. end
  19. @impl true
  20. def handle_event("add_location", %{"location_raw" => params}, socket) do
  21. case params |> LocationStore.add_location() do
  22. :ok -> {:noreply, socket}
  23. {:error, cs} -> {:noreply, socket |> assign(location_cs: cs)}
  24. end
  25. end
  26. def handle_event("trigger_all", _, socket) do
  27. {:noreply, socket |> trigger_global_refresh}
  28. end
  29. def handle_event("toggle_form", _, socket = %{assigns: %{display_cs: display}}),
  30. do: {:noreply, socket |> assign(display_cs: not display)}
  31. @impl true
  32. def handle_info({:query_sent, id, ref}, socket = %{assigns: %{pending: pending}}) do
  33. {:noreply, socket |> assign(pending: pending |> Map.put(ref, id))}
  34. end
  35. def handle_info(:periodic_refresh, socket),
  36. do:
  37. {:noreply,
  38. socket
  39. |> trigger_global_refresh
  40. |> trigger_periodic_refresh}
  41. @impl true
  42. def handle_info(
  43. {:query_result, ref, res},
  44. socket = %{assigns: %{locations: valid, pending: pending}}
  45. ) do
  46. id = pending |> Map.get(ref)
  47. send_update(VaccinsWeb.LocationComponent, id: id, availabilities: res)
  48. {:noreply, socket |> assign(pending: pending |> Map.delete(ref))}
  49. end
  50. defp trigger_global_refresh(socket = %{assigns: %{locations: locations}}) do
  51. locations
  52. |> Enum.each(&send_update(VaccinsWeb.LocationComponent, id: &1.id, force_refresh: true))
  53. socket
  54. end
  55. defp trigger_periodic_refresh(socket) do
  56. Process.send_after(self(), :periodic_refresh, @refresh_period_ms)
  57. socket
  58. end
  59. end