defmodule Phoenix.LiveEditableView do
@moduledoc """
View-Level LiveEditable Utiltities
defmodule MyView do
use MyAppWeb, :live_view
use Phoenix.LiveEditableView
...
end
Layered configuration:
- hardcoded default -> config -> view -> tag -> handler
- values can be overridden
"""
# ----- hook -----
import Phoenix.LiveEditable.ViewCache
def on_mount(:default, _params, _session, socket) do
# setup a ViewCache and load config data
vc_new(socket)
vc_putval(socket, :ple_appname, appname(socket))
vc_putval(socket, :ple_viewpid, self())
vc_merge(socket, ple_config_map(socket))
{:cont, socket}
end
# ----- hook helpers -----
defp appname(socket) do
socket.endpoint
|> Atom.to_string()
|> String.replace("Web.Endpoint", "")
|> String.replace("Elixir.", "")
|> Macro.underscore()
|> String.to_atom()
end
defp ple_config_map(socket) do
endpoint = socket.endpoint
socket
|> appname()
|> Application.fetch_env(endpoint)
|> elem(1)
|> Keyword.get(:live_editable)
|> Enum.reject(fn({k,_}) -> ple_invalid_key?(k) end)
|> Enum.into(%{})
end
defp ple_invalid_key?(key) do
%Phoenix.LiveEditable.ViewCache{}
|> Map.from_struct()
|> Map.keys()
|> Enum.all?(&(key == &1))
end
# ----- use macro -----
defmacro __using__(_opts) do
quote do
on_mount Phoenix.LiveEditableView
import Phoenix.LiveEditable.Helpers
end
end
end