defmodule ElixirAiWeb.AiProvidersLive do use ElixirAiWeb, :live_component import ElixirAiWeb.FormComponents alias ElixirAi.AiProvider def update(assigns, socket) do {:ok, socket |> assign(assigns) |> assign_new(:show_form, fn -> false end) |> assign_new(:confirm_delete_id, fn -> nil end) |> assign_new( :form_data, fn -> %{ "name" => "", "model_name" => "", "api_token" => "", "completions_url" => "" } end ) |> assign_new(:error, fn -> nil end)} end def render(assigns) do ~H"""

AI Providers

<%= if @show_form do %>
<.input type="text" name="name" value={@form_data["name"]} label="Provider Name" /> <.input type="text" name="model_name" value={@form_data["model_name"]} label="Model Name" /> <.input type="password" name="api_token" value={@form_data["api_token"]} label="API Token" /> <.input type="text" name="completions_url" value={@form_data["completions_url"]} label="Completions URL" /> r
<% end %> <%= if @error do %>

{@error}

<% end %> <%= if @confirm_delete_id do %> <.modal>

Delete Provider

Are you sure you want to delete this provider? This action cannot be undone.

<% end %>
""" end def handle_event("toggle_form", _params, socket) do {:noreply, assign(socket, show_form: !socket.assigns.show_form, error: nil)} end def handle_event("delete_provider", %{"id" => id}, socket) do {:noreply, assign(socket, confirm_delete_id: id)} end def handle_event("cancel_delete", _params, socket) do {:noreply, assign(socket, confirm_delete_id: nil)} end def handle_event("confirm_delete", _params, socket) do case AiProvider.delete(socket.assigns.confirm_delete_id) do :ok -> {:noreply, assign(socket, confirm_delete_id: nil)} _ -> {:noreply, assign(socket, confirm_delete_id: nil, error: "Failed to delete provider")} end end def handle_event("create_provider", params, socket) do name = String.trim(params["name"]) model_name = String.trim(params["model_name"]) api_token = String.trim(params["api_token"]) completions_url = String.trim(params["completions_url"]) cond do name == "" -> {:noreply, assign(socket, error: "Provider name can't be blank")} model_name == "" -> {:noreply, assign(socket, error: "Model name can't be blank")} api_token == "" -> {:noreply, assign(socket, error: "API token can't be blank")} completions_url == "" -> {:noreply, assign(socket, error: "Completions URL can't be blank")} true -> attrs = %{ name: name, model_name: model_name, api_token: api_token, completions_url: completions_url } case AiProvider.create(attrs) do :ok -> {:noreply, socket |> assign(show_form: false) |> assign( form_data: %{ "name" => "", "model_name" => "", "api_token" => "", "completions_url" => "" } ) |> assign(error: nil)} _ -> {:noreply, assign(socket, error: "Failed to create provider")} end end end end