2021-04-05 00:55:51 +08:00
|
|
|
defmodule LivebookWeb.SessionLive.CellUploadComponent do
|
|
|
|
use LivebookWeb, :live_component
|
|
|
|
|
2021-09-05 01:16:01 +08:00
|
|
|
alias Livebook.FileSystem
|
2021-04-05 00:55:51 +08:00
|
|
|
|
|
|
|
@impl true
|
|
|
|
def mount(socket) do
|
2021-08-14 03:17:43 +08:00
|
|
|
{:ok, assign(socket, name: "", error_message: nil)}
|
2021-04-05 00:55:51 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
def render(assigns) do
|
2021-07-07 20:32:49 +08:00
|
|
|
~H"""
|
2022-09-01 05:53:23 +08:00
|
|
|
<div class="p-6 flex flex-col space-y-8">
|
2021-04-05 00:55:51 +08:00
|
|
|
<h3 class="text-2xl font-semibold text-gray-800">
|
|
|
|
Insert image
|
|
|
|
</h3>
|
2023-02-23 02:34:54 +08:00
|
|
|
<div :if={@uploads.cell_image.errors != []} class="error-box">
|
|
|
|
Invalid image file. The image must be either GIF, JPEG, SVG or PNG and cannot exceed 5MB in size.
|
|
|
|
</div>
|
|
|
|
<div :if={@error_message} class="error-box">
|
|
|
|
<%= @error_message %>
|
|
|
|
</div>
|
|
|
|
<div :for={entry <- @uploads.cell_image.entries} class="flex flex-col space-y-1">
|
|
|
|
<div class="flex justify-between text-gray-700">
|
|
|
|
<span><%= entry.client_name %></span>
|
|
|
|
<span><%= entry.progress %>%</span>
|
2021-04-05 00:55:51 +08:00
|
|
|
</div>
|
2023-02-23 02:34:54 +08:00
|
|
|
<div class="w-full h-2 rounded-lg bg-blue-200">
|
|
|
|
<div
|
|
|
|
class="h-full rounded-lg bg-blue-600 transition-all ease-out duration-1000"
|
|
|
|
style={"width: #{entry.progress}%"}
|
|
|
|
>
|
2021-04-05 00:55:51 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
2023-02-23 02:34:54 +08:00
|
|
|
</div>
|
2021-07-07 20:32:49 +08:00
|
|
|
<form phx-submit="save" phx-change="validate" phx-target={@myself}>
|
2021-04-05 00:55:51 +08:00
|
|
|
<div class="w-full flex space-x-2">
|
|
|
|
<div>
|
|
|
|
<label>
|
2023-02-23 02:34:54 +08:00
|
|
|
<.live_file_input upload={@uploads.cell_image} class="hidden" />
|
2021-12-04 04:57:21 +08:00
|
|
|
<div class="cursor-pointer button-base button-gray button-square-icon">
|
2021-07-07 20:32:49 +08:00
|
|
|
<.remix_icon icon="folder-upload-line" />
|
2021-04-05 00:55:51 +08:00
|
|
|
</div>
|
|
|
|
</label>
|
|
|
|
</div>
|
2021-12-30 05:06:19 +08:00
|
|
|
<div class="grow">
|
2021-07-07 20:32:49 +08:00
|
|
|
<input class="input" name="name" value={@name} placeholder="Name" autocomplete="off" />
|
2021-04-05 00:55:51 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="mt-8 flex justify-end space-x-2">
|
2023-02-23 02:34:54 +08:00
|
|
|
<.link patch={@return_to} class="button-base button-outlined-gray">
|
|
|
|
Cancel
|
|
|
|
</.link>
|
2022-08-02 21:51:02 +08:00
|
|
|
<button
|
|
|
|
class="button-base button-blue"
|
2021-07-07 20:32:49 +08:00
|
|
|
type="submit"
|
2022-08-02 21:51:02 +08:00
|
|
|
disabled={@uploads.cell_image.entries == []}
|
|
|
|
>
|
2021-07-07 20:32:49 +08:00
|
|
|
Upload
|
|
|
|
</button>
|
2021-04-05 00:55:51 +08:00
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
def handle_event("validate", %{"name" => name}, socket) do
|
|
|
|
{:noreply, assign(socket, name: name)}
|
|
|
|
end
|
|
|
|
|
|
|
|
def handle_event("save", %{"name" => name}, socket) do
|
2021-09-05 01:16:01 +08:00
|
|
|
%{images_dir: images_dir} = socket.assigns.session
|
2021-04-05 00:55:51 +08:00
|
|
|
|
2021-08-14 03:17:43 +08:00
|
|
|
consume_uploaded_entries(socket, :cell_image, fn %{path: path}, entry ->
|
|
|
|
upload_file = FileSystem.File.local(path)
|
|
|
|
ext = Path.extname(entry.client_name)
|
2022-04-02 07:19:17 +08:00
|
|
|
filename = if name == "", do: entry.client_name, else: name <> ext
|
2021-08-14 03:17:43 +08:00
|
|
|
destination_file = FileSystem.File.resolve(images_dir, filename)
|
|
|
|
|
2022-01-27 22:47:04 +08:00
|
|
|
result =
|
|
|
|
with :ok <- FileSystem.File.copy(upload_file, destination_file) do
|
|
|
|
{:ok, filename}
|
|
|
|
end
|
|
|
|
|
|
|
|
{:ok, result}
|
2021-08-14 03:17:43 +08:00
|
|
|
end)
|
|
|
|
|> case do
|
|
|
|
[{:ok, filename}] ->
|
2022-12-30 05:32:52 +08:00
|
|
|
url = "images/#{URI.encode(filename, &URI.char_unreserved?/1)}"
|
|
|
|
send(self(), {:cell_upload_complete, socket.assigns.cell_upload_metadata, url})
|
|
|
|
{:noreply, push_patch(socket, to: socket.assigns.return_to)}
|
2021-04-05 00:55:51 +08:00
|
|
|
|
2021-08-14 03:17:43 +08:00
|
|
|
[{:error, message}] ->
|
|
|
|
{:noreply, assign(socket, error_message: message)}
|
|
|
|
end
|
2021-04-05 00:55:51 +08:00
|
|
|
end
|
|
|
|
end
|