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.

<.live_file_input upload={@uploads.notebook} class="hidden" aria-labelledby="import-from-file" />
<%= if @uploads.notebook.entries == [] do %> Drop your notebook here <% else %>
<%= file.client_name %>
<% end %>
<%= if @error do %>
You can only upload files with .livemd extension.
<% end %>
""" 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