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>
<: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
"""
"""
end
def get_example_2_code() do
"""
"""
end
def get_example_3_code() do
"""
"""
end
end