cannery/lib/cannery_web/live/home_live.ex
2022-02-07 23:50:32 -05:00

129 lines
3.9 KiB
Elixir

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)
{:ok, socket |> assign_defaults(session) |> assign(query: "", results: %{}, admins: admins)}
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}")}
_ ->
{:noreply,
socket
|> put_flash(:error, "No dependencies found matching \"#{query}\"")
|> assign(results: %{}, query: query)}
end
end
@impl true
def render(assigns) do
~H"""
<div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl">
<h1 class="title text-primary-500 text-2xl">
Welcome to Cannery
</h1>
<h2 class="title text-primary-500 text-lg">
The Self-hosted Ammo Tracker Website
</h2>
<hr class="hr" />
<ul class="flex flex-col space-y-4 text-center">
<li class="flex flex-col sm:flex-row justify-center items-center
space-y-2 sm:space-y-0 sm:space-x-2">
<b class="whitespace-nowrap">
Easy to Use:
</b>
<p>Cannery lets you easily keep an eye on your ammo levels before and after range day</p>
</li>
<li class="flex flex-col sm:flex-row justify-center items-center
space-y-2 sm:space-y-0 sm:space-x-2">
<b class="whitespace-nowrap">
Secure:
</b>
<p>
Self-host your own instance, or use an instance from someone you trust.
Your data stays with you, period
</p>
</li>
<li class="flex flex-col sm:flex-row justify-center items-center
space-y-2 sm:space-y-0 sm:space-x-2">
<b class="whitespace-nowrap">
Simple:
</b>
<p>Access from any internet-capable device</p>
</li>
</ul>
<hr class="hr" />
<ul class="flex flex-col space-y-2 text-center justify-center">
<h2 class="title text-primary-500 text-lg">
Instance Information
</h2>
<li class="flex flex-col justify-center space-x-2">
<b>Admins:</b>
<p>
<%= if @admins |> Enum.empty?() do %>
<%= link("Sign up to setup Cannery!",
class: "hover:underline",
to: Routes.user_registration_path(CanneryWeb.Endpoint, :new)
) %>
<% else %>
<div class="flex flex-wrap justify-center space-x-2">
<%= for admin <- @admins do %>
<a class="hover:underline" href={"mailto:#{admin.email}"}>
<%= admin.email %>
</a>
<% end %>
</div>
<% end %>
</p>
</li>
<li class="flex flex-row justify-center space-x-2">
<b>Registration:</b>
<p>
<%= Application.get_env(:cannery, CanneryWeb.Endpoint)[:registration]
|> case do
"public" -> "Public Signups"
_ -> "Invite Only"
end %>
</p>
</li>
</ul>
</div>
"""
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