diff --git a/lib/chess_web/templates/game/new.html.eex b/lib/chess_web/templates/game/new.html.eex index cad9015..c67d600 100644 --- a/lib/chess_web/templates/game/new.html.eex +++ b/lib/chess_web/templates/game/new.html.eex @@ -4,7 +4,12 @@ <%= form_for @changeset, game_path(@conn, :create), [class: "create-game"], fn form -> %>
-
+ <%= live_render( + @conn, + ChessWeb.OpponentFinderLive, + session: %{"user_id" => current_user(@conn).id} + ) %> + <%= error_tag form, :opponent_id %>
diff --git a/lib/chess_web/templates/game/opponent_finder.html.leex b/lib/chess_web/templates/game/opponent_finder.html.leex new file mode 100644 index 0000000..0fe0035 --- /dev/null +++ b/lib/chess_web/templates/game/opponent_finder.html.leex @@ -0,0 +1,32 @@ +
+
+ + + <%= tag :input, + id: "query-string", + class: "search-input", + name: "q", + type: "text", + autocomplete: "off", + "phx-change": "search", + "phx-debounce": "250", + value: @q, + placeholder: Map.get(@selected, :name, "") + %> + <%= tag :input, + name: "game[opponent_id]", + type: "hidden", + value: Map.get(@selected, :id, nil) + %> + + <%= if Enum.any?(@opponents) do %> + + <% end %> +
+
diff --git a/lib/chess_web/views/live/opponent_finder_live.ex b/lib/chess_web/views/live/opponent_finder_live.ex new file mode 100644 index 0000000..7d866b9 --- /dev/null +++ b/lib/chess_web/views/live/opponent_finder_live.ex @@ -0,0 +1,51 @@ +defmodule ChessWeb.OpponentFinderLive do + use Phoenix.LiveView + + alias Chess.Store.User + alias Chess.Repo + alias Chess.Repo.Queries + + alias ChessWeb.GameView + + def render(assigns) do + Phoenix.View.render(GameView, "opponent_finder.html", assigns) + end + + def mount(_params, %{"user_id" => user_id}, socket) do + ChessWeb.Endpoint.subscribe("opponent_finder:#{user_id}") + + user = Repo.get!(User, user_id) + + {:ok, assign(socket, default_assigns(user))} + end + + def handle_event("search", %{"q" => q}, socket) do + opponents = + case q do + "" -> + [] + + query_string -> + socket.assigns.user + |> Queries.opponents(query_string) + |> Repo.all() + end + + {:noreply, assign(socket, %{opponents: opponents})} + end + + def handle_event("select", %{"id" => id}, socket) do + opponent = Repo.get!(User, id) + + {:noreply, assign(socket, %{q: "", opponents: [], selected: opponent})} + end + + def default_assigns(user) do + %{ + q: "", + user: user, + opponents: [], + selected: %{} + } + end +end