Map.merge params causing double save in Phoenix Liveview

I am uploading images to S3 via Ecto Waffle and am merging the Plug.Upload and the params of a Liveview, but I see double save.

How do I reformat/refactor the merge of the params so I am not triggering a double save?

defp save_campaign(socket, :new, campaign_params) do
    consume_uploaded_entries(socket, :profile_image, fn %{path: path}, entry ->
      Campaigns.create_campaign_profile_image(Map.merge(campaign_params,
          %{"profile_image" => %Plug.Upload{
              content_type: entry.client_type,
              filename: entry.client_name,
              path: path}}))
    end)

    case Campaigns.create_campaign_profile_image(campaign_params) do
      {:ok, campaign} ->
        notify_parent({:saved, campaign})

        {:noreply,
         socket
         |> put_flash(:info, "Campaign created successfully")
         |> push_patch(to: socket.assigns.patch)}

      {:error, %Ecto.Changeset{} = changeset} ->
        {:noreply, assign_form(socket, changeset)}
    end

Resolved this problem by using a pattern from Parzival

I went down some anti-pattern rabbit holes on the Live View Uploads story.