diff --git a/lib/link_shortener_web/live/link_live/form_component.ex b/lib/link_shortener_web/live/link_live/form_component.ex index 6fb14b0..a1de579 100644 --- a/lib/link_shortener_web/live/link_live/form_component.ex +++ b/lib/link_shortener_web/live/link_live/form_component.ex @@ -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 + <% 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 %> + + <% end %> + <:actions> <.button phx-disable-with="Saving...">Save Link @@ -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 diff --git a/lib/link_shortener_web/live/link_live/index.ex b/lib/link_shortener_web/live/link_live/index.ex index 91e0792..73105e6 100644 --- a/lib/link_shortener_web/live/link_live/index.ex +++ b/lib/link_shortener_web/live/link_live/index.ex @@ -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 diff --git a/lib/link_shortener_web/live/link_live/index.html.heex b/lib/link_shortener_web/live/link_live/index.html.heex index 34ae04c..5518c09 100644 --- a/lib/link_shortener_web/live/link_live/index.html.heex +++ b/lib/link_shortener_web/live/link_live/index.html.heex @@ -39,6 +39,7 @@ action={@live_action} link={@link} current_user={@current_user} + is_checked={@is_random_shorten_by_default} patch={~p"/links"} /> diff --git a/test/link_shortener_web/live/link_live_test.exs b/test/link_shortener_web/live/link_live_test.exs index 6451ceb..67dc237 100644 --- a/test/link_shortener_web/live/link_live_test.exs +++ b/test/link_shortener_web/live/link_live_test.exs @@ -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't be blank"