Packages
ash_phoenix
2.3.1
2.3.24
2.3.23
2.3.22
2.3.21
2.3.20
2.3.19
2.3.18
2.3.17
2.3.16
2.3.15
2.3.14
2.3.13
2.3.12
2.3.11
2.3.10
2.3.9
2.3.8
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.26
2.1.25
2.1.24
2.1.23
2.1.22
2.1.21
2.1.20
2.1.19
2.1.18
2.1.17
2.1.16
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.8
2.0.0-rc.7
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.3.7
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.26
1.2.25
1.2.24
1.2.23
1.2.22
1.2.21
1.2.20
1.2.19
1.2.18
1.2.17
1.2.16
1.2.15
1.2.14
1.2.13
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.1.0-rc.3
1.1.0-rc.2
1.1.0-rc.1
1.1.0-rc.0
1.0.0-rc.1
1.0.0-rc.0
1.0.0-pre.2
1.0.0-pre.1
1.0.0-pre.0
0.7.7
0.7.6-rc.0
0.7.5
0.7.4
0.7.3
0.7.2-rc.2
0.7.2-rc.1
0.7.2-rc.0
0.7.1
0.7.0
0.6.0-rc.7
0.6.0-rc.6
0.6.0-rc.5
0.6.0-rc.4
0.6.0-rc.3
0.6.0-rc.2
0.6.0-rc.1
0.6.0-rc.0
0.5.19-rc.2
0.5.19-rc.1
0.5.19-rc.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.24
0.4.23
0.4.23-rc.1
0.4.23-rc.0
0.4.22-rc2
0.4.22-rc1
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Utilities for integrating Ash and Phoenix
Current section
Files
Jump to
Current section
Files
lib/ash_phoenix/live_view/subdomain_hook.ex
defmodule AshPhoenix.LiveView.SubdomainHook do
@hook_options [
assign: [
type: :atom,
doc: "The key to use when assigning the current tenant",
default: :current_tenant
],
handle_subdomain: [
type: :mfa,
doc:
"An mfa to call with the socket and a subdomain value. Can be used to do something like fetch the current user given the tenant.
Must return either `{:cont, socket}`, `{:cont, socket, opts} or `{:halt, socket}`."
]
]
@moduledoc """
This is a basic hook that loads the current tenant assign from a given
value set on subdomain.
Options:
#{Spark.Options.docs(@hook_options)}
To use the hook, you can do one of the following:
```elixir
live_session :foo, on_mount: [
AshPhoenix.LiveView.SubdomainHook,
]
```
This will assign the tenant's subdomain value to `:current_tenant` key by default.
If you want to specify the assign key
```elixir
live_session :foo, on_mount: [
{AshPhoenix.LiveView.SubdomainHook, [assign: :different_assign_key}]
]
```
You can also provide `handle_subdomain` module, function, arguments tuple
that will be run after the tenant is assigned.
```elixir
live_session :foo, on_mount: [
{AshPhoenix.LiveView.SubdomainHook, [handle_subdomain: {FooApp.SubdomainHandler, :handle_subdomain, [:bar]}]
]
```
This can be any module, function, and list of arguments as it uses Elixir's [apply/3](https://hexdocs.pm/elixir/1.18.3/Kernel.html#apply/3).
The socket and tenant will be the first two arguments.
The function return must match Phoenix LiveView's [on_mount/1](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#on_mount/1)
```elixir
defmodule FooApp.SubdomainHandler do
def handle_subdomain(socket, tenant, :bar) do
# your logic here
{:cont, socket}
end
end
```
"""
import Phoenix.LiveView
import Phoenix.Component, only: [assign: 3]
def on_mount(opts, _params, _session, socket) when is_list(opts) do
opts = Spark.Options.validate!(opts, @hook_options)
socket
|> assign_tenant(opts)
|> call_handle_subdomain(opts)
end
def on_mount(_action, params, session, socket) do
on_mount([], params, session, socket)
end
defp assign_tenant(socket, opts) do
attach_hook(socket, :set_tenant, :handle_params, fn
_params, url, socket ->
subdomain = AshPhoenix.Helpers.get_subdomain(socket, url)
{:cont, assign(socket, opts[:assign], subdomain)}
end)
end
defp call_handle_subdomain(socket, opts) do
case opts[:handle_subdomain] do
{m, f, a} ->
apply(m, f, [socket, socket.assigns[opts[:assign]] | a])
_ ->
{:cont, socket}
end
end
end