defmodule LivebookWeb.ExploreLive do use LivebookWeb, :live_view import LivebookWeb.UserHelpers import LivebookWeb.SessionHelpers alias Livebook.Notebook.Explore @impl true def mount(_params, %{"current_user_id" => current_user_id}, socket) do if connected?(socket) do Phoenix.PubSub.subscribe(Livebook.PubSub, "users:#{current_user_id}") end current_user = build_current_user(current_user_id, socket) [lead_notebook_info | notebook_infos] = Explore.notebook_infos() {:ok, assign(socket, current_user: current_user, lead_notebook_info: lead_notebook_info, notebook_infos: notebook_infos )} end @impl true def render(assigns) do ~L"""
<%= live_component @socket, LivebookWeb.SidebarComponent, id: :sidebar, items: [ %{type: :logo}, %{type: :break}, %{type: :user, current_user: @current_user, path: Routes.explore_path(@socket, :user)} ] %>
<%= live_patch to: Routes.home_path(@socket, :page), class: "hidden md:block absolute top-[50%] left-[-12px] transform -translate-y-1/2 -translate-x-full" do %> <%= remix_icon("arrow-left-line", class: "text-2xl align-middle") %> <% end %>

Explore

Check out a number of examples showcasing various parts of the Elixir ecosystem. Click on any notebook you like and start playing around with it!

<%= @lead_notebook_info.title %>

<%= @lead_notebook_info.description %>

<%= live_patch "Let's go", to: Routes.explore_path(@socket, :notebook, @lead_notebook_info.slug), class: "button button-blue" %>
<%= for {info, idx} <- Enum.with_index(@notebook_infos) do %> <%= live_component @socket, LivebookWeb.NotebookCardComponent, id: "notebook-card-#{idx}", notebook_info: info %> <% end %>
<%= if @live_action == :user do %> <%= live_modal @socket, LivebookWeb.UserComponent, id: :user_modal, modal_class: "w-full max-w-sm", user: @current_user, return_to: Routes.explore_path(@socket, :page) %> <% end %> """ end @impl true def handle_params(%{"slug" => slug}, _url, socket) do notebook = Explore.notebook_by_slug!(slug) {:noreply, create_session(socket, notebook: notebook)} end def handle_params(_params, _url, socket), do: {:noreply, socket} @impl true def handle_info( {:user_change, %{id: id} = user}, %{assigns: %{current_user: %{id: id}}} = socket ) do {:noreply, assign(socket, :current_user, user)} end end