defmodule Cairnloop.Web.SettingsLive do use Phoenix.LiveView def mount(_params, session, socket) do provider = Application.get_env(:cairnloop, :sla_policy_provider, Cairnloop.DefaultSLAPolicyProvider) socket = socket |> assign(:host_user_id, Map.get(session, "host_user_id")) |> assign(:provider, provider) |> assign(:priorities, [:low, :normal, :high, :urgent]) |> load_policies() {:ok, socket} end def handle_event("save_policy", %{"policy" => params}, socket) do priority_str = params["priority"] priority = if priority_str in ["low", "normal", "high", "urgent"], do: String.to_atom(priority_str), else: nil if priority do attrs = %{ target_first_response_minutes: String.to_integer(params["target_first_response_minutes"]), target_resolution_minutes: String.to_integer(params["target_resolution_minutes"]) } case socket.assigns.provider.set_policy(priority, attrs) do {:ok, _policy} -> {:noreply, socket |> put_flash(:info, "SLA policy updated successfully.") |> load_policies()} {:error, reason} -> {:noreply, put_flash(socket, :error, "Failed to update SLA policy: #{inspect(reason)}")} end else {:noreply, put_flash(socket, :error, "Invalid priority")} end rescue _e in ArgumentError -> {:noreply, put_flash(socket, :error, "Invalid input values.")} end defp load_policies(socket) do case socket.assigns.provider.get_active_policies() do {:ok, policies} -> assign(socket, :policies, policies) {:error, _reason} -> assign(socket, :policies, []) end end def render(assigns) do ~H""" <.live_component module={Cairnloop.Web.SearchModalComponent} id="search-modal" host_surface="settings" host_user_id={@host_user_id} current_path="/settings" />