Current section

Files

Jump to
ex_ussd_simulator lib live page_live.ex
Raw

lib/live/page_live.ex

defmodule ExUssdSimulator.PageLive do
use ExUssdSimulator.Web, :live_view
require Logger
alias ExUssdSimulator.Config
@callback_url_unavailable_error "This is a Test prompt. We could not access your ExUssd-Endpoint. Please make sure that you accept ExUssd-Calls at "
@impl true
def render(assigns), do: ExUssdSimulator.PageView.render("show.html", assigns)
@impl true
def mount(_params, _session, socket) do
{:ok, new_session(socket)}
end
@impl true
def handle_event("button_clicked", %{"value" => value}, socket) do
{:noreply, update(socket, :ussd_code, &(&1 <> value))}
end
@impl true
def handle_event("reset", _params, socket) do
{:noreply, reset_ussd_code(socket)}
end
@impl true
def handle_event("end_session", _params, socket) do
{:noreply, new_session(socket)}
end
@impl true
def handle_event("call", _params, socket) do
{:noreply, execute(socket)}
end
defp new_session(socket) do
random_session_id = Enum.random(123_123_123..999_999_999)
socket
|> assign(session_id: random_session_id)
|> show_home_prompt()
end
defp execute(socket) do
result = execute_ussd_code(socket)
set_prompt(socket, result)
end
defp show_home_prompt(socket) do
socket
|> reset_ussd_code()
|> execute()
end
defp execute_ussd_code(%{assigns: %{ussd_code: ussd_code, session_id: session_id}}) do
callback_url = Config.callback_url()
service_code = Config.service_code()
headers = [{"Content-Type", "application/json"}]
body =
%{
text: ussd_code,
sessionId: session_id,
serviceCode: service_code
}
|> Jason.encode!()
case HTTPoison.post(callback_url, body, headers) do
{:ok, %{body: prompt}} ->
prompt
error ->
Logger.error(inspect(error))
@callback_url_unavailable_error <> callback_url
end
end
defp reset_ussd_code(socket) do
assign(socket, ussd_code: "")
end
defp set_prompt(socket, prompt) do
socket
|> assign(prompt: prompt)
|> reset_ussd_code()
end
end