3.3 KiB · text 5af55d9
defmodule GitGudWeb.WikiLive.Edit do
use GitGudWeb, :live_view
alias GitGud.Repositories
alias GitGud.Repositories.Storage
alias GitGud.Wikis
@impl true
def mount(%{"owner" => owner, "name" => name} = params, _session, socket) do
repo =
Repositories.get_repository_by_path!(owner, name)
|> GitGud.Repo.preload([:owner, :organization])
slug = params["slug"] || ""
body = if slug == "", do: "", else: Wikis.get_page(repo, slug) || ""
{:ok,
socket
|> assign(:repo, repo)
|> assign(:handle, Storage.repo_handle(repo))
|> GitGudWeb.RepoLive.Header.assign_chrome(repo)
|> assign(:slug, slug)
|> assign(:body, body)
|> assign(:message, "")
|> assign(:page_title, "Edit wiki: #{slug}")}
end
@impl true
def handle_event("save", %{"slug" => slug, "body" => body, "message" => message}, socket) do
user = socket.assigns.current_scope.user
msg = if message == "", do: "Update " <> slug, else: message
case Wikis.put_page(socket.assigns.repo, user, slug, body, message: msg) do
{:ok, _sha} ->
{:noreply,
socket
|> put_flash(:info, "Page saved.")
|> push_navigate(
to: ~p"/r/#{socket.assigns.handle}/#{socket.assigns.repo.name}/wiki/#{slug}"
)}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Save failed: #{inspect(reason)}")}
end
end
@impl true
def render(assigns) do
~H"""
<Layouts.app flash={@flash} current_scope={@current_scope}>
<div class="space-y-4 max-w-3xl">
<GitGudWeb.RepoLive.Header.header
repo={@repo}
handle={@handle}
current_scope={@current_scope}
has_packages?={@has_packages?}
can_admin?={@can_admin?}
latest_run={@latest_run}
/>
<h1 class="text-xl font-semibold">
{if @slug == "", do: "New wiki page", else: "Edit " <> @slug}
</h1>
<form phx-submit="save" class="space-y-3" id="wiki-edit-form">
<label class="flex flex-col gap-1">
<span class="text-sm opacity-70">Slug</span>
<input
type="text"
name="slug"
value={@slug}
required
class="input input-bordered"
placeholder="Home"
/>
</label>
<label class="flex flex-col gap-1">
<span class="text-sm opacity-70">Content (Markdown)</span>
<textarea name="body" rows="20" class="textarea textarea-bordered font-mono text-sm"><%= @body %></textarea>
</label>
<label class="flex flex-col gap-1">
<span class="text-sm opacity-70">Commit message</span>
<input
type="text"
name="message"
value={@message}
class="input input-bordered"
placeholder="Update Home"
/>
</label>
<div class="flex justify-end gap-2">
<.link
navigate={~p"/r/#{@handle}/#{@repo.name}/wiki"}
class="btn btn-sm btn-ghost"
>
Cancel
</.link>
<button type="submit" class="btn btn-sm btn-primary">Save</button>
</div>
</form>
</div>
</Layouts.app>
"""
end
end