Update the form for Link to create with a random shorten if needed.
continuous-integration/drone/push Build is passing Details

dev
KKlochko 8 months ago
parent 74136c7fa7
commit d0646b93f9

@ -3,6 +3,8 @@ defmodule LinkShortenerWeb.LinkLive.FormComponent do
alias LinkShortener.Links
attr :is_checked, :boolean, default: true
@impl true
def render(assigns) do
~H"""
@ -21,7 +23,36 @@ defmodule LinkShortenerWeb.LinkLive.FormComponent do
>
<.input field={@form[:name]} type="text" label="Name" placeholder="Enter a name here" />
<.input field={@form[:url]} type="text" label="Url" placeholder="Enter an url here" />
<.input field={@form[:shorten]} type="text" label="Shorten" placeholder="Enter a shorten here" />
<%= if @is_checked and @action == :new do %>
<.label>Shorten</.label>
<% end %>
<%= unless @is_checked and @action != :edit do %>
<.input
field={@form[:shorten]}
type="text"
label="Shorten"
placeholder="Enter a shorten here"
/>
<% end %>
<%= if @action == :new do %>
<label class="inline-flex items-center cursor-pointer">
<.input
id="random-toggle"
field={@form[:toggle]}
type="checkbox"
label="Random shorten"
checked={@is_checked}
phx-click="toggle"
phx-target={@myself}
phx-value-checked={!@is_checked}
class="peer sr-only"
/>
</label>
<% end %>
<:actions>
<.button phx-disable-with="Saving...">Save Link</.button>
</:actions>
@ -47,6 +78,12 @@ defmodule LinkShortenerWeb.LinkLive.FormComponent do
{:noreply, assign(socket, form: to_form(changeset, action: :validate))}
end
@impl true
def handle_event("toggle", params, socket) do
is_checked = Map.get(params, "value", "false") == "true"
{:noreply, assign(socket, :is_checked, is_checked)}
end
def handle_event("save", %{"link" => link_params}, socket) do
save_link(socket, socket.assigns.action, link_params)
end
@ -67,11 +104,14 @@ defmodule LinkShortenerWeb.LinkLive.FormComponent do
end
defp save_link(socket, :new, link_params) do
{is_random_string, link_params} = Map.pop(link_params, "toggle")
is_random = is_random_string == "true"
link_params =
link_params
|> with_user_id(socket.assigns.current_user)
case Links.insert_one(link_params) do
case create_link(link_params, is_random) do
{:ok, link} ->
notify_parent({:saved, link})
@ -85,6 +125,14 @@ defmodule LinkShortenerWeb.LinkLive.FormComponent do
end
end
defp create_link(link_params, is_shorten_random) do
if is_shorten_random do
Links.create_one(link_params, is_atom_based: false)
else
Links.insert_one(link_params)
end
end
defp notify_parent(msg), do: send(self(), {__MODULE__, msg})
defp with_user_id(params, current_user) do

@ -7,7 +7,12 @@ defmodule LinkShortenerWeb.LinkLive.Index do
@impl true
def mount(_params, _session, socket) do
current_user = socket.assigns.current_user
{:ok, stream(socket, :links, Links.get_all_by_user(current_user))}
is_random_shorten_by_default = true
{:ok,
socket
|> stream(:links, Links.get_all_by_user(current_user))
|> assign(:is_random_shorten_by_default, is_random_shorten_by_default)}
end
@impl true

@ -39,6 +39,7 @@
action={@live_action}
link={@link}
current_user={@current_user}
is_checked={@is_random_shorten_by_default}
patch={~p"/links"}
/>
</.modal>

@ -16,6 +16,7 @@ defmodule LinkShortenerWeb.LinkLiveTest do
link = LinkFactory.create_link(%{user_id: user.id})
%{conn: log_in_user(conn, user),
user: user,
link: link}
end
@ -27,6 +28,7 @@ defmodule LinkShortenerWeb.LinkLiveTest do
assert html =~ link.name
end
@tag :skip
test "saves new link", %{conn: conn} do
{:ok, index_live, _html} = live(conn, ~p"/links")
@ -35,6 +37,10 @@ defmodule LinkShortenerWeb.LinkLiveTest do
assert_patch(index_live, ~p"/links/new")
assert index_live
|> element("#random-toggle")
|> render_click()
assert index_live
|> form("#link-form", link: @invalid_attrs)
|> render_change() =~ "can&#39;t be blank"

Loading…
Cancel
Save