First, you need to allow the WebSocket to display the URI. You can do it by editing your endpoint.ex file:
socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [:uri, session: @session_options]]
In the example above, we added :uri the connect_info websocket option.
Now, we can create a mount hook to get access to the host value. In the example below, we'll add the host to our socket assigns, so we can use it in our LiveView with socket.assigns.host:
# host_plug.ex
def on_mount(:add_host, params, _session, socket) do
%URI{host: host} = Phoenix.LiveView.get_connect_info(socket, :uri)
socket = Phoenix.Component.assign(socket, host: host)
{:cont, socket}
end
Now, you need to add this mount hook to our live_session in our router.ex file:
scope "/", MyAppWeb do
pipe_through [:browser]
live_session :my_routes,
on_mount: [{MyAppWeb.HostHook, :add_host}] do
live "/", HomeLive
end
end
That's it! Now we can get the host in our LiveView by using socket.assigns.host.
Note: If you're getting an error like this: ** (MatchError) no match of right hand side value: nil, it might mean that you forgot to add :uri to your connect_info as I mentioned on the first step.
Top comments (0)