defmodule LivebookWeb.Output.AudioInputComponent do use LivebookWeb, :live_component @impl true def mount(socket) do {:ok, socket |> assign( endianness: System.endianness(), value: nil, audio_url: nil, decoding?: false ) |> allow_upload(:file, accept: :any, max_entries: 1, max_file_size: 100_000_000_000, progress: &handle_progress/3, auto_upload: true )} end @impl true def update(assigns, socket) do {value, assigns} = Map.pop!(assigns, :value) socket = assign(socket, assigns) socket = cond do value == socket.assigns.value -> socket value == nil -> assign(socket, value: value, audio_url: nil) true -> assign(socket, value: value, audio_url: audio_url(socket.assigns.input_id)) end {:ok, socket} end defp audio_url(input_id) do # For the client-side audio preview, we serve audio encoded as WAV # from a separate endpoint. To do that, we encode information in a # token and then the controller fetches input value from the LV. # This is especially important for client-specific inputs in forms. token = LivebookWeb.SessionHelpers.generate_input_token(self(), input_id) ~p"/sessions/audio-input/#{token}" end @impl true def render(assigns) do ~H"""