defmodule GitGudWeb.RepoLive.Index do
use GitGudWeb, :live_view
alias GitGud.Repositories
alias GitGud.Repositories.Storage
@impl true
def mount(_params, _session, socket) do
repos =
socket.assigns.current_scope
|> Repositories.list_repositories()
|> GitGud.Repo.preload([:owner, :organization])
|> Enum.map(fn r -> Map.put(r, :handle, namespace_handle(r)) end)
{:ok,
socket
|> assign(:page_title, "Repositories")
|> stream(:repos, repos)}
end
defp namespace_handle(%{organization: %{handle: h}}) when is_binary(h), do: h
defp namespace_handle(%{owner: user}), do: Storage.owner_handle(user)
@impl true
def render(assigns) do
~H"""
<Layouts.app flash={@flash} current_scope={@current_scope}>
<div class="space-y-4">
<div class="flex items-center justify-between">
<h1 class="text-2xl font-semibold">Repositories</h1>
<%= if @current_scope && @current_scope.user do %>
<.link
navigate={~p"/repositories/new"}
class="btn btn-primary"
id="new-repo-link"
>
<.icon name="hero-plus" class="size-4" /> New
</.link>
<% end %>
</div>
<ul id="repos" phx-update="stream" class="divide-y divide-base-300">
<li class="py-6 hidden only:block text-sm opacity-60">
No repositories yet.
</li>
<li :for={{id, repo} <- @streams.repos} id={id} class="py-4">
<.link
navigate={~p"/r/#{repo.handle}/#{repo.name}"}
class="font-mono text-primary hover:underline"
>
{repo.handle}/{repo.name}
</.link>
<p :if={repo.description} class="text-sm opacity-70">{repo.description}</p>
<p class="text-xs opacity-50 mt-1">
{repo.visibility} ·
<span :if={repo.pushed_at}>pushed {format_time(repo.pushed_at)}</span>
<span :if={!repo.pushed_at}>no pushes yet</span>
</p>
</li>
</ul>
</div>
</Layouts.app>
"""
end
defp format_time(dt), do: Calendar.strftime(dt, "%Y-%m-%d %H:%M")
end
2.2 KiB · text
5af55d9