bones73k/lib/bones73k_web/live/live_helpers.ex

70 lines
2 KiB
Elixir
Raw Normal View History

2021-02-24 07:49:39 -05:00
defmodule Bones73kWeb.LiveHelpers do
2020-09-14 10:17:47 -04:00
import Phoenix.LiveView
import Phoenix.LiveView.Helpers
2021-02-24 07:49:39 -05:00
alias Bones73k.Accounts
alias Bones73k.Accounts.User
alias Bones73kWeb.UserAuth
2020-09-14 12:22:25 -04:00
@doc """
Performs the {:noreply, socket} for a given socket.
This helps make the noreply pipeable
"""
def live_noreply(socket), do: {:noreply, socket}
@doc """
Performs the {:ok, socket} for a given socket.
This helps make the ok reply pipeable
"""
def live_okreply(socket), do: {:ok, socket}
2020-09-14 12:22:25 -04:00
@doc """
2021-02-24 07:49:39 -05:00
Renders a component inside the `Bones73kWeb.ModalComponent` component.
2020-09-14 12:22:25 -04:00
The rendered modal receives a `:return_to` option to properly update
the URL when the modal is closed.
## Examples
2021-02-24 07:49:39 -05:00
<%= live_modal @socket, Bones73kWeb.PropertyLive.FormComponent,
2020-09-14 12:22:25 -04:00
id: @property.id || :new,
action: @live_action,
property: @property,
return_to: Routes.property_index_path(@socket, :index) %>
"""
def live_modal(socket, component, opts) do
modal_opts = [id: :modal, component: component, opts: opts]
2021-03-03 16:52:26 -05:00
# dirty little workaround for elixir complaining about socket being unused
_socket = socket
2021-02-24 07:49:39 -05:00
live_component(socket, Bones73kWeb.ModalComponent, modal_opts)
2020-09-14 12:22:25 -04:00
end
2020-09-14 10:17:47 -04:00
@doc """
Loads default assigns for liveviews
"""
def assign_defaults(socket, session) do
2021-02-24 07:49:39 -05:00
Bones73kWeb.Endpoint.subscribe(UserAuth.pubsub_topic())
assign_current_user(socket, session)
2020-09-14 10:17:47 -04:00
end
# For liveviews, ensures current_user is in socket assigns.
def assign_current_user(socket, session) do
2020-09-14 10:17:47 -04:00
with user_token when not is_nil(user_token) <- session["user_token"],
%User{} = user <- Accounts.get_user_by_session_token(user_token) do
assign(socket, :current_user, user)
else
_ -> socket
end
2020-09-14 10:17:47 -04:00
end
@doc """
Copies current flash into new put_flash invocations.
To be used before a push_patch.
"""
def copy_flash(%{assigns: %{flash: flash}} = socket) do
Enum.reduce(flash, socket, fn {k, v}, acc ->
put_flash(acc, String.to_existing_atom(k), v)
end)
end
2020-09-14 10:17:47 -04:00
end