65 lines · 1.8 KB · TypeScript
RawDownload
import type { VoiceInputState } from "@t3tools/client-runtime/voice-input"; export type VoiceComposerPresentation = {  readonly leadingAction: "cancel" | null;  readonly trailingAction: "mic" | "confirm";  readonly showsSend: boolean;  readonly statusKind: "active" | "error" | null;  readonly statusLabel: string | null;  readonly confirmationEnabled: boolean;}; export function resolveVoiceComposerPresentation(  state: VoiceInputState,  elapsedSeconds: number,): VoiceComposerPresentation {  switch (state.phase) {    case "idle":      return {        leadingAction: null,        trailingAction: "mic",        showsSend: true,        statusKind: null,        statusLabel: null,        confirmationEnabled: false,      };    case "error":      return {        leadingAction: null,        trailingAction: "mic",        showsSend: true,        statusKind: "error",        statusLabel: state.error,        confirmationEnabled: false,      };    case "preparing":      return {        leadingAction: "cancel",        trailingAction: "confirm",        showsSend: false,        statusKind: "active",        statusLabel: "Preparing",        confirmationEnabled: false,      };    case "recording": {      const seconds = Math.max(0, Math.floor(elapsedSeconds));      return {        leadingAction: "cancel",        trailingAction: "confirm",        showsSend: false,        statusKind: "active",        statusLabel: `Recording ${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, "0")}`,        confirmationEnabled: true,      };    }    case "transcribing":      return {        leadingAction: "cancel",        trailingAction: "confirm",        showsSend: false,        statusKind: "active",        statusLabel: "Transcribing",        confirmationEnabled: false,      };  }}