index.ex 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. availabilities: locations |> Map.new(&{&1.id, []}),
  14. location_cs: LocationStore.LocationRaw.changeset(%{}),
  15. display_cs: false
  16. )
  17. |> trigger_global_refresh
  18. |> trigger_periodic_refresh}
  19. end
  20. @impl true
  21. def handle_event("add_location", %{"location_raw" => params}, socket) do
  22. case params |> LocationStore.add_location() do
  23. :ok -> {:noreply, socket}
  24. {:error, cs} -> {:noreply, socket |> assign(location_cs: cs)}
  25. end
  26. end
  27. def handle_event("trigger_all", _, socket) do
  28. {:noreply, socket |> trigger_global_refresh}
  29. end
  30. def handle_event("toggle_form", _, socket = %{assigns: %{display_cs: display}}),
  31. do: {:noreply, socket |> assign(display_cs: not display)}
  32. @impl true
  33. def handle_info({:query_sent, id, ref}, socket = %{assigns: %{pending: pending}}) do
  34. {:noreply, socket |> assign(pending: pending |> Map.put(ref, id))}
  35. end
  36. def handle_info(:periodic_refresh, socket),
  37. do:
  38. {:noreply,
  39. socket
  40. |> trigger_global_refresh
  41. |> trigger_periodic_refresh}
  42. @impl true
  43. def handle_info(
  44. {:query_result, ref, res},
  45. socket = %{assigns: %{locations: valid, pending: pending}}
  46. ) do
  47. id = pending |> Map.get(ref)
  48. send_update(VaccinsWeb.LocationComponent, id: id, availabilities: res)
  49. {:noreply, socket |> assign(pending: pending |> Map.delete(ref))}
  50. end
  51. defp trigger_global_refresh(socket = %{assigns: %{locations: locations}}) do
  52. locations
  53. |> Enum.each(&send_update(VaccinsWeb.LocationComponent, id: &1.id, force_refresh: true))
  54. socket
  55. end
  56. defp trigger_periodic_refresh(socket) do
  57. Process.send_after(self(), :periodic_refresh, @refresh_period_ms)
  58. socket
  59. end
  60. end