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

Conversations

<.conversation_list conversations={@conversations} /> <.create_conversation_form new_name={@new_name} ai_providers={@ai_providers} /> <%= if @error do %>

{@error}

<% end %>
""" end defp conversation_list(assigns) do ~H""" """ end defp create_conversation_form(assigns) do ~H"""
<.input type="text" name="name" value={@new_name} label="Conversation Name" />
""" 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(:load_data, socket) do conversations = ConversationManager.list_conversations() Logger.debug( "Conversations: #{inspect(conversations, limit: :infinity, printable_limit: :infinity)}" ) ai_providers = AiProvider.all() Logger.debug( "AI Providers: #{inspect(ai_providers, limit: :infinity, printable_limit: :infinity)}" ) {:noreply, socket |> assign(conversations: conversations) |> assign(ai_providers: ai_providers)} end def handle_info({:provider_added, _attrs}, socket) do {:noreply, assign(socket, ai_providers: AiProvider.all())} end end