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 -> %>
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 @@
+
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