| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- defmodule VaccinsWeb.IndexLive do
- use VaccinsWeb, :live_view
- alias Vaccins.{LocationStore, Search}
- @refresh_period_ms 30 * 1000
- @impl true
- def mount(_params, _session, socket) do
- locations = LocationStore.get_locations()
- {:ok,
- socket
- |> assign(
- locations: locations,
- pending: %{},
- location_cs: LocationStore.LocationRaw.changeset(%{}),
- display_cs: false
- )
- |> trigger_global_refresh
- |> trigger_periodic_refresh}
- end
- @impl true
- def handle_event("add_location", %{"location_raw" => params}, socket) do
- case params |> LocationStore.add_location() do
- :ok -> {:noreply, socket}
- {:error, cs} -> {:noreply, socket |> assign(location_cs: cs)}
- end
- end
- def handle_event("trigger_all", _, socket) do
- {:noreply, socket |> trigger_global_refresh}
- end
- def handle_event("toggle_form", _, socket = %{assigns: %{display_cs: display}}),
- do: {:noreply, socket |> assign(display_cs: not display)}
- @impl true
- def handle_info({:query_sent, id, ref}, socket = %{assigns: %{pending: pending}}) do
- {:noreply, socket |> assign(pending: pending |> Map.put(ref, id))}
- end
- def handle_info(:periodic_refresh, socket),
- do:
- {:noreply,
- socket
- |> trigger_global_refresh
- |> trigger_periodic_refresh}
- @impl true
- def handle_info(
- {:query_result, ref, res},
- socket = %{assigns: %{locations: valid, pending: pending}}
- ) do
- id = pending |> Map.get(ref)
- send_update(VaccinsWeb.LocationComponent, id: id, availabilities: res)
- {:noreply, socket |> assign(pending: pending |> Map.delete(ref))}
- end
- defp trigger_global_refresh(socket = %{assigns: %{locations: locations}}) do
- locations
- |> Enum.each(&send_update(VaccinsWeb.LocationComponent, id: &1.id, force_refresh: true))
- socket
- end
- defp trigger_periodic_refresh(socket) do
- Process.send_after(self(), :periodic_refresh, @refresh_period_ms)
- socket
- end
- end
|