defmodule ElixirAiWeb.HomeLive do use ElixirAiWeb, :live_view import ElixirAiWeb.FormComponents alias ElixirAi.{ConversationManager, AiProvider} def mount(_params, _session, socket) do if connected?(socket) do Phoenix.PubSub.subscribe(ElixirAi.PubSub, "ai_providers") end {:ok, socket |> assign(conversations: ConversationManager.list_conversations()) |> assign(ai_providers: AiProvider.all()) |> assign(new_name: "") |> assign(error: nil)} end def render(assigns) do ~H"""

Conversations

<.input type="text" name="name" value={@new_name} label="Conversation Name" />
<%= if @error do %>

{@error}

<% end %>
<.live_component module={ElixirAiWeb.AiProvidersLive} id="ai-providers" />
""" end def handle_event("create", %{"name" => name, "ai_provider_id" => provider_id}, socket) do name = String.trim(name) cond do name == "" -> {:noreply, assign(socket, error: "Name can't be blank")} provider_id == "" -> {:noreply, assign(socket, error: "Please select an AI provider")} true -> case ConversationManager.create_conversation(name, provider_id) do {:ok, _pid} -> {:noreply, socket |> push_navigate(to: ~p"/chat/#{name}") |> assign(error: nil)} {:error, :already_exists} -> {:noreply, assign(socket, error: "A conversation with that name already exists")} _ -> {:noreply, assign(socket, error: "Failed to create conversation")} end end end def handle_info({:provider_added, _attrs}, socket) do {:noreply, assign(socket, ai_providers: AiProvider.all())} end end