defmodule Sorcery.LiveHelper do
defmacro __using__([client: client, presence: presence]) do
quote do
def assign_portals(socket) do
portals = Sorcery.Storage.GenserverAdapter.GetPresence.my_portals(unquote(client), unquote(presence), %{})
state = unquote(client).get_state(%{})
assign_portals(socket, portals, state)
end
def assign_portals(socket, my_portals, state) do
qm = Sorcery.Storage.GenserverAdapter.QueryMeta.new(state)
portal_meta = []
portals = %{}
{portal_meta, portals} = Enum.reduce(my_portals, {portal_meta, portals}, fn portal, {portal_meta, portals} ->
tk = Map.get(portal, :tk)
assigns_key = Map.get(portal, :assigns_key, tk)
db = Sorcery.Storage.GenserverAdapter.Query.solve_portal(portal, qm)
{
[{assigns_key, portal} | portal_meta],
Map.put(portals, assigns_key, Map.get(db, tk, %{}))
}
end)
Sorcery.PortalMonitor.monitor(self(), __MODULE__)
socket
|> assign(:portals, portals)
|> assign(:portal_meta, portal_meta)
end
def sorcery_unmount(pids) do
unquote(client).unmount(pids)
end
def handle_info("assign_portals", socket) do
portals = Sorcery.Storage.GenserverAdapter.GetPresence.my_portals(unquote(client), unquote(presence), %{})
state = unquote(client).get_state(%{})
{:noreply, assign_portals(socket, portals, state)}
end
def src_push!(src) do
unquote(client).src_push!(src, %{})
end
end
end
end