defmodule LivebookWeb.OpenLive.UploadComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok,
socket
|> assign(:error, false)
|> allow_upload(:notebook, accept: ~w(.livemd), max_entries: 1)}
end
@impl true
def render(assigns) do
~H"""
Drag and drop a .livemd file below to import it.
"""
end
@impl Phoenix.LiveComponent
def handle_event("clear-file", _params, socket) do
{socket, _entries} = Phoenix.LiveView.Upload.maybe_cancel_uploads(socket)
{:noreply, assign(socket, error: false)}
end
@impl Phoenix.LiveComponent
def handle_event("validate", _params, socket) do
has_error? = Enum.any?(socket.assigns.uploads.notebook.entries, &(not &1.valid?))
{:noreply, assign(socket, error: has_error?)}
end
@impl Phoenix.LiveComponent
def handle_event("save", _params, socket) do
consume_uploaded_entries(socket, :notebook, fn %{path: path}, _entry ->
content = File.read!(path)
send(self(), {:import_source, content, []})
{:ok, :ok}
end)
{:noreply, socket}
end
end