defmodule MoonWeb.Pages.Components.FileInputPage do @moduledoc false use MoonWeb, :live_view alias Moon.Autolayouts.TopToDown alias Moon.Components.Button alias Moon.Components.FileInput alias Moon.Components.Form alias Moon.Components.Link alias MoonWeb.Components.ExampleAndCode alias MoonWeb.Components.Page alias MoonWeb.Components.ComponentPageDescription alias __MODULE__.SimpleS3Upload data(breadcrumbs, :any, default: [ %{ to: "#", name: "Components v1" }, %{ to: "/components/file-input", name: "File Input" } ] ) def render(assigns) do ~F"""

Uploads: https://hexdocs.pm/phoenix_live_view/uploads.html

External uploads: https://hexdocs.pm/phoenix_live_view/uploads-external.html

<:example>
<:code>{get_example_1_code()} <:state>{get_example_1_state(assigns)}
<:example>
<:code>{get_example_2_code()} <:state>{get_example_2_state(assigns)}
<:example>
.oOo.
<:code>{get_example_3_code()} <:state>{get_example_1_state(assigns)}
""" end def mount(_params, _session, socket) do socket = assign(socket, uploaded_files: [] ) |> allow_upload(:some_picture_file, accept: ~w(.jpg .jpeg .png .pdf), max_file_size: 1024 * 1024, max_entries: 1 ) |> allow_upload(:some_picture_file_for_s3, accept: ~w(.jpg .jpeg .png .pdf), max_file_size: 1024 * 1024, max_entries: 1, external: &presign_upload/2 ) {:ok, socket} end def handle_params(_params, uri, socket) do {:noreply, assign(socket, uri: uri)} end def handle_event("upload_changed", _params, socket) do {:noreply, socket} end def handle_event("upload_s3_changed", _params, socket) do {:noreply, socket} end def handle_event("upload_s3_submitted", _params, socket) do consume_uploaded_entries(socket, :image, fn _meta, entry -> {:ok, entry} end) {:noreply, socket} end def handle_event("cancel_upload", %{"ref" => ref}, socket) do {:noreply, cancel_upload(socket, :image, ref)} end def presign_upload(entry, socket) do uploads = socket.assigns.uploads s3_config = Application.get_env(:moon, :s3) bucket = s3_config[:bucket] key = "uploaded-file" config = %{ region: s3_config[:region], access_key_id: s3_config[:access_key_id], secret_access_key: s3_config[:secret_access_key] } {:ok, fields} = SimpleS3Upload.sign_form_upload(config, bucket, key: key, content_type: entry.client_type, max_file_size: uploads.some_picture_file_for_s3.max_file_size, expires_in: :timer.hours(1) ) meta = %{ uploader: "S3", key: key, url: "https://#{bucket}.s3.#{config.region}.amazonaws.com/", fields: fields } {:ok, meta, socket} end def get_example_1_state(assigns) do """ @uploaded_files = #{inspect(assigns.uploaded_files)} @uploads.some_picture_file = #{inspect(assigns.uploads.some_picture_file)} """ end def get_example_2_state(assigns) do """ @uploaded_files = #{inspect(assigns.uploaded_files)} @uploads.some_picture_file = #{inspect(assigns.uploads.some_picture_file)} """ end def get_example_1_code() do """

Drag and drop area

{#for entry <- @uploads.some_picture_file.entries} <.live_img_preview entry={entry} style="max-width: 200px; max-height: 200px;" /> {entry.progress} {#for err <- upload_errors(@uploads.some_picture_file, entry)}

{inspect(err)}

{/for} {/for}
{#for err <- upload_errors(@uploads.some_picture_file)}

{inspect(err)}

{/for}
""" end def get_example_2_code() do """

Drag and drop area

{#for entry <- @uploads.some_picture_file_for_s3.entries} <.live_img_preview entry={entry} style="max-width: 200px; max-height: 200px;" /> {entry.progress} {#for err <- upload_errors(@uploads.some_picture_file_for_s3, entry)}

{inspect(err)}

{/for} {/for}
{#for err <- upload_errors(@uploads.some_picture_file_for_s3)}

{inspect(err)}

{/for}
""" end def get_example_3_code() do """
.oOo.
""" end end