defmodule CanneryWeb.HomeLive do @moduledoc """ Liveview for the home page """ use CanneryWeb, :live_view alias Cannery.Accounts @impl true def mount(_params, session, socket) do admins = Accounts.list_users_by_role(:admin) socket = socket |> assign_defaults(session) |> assign(page_title: "Home", query: "", results: %{}, admins: admins) {:ok, socket} end @impl true def handle_event("suggest", %{"q" => query}, socket) do {:noreply, socket |> assign(results: search(query), query: query)} end @impl true def handle_event("search", %{"q" => query}, socket) do case search(query) do %{^query => vsn} -> {:noreply, redirect(socket, external: "https://hexdocs.pm/#{query}/#{vsn}")} _no_query -> {:noreply, socket |> put_flash(:error, "No dependencies found matching \"#{query}\"") |> assign(results: %{}, query: query)} end end @impl true def render(assigns) do ~H"""

<%= gettext("Welcome to %{name}", name: "Cannery") %>

<%= gettext("The self-hosted firearm tracker website") %>



""" end defp search(query) do if not CanneryWeb.Endpoint.config(:code_reloader) do raise "action disabled when not in development" end for {app, desc, vsn} <- Application.started_applications(), app = to_string(app), String.starts_with?(app, query) and not List.starts_with?(desc, ~c"ERTS"), into: %{}, do: {app, vsn} end end