Packages
livebook
0.9.3
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/open_live/url_component.ex
defmodule LivebookWeb.OpenLive.UrlComponent do
use LivebookWeb, :live_component
alias Livebook.{Utils, Notebook}
@impl true
def mount(socket) do
{:ok, assign(socket, url: "", error_message: nil)}
end
@impl true
def update(assigns, socket) do
if url = assigns[:url] do
{:ok, do_import(socket, url)}
else
{:ok, socket}
end
end
@impl true
def render(assigns) do
~H"""
<div class="flex-col space-y-5">
<div :if={@error_message} class="error-box">
<%= @error_message %>
</div>
<p class="text-gray-700" id="import-from-url">
Paste the URL to a .livemd file, to a GitHub file, or to a Gist.
</p>
<.form
:let={f}
for={%{"url" => @url}}
as={:data}
phx-submit="import"
phx-change="validate"
phx-target={@myself}
autocomplete="off"
>
<.text_field
field={f[:url]}
label="Notebook URL"
autofocus
aria-labelledby="import-from-url"
spellcheck="false"
/>
<button
class="mt-5 button-base button-blue"
type="submit"
disabled={not Utils.valid_url?(@url)}
>
Import
</button>
</.form>
</div>
"""
end
@impl true
def handle_event("validate", %{"data" => %{"url" => url}}, socket) do
{:noreply, assign(socket, url: url)}
end
def handle_event("import", %{"data" => %{"url" => url}}, socket) do
{:noreply, do_import(socket, url)}
end
defp do_import(socket, url) do
origin = Notebook.ContentLoader.url_to_location(url)
origin
|> Notebook.ContentLoader.fetch_content_from_location()
|> case do
{:ok, content} ->
send(self(), {:import_source, content, [origin: origin]})
socket
{:error, message} ->
assign(socket, url: url, error_message: Utils.upcase_first(message))
end
end
end