forked from shibao/cannery
		
	add liveview helpers
This commit is contained in:
		@@ -45,7 +45,7 @@ let socket = new Socket("/socket", {params: {token: window.userToken}})
 | 
				
			|||||||
//       # max_age: 1209600 is equivalent to two weeks in seconds
 | 
					//       # max_age: 1209600 is equivalent to two weeks in seconds
 | 
				
			||||||
//       case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do
 | 
					//       case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do
 | 
				
			||||||
//         {:ok, user_id} ->
 | 
					//         {:ok, user_id} ->
 | 
				
			||||||
//           {:ok, assign(socket, :user, user_id)}
 | 
					//           {:ok, socket |> assign(:user, user_id)}
 | 
				
			||||||
//         {:error, reason} ->
 | 
					//         {:error, reason} ->
 | 
				
			||||||
//           :error
 | 
					//           :error
 | 
				
			||||||
//       end
 | 
					//       end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,6 +83,7 @@ defmodule LokalWeb do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      # Import LiveView helpers (live_render, live_component, live_patch, etc)
 | 
					      # Import LiveView helpers (live_render, live_component, live_patch, etc)
 | 
				
			||||||
      import Phoenix.LiveView.Helpers
 | 
					      import Phoenix.LiveView.Helpers
 | 
				
			||||||
 | 
					      import LokalWeb.LiveHelpers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Import basic rendering functionality (render, render_layout, etc)
 | 
					      # Import basic rendering functionality (render, render_layout, etc)
 | 
				
			||||||
      import Phoenix.View
 | 
					      import Phoenix.View
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ defmodule LokalWeb.UserSocket do
 | 
				
			|||||||
  # verification, you can put default assigns into
 | 
					  # verification, you can put default assigns into
 | 
				
			||||||
  # the socket that will be set for all channels, ie
 | 
					  # 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`.
 | 
					  # To deny connection, return `:error`.
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,7 @@ defmodule LokalWeb.Live.Component.Topbar do
 | 
				
			|||||||
            </form>
 | 
					            </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <%# user settings %>
 | 
					            <%# user settings %>
 | 
				
			||||||
            <%= if assigns |> Map.has_key?(:current_user) do %>
 | 
					            <%= if @current_user do %>
 | 
				
			||||||
              <li>
 | 
					              <li>
 | 
				
			||||||
                <%= @current_user.email %></li>
 | 
					                <%= @current_user.email %></li>
 | 
				
			||||||
              <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
 | 
					  use LokalWeb, :live_view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @impl true
 | 
					  @impl true
 | 
				
			||||||
  def mount(_params, _session, socket) do
 | 
					  def mount(_params, session, socket) do
 | 
				
			||||||
    {:ok, assign(socket, query: "", results: %{})}
 | 
					    {:ok, socket |> assign_defaults(session) |> assign(query: "", results: %{})}
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @impl true
 | 
					  @impl true
 | 
				
			||||||
  def handle_event("suggest", %{"q" => query}, socket) do
 | 
					  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
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @impl true
 | 
					  @impl true
 | 
				
			||||||
  def handle_event("search", %{"q" => query}, socket) do
 | 
					  def handle_event("search", %{"q" => query}, socket) do
 | 
				
			||||||
    case search(query) do
 | 
					    case search(query) do
 | 
				
			||||||
      %{^query => vsn} ->
 | 
					      %{^query => vsn} ->
 | 
				
			||||||
        {:noreply, redirect(socket, external: "https://hexdocs.pm/#{query}/#{vsn}")}
 | 
					        {:noreply, socket |> redirect(external: "https://hexdocs.pm/#{query}/#{vsn}")}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      _ ->
 | 
					      _ ->
 | 
				
			||||||
        {:noreply,
 | 
					        {:noreply,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
<main role="main" class="container min-w-full min-h-full">
 | 
					<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 %>
 | 
					  <%= @inner_content %>
 | 
				
			||||||
</main>
 | 
					</main>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user