forked from shibao/cannery
		
	add liveview helpers
This commit is contained in:
		@@ -83,6 +83,7 @@ defmodule LokalWeb do
 | 
			
		||||
 | 
			
		||||
      # Import LiveView helpers (live_render, live_component, live_patch, etc)
 | 
			
		||||
      import Phoenix.LiveView.Helpers
 | 
			
		||||
      import LokalWeb.LiveHelpers
 | 
			
		||||
 | 
			
		||||
      # Import basic rendering functionality (render, render_layout, etc)
 | 
			
		||||
      import Phoenix.View
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ defmodule LokalWeb.UserSocket do
 | 
			
		||||
  # verification, you can put default assigns into
 | 
			
		||||
  # the socket that will be set for all channels, ie
 | 
			
		||||
  #
 | 
			
		||||
  #     {:ok, assign(socket, :user_id, verified_user_id)}
 | 
			
		||||
  #     {:ok, socket |> assign(:user_id, verified_user_id)}
 | 
			
		||||
  #
 | 
			
		||||
  # To deny connection, return `:error`.
 | 
			
		||||
  #
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ defmodule LokalWeb.Live.Component.Topbar do
 | 
			
		||||
            </form>
 | 
			
		||||
 | 
			
		||||
            <%# user settings %>
 | 
			
		||||
            <%= if assigns |> Map.has_key?(:current_user) do %>
 | 
			
		||||
            <%= if @current_user do %>
 | 
			
		||||
              <li>
 | 
			
		||||
                <%= @current_user.email %></li>
 | 
			
		||||
              <li>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								lib/lokal_web/live/live_helpers.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								lib/lokal_web/live/live_helpers.ex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
defmodule LokalWeb.LiveHelpers do
 | 
			
		||||
  import Phoenix.LiveView.Helpers
 | 
			
		||||
  import Phoenix.LiveView, only: [assign_new: 3]
 | 
			
		||||
  alias Lokal.{Accounts}
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Renders a component inside the `LokalWeb.ModalComponent` component.
 | 
			
		||||
 | 
			
		||||
  The rendered modal receives a `:return_to` option to properly update
 | 
			
		||||
  the URL when the modal is closed.
 | 
			
		||||
 | 
			
		||||
  ## Examples
 | 
			
		||||
 | 
			
		||||
      <%= live_modal LokalWeb.TagLive.FormComponent,
 | 
			
		||||
        id: @tag.id || :new,
 | 
			
		||||
        action: @live_action,
 | 
			
		||||
        tag: @tag,
 | 
			
		||||
        return_to: Routes.tag_index_path(@socket, :index) %>
 | 
			
		||||
  """
 | 
			
		||||
  def live_modal(component, opts) do
 | 
			
		||||
    path = Keyword.fetch!(opts, :return_to)
 | 
			
		||||
    modal_opts = [id: :modal, return_to: path, component: component, opts: opts]
 | 
			
		||||
    live_component(LokalWeb.ModalComponent, modal_opts)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def assign_defaults(socket, %{"user_token" => user_token} = _session) do
 | 
			
		||||
    socket
 | 
			
		||||
    |> assign_new(:current_user, fn ->
 | 
			
		||||
      Accounts.get_user_by_session_token(user_token)
 | 
			
		||||
    end)
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def assign_defaults(socket, _session) do
 | 
			
		||||
    socket
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										26
									
								
								lib/lokal_web/live/modal_component.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib/lokal_web/live/modal_component.ex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
defmodule LokalWeb.ModalComponent do
 | 
			
		||||
  use LokalWeb, :live_component
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def render(assigns) do
 | 
			
		||||
    ~L"""
 | 
			
		||||
    <div id="<%= @id %>" class="phx-modal"
 | 
			
		||||
      phx-capture-click="close"
 | 
			
		||||
      phx-window-keydown="close"
 | 
			
		||||
      phx-key="escape"
 | 
			
		||||
      phx-target="#<%= @id %>"
 | 
			
		||||
      phx-page-loading>
 | 
			
		||||
 | 
			
		||||
      <div class="phx-modal-content">
 | 
			
		||||
        <%= live_patch raw("×"), to: @return_to, class: "phx-modal-close" %>
 | 
			
		||||
        <%= live_component @socket, @component, @opts %>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def handle_event("close", _, socket) do
 | 
			
		||||
    {:noreply, push_patch(socket, to: socket.assigns.return_to)}
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -2,20 +2,20 @@ defmodule LokalWeb.PageLive do
 | 
			
		||||
  use LokalWeb, :live_view
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def mount(_params, _session, socket) do
 | 
			
		||||
    {:ok, assign(socket, query: "", results: %{})}
 | 
			
		||||
  def mount(_params, session, socket) do
 | 
			
		||||
    {:ok, socket |> assign_defaults(session) |> assign(query: "", results: %{})}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def handle_event("suggest", %{"q" => query}, socket) do
 | 
			
		||||
    {:noreply, assign(socket, results: search(query), query: query)}
 | 
			
		||||
    {:noreply, socket |> assign(results: search(query), query: query)}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def handle_event("search", %{"q" => query}, socket) do
 | 
			
		||||
    case search(query) do
 | 
			
		||||
      %{^query => vsn} ->
 | 
			
		||||
        {:noreply, redirect(socket, external: "https://hexdocs.pm/#{query}/#{vsn}")}
 | 
			
		||||
        {:noreply, socket |> redirect(external: "https://hexdocs.pm/#{query}/#{vsn}")}
 | 
			
		||||
 | 
			
		||||
      _ ->
 | 
			
		||||
        {:noreply,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<main role="main" class="container min-w-full min-h-full">
 | 
			
		||||
  <%= live_component LokalWeb.Live.Component.Topbar %>
 | 
			
		||||
  <%= live_component LokalWeb.Live.Component.Topbar, current_user: assigns[:current_user] %>
 | 
			
		||||
 | 
			
		||||
  <%= @inner_content %>
 | 
			
		||||
</main>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user