defmodule MedicodeWeb.Components.SidebarComponent do @moduledoc """ Main layout header component """ use MedicodeWeb, :live_component use MedicodeWeb, :verified_routes import MedicodeWeb.CoreComponents alias Medicode.Transcriptions @impl Phoenix.LiveComponent def mount(socket) do socket = socket |> assign(:status, nil) |> assign(:upload_progress, 0) |> allow_upload(:audio, accept: ~w(.mp3), max_entries: 1, progress: &handle_upload_progress/3, auto_upload: true ) {:ok, socket} end @impl Phoenix.LiveComponent def update(assigns, socket) do if connected?(socket) do Phoenix.PubSub.subscribe(:medicode_pubsub, "medicode:#{assigns.current_user.id}") end socket = socket |> assign(:current_user, assigns.current_user) |> assign(:transcriptions, list_transcriptions(assigns.current_user)) {:ok, socket} end @impl Phoenix.LiveComponent def render(assigns) do ~H""" """ end @impl Phoenix.LiveComponent def handle_event("record_transcription", _params, socket) do socket = if socket.assigns.status == :streaming_audio do socket |> push_event("stop_audio_recording", %{}) |> assign(:status, nil) else {:ok, new_transcription} = Transcriptions.create_transcription(%{ user_id: socket.assigns.current_user.id, filename: "Untitled", status: :recording }) Medicode.TranscriptionSupervisor.start_transcription(new_transcription) transcriptions = list_transcriptions(socket.assigns.current_user) socket |> assign(:status, :streaming_audio) |> assign(:transcriptions, transcriptions) |> push_event("start_audio_recording", %{}) |> push_patch(to: ~p"/transcriptions/#{new_transcription.id}") end {:noreply, socket} end def handle_event("save", _params, socket) do if socket.assigns.uploads.audio.entries == [] do {:noreply, put_flash(socket, :error, "Please select an audio file")} else uploaded_files = consume_uploaded_entries(socket, :audio, fn %{path: path}, _entry -> dest = Path.join(System.tmp_dir(), Path.basename(path)) File.cp!(path, dest) {:ok, dest} end) {:ok, transcription} = Transcriptions.create_transcription(%{ user_id: socket.assigns.current_user.id, filename: Enum.at(uploaded_files, 0) }) Phoenix.PubSub.broadcast( :medicode_pubsub, "medicode:#{socket.assigns.current_user.id}", {:transcription_created, transcription.id} ) Transcriptions.transcribe_audio(transcription) {:noreply, push_navigate(socket, to: ~p"/transcriptions/#{transcription.id}")} end end def handle_event("validate", _params, socket) do {:noreply, socket} end defp list_transcriptions(user) do Transcriptions.list_transcriptions(user) end defp handle_upload_progress(:audio, entry, socket) do {:noreply, assign(socket, :upload_progress, entry.progress)} end end