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"""
<.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} />
"""
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]} />
<:actions>
Create
"""
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>
Create
"""
end
end