defmodule LivebookWeb.OpenLive.UploadComponent do use LivebookWeb, :live_component @impl true def mount(socket) do {:ok, socket |> assign(:error, false) |> allow_upload(:file, accept: ~w(.livemd), max_entries: 1)} end @impl true def render(assigns) do ~H"""

Drag and drop a .livemd file below to import it.

<.file_drop_input upload={@uploads.file} label="Notebook" on_clear={JS.push("clear_file", target: @myself)} />
<%= if @error do %>
You can only upload files with .livemd extension.
<% end %>
""" end @impl true def handle_event("validate", _params, socket) do has_error? = Enum.any?(socket.assigns.uploads.file.entries, &(not &1.valid?)) {:noreply, assign(socket, error: has_error?)} end def handle_event("clear_file", %{"ref" => ref}, socket) do {:noreply, socket |> cancel_upload(:file, ref) |> assign(error: false)} end def handle_event("save", _params, socket) do consume_uploaded_entries(socket, :file, fn %{path: path}, _entry -> content = File.read!(path) send(self(), {:import_source, content, []}) {:ok, :ok} end) {:noreply, socket} end end