lib/exshome_web/views/layout_view.ex

defmodule ExshomeWeb.LayoutView do
  use ExshomeWeb, :view
  alias Phoenix.LiveView.Socket

  # Phoenix LiveDashboard is available only in development by default,
  # so we instruct Elixir to not warn if the dashboard route is missing.
  @compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}

  def navigation_data(%Socket{view: view} = socket) do
    if function_exported?(view, :app_module, 0) do
      app_navigation(socket)
    else
      []
    end
  end

  defp app_navigation(%Socket{view: view} = socket) do
    app_pages =
      for page <- view.app_module().pages() do
        %{
          icon: page.icon(),
          name: page.action(),
          selected: view == page,
          path: view.app_module().path(socket, page.action())
        }
      end

    [
      %{
        icon: "🏠",
        name: "home",
        selected: false,
        path: Routes.home_path(socket, :index)
      }
      | app_pages
    ]
  end
end