dotfiles/app/lib/prymn_web/components/create_app.ex
Nikos Papadakis 818b20f775 add functionality that creates wordpress sites
Reviewed-on: https://git.nikos.gg/prymn/prymn/pulls/9
Co-authored-by: Nikos Papadakis <nikos@papadakis.xyz>
Co-committed-by: Nikos Papadakis <nikos@papadakis.xyz>
2023-12-14 12:27:05 +00:00

151 lines
4.6 KiB
Elixir

defmodule PrymnWeb.CreateApp do
use PrymnWeb, :live_component
alias Prymn.Apps
@impl true
def mount(socket) do
servers = Prymn.Servers.list_registered_servers()
{:ok, assign(socket, :servers, servers)}
end
@impl true
def update(assigns, socket) do
changeset = Apps.change_app(%Apps.App{server: nil})
{:ok,
socket
|> assign(assigns)
|> assign(:form, to_form(changeset))}
end
@impl true
def render(assigns) do
~H"""
<div class="mx-auto max-w-2xl">
<fieldset>
<legend class="mb-6 border-b border-slate-200 pb-2 text-base font-semibold">App Type</legend>
<span>
<input
id="wordpress"
type="radio"
name="app_type"
value="wordpress"
class="peer hidden"
checked={@app_type == "wordpress"}
/>
<label
for="wordpress"
class="inline-block cursor-pointer rounded p-5 shadow peer-checked:bg-black peer-checked:text-white"
phx-click={JS.patch(~p"/apps/new?app_type=wordpress")}
>
WordPress
</label>
</span>
<span>
<input
id="plain"
type="radio"
name="app_type"
value="plain"
class="peer hidden"
checked={@app_type == "plain"}
/>
<label
for="plain"
class="inline-block cursor-pointer rounded p-5 shadow peer-checked:bg-black peer-checked:text-white"
phx-click={JS.patch(~p"/apps/new?app_type=plain")}
>
Plain HTML
</label>
</span>
</fieldset>
<.wordpress_app_form
:if={@app_type == "wordpress"}
form={@form}
servers={@servers}
myself={@myself}
/>
<.plain_app_form :if={@app_type == "plain"} form={@form} servers={@servers} myself={@myself} />
</div>
"""
end
@impl true
def handle_event("create_wordpress_app", %{"app" => params}, socket) do
server =
Enum.find(socket.assigns.servers, %Prymn.Servers.Server{}, fn server ->
Integer.to_string(server.id) == params["server_id"]
end)
socket =
case Apps.create_app(server, params) do
%Ecto.Changeset{valid?: false} = changeset -> assign(socket, :form, to_form(changeset))
%Apps.App{} -> push_navigate(socket, to: ~p"/apps")
end
{:noreply, socket}
end
def handle_event("create_plain_app", _params, socket) do
{:noreply, socket}
end
defp wordpress_app_form(assigns) do
~H"""
<.simple_form method="POST" for={@form} phx-submit="create_wordpress_app" phx-target={@myself}>
<.input
type="select"
label="Hosting Server"
prompt="Select a server"
field={@form[:server_id]}
options={Enum.map(@servers, &{&1.name, &1.id})}
/>
<.input type="text" label="App Name" field={@form[:name]} />
<.input type="text" label="Domain Name" field={@form[:domain]} />
<fieldset>
<legend class="text-sm font-semibold leading-6 text-gray-900">
WordPress Settings
</legend>
<div class="mt-6 grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-2">
<.inputs_for :let={wordpress} field={@form[:wordpress]}>
<.input type="email" label="Admin Email" field={wordpress[:admin_email]} />
<.input type="text" label="Admin Username" field={wordpress[:admin_username]} />
<.input type="text" label="Installation Path" field={wordpress[:path]} />
<.input
type="text"
label="Database Host"
field={wordpress[:db_host]}
value="127.0.0.1"
readonly
/>
<.input type="text" label="Database Name" field={wordpress[:db_name]} />
<.input type="text" label="Database User" field={wordpress[:db_user]} />
<.input type="password" label="Database Password" field={wordpress[:db_pass]} />
</.inputs_for>
</div>
</fieldset>
<:actions>
<Button.primary type="submit">Create</Button.primary>
</:actions>
</.simple_form>
"""
end
defp plain_app_form(assigns) do
~H"""
<.simple_form method="POST" for={@form} phx-submit="create_plain_app" phx-target={@myself}>
<.input
type="select"
label="Hosting Server"
prompt="Select a server"
field={@form[:server_id]}
options={Enum.map(@servers, &{&1.name, &1.id})}
/>
<:actions>
<Button.primary type="submit">Create</Button.primary>
</:actions>
</.simple_form>
"""
end
end