defmodule Phoenix.ExUssd.PageLive do use Phoenix.ExUssd.Web, :live_view @impl true def render(assigns) do ~L"""
<%= if @show_modal do %>
<% end %>

choose api parameter phone number

<%= for {phone_number, count} <- Enum.with_index(@phone_numbers) do %> <%= if phone_number == @phone_number do %> <% else %> <% end %> <% end %>
<%= Phoenix.HTML.Format.text_to_html(@dialer) %>
<%= for value <- 1..3 do %> <% end %>
<%= for value <- 4..6 do %> <% end %>
<%= for value <- 7..9 do %> <% end %>
<%= for value <- ["*", 0, "\#"] do %> <% end %>
""" end @impl true def mount(_params, %{"menu" => menu, "phone_numbers" => phone_numbers}, socket) do phone_number = List.first(phone_numbers) {:ok, assign(socket, menu: menu, dialer: "", phone_number: phone_number, phone_numbers: phone_numbers, show_modal: false, user_input: "", session_id: nil, menu_string: "", should_close: false )} end @impl true def handle_event("change_phone_number", %{"radio" => phone_number}, socket) do {:noreply, assign(socket, phone_number: phone_number)} end @impl true def handle_event("capture_keyup", %{"key" => "Enter"}, socket) do send(self(), {:get_menu, %{user_input: socket.assigns.user_input}}) {:noreply, assign(socket, :user_input, "")} end @impl true def handle_event("capture_keyup", _, socket) do {:noreply, socket} end @impl true def handle_event("user_input", %{"user_input" => user_input}, socket) do {:noreply, assign(socket, user_input: user_input)} end @impl true def handle_event("button_clicked", %{"val" => value}, socket) do {:noreply, update(socket, :dialer, &(&1 <> value))} end @impl true def handle_event("cancel", _, socket) do send(self(), {:end_session, %{session_id: socket.assigns.session_id}}) {:noreply, assign(socket, show_modal: false, user_input: "", session_id: nil, dialer: "" )} end @impl true def handle_event("undo_last", _params, socket) do {:noreply, update(socket, :dialer, fn code -> code |> String.split_at(-1) |> elem(0) end)} end @impl true def handle_event("clear_dialer", _params, socket) do {:noreply, assign(socket, :dialer, "")} end @impl true def handle_event("call", _params, socket) do session_id = ExUssd.Utils.generate_id() payload = process_dialer(socket.assigns.dialer) |> Map.merge(%{session_id: session_id, start: true}) send(self(), {:get_menu, payload}) socket = assign(socket, Map.drop(payload, [:user_input])) {:noreply, update(socket, :show_modal, &(!&1))} end @impl true def handle_event("send", _, socket) do send(self(), {:get_menu, %{user_input: socket.assigns.user_input}}) {:noreply, assign(socket, :user_input, "")} end @impl true def handle_info({:end_session, %{session_id: session_id}}, socket) do ExUssd.end_session(session_id: session_id) {:noreply, socket} end @impl true def handle_info( {:get_menu, %{user_input: user_input}}, %{assigns: %{session_id: session_id}} = socket ) when user_input == "" and not is_nil(session_id) do {:noreply, assign(socket, menu_string: "Input required, Try again", should_close: true)} end @impl true def handle_info({:get_menu, payload}, socket) do api_parameters = %{ "service_code" => Map.get(payload, :dialer, socket.assigns.dialer), "session_id" => Map.get(payload, :session_id, socket.assigns.session_id), "text" => Map.get(payload, :user_input, socket.assigns.user_input), "phone_number" => socket.assigns.phone_number } {:ok, %{menu_string: menu_string, should_close: should_close}} = ExUssd.goto(menu: socket.assigns.menu, api_parameters: api_parameters) socket = socket |> assign(menu_string: menu_string, should_close: should_close) {:noreply, socket} end defp process_dialer(""), do: %{dialer: "*555#", user_input: "*555#"} defp process_dialer(dialer) do processed_dialer = dialer |> String.replace("#", "") |> String.split("*") if length(processed_dialer) > 2, do: %{dialer: get_service_code(processed_dialer), user_input: dialer}, else: %{dialer: dialer, user_input: dialer} end def get_service_code(processed_dialer) do dialer = tl(processed_dialer) |> List.first() "*#{dialer}#" end end