Aggiedit/lib/aggiedit_web/live/live_helpers.ex
2022-04-06 14:41:19 -06:00

73 lines
1.9 KiB
Elixir

defmodule AggieditWeb.LiveHelpers do
import Phoenix.LiveView
import Phoenix.LiveView.Helpers
alias Phoenix.LiveView.JS
alias Aggiedit.Accounts
alias Aggiedit.Accounts.User
@doc """
Renders a live component inside a modal.
The rendered modal receives a `:return_to` option to properly update
the URL when the modal is closed.
## Examples
<.modal return_to={Routes.post_index_path(@socket, :index)}>
<.live_component
module={AggieditWeb.PostLive.FormComponent}
id={@post.id || :new}
title={@page_title}
action={@live_action}
return_to={Routes.post_index_path(@socket, :index)}
post: @post
/>
</.modal>
"""
def modal(assigns) do
assigns = assign_new(assigns, :return_to, fn -> nil end)
~H"""
<div id="modal" class="phx-modal fade-in" phx-remove={hide_modal()}>
<div
id="modal-content"
class="phx-modal-content fade-in-scale"
phx-click-away={JS.dispatch("click", to: "#close")}
phx-window-keydown={JS.dispatch("click", to: "#close")}
phx-key="escape"
>
<%= if @return_to do %>
<%= live_patch "✖",
to: @return_to,
id: "close",
class: "phx-modal-close",
phx_click: hide_modal()
%>
<% else %>
<a id="close" href="#" class="phx-modal-close" phx-click={hide_modal()}>✖</a>
<% end %>
<%= render_slot(@inner_block) %>
</div>
</div>
"""
end
defp hide_modal(js \\ %JS{}) do
js
|> JS.hide(to: "#modal", transition: "fade-out")
|> JS.hide(to: "#modal-content", transition: "fade-out-scale")
end
def assign_socket_user(session, socket) do
with token when not is_nil(token) <- session["user_token"],
current_user=%User{} = Accounts.get_user_by_session_token(token) do
assign(socket, :current_user, current_user)
else
_ -> socket
end
end
end