Packages
mob
0.6.11
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.2
0.6.1
0.6.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.11
0.5.10
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.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
BEAM-on-device mobile framework for Elixir
Current section
Files
Jump to
Current section
Files
lib/mob/webview.ex
defmodule Mob.WebView do
@moduledoc """
Bidirectional JS bridge for the native WebView component.
Use `Mob.UI.webview/1` to embed the component, then call these functions
from `handle_info` to communicate with the page.
JS side — inject `window.mob` is injected automatically by the native layer:
// Send a message to Elixir
window.mob.send({ event: "clicked", id: 42 })
// Receive a message from Elixir
window.mob.onMessage(function(data) { console.log(data) })
Elixir side:
def handle_info({:webview, :message, %{"event" => "clicked", "id" => id}}, socket) do
{:noreply, socket}
end
def handle_info({:webview, :blocked, url}, socket) do
# A navigation attempt was blocked by the allow: whitelist
{:noreply, socket}
end
"""
@doc """
Evaluate arbitrary JavaScript in the current WebView and return the result
asynchronously via `handle_info({:webview, :eval_result, result}, socket)`.
"""
@spec eval_js(Phoenix.LiveView.Socket.t(), String.t()) :: Phoenix.LiveView.Socket.t()
def eval_js(socket, code) when is_binary(code) do
:mob_nif.webview_eval_js(code)
socket
end
@doc """
Push a message from Elixir into the WebView page. Calls `window.mob._dispatch(json)`
in JS, which delivers the data to all `window.mob.onMessage` handlers.
"""
@spec post_message(Phoenix.LiveView.Socket.t(), term()) :: Phoenix.LiveView.Socket.t()
def post_message(socket, data) do
json = :json.encode(data)
:mob_nif.webview_post_message(json)
socket
end
end