index.ex 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. defmodule VaccinsWeb.IndexLive do
  2. use VaccinsWeb, :live_view
  3. alias Vaccins.{LocationStore, Search}
  4. @impl true
  5. def mount(_params, _session, socket) do
  6. locations = LocationStore.get_locations()
  7. {:ok,
  8. socket
  9. |> assign(
  10. locations: locations,
  11. pending: %{},
  12. availabilities: locations |> Map.new(&{&1.id, []}),
  13. location_cs: LocationStore.LocationRaw.changeset(%{})
  14. )}
  15. end
  16. @impl true
  17. def handle_event("add_location", %{"location_raw" => params}, socket) do
  18. case params |> LocationStore.add_location() do
  19. :ok -> {:noreply, socket}
  20. {:error, cs} -> {:noreply, socket |> assign(location_cs: cs)}
  21. end
  22. end
  23. @impl true
  24. def handle_info({:query_sent, id, ref}, socket = %{assigns: %{pending: pending}}) do
  25. {:noreply, socket |> assign(pending: pending |> Map.put(ref, id))}
  26. end
  27. @impl true
  28. def handle_info(
  29. {:query_result, ref, res},
  30. socket = %{assigns: %{locations: valid, pending: pending}}
  31. ) do
  32. id = pending |> Map.get(ref)
  33. send_update(VaccinsWeb.LocationComponent, id: id, availabilities: res)
  34. {:noreply, socket |> assign(pending: pending |> Map.delete(ref))}
  35. end
  36. end