LiveviewAppWeb.Router.Helpers.live_path/3 is undefined

Below are the index module I have a little bit modified the code from the book, Programming Phoenix LiveView, Beta 0.9, Part 1, to combine the SortingComponent of the book, Building Table Views with Phoenix LiveView .

defmodule MarketWeb.ProductLive.Index do
  use MarketWeb, :live_view

  alias MarketWeb.Router.Helpers, as: Routes

  alias Market.Catalog
  alias Market.Catalog.Product
  alias MarketWeb.Forms.SortingForm

  require Logger

  @impl true
  def mount(_params, _session, socket) do
    {:ok, stream(socket, :products, Catalog.list_products())}
    # {:ok, stream(socket, :products, [nil])}
  end

  @impl true
  def handle_params(params, _url, socket) do
    IO.inspect(params, label: "handle_params, params")
    socket =
      socket
      |> parse_params(params)
      # |> IO.inspect
      |> assign_products()

    {:noreply, apply_action(socket, socket.assigns.live_action, params)}
  end

  defp parse_params(socket, params) do
    with {:ok, sorting_opts} <- SortingForm.parse(params) do
      assign_sorting(socket, sorting_opts)
    else
      _error ->
        assign_sorting(socket)
    end
  end

  defp assign_sorting(socket, overrides \\ %{}) do
    opts = Map.merge(SortingForm.default_values(), overrides)
    assign(socket, :sorting, opts) # |> IO.inspect
  end

  # Update assign_products/1 like this:
  defp assign_products(socket) do
    %{sorting: sorting} = socket.assigns

    assign(socket, :products, Catalog.list_products(sorting))
  end

  defp apply_action(socket, :edit, %{"id" => id}) do
    socket
    |> assign(:page_title, "Edit Product")
    |> assign(:product, Catalog.get_product!(id))
  end

  defp apply_action(socket, :new, _params) do
    socket
    |> assign(:page_title, "New Product")
    |> assign(:product, %Product{})
  end

  defp apply_action(socket, :index, params) do
    IO.inspect(params, label: "apply_action, :index, params")
    socket
    |> assign(:page_title, "Listing Products")
    |> assign(:product, Catalog.list_products(params))
  end

  def handle_info({:update, params}, socket) do
    # IO.puts "ProductLive.handle_info({:update, params}, socket)"
    # IO.inspect(params, label: "params")

    # params = merge_and_sanitize_params(socket, params) # (1) delete nil values, (2) preserve old values in socket.assigns

    # IO.inspect(params, label: "params")

    # call handle_params
    Logger.info "handling query"
    IO.inspect(params, label: "params")
    handle_params(params, "dummy", socket)

    # path = Routes.live_path(socket, __MODULE__, params)
    # {:noreply, push_navigate(socket, to: path, replace: true)}
    {:noreply, push_navigate(socket, to: "/?page=1&page_size=20&sort_by=id&sort_dir=desc", replace: true)}
    # {:noreply, push_navigate(socket, to: "/products", replace: true)}
  end

  @impl true
  def handle_info({MarketWeb.ProductLive.FormComponent, {:saved, product}}, socket) do
    {:noreply, stream_insert(socket, :products, product)}
  end

  @impl true
  def handle_event("delete", %{"id" => id}, socket) do
    product = Catalog.get_product!(id)
    {:ok, _} = Catalog.delete_product(product)

    {:noreply, stream_delete(socket, :products, product)}
  end
end