Current section

Files

Jump to
flashy lib flashy.ex
Raw

lib/flashy.ex

defmodule Flashy do
@moduledoc false
alias Phoenix.{Controller, LiveView, LiveView.Socket}
alias Plug.Conn
@doc """
Put notification to LiveView flash.
## Options
* `:key` - The optional notification flash key.
Defaults to a random number.
Only use this if you need to replace a notification instead of adding a new one.
"""
@spec put_notification(Conn.t() | Socket.t(), Flashy.Protocol.t(), Keyword.t()) ::
Conn.t() | Socket.t()
def put_notification(socket_or_conn, notification, opts \\ [])
def put_notification(%Socket{} = socket, notification, opts) do
key = calculate_key(opts[:key])
LiveView.put_flash(socket, key, notification)
end
def put_notification(%Conn{} = conn, notification, opts) do
key = calculate_key(opts[:key])
Controller.put_flash(conn, key, notification)
end
@doc """
Send a notification to the parent LiveView.
## Options
* `:key` - The optional notification flash key.
Defaults to a random number.
Only use this if you need to replace a notification instead of adding a new one.
* `:pid` - The optional pid of the target LiveView.
Defaults to `self/0`.
"""
@spec send_notification(Socket.t(), Flashy.Protocol.t(), Keyword.t()) :: Socket.t()
def send_notification(%Socket{} = socket, notification, opts \\ []) do
pid = opts[:pid] || self()
send(pid, {:flashy_notification, notification, opts})
socket
end
defp calculate_key(nil) do
:erlang.unique_integer([:positive, :monotonic]) |> to_string() |> then(&"flashy-#{&1}")
end
defp calculate_key(key) when is_binary(key), do: "flashy-custom-#{key}"
end