{"version":3,"file":"dta-voice.mjs","sources":["../../../projects/dta-voice/src/lib/dta-voice/audio-finish/audio-finish.component.ts","../../../projects/dta-voice/src/lib/dta-voice/audio-finish/audio-finish.component.html","../../../projects/dta-voice/src/lib/dta-voice/home-screen/home-screen.component.ts","../../../projects/dta-voice/src/lib/dta-voice/home-screen/home-screen.component.html","../../../projects/dta-voice/src/lib/dta-voice/voice-recorder/audio-waves/audio-waves.component.ts","../../../projects/dta-voice/src/lib/dta-voice/voice-recorder/audio-waves/audio-waves.component.html","../../../projects/dta-voice/src/lib/dta-voice/shared/audio-utils.ts","../../../projects/dta-voice/src/lib/dta-voice/voice-recorder/voice-recorder.component.ts","../../../projects/dta-voice/src/lib/dta-voice/voice-recorder/voice-recorder.component.html","../../../projects/dta-voice/src/lib/environments/environment.ts","../../../projects/dta-voice/src/lib/dta-voice/core/https/jwt-auth.api.ts","../../../projects/dta-voice/src/lib/dta-voice/core/web-socket/signal-r.service.ts","../../../projects/dta-voice/src/lib/dta-voice/core/https/audio-http.ts","../../../projects/dta-voice/src/lib/dta-voice/core/https/send-audios-tracks.http.ts","../../../projects/dta-voice/src/lib/dta-voice/shared/services/send-audios-tracks.service.ts","../../../projects/dta-voice/src/lib/dta-voice/core/services/signalr-initializer.service.ts","../../../projects/dta-voice/src/lib/dta-voice/shared/base-voice-capture.component.ts","../../../projects/dta-voice/src/lib/dta-voice/mobile-session-accordion/mobile-session-accordion.component.ts","../../../projects/dta-voice/src/lib/dta-voice/mobile-session-accordion/mobile-session-accordion.component.html","../../../projects/dta-voice/src/lib/dta-voice/voice-page-slide/voice-page-slide.component.ts","../../../projects/dta-voice/src/lib/dta-voice/voice-page-slide/voice-page-slide.component.html","../../../projects/dta-voice/src/lib/dta-voice/voice-web-app/voice-web-app.component.ts","../../../projects/dta-voice/src/lib/dta-voice/voice-web-app/voice-web-app.component.html","../../../projects/dta-voice/src/public-api.ts","../../../projects/dta-voice/src/dta-voice.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'app-audio-finish',\r\n  imports: [],\r\n  templateUrl: './audio-finish.component.html',\r\n  styleUrl: './audio-finish.component.scss'\r\n})\r\nexport class AudioFinishComponent {\r\n\r\n}\r\n","<div class=\"audio-finish-container\">\r\n    <div class=\"success-icon-container\">\r\n        <img src=\"https://cdn.jsdelivr.net/gh/yuriduartetotvs/cdn@main/image/success.svg\" alt=\"Sucesso\" class=\"success-icon\">\r\n    </div>\r\n    \r\n    <h1 class=\"audio-finish-title\">Preenchimento concluído!</h1>\r\n    \r\n    <div class=\"audio-finish-message\">\r\n        <p>Seus áudios já foram processados e os campos</p>\r\n        <p>preenchidos no sistema.</p>\r\n        <p>Você já pode fechar esta janela!</p>\r\n        <p class=\"return-message\"><strong>Retorne ao sistema para conferir as informações.</strong></p>\r\n    </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { PoCheckboxModule } from '@po-ui/ng-components';\r\n\r\n@Component({\r\n  selector: 'app-home-screen',\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    PoCheckboxModule,\r\n  ],\r\n  templateUrl: './home-screen.component.html',\r\n  styleUrl: './home-screen.component.scss'\r\n})\r\nexport class HomeScreenComponent implements OnInit {\r\n  @Input() welcomeTitle: string = 'Boas-vindas ao DTA Voice, a inteligência artificial que otimiza o preenchimento de listas, tabelas e campos, a partir do uso de voz.';\r\n  @Input() welcomeDescription: string = 'Para utilizá-la é muito simples: basta que você conte para ela o que você quer que seja utilizado para o preenchimento dos campos. Pode conversar normalmente que nossa IA irá interpretar sua fala e extrair as informações para o correto preenchimento dos campos.';\r\n  @Input() welcomeFeatures: string = 'Além disso, você poderá, durante o processo, realizar mais de uma gravação, escutar suas gravações, e até mesmo deletar e regravar, caso considere necessário.';\r\n\r\n  dontShowAgain = false;  \r\n  \r\n  ngOnInit() {\r\n    this.dontShowAgain = localStorage.getItem('hideWelcomeMessage') === 'true';\r\n  }\r\n  \r\n  onDontShowAgainChange() {\r\n    localStorage.setItem('hideWelcomeMessage', this.dontShowAgain.toString());\r\n  }\r\n}\r\n","<div class=\"dta-voice-icons\">\r\n    <img src=\"https://cdn.jsdelivr.net/gh/yuriduartetotvs/cdn@main/image/dta.svg\" alt=\"IA\" class=\"dta-icon\" />\r\n    <img src=\"https://cdn.jsdelivr.net/gh/yuriduartetotvs/cdn@main/image/microphone-icon.svg\" alt=\"Microfone\" class=\"dta-icon mic\" />\r\n</div>\r\n<div class=\"dta-voice-text\">\r\n    <p>\r\n        {{ welcomeTitle }}\r\n    </p>\r\n    <p>\r\n        {{ welcomeDescription }}\r\n    </p>\r\n    <p>\r\n        {{ welcomeFeatures }}\r\n    </p>\r\n    <p style=\"font-weight: bold;\">\r\n        Para iniciar, clique em \"Iniciar captura de voz\".\r\n    </p>\r\n</div>\r\n\r\n<div class=\"checkbox-container\">\r\n    <po-checkbox\r\n        name=\"dontShowAgain\"\r\n        [(ngModel)]=\"dontShowAgain\"\r\n        p-label=\"Não exibir esta mensagem novamente.\"\r\n        (p-change)=\"onDontShowAgainChange()\">\r\n    </po-checkbox>\r\n</div>","import { Component, OnInit, OnDestroy, EventEmitter, Output, ViewChild } from '@angular/core';\r\nimport RecordRTC from 'recordrtc';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PoButtonModule, PoModalComponent, PoModalModule } from '@po-ui/ng-components';\r\n\r\n@Component({\r\n  selector: 'app-audio-waves',\r\n  standalone: true,\r\n  imports: [CommonModule, PoModalModule, PoButtonModule],\r\n  templateUrl: './audio-waves.component.html',\r\n  styleUrl: './audio-waves.component.scss'\r\n})\r\nexport class AudioWavesComponent implements OnInit, OnDestroy {\r\n  @Output() recordingComplete = new EventEmitter<{ blob: Blob, hash: string }>();\r\n  @Output() recordingCancelled = new EventEmitter<void>();\r\n\r\n  bars: number[] = [];\r\n  space = 12; // Espaçamento entre barras\r\n  recordRTC: RecordRTC | undefined;\r\n  isRecording = false;\r\n  animationInterval: any;\r\n  audioContext: AudioContext | undefined;\r\n  analyser: AnalyserNode | undefined;\r\n  mediaStreamSource: MediaStreamAudioSourceNode | undefined;\r\n  dataArray: Uint8Array | undefined;\r\n  stream: MediaStream | undefined;\r\n\r\n  // Propriedades para o player de áudio\r\n  audioUrl: string | null = null;\r\n  audioBlob: Blob | null = null;\r\n  audioElement: HTMLAudioElement | null = null;\r\n  isPlaying = false;\r\n\r\n  //Buscar o tamanho do audio\r\n  totalDuration: number = 0;\r\n  currentTime: string = '0:00';\r\n  updateTimer: any;\r\n\r\n  private audioHash: string = '';\r\n\r\n  @ViewChild(\"modalCancelAudio\", { static: true }) modalCancelAudio?: PoModalComponent;\r\n\r\n  ngOnInit() {\r\n    this.generateBars();\r\n    this.startSimulatedAnimation(); // Inicia animação simulada até começar a gravação real\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.clearAnimations();\r\n    this.stopMediaStream();\r\n    this.clearAudioPlayer();\r\n  }\r\n\r\n  clearAnimations() {\r\n    if (this.animationInterval) {\r\n      clearInterval(this.animationInterval);\r\n    }\r\n    if (this.audioContext) {\r\n      this.audioContext.close();\r\n    }\r\n  }\r\n\r\n  stopMediaStream() {\r\n    if (this.stream) {\r\n      this.stream.getTracks().forEach(track => track.stop());\r\n    }\r\n  }\r\n\r\n  generateBars() {\r\n    // Inicializa com valores aleatórios para simular as ondas\r\n    this.bars = Array.from({ length: 20 }, () => this.randomHeight());\r\n  }\r\n\r\n  startSimulatedAnimation() {\r\n    this.clearAnimations();\r\n    this.animationInterval = setInterval(() => {\r\n      // Atualiza as alturas aleatoriamente para simular movimento quando não estiver gravando\r\n      this.bars = this.bars.map(() => this.randomHeight());\r\n    }, 150);\r\n  }\r\n\r\n  randomHeight() {\r\n    // Gera um valor aleatório dentro da faixa da onda\r\n    return Math.floor(Math.random() * 40) + 10; // entre 10 e 50 px\r\n  }\r\n\r\n  async startRecording() {\r\n    try {\r\n      // Limpar o estado de reprodução anterior\r\n      this.clearAudioPlayer();\r\n\r\n      // Parar animação simulada\r\n      this.clearAnimations();\r\n\r\n      // Obter acesso ao microfone\r\n      this.stream = await navigator.mediaDevices.getUserMedia({\r\n        audio: {\r\n          sampleRate: 48000,\r\n          channelCount: 1,\r\n          echoCancellation: false,\r\n          noiseSuppression: false,\r\n          autoGainControl: false,\r\n        }\r\n      });\r\n\r\n      // Configurar o analisador de áudio\r\n      this.audioContext = new AudioContext();\r\n      this.analyser = this.audioContext.createAnalyser();\r\n      this.mediaStreamSource = this.audioContext.createMediaStreamSource(this.stream);\r\n      this.mediaStreamSource.connect(this.analyser);\r\n\r\n      // Configurar o analisador\r\n      this.analyser.fftSize = 256;\r\n      const bufferLength = this.analyser.frequencyBinCount;\r\n      this.dataArray = new Uint8Array(new ArrayBuffer(bufferLength));\r\n\r\n      // Iniciar a visualização em tempo real\r\n      this.visualize();\r\n\r\n      // Configurar e iniciar a gravação para WebM - CORRIGIDO\r\n      const options = {\r\n        type: 'audio' as const,\r\n        mimeType: 'audio/webm' as const,\r\n        audioBitsPerSecond: 128000,\r\n        numberOfAudioChannels: 1 as const,  // Explicitly type as 1 to match the required type\r\n        timeSlice: 1000,\r\n        disableLogs: false,\r\n        checkForInactiveTracks: true, // Adicionar esta opção\r\n        // Não usar recorderType para WebM - deixar o RecordRTC escolher automaticamente\r\n      };\r\n\r\n      this.recordRTC = new RecordRTC(this.stream, options);\r\n      this.recordRTC.startRecording();\r\n      this.isRecording = true;\r\n    } catch (err) {\r\n      this.errorCallback(err);\r\n      // Se falhar, voltar para a animação simulada\r\n      this.startSimulatedAnimation();\r\n    }\r\n  }\r\n\r\n  visualize() {\r\n    if (!this.analyser || !this.dataArray) {\r\n      return;\r\n    }\r\n\r\n    // Criar um loop de animação para atualizar a visualização\r\n    const updateVisualizer = () => {\r\n      if (!this.analyser) return;\r\n\r\n      // Obter dados de frequência do áudio atual\r\n      const tempArray = new Uint8Array(this.analyser.frequencyBinCount);\r\n      this.analyser.getByteFrequencyData(tempArray);\r\n\r\n      // Mapear os dados do áudio para as alturas das barras\r\n      const barCount = this.bars.length;\r\n      const step = Math.floor(tempArray.length / barCount);\r\n\r\n      for (let i = 0; i < barCount; i++) {\r\n        // Pegar uma amostra dos dados de frequência\r\n        const value = tempArray[i * step];\r\n        // Mapear o valor (0-255) para a altura da barra (10-50)\r\n        this.bars[i] = 10 + Math.floor((value / 255) * 40);\r\n      }\r\n\r\n      requestAnimationFrame(updateVisualizer);\r\n    };\r\n\r\n    updateVisualizer();\r\n  }\r\n\r\n  async stopRecording() {\r\n    if (this.recordRTC) {\r\n      this.recordRTC.stopRecording(() => {\r\n        if (this.recordRTC) {\r\n          const blob = this.recordRTC.getBlob();\r\n\r\n          // Gerar hash do áudio\r\n          this.generateAudioHash(blob).then(hash => {\r\n            this.audioHash = hash;\r\n\r\n            // Configurar o player de áudio\r\n            this.setupAudioPlayer(blob);\r\n\r\n            // Automaticamente emitir o evento de conclusão sem precisar do botão\r\n            this.recordingComplete.emit({\r\n              blob: blob,\r\n              hash: this.audioHash\r\n            });\r\n          });\r\n        }\r\n      });\r\n\r\n      // Limpar recursos de gravação\r\n      this.isRecording = false;\r\n      this.clearAnimations();\r\n      this.stopMediaStream();\r\n    }\r\n  }\r\n\r\n  // Add method to generate hash based on audio properties\r\n  private generateAudioHash(audioBlob: Blob): Promise<string> {\r\n    return new Promise<string>((resolve) => {\r\n      // Use a combination of timestamp, blob size and type to create a unique hash\r\n      const timestamp = new Date().getTime();\r\n      const randomPart = Math.floor(Math.random() * 1000000);\r\n      const hash = `audio-${timestamp}-${audioBlob.size}-${randomPart}`;\r\n      this.audioHash = hash;\r\n      resolve(hash);\r\n    });\r\n  }\r\n\r\n  setupAudioPlayer(blob: Blob) {\r\n    // Limpar qualquer reprodução anterior\r\n    this.clearAudioPlayer();\r\n\r\n    // Armazenar o blob e criar URL\r\n    this.audioBlob = blob;\r\n    this.audioUrl = URL.createObjectURL(blob);\r\n\r\n    // Criar elemento de áudio\r\n    this.audioElement = new Audio(this.audioUrl);\r\n\r\n    // Configurar múltiplos eventos para tentar obter a duração\r\n    const setDuration = () => {\r\n      if (this.audioElement &&\r\n        !isNaN(this.audioElement.duration) &&\r\n        this.audioElement.duration > 0 &&\r\n        this.audioElement.duration !== Infinity) { // Adicionar verificação para Infinity\r\n        this.totalDuration = this.audioElement.duration;\r\n        this.updateDisplayTime(this.totalDuration);\r\n      } else {\r\n        // Fallback: calcular duração baseada no tamanho do arquivo\r\n        this.estimateDuration(blob);\r\n      }\r\n    };\r\n\r\n    // Tentar múltiplos eventos\r\n    this.audioElement.addEventListener('loadedmetadata', setDuration);\r\n    this.audioElement.addEventListener('loadeddata', setDuration);\r\n    this.audioElement.addEventListener('canplaythrough', setDuration);\r\n    this.audioElement.addEventListener('durationchange', setDuration);\r\n\r\n    // Configurar eventos para atualização do timer\r\n    this.audioElement.addEventListener('timeupdate', this.updateCurrentTime.bind(this));\r\n    this.audioElement.addEventListener('ended', () => {\r\n      this.isPlaying = false;\r\n      // Reset to total duration display when playback ends\r\n      if (!isNaN(this.totalDuration) && this.totalDuration !== Infinity) {\r\n        this.updateDisplayTime(this.totalDuration);\r\n      }\r\n    });\r\n\r\n    // Force load para tentar obter metadados\r\n    this.audioElement.load();\r\n\r\n    // Timeout para forçar estimativa se não conseguir obter duração em 2 segundos\r\n    setTimeout(() => {\r\n      if (this.totalDuration === 0 ||\r\n        isNaN(this.totalDuration) ||\r\n        this.totalDuration === Infinity) {\r\n        this.estimateDuration(blob);\r\n      }\r\n    }, 2000);\r\n\r\n    // Visualizar ondas conforme o áudio\r\n    this.setupAudioVisualization();\r\n  }\r\n\r\n  private estimateDuration(blob: Blob): void {\r\n    // Estimativa baseada no tamanho do arquivo\r\n    // Para WebM com 128kbps: aproximadamente 16KB por segundo\r\n    const estimatedSeconds = blob.size / (128000 / 8); // 128kbps em bytes por segundo\r\n\r\n    if (estimatedSeconds > 0 && estimatedSeconds < 3600) { // Máximo 1 hora\r\n      this.totalDuration = estimatedSeconds;\r\n      this.updateDisplayTime(this.totalDuration);\r\n    } else {\r\n      // Fallback final: usar 0:00\r\n      this.totalDuration = 0;\r\n      this.currentTime = '0:00';\r\n      console.warn('Não foi possível determinar a duração do áudio');\r\n    }\r\n  }\r\n\r\n  private updateDisplayTime(timeInSeconds: number) {\r\n    // Verificar se o tempo é válido\r\n    if (isNaN(timeInSeconds) || timeInSeconds < 0) {\r\n      this.currentTime = '0:00';\r\n      return;\r\n    }\r\n\r\n    const minutes = Math.floor(timeInSeconds / 60);\r\n    const seconds = Math.floor(timeInSeconds % 60);\r\n    this.currentTime = `${minutes}:${seconds.toString().padStart(2, '0')}`;\r\n  }\r\n\r\n  setupAudioVisualization() {\r\n    // Aqui você pode manter a visualização das ondas estática \r\n    // ou implementar uma visualização que acompanha o áudio sendo reproduzido\r\n\r\n    // Para uma visualização simplificada, podemos pausar a animação simulada\r\n    this.clearAnimations();\r\n\r\n    // E manter uma representação fixa das ondas\r\n    this.bars = Array.from({ length: 20 }, () => 10 + Math.floor(Math.random() * 40));\r\n  }\r\n\r\n  updateCurrentTime() {\r\n    if (this.audioElement && this.totalDuration > 0 && !isNaN(this.totalDuration)) {\r\n      // Verificar se currentTime é válido\r\n      if (!isNaN(this.audioElement.currentTime)) {\r\n        // Calculate remaining time for countdown display\r\n        const remainingTime = Math.max(0, this.totalDuration - this.audioElement.currentTime);\r\n        this.updateDisplayTime(remainingTime);\r\n      }\r\n    }\r\n  }\r\n\r\n  togglePlayback() {\r\n    if (!this.audioElement) return;\r\n\r\n    if (this.isPlaying) {\r\n      this.audioElement.pause();\r\n    } else {\r\n      this.audioElement.play();\r\n    }\r\n\r\n    this.isPlaying = !this.isPlaying;\r\n  }\r\n\r\n  cancelAudio() {\r\n    this.clearAudioPlayer();\r\n    this.recordingCancelled.emit();\r\n    this.startSimulatedAnimation(); // Voltar para animação simulada\r\n    this.modalCancelAudio?.close(); // Fechar modal\r\n  }\r\n\r\n  clearAudioPlayer() {\r\n    if (this.audioElement) {\r\n      this.audioElement.pause();\r\n      this.audioElement.removeEventListener('timeupdate', this.updateCurrentTime.bind(this));\r\n      this.audioElement = null;\r\n    }\r\n\r\n    if (this.audioUrl) {\r\n      URL.revokeObjectURL(this.audioUrl);\r\n      this.audioUrl = null;\r\n    }\r\n\r\n    this.audioBlob = null;\r\n    this.isPlaying = false;\r\n    this.currentTime = '0:00';\r\n  }\r\n\r\n  errorCallback(error: any) {\r\n    console.error('Erro na gravação de áudio:', error);\r\n  }\r\n}","<div class=\"audio-waves-container\">\r\n  <!-- Visualização das ondas de áudio -->\r\n  @if(isRecording) {\r\n  <div class=\"audio-waves\">\r\n    <div class=\"bar\" *ngFor=\"let height of bars\" [style.height.px]=\"height\"></div>\r\n  </div>\r\n  }\r\n</div>","export class AudioUtils {\r\n\r\n  static generateUniqueKey(): number {\r\n    return Math.floor(Math.random() * 1000000);\r\n  }\r\n\r\n  static generateAudioId(): string {\r\n    return 'audio-' + Date.now() + '-' + Math.floor(Math.random() * 1000);\r\n  }\r\n\r\n  static generateAudioHash(audioBlob: Blob): Promise<string> {\r\n    return new Promise<string>((resolve) => {\r\n      const timestamp = new Date().getTime();\r\n      const randomPart = Math.floor(Math.random() * 1000000);\r\n      const hash = `audio-${timestamp}-${audioBlob.size}-${randomPart}`;\r\n      resolve(hash);\r\n    });\r\n  }\r\n\r\n  static formatTimestamp(timestamp: Date): string {\r\n    const date = new Date(timestamp);\r\n    const day = date.getDate().toString().padStart(2, '0');\r\n    const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n    const year = date.getFullYear();\r\n    const hours = date.getHours().toString().padStart(2, '0');\r\n    const minutes = date.getMinutes().toString().padStart(2, '0');\r\n    \r\n    return `${day}${month}${year}_${hours}${minutes}`;\r\n  }\r\n\r\n  static generateRandomBarHeight(): number {\r\n    return Math.floor(Math.random() * 40) + 10; // entre 10 e 50 px\r\n  }\r\n\r\n  static estimateAudioDuration(blob: Blob): string {\r\n    // Estimativa aproximada: ~8KB por segundo para WebM\r\n    const estimatedSeconds = Math.max(1, Math.floor(blob.size / 8000));\r\n    const minutes = Math.floor(estimatedSeconds / 60);\r\n    const seconds = estimatedSeconds % 60;\r\n    return `${minutes}:${seconds.toString().padStart(2, '0')}`;\r\n  }\r\n\r\n  static formatTimeDisplay(timeInSeconds: number): string {\r\n    const minutes = Math.floor(timeInSeconds / 60);\r\n    const seconds = Math.floor(timeInSeconds % 60);\r\n    return `${minutes}:${seconds.toString().padStart(2, '0')}`;\r\n  }\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PoButtonModule, PoListViewModule, PoListViewAction, PoNotificationService, PoLoadingModule, PoModalModule, PoModalComponent } from '@po-ui/ng-components';\r\nimport { AudioWavesComponent } from './audio-waves/audio-waves.component';\r\nimport { ShepherdService } from 'angular-shepherd';\r\nimport { AudioUtils } from '../shared/audio-utils';\r\nimport { AudioRecordModel } from '../shared/models';\r\n\r\n@Component({\r\n  selector: 'app-voice-recorder',\r\n  standalone: true,\r\n  imports: [CommonModule, PoButtonModule, PoListViewModule, PoLoadingModule, PoModalModule, AudioWavesComponent],\r\n  templateUrl: './voice-recorder.component.html',\r\n  styleUrl: './voice-recorder.component.scss'\r\n})\r\nexport class VoiceRecorderComponent implements OnInit, OnDestroy {\r\n  @ViewChild(AudioWavesComponent) audioWaves!: AudioWavesComponent;\r\n  @Output() selectedAudiosEvent = new EventEmitter<AudioRecordModel[]>();\r\n  @Input() loading = false;\r\n  @Input() enableTour = false;\r\n  isRecording = false;\r\n  audioRecords: AudioRecordModel[] = [];\r\n  submitting = false;\r\n  audioRemove: AudioRecordModel | null = null;\r\n  isProcessing = false; // Estado para controlar o loading do processamento\r\n\r\n  currentPlayingAudio: AudioRecordModel | null = null;\r\n  currentAudioElement: HTMLAudioElement | null = null;\r\n  showTooltip = false;\r\n\r\n  constructor(private readonly poNotification: PoNotificationService, private readonly shepherdService: ShepherdService) {\r\n  }\r\n  ngOnDestroy(): void {\r\n    this.stopCurrentAudio();\r\n  }\r\n\r\n  @ViewChild(\"modalDeteteItem\", { static: true }) modalDeleteItem?: PoModalComponent;\r\n  @ViewChild(\"modalDeleteMultipleItems\", { static: true }) modalDeleteMultipleItems?: PoModalComponent;\r\n\r\n  initializeTour(): void {\r\n    this.shepherdService.defaultStepOptions = {\r\n      classes: 'shepherd-theme-arrows',\r\n      scrollTo: { behavior: 'smooth', block: 'center' },\r\n      cancelIcon: {\r\n        enabled: true\r\n      },\r\n      when: {\r\n        show: () => {\r\n          console.log('Step shown');\r\n        },\r\n        hide: () => {\r\n          console.log('Step hidden');\r\n        }\r\n      }\r\n    };\r\n\r\n    this.shepherdService.modal = true;\r\n    this.shepherdService.confirmCancel = false;\r\n\r\n    const steps = [\r\n      {\r\n        id: 'welcome',\r\n        title: 'Bem-vindo ao DTA Voice',\r\n        text: 'Vamos fazer um tour rápido pelas funcionalidades de captura de voz. Clique em \"Próximo\" para continuar.',\r\n        buttons: [\r\n          {\r\n            text: 'Pular Tour',\r\n            action: () => this.skipTour(),\r\n            classes: 'shepherd-button-secondary'\r\n          },\r\n          {\r\n            text: 'Próximo',\r\n            action: () => this.shepherdService.next(),\r\n            classes: 'shepherd-button-primary'\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        id: 'record-button',\r\n        title: 'Botão de Gravação',\r\n        text: 'Este é o botão principal para iniciar e parar a gravação de áudio. Clique aqui quando estiver pronto para falar.',\r\n        attachTo: {\r\n          element: '#btn-record',\r\n          on: 'top' as const\r\n        },\r\n        buttons: [\r\n          {\r\n            text: 'Próximo',\r\n            action: () => this.shepherdService.next(),\r\n            classes: 'shepherd-button-primary'\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        id: 'audio-waves',\r\n        title: 'Visualização de Áudio',\r\n        text: 'Aqui você verá as ondas sonoras em tempo real durante a gravação e poderá reproduzir o áudio gravado.',\r\n        attachTo: {\r\n          element: '.audio-waves-container',\r\n          on: 'bottom' as const\r\n        },\r\n        beforeShowPromise: () => {\r\n          //depois de clicar no botão de gravação, iniciar a gravação limpa ela para não ficar\r\n\r\n          return new Promise<void>((resolve) => {\r\n            // Verificar se o componente de ondas sonoras está pronto, dar o false so depois de clicar no botão de gravação\r\n            if (this.audioWaves) {\r\n              this.audioWaves.isRecording = true;\r\n            }\r\n            resolve();\r\n          });\r\n\r\n        },\r\n        buttons: [\r\n          {\r\n            text: 'Próximo',\r\n            action: () => this.shepherdService.next(),\r\n            classes: 'shepherd-button-primary'\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        id: 'audio-list',\r\n        title: 'Lista de Áudios',\r\n        text: 'Após gravar, seus áudios aparecerão nesta lista. Você pode reproduzi-los, selecioná-los ou removê-los.',\r\n        attachTo: {\r\n          element: '.audio-list-container',\r\n          on: 'top' as const\r\n        },\r\n        beforeShowPromise: () => {\r\n          return new Promise<void>((resolve) => {\r\n            // Se não houver áudios, mostrar uma mensagem diferente\r\n            if (this.audioRecords.length === 0) {\r\n              // Simular um áudio para demonstração do tour\r\n              this.addDemoAudioForTour();\r\n              this.audioWaves.isRecording = false;\r\n            }\r\n            resolve();\r\n          });\r\n        },\r\n        buttons: [\r\n          {\r\n            text: 'Finalizar Tour',\r\n            action: () => this.finalizeTour(),\r\n            classes: 'shepherd-button-primary'\r\n          }\r\n        ]\r\n      }\r\n    ];\r\n\r\n    this.shepherdService.addSteps(steps);\r\n\r\n    // Iniciar o tour após um pequeno delay para garantir que os elementos estejam renderizados\r\n    setTimeout(() => {\r\n      this.shepherdService.start();\r\n    }, 500);\r\n  }\r\n\r\n  private addDemoAudioForTour(): void {\r\n    // Adicionar um áudio de demonstração apenas para o tour\r\n    const demoAudio: AudioRecordModel = {\r\n      id: 'demo-audio-tour',\r\n      blob: new Blob(),\r\n      url: '',\r\n      name: 'Áudio de demonstração',\r\n      timestamp: new Date(),\r\n      duration: '0:15',\r\n      selected: false\r\n    };\r\n\r\n    this.audioRecords = [demoAudio];\r\n  }\r\n\r\n  private finalizeTour(): void {\r\n    // Remover áudio de demonstração se existir\r\n    this.audioRecords = this.audioRecords.filter(audio => audio.id !== 'demo-audio-tour');\r\n    this.shepherdService.complete();\r\n  }\r\n\r\n  // Adicionar método para reiniciar o tour se necessário\r\n  public restartTour(): void {\r\n    this.shepherdService.cancel();\r\n    setTimeout(() => {\r\n      this.initializeTour();\r\n    }, 100);\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.audioRecords = [];\r\n    this.selectedAudiosEvent.emit(this.audioRecords);\r\n\r\n    if (!this.shouldShowTour()) {\r\n      return; // Não inicializar o tour\r\n    }\r\n\r\n    this.initializeTour();\r\n  }\r\n\r\n  private skipTour(): void {\r\n    // Salvar no localStorage que o usuário pulou o tour\r\n    localStorage.setItem('dtaVoiceTourSkipped', 'true');\r\n    this.shepherdService.cancel();\r\n  }\r\n\r\n  private shouldShowTour(): boolean {\r\n    const tourSkipped = localStorage.getItem('dtaVoiceTourSkipped');\r\n    return tourSkipped !== 'true';\r\n  }\r\n\r\n  // Ações para a lista\r\n  actions: PoListViewAction[] = [\r\n    {\r\n      label: 'Ouvir',\r\n      action: this.playAudio.bind(this),\r\n      icon: 'po-icon po-icon-volume-high'\r\n    },\r\n    {\r\n      label: 'Remover',\r\n      action: this.modalRemoveAudio.bind(this),\r\n      icon: 'po-icon po-icon-delete',\r\n      type: 'danger'\r\n    }\r\n  ];\r\n\r\n  toggleRecording() {\r\n    if (this.isRecording) {\r\n      this.stopRecording();\r\n    } else {\r\n      this.startRecording();\r\n    }\r\n  }\r\n\r\n  startUpload(): void {\r\n    // Criar um input file temporário para selecionar arquivos de áudio\r\n    const fileInput = document.createElement('input');\r\n    fileInput.type = 'file';\r\n    // Aceitar todos os tipos de áudio por tipo MIME e extensões específicas\r\n    fileInput.accept = 'audio/*,.mp3,.wav,.ogg,.m4a,.aac,.flac,.webm,.opus,.wma,.amr,.3gp,.mp4,.mpeg,.mpga,.ra,.ram,.rm,.mid,.midi,.aifc,.aiff,.au,.snd,.gsm,.ulaw,.voc,.m4b,.m4p,.m4r,.3g2,.awb,.qcp,.ac3,.dts,.mlp,.thd,.tta,.wv,.mka';\r\n    fileInput.multiple = true;\r\n    \r\n    fileInput.onchange = (event: any) => {\r\n      const files = event.target.files;\r\n      if (files && files.length > 0) {\r\n        this.handleFileUpload(files);\r\n      }\r\n    };\r\n    \r\n    fileInput.click();\r\n  }\r\n\r\n  private async handleFileUpload(files: FileList): Promise<void> {\r\n    this.isProcessing = true;\r\n    let processedCount = 0;\r\n    const totalFiles = Array.from(files).filter(file => this.isValidAudioFile(file) && file.size <= 100 * 1024 * 1024).length;\r\n    \r\n    try {\r\n      for (const file of Array.from(files)) {\r\n        // Verificar se é um arquivo de áudio válido\r\n        if (!this.isValidAudioFile(file)) {\r\n          this.poNotification.warning(`O arquivo \"${file.name}\" não é um arquivo de áudio válido.`);\r\n          continue;\r\n        }\r\n\r\n        // Verificar tamanho do arquivo (limite de 100MB)\r\n        if (file.size > 100 * 1024 * 1024) {\r\n          this.poNotification.warning(`O arquivo \"${file.name}\" é muito grande (máximo 100MB).`);\r\n          continue;\r\n        }\r\n\r\n        // Mostrar progresso se houver múltiplos arquivos\r\n        if (totalFiles > 1) {\r\n          console.log(`Processando arquivo ${processedCount + 1} de ${totalFiles}: ${file.name}`);\r\n        }\r\n        \r\n        await this.processAudioFile(file);\r\n        processedCount++;\r\n      }\r\n\r\n      // Notificação final se múltiplos arquivos foram processados\r\n      if (totalFiles > 1 && processedCount > 0) {\r\n        this.poNotification.success(`${processedCount} arquivos processados com sucesso!`);\r\n      }\r\n      \r\n    } catch (error) {\r\n      console.error('Erro ao processar arquivos:', error);\r\n      this.poNotification.error('Erro ao processar arquivos de áudio.');\r\n    } finally {\r\n      this.isProcessing = false;\r\n    }\r\n  }\r\n\r\n  // Método para verificar se o arquivo é um áudio válido\r\n  private isValidAudioFile(file: File): boolean {\r\n    // Verificar por tipo MIME\r\n    if (file.type.startsWith('audio/')) {\r\n      return true;\r\n    }\r\n\r\n    // Verificar por extensão como fallback - aceita todos os tipos de áudio comuns\r\n    const audioExtensions = [\r\n      '.mp3', '.wav', '.ogg', '.m4a', '.aac', '.flac', \r\n      '.webm', '.opus', '.wma', '.amr', '.3gp', '.mp4',\r\n      '.mpeg', '.mpga', '.ra', '.ram', '.rm', '.mid', \r\n      '.midi', '.kar', '.aifc', '.aiff', '.au', '.snd',\r\n      '.gsm', '.ulaw', '.voc', '.pls', '.m3u', '.m4b',\r\n      '.m4p', '.m4r', '.3g2', '.awb', '.qcp', '.ac3',\r\n      '.dts', '.mlp', '.thd', '.tta', '.wv', '.mka'\r\n    ];\r\n\r\n    const fileName = file.name.toLowerCase();\r\n    const hasAudioExtension = audioExtensions.some(ext => fileName.endsWith(ext));\r\n\r\n    if (hasAudioExtension) {\r\n      console.log(`Arquivo \"${file.name}\" detectado como áudio pela extensão (tipo MIME: \"${file.type}\")`);\r\n      return true;\r\n    }\r\n\r\n    console.warn(`Arquivo \"${file.name}\" rejeitado - Tipo: \"${file.type}\", Extensão não reconhecida`);\r\n    return false;\r\n  }\r\n\r\n  private async processAudioFile(file: File): Promise<void> {\r\n    try {\r\n      console.log(`Processando arquivo: ${file.name}, Tipo MIME: \"${file.type}\", Tamanho: ${file.size} bytes`);\r\n      \r\n      // Usar o arquivo original sem conversão\r\n      const audioBlob = file;\r\n      const fileName = file.name;\r\n      \r\n      // Gerar ID para o arquivo\r\n      const audioId = AudioUtils.generateAudioId();\r\n      \r\n      // Criar URL para o blob\r\n      const audioUrl = URL.createObjectURL(audioBlob);\r\n      \r\n      // Obter duração do áudio com timeout\r\n      const duration = await this.getAudioDuration(audioUrl);\r\n      \r\n      const audioRecord: AudioRecordModel = {\r\n        id: audioId,\r\n        name: fileName,\r\n        blob: audioBlob,\r\n        url: audioUrl,\r\n        duration: duration,\r\n        timestamp: new Date(),\r\n        selected: false\r\n      };\r\n\r\n      this.audioRecords.push(audioRecord);\r\n      this.selectedAudiosEvent.emit(this.audioRecords);\r\n      \r\n      this.poNotification.success(`Arquivo \"${file.name}\" adicionado com sucesso!`);\r\n      \r\n    } catch (error) {\r\n      console.error('Erro ao processar arquivo de áudio:', error);\r\n      this.poNotification.error(`Erro ao processar o arquivo \"${file.name}\".`);\r\n    }\r\n  }\r\n\r\n  // Método auxiliar para obter duração do áudio com timeout\r\n  private async getAudioDuration(audioUrl: string): Promise<string> {\r\n    return new Promise((resolve) => {\r\n      const audio = new Audio();\r\n      let resolved = false;\r\n      let timeoutId: number;\r\n\r\n      const resolveWithDuration = (duration?: number) => {\r\n        if (resolved) return;\r\n        resolved = true;\r\n        \r\n        // Limpar timeout e áudio\r\n        if (timeoutId) clearTimeout(timeoutId);\r\n        audio.src = '';\r\n        \r\n        if (duration && isFinite(duration) && duration > 0) {\r\n          const minutes = Math.floor(duration / 60);\r\n          const seconds = Math.floor(duration % 60);\r\n          resolve(`${minutes}:${seconds.toString().padStart(2, '0')}`);\r\n        } else {\r\n          resolve('0:00');\r\n        }\r\n      };\r\n\r\n      // Configurar eventos antes de definir src\r\n      audio.onloadedmetadata = () => {\r\n        resolveWithDuration(audio.duration);\r\n      };\r\n\r\n      audio.onerror = () => {\r\n        console.warn('Erro ao carregar metadados do áudio');\r\n        resolveWithDuration();\r\n      };\r\n\r\n      audio.onabort = () => {\r\n        console.warn('Carregamento do áudio foi abortado');\r\n        resolveWithDuration();\r\n      };\r\n\r\n      // Timeout reduzido para 3 segundos\r\n      timeoutId = window.setTimeout(() => {\r\n        console.warn('Timeout ao carregar metadados do áudio');\r\n        resolveWithDuration();\r\n      }, 3000);\r\n\r\n      // Definir src por último para evitar race conditions\r\n      audio.src = audioUrl;\r\n    });\r\n  }\r\n\r\n  startRecording() {\r\n    this.audioWaves.startRecording();\r\n    this.isRecording = true;\r\n  }\r\n\r\n  stopRecording() {\r\n    this.audioWaves.stopRecording();\r\n    this.isRecording = false;\r\n  }\r\n\r\n  onRecordingComplete(audioBlob: Blob, hashAudio: string) {\r\n    // Verificar se já existe um áudio com o mesmo hash\r\n    const duplicateAudio = this.audioRecords.find(record => record.id === hashAudio);\r\n\r\n    if (duplicateAudio) {\r\n      // Se encontrado áudio duplicado, mostrar alerta\r\n      this.poNotification.warning({\r\n        message: 'Áudio já está na lista!',\r\n        duration: 3000\r\n      });\r\n      return;\r\n    }\r\n\r\n    // Criar um URL para o blob\r\n    const audioUrl = URL.createObjectURL(audioBlob);\r\n\r\n    // Tentar obter a duração real do áudio\r\n    const audio = new Audio(audioUrl);\r\n\r\n    const addAudioToList = (durationFormatted: string) => {\r\n      const audioRecord: AudioRecordModel = {\r\n        id: hashAudio || this.generateId(),\r\n        blob: audioBlob,\r\n        url: audioUrl,\r\n        name: `Gravação ${this.audioRecords.length + 1}`,\r\n        timestamp: new Date(),\r\n        duration: durationFormatted,\r\n        selected: false\r\n      };\r\n      this.audioRecords = [...this.audioRecords, audioRecord];\r\n      this.sendSelectedAudios();\r\n      // Removido download automático - this.downloadAudio(audioRecord);\r\n    };\r\n\r\n    audio.addEventListener('loadedmetadata', () => {\r\n      // Verificar se a duração é válida (não infinita e não NaN)\r\n      if (audio.duration && isFinite(audio.duration) && audio.duration > 0) {\r\n        const durationMinutes = Math.floor(audio.duration / 60);\r\n        const durationSeconds = Math.floor(audio.duration % 60);\r\n        const durationFormatted = `${durationMinutes}:${durationSeconds.toString().padStart(2, '0')}`;\r\n        addAudioToList(durationFormatted);\r\n      } else {\r\n        // Usar estimativa se a duração real não estiver disponível\r\n        const estimatedDuration = this.estimateDuration(audioBlob);\r\n        addAudioToList(estimatedDuration);\r\n      }\r\n    });\r\n\r\n    // Fallback caso o evento loadedmetadata não seja disparado\r\n    audio.addEventListener('error', () => {\r\n      console.warn('Erro ao carregar metadados do áudio, usando estimativa');\r\n      const estimatedDuration = this.estimateDuration(audioBlob);\r\n      addAudioToList(estimatedDuration);\r\n    });\r\n\r\n    // Timeout como último recurso\r\n    setTimeout(() => {\r\n      if (this.audioRecords.find(record => record.id === (hashAudio || this.generateId())) === undefined) {\r\n        console.warn('Timeout ao carregar metadados, usando estimativa');\r\n        const estimatedDuration = this.estimateDuration(audioBlob);\r\n        addAudioToList(estimatedDuration);\r\n      }\r\n    }, 2000);\r\n  }\r\n\r\n  downloadAudio(audio: AudioRecordModel) {\r\n    try {\r\n      // Criar um link temporário para download\r\n      const downloadLink = document.createElement('a');\r\n      downloadLink.href = audio.url;\r\n      downloadLink.download = `${audio.name}_${AudioUtils.formatTimestamp(audio.timestamp)}.webm`;\r\n      \r\n      // Adicionar o link ao DOM temporariamente\r\n      document.body.appendChild(downloadLink);\r\n      \r\n      // Simular clique para iniciar o download\r\n      downloadLink.click();\r\n      \r\n      // Remover o link do DOM\r\n      document.body.removeChild(downloadLink);\r\n\r\n      // Mostrar notificação de sucesso\r\n      this.poNotification.success({\r\n        message: `Download do áudio \"${audio.name}\" iniciado!`,\r\n        duration: 2000\r\n      });\r\n\r\n    } catch (error) {\r\n      console.error('Erro ao fazer download do áudio:', error);\r\n      this.poNotification.error({\r\n        message: 'Erro ao fazer download do áudio.',\r\n        duration: 3000\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Função para reativar download automático (se necessário no futuro)\r\n   * Basta adicionar: this.downloadAudio(audioRecord); após criar o audio record\r\n   */\r\n  // enableAutoDownload(audioRecord: AudioRecordModel) {\r\n  //   this.downloadAudio(audioRecord);\r\n  // }\r\n\r\n  // Método para alternar seleção de um áudio\r\n  toggleAudioSelection(audio: AudioRecordModel) {\r\n    audio.selected = !audio.selected;\r\n  }\r\n\r\n  // Método para obter áudios selecionados\r\n  getSelectedAudios(): AudioRecordModel[] {\r\n    return this.audioRecords.filter(audio => audio.selected);\r\n  }\r\n\r\n  // Método para abrir modal de exclusão múltipla\r\n  modalRemoveMultipleAudios() {\r\n    this.modalDeleteMultipleItems?.open();\r\n  }\r\n\r\n  // Método para remover múltiplos áudios\r\n  removeMultipleAudios() {\r\n    const selectedAudios = this.getSelectedAudios();\r\n\r\n    // Revogar URLs dos áudios selecionados\r\n    selectedAudios.forEach(audio => {\r\n      URL.revokeObjectURL(audio.url);\r\n    });\r\n\r\n    // Remover áudios selecionados da lista\r\n    this.audioRecords = this.audioRecords.filter(audio => !audio.selected);\r\n\r\n    // Fechar modal\r\n    this.modalDeleteMultipleItems?.close();\r\n\r\n    this.sendSelectedAudios();\r\n\r\n    // Mostrar notificação\r\n    this.poNotification.success({\r\n      message: `${selectedAudios.length} áudios foram excluídos com sucesso!`,\r\n      duration: 3000\r\n    });\r\n  }\r\n\r\n  private estimateDuration(blob: Blob): string {\r\n    const estimatedSeconds = blob.size / (128000 / 8); // 128kbps em bytes por segundo\r\n\r\n    if (estimatedSeconds > 0 && estimatedSeconds < 3600) { // Máximo 1 hora\r\n      const durationMinutes = Math.floor(estimatedSeconds / 60);\r\n      const durationSecondsRounded = Math.floor(estimatedSeconds % 60);\r\n      return `${durationMinutes}:${durationSecondsRounded.toString().padStart(2, '0')}`;\r\n    } else {\r\n      // Fallback final: usar 0:00\r\n      console.warn('Não foi possível determinar a duração do áudio');\r\n      return '0:00';\r\n    }\r\n  }\r\n\r\n  onRecordingCancelled() {\r\n    console.log('Gravação cancelada pelo usuário');\r\n  }\r\n\r\n  playAudio(audio: AudioRecordModel) {\r\n    // Se já existe um áudio sendo reproduzido\r\n    if (this.currentAudioElement) {\r\n      // Se é o mesmo áudio, pausar/despausar\r\n      if (this.currentPlayingAudio?.id === audio.id) {\r\n        if (this.currentAudioElement.paused) {\r\n          this.currentAudioElement.play();\r\n          this.currentPlayingAudio = audio;\r\n        } else {\r\n          this.currentAudioElement.pause();\r\n          this.currentPlayingAudio = null;\r\n        }\r\n        return;\r\n      } else {\r\n        // Se é um áudio diferente, parar o atual\r\n        this.stopCurrentAudio();\r\n      }\r\n    }\r\n\r\n    // Criar novo elemento de áudio\r\n    this.currentAudioElement = new Audio(audio.url);\r\n    this.currentPlayingAudio = audio;\r\n\r\n    // Configurar eventos\r\n    this.currentAudioElement.addEventListener('ended', () => {\r\n      this.stopCurrentAudio();\r\n    });\r\n\r\n    this.currentAudioElement.addEventListener('error', () => {\r\n      console.error('Erro ao reproduzir áudio');\r\n      this.stopCurrentAudio();\r\n    });\r\n\r\n    // Iniciar reprodução\r\n    this.currentAudioElement.play().catch(error => {\r\n      console.error('Erro ao reproduzir áudio:', error);\r\n      this.stopCurrentAudio();\r\n    });\r\n  }\r\n\r\n  private stopCurrentAudio(): Promise<void> {\r\n    return new Promise((resolve) => {\r\n      if (this.currentAudioElement) {\r\n        // Adicionar listener para garantir que o áudio foi pausado\r\n        const handlePause = () => {\r\n          this.currentAudioElement?.removeEventListener('pause', handlePause);\r\n          this.currentAudioElement = null;\r\n          this.currentPlayingAudio = null;\r\n          resolve();\r\n        };\r\n\r\n        this.currentAudioElement.addEventListener('pause', handlePause);\r\n        this.currentAudioElement.pause();\r\n        this.currentAudioElement.currentTime = 0;\r\n\r\n        // Timeout de segurança caso o evento 'pause' não seja disparado\r\n        setTimeout(() => {\r\n          if (this.currentAudioElement) {\r\n            this.currentAudioElement.removeEventListener('pause', handlePause);\r\n            this.currentAudioElement = null;\r\n          }\r\n          this.currentPlayingAudio = null;\r\n          resolve();\r\n        }, 100);\r\n      } else {\r\n        this.currentPlayingAudio = null;\r\n        resolve();\r\n      }\r\n    });\r\n  }\r\n\r\n  isAudioPlaying(audio: AudioRecordModel): boolean {\r\n    return !!this.currentPlayingAudio?.id &&\r\n      this.currentPlayingAudio.id === audio.id &&\r\n      !!this.currentAudioElement &&\r\n      !this.currentAudioElement.paused;\r\n  }\r\n\r\n  modalRemoveAudio(audio: AudioRecordModel) {\r\n    // Verificar se o áudio ainda existe na lista antes de definir para remoção\r\n    const audioExists = this.audioRecords.find(record => record.id === audio.id);\r\n    if (audioExists) {\r\n      this.audioRemove = audio;\r\n      this.modalDeleteItem?.open();\r\n    }\r\n  }\r\n\r\n  async removeAudio() {\r\n    //Criar um time antes de iniciar o processo de remoção\r\n    await new Promise(resolve => setTimeout(resolve, 1000));\r\n\r\n    if (!this.audioRemove || this.audioRemove === null) {\r\n      return;\r\n    }\r\n\r\n    // Parar o áudio se estiver sendo reproduzido e aguardar\r\n    if (this.currentPlayingAudio?.id === this.audioRemove.id) {\r\n      await this.stopCurrentAudio();\r\n\r\n      // Aguardar um pequeno delay para garantir que o áudio foi completamente parado\r\n      await new Promise(resolve => setTimeout(resolve, 50));\r\n    }\r\n\r\n    // Verificar novamente se o áudio ainda existe (dupla verificação)\r\n    const audioStillExists = this.audioRecords.find(record => record.id === this.audioRemove!.id);\r\n    if (!audioStillExists) {\r\n      this.audioRemove = null;\r\n      this.modalDeleteItem?.close();\r\n      return;\r\n    }\r\n\r\n    try {\r\n      // Revogar URL do blob\r\n      URL.revokeObjectURL(this.audioRemove.url);\r\n\r\n      // Filtrar e atualizar a lista\r\n      this.audioRecords = this.audioRecords.filter(record => record.id !== this.audioRemove!.id);\r\n\r\n      // Emitir o array atualizado\r\n      this.sendSelectedAudios();\r\n\r\n      // Mostrar notificação de sucesso\r\n      this.poNotification.success({\r\n        message: 'Áudio removido com sucesso!',\r\n        duration: 2000\r\n      });\r\n\r\n    } catch (error) {\r\n      console.error('Erro ao remover áudio:', error);\r\n      this.poNotification.error({\r\n        message: 'Erro ao remover áudio. Tente novamente.',\r\n        duration: 3000\r\n      });\r\n    } finally {\r\n      // Sempre limpar a referência e fechar modal\r\n      this.audioRemove = null;\r\n      this.modalDeleteItem?.close();\r\n    }\r\n  }\r\n\r\n  selectAudio(audio: AudioRecordModel) {\r\n    audio.selected = !audio.selected;\r\n    this.sendSelectedAudios();\r\n  }\r\n\r\n  sendSelectedAudios() {\r\n    // Criar uma cópia do array para evitar problemas de referência\r\n    const audiosCopy = [...this.audioRecords];\r\n    this.selectedAudiosEvent.emit(audiosCopy);\r\n  }\r\n\r\n  generateId(): string {\r\n    return AudioUtils.generateAudioId();\r\n  }\r\n\r\n  // Métodos para controlar o tooltip mobile\r\n  toggleTooltip(): void {\r\n    this.showTooltip = !this.showTooltip;\r\n  }\r\n\r\n  hideTooltip(): void {\r\n    this.showTooltip = false;\r\n  }\r\n}","@if(!loading && !isProcessing) {\n<div class=\"captura-voz-container\">\n    <div class=\"captura-voz-header\">\n        <strong>Captura de voz</strong>\n        <button class=\"info-tooltip-mobile\" \n                (click)=\"toggleTooltip()\" \n                [attr.aria-label]=\"'Informações sobre captura de voz'\"\n                type=\"button\">\n            <i class=\"po-icon po-icon-info\"></i>\n        </button>\n    </div>\n    <div class=\"captura-voz-desc\">\n        Quando estiver pronto para gravar, pressione \"gravar voz\" e comece a falar. Caso já tenha o áudio no seu dispositivo, pressione \"Fazer upload\".\n    </div>\n    \n    <!-- Tooltip para mobile -->\n    <div class=\"mobile-tooltip\" \n         [class.show]=\"showTooltip\" \n         (click)=\"hideTooltip()\"\n         (keydown.escape)=\"hideTooltip()\">\n        <div class=\"tooltip-content\" \n             (click)=\"$event.stopPropagation()\"\n             (keydown)=\"$event.stopPropagation()\">\n            <div class=\"tooltip-header\">\n                <span>Como usar</span>\n                <button class=\"tooltip-close\" (click)=\"hideTooltip()\" type=\"button\">\n                    <i class=\"po-icon po-icon-close\"></i>\n                </button>\n            </div>\n            <div class=\"tooltip-text\">\n                Quando estiver pronto para gravar, pressione \"gravar voz\" e comece a falar. Caso já tenha o áudio no seu dispositivo, pressione \"Fazer upload\".\n            </div>\n        </div>\n    </div>\n\n    <app-audio-waves \n        (recordingComplete)=\"onRecordingComplete($event.blob, $event.hash)\"\n        (recordingCancelled)=\"onRecordingCancelled()\">\n    </app-audio-waves>\n\n    <div class=\"recording-buttons\">        \n        <po-button \n            id=\"btn-upload\"\n            class=\"po-xl-6 po-lg-6 po-md-6 po-sm-12\" \n            p-label=\"Fazer upload\" \n            p-kind=\"secondary\" \n            p-icon=\"po-icon-upload\"\n            [p-disabled]=\"isRecording\"\n            (p-click)=\"startUpload()\">\n        </po-button>\n        <po-button \n            id=\"btn-record\"\n            class=\"po-xl-6 po-lg-6 po-md-6 po-sm-12\" \n            [p-label]=\"isRecording ? 'Parar gravação' : 'Gravar voz'\" \n            p-kind=\"secondary\" \n            [p-icon]=\"isRecording ? 'an an-stop' : 'an an-radio-button'\"\n            (p-click)=\"toggleRecording()\">\n        </po-button>\n    </div>\n\n    <!-- Lista de áudios gravados -->\n    <div class=\"audio-list-container\" *ngIf=\"audioRecords.length > 0\">\n        <div class=\"audio-list-header\">\n            <h3>Áudios Gravados</h3>\n            \n            <!-- Botão para deletar múltiplos áudios -->\n            <div class=\"bulk-actions\" *ngIf=\"getSelectedAudios().length >= 1\">\n                <po-button \n                    [p-label]=\"'Excluir Selecionados (' + getSelectedAudios().length + ')'\"\n                    p-kind=\"primary\"\n                    p-danger=\"true\"\n                    p-icon=\"po-icon po-icon-delete\"\n                    (p-click)=\"modalRemoveMultipleAudios()\">\n                </po-button>\n            </div>\n        </div>\n        \n        <div class=\"audio-list\">\n            <div class=\"audio-item\" *ngFor=\"let audio of audioRecords\">\n                <div class=\"audio-checkbox\">\n                    <input type=\"checkbox\" \n                           [checked]=\"audio.selected\"\n                           (change)=\"toggleAudioSelection(audio)\"\n                           [id]=\"audio.id\" />\n                </div>\n                <div class=\"audio-details\">\n                    <div class=\"audio-name\">{{ audio.name }}</div>\n                    <div class=\"audio-info\">\n                        <span class=\"an an-waveform\">{{ audio.duration }}</span>\n                        <span class=\"an an-timer\">{{ audio.timestamp | date:'dd/MM/yyyy HH:mm' }}</span>\n                    </div>\n                </div>\n                <div class=\"audio-actions\">\n                    <po-button \n                        p-kind=\"tertiary\"\n                        p-size=\"small\"\n                        [p-label]=\"isAudioPlaying(audio) ? 'Pausar' : 'Reproduzir'\"\n                        [p-icon]=\"isAudioPlaying(audio) ? 'an an-pause' : 'an an-play'\"\n                        (p-click)=\"playAudio(audio)\">\n                    </po-button>\n                    <po-button \n                        p-kind=\"tertiary\"\n                        p-size=\"small\"\n                        p-label=\"Excluir\"\n                        p-icon=\"po-icon po-icon-delete\"\n                        p-danger=\"true\"\n                        (p-click)=\"modalRemoveAudio(audio)\">\n                    </po-button>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n}\n@else if (isProcessing) {\n    <div class=\"sample-container\">\n        <po-loading-overlay [p-screen-lock]=\"isProcessing\" p-text=\"Processando áudio\"></po-loading-overlay>\n    </div>\n}\n@else {\n    <div class=\"sample-container\">\n        <po-loading-overlay [p-screen-lock]=\"loading\" p-text=\"Processando os áudios\"></po-loading-overlay>\n    </div>\n}\n\n<!-- Modal para excluir um único áudio -->\n<po-modal #modalDeteteItem p-title=\"Excluir Audio gravado?\">\n    <p>Tem certeza que deseja excluir o áudio? Esta ação não poderá ser desfeita.</p>\n    <po-modal-footer>\n      <po-button p-label=\"Cancelar\" p-kind=\"secondary\" (p-click)=\"modalDeteteItem.close()\"></po-button>\n      <po-button p-label=\"Excluir audio\" p-kind=\"primary\" p-danger=\"true\" (p-click)=\"removeAudio();\"></po-button>\n    </po-modal-footer>\n</po-modal>\n\n<!-- Modal para excluir múltiplos áudios -->\n<po-modal #modalDeleteMultipleItems p-title=\"Excluir Áudios Selecionados?\">\n    <p [innerHTML]=\"'Tem certeza que deseja excluir ' + getSelectedAudios().length + ' áudios selecionados? Esta ação não poderá ser desfeita.'\"></p>\n    <po-modal-footer>\n      <po-button p-label=\"Cancelar\" p-kind=\"secondary\" (p-click)=\"modalDeleteMultipleItems?.close()\"></po-button>\n      <po-button p-label=\"Excluir Todos\" p-kind=\"primary\" p-danger=\"true\" (p-click)=\"removeMultipleAudios();\"></po-button>\n    </po-modal-footer>\n</po-modal>\n","export const environment = {\r\n  production: false,\r\n   api: {\r\n    dtaAuth: {\r\n      baseUrl: 'https://auth.dta.totvs.io/api/productKey/auth',\r\n      endpoints: {\r\n        token: '/token',\r\n        refreshToken: '/refresh-token'\r\n      }\r\n    }\r\n  },\r\n  apiUrl: 'https://voice.dta.totvs.io',\r\n  signalrUrl: 'https://voice.dta.totvs.io/voiceHub',\r\n  apiAuth: 'https://auth.dta.totvs.io/api/productKey/auth/token',\r\n  apiAuthRefresh: 'https://auth.dta.totvs.io/api/productKey/auth/refresh-token',\r\n  webApp: 'https://voicewebapp.dta.totvs.io/#/dta/app',\r\n};\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable, of, BehaviorSubject } from \"rxjs\";\r\nimport { map, catchError } from \"rxjs/operators\";\r\nimport { environment } from \"../../../environments/environment\";\r\n\r\nconst TOKEN_URL = environment.apiAuth;\r\nconst REFRESH_URL = environment.apiAuthRefresh;\r\n\r\ninterface TokenPayload {\r\n  exp: number;\r\n  [key: string]: any;\r\n}\r\n\r\ninterface Credentials {\r\n  totvsId: string;\r\n  projectId: string;\r\n  user: string;\r\n  contingency: string;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class JwtAuthApi {\r\n  private readonly tokenSubject = new BehaviorSubject<{\r\n    credentials: Credentials,\r\n    token: string\r\n  } | null>(null);\r\n\r\n  constructor(private readonly http: HttpClient) { }\r\n\r\n  getValidToken(credentials: Credentials): Observable<string> {\r\n    const cache = this.tokenSubject.value;\r\n    if (cache && this.isSameCredentials(credentials, cache.credentials) && !this.isTokenExpiring(cache.token)) {\r\n      return of(cache.token);\r\n    }\r\n\r\n    if (cache && this.isSameCredentials(credentials, cache.credentials) && this.isTokenExpiring(cache.token)) {\r\n      return this.refreshToken(cache.token).pipe(\r\n        map(token => {\r\n          this.tokenSubject.next({ credentials, token });\r\n          return token;\r\n        }),\r\n        catchError(() => {\r\n          return this.createToken(credentials).pipe(\r\n            map(token => {\r\n              this.tokenSubject.next({ credentials, token });\r\n              return token;\r\n            })\r\n          );\r\n        })\r\n      );\r\n    }\r\n\r\n    return this.createToken(credentials).pipe(\r\n      map(token => {\r\n        this.tokenSubject.next({ credentials, token });\r\n        return token;\r\n      })\r\n    );\r\n  }\r\n\r\n  private isSameCredentials(a: Credentials, b: Credentials): boolean {\r\n    return (\r\n      a.totvsId === b.totvsId &&\r\n      a.projectId === b.projectId &&\r\n      a.user === b.user &&\r\n      a.contingency === b.contingency\r\n    );\r\n  }\r\n\r\n  private createToken(credentials: Credentials): Observable<string> {\r\n    return this.http.post<{ token: string }>(TOKEN_URL, credentials)\r\n      .pipe(map(resp => resp.token));\r\n  }\r\n\r\n  private refreshToken(token: string): Observable<string> {\r\n    const headers = new HttpHeaders().set('Authorization', `Bearer ${token}`);\r\n    return this.http.post<{ token: string }>(REFRESH_URL, {}, { headers })\r\n      .pipe(map(resp => resp.token));\r\n  }\r\n\r\n  private decodeJwt(token: string): TokenPayload | null {\r\n    try {\r\n      const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\r\n      const jsonPayload = decodeURIComponent(atob(base64)\r\n        .split('')\r\n        .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\r\n        .join(''));\r\n      return JSON.parse(jsonPayload);\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private isTokenExpiring(token: string, rangeSeconds = 60): boolean {\r\n    const payload = this.decodeJwt(token);\r\n    if (!payload?.exp) return true;\r\n    const nowSec = Math.floor(Date.now() / 1000);\r\n    return (payload.exp - nowSec) < rangeSeconds;\r\n  }\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { HubConnection, HubConnectionBuilder, HubConnectionState, LogLevel } from '@microsoft/signalr';\r\nimport { BehaviorSubject, Subject, firstValueFrom } from 'rxjs';\r\nimport { JwtAuthApi } from '../https/jwt-auth.api';\r\n\r\ninterface Credentials {\r\n  totvsId: string;\r\n  projectId: string;\r\n  user: string;\r\n  contingency: string;\r\n}\r\n\r\nexport enum ConnectionState {\r\n  Disconnected = 'Disconnected',\r\n  Connecting = 'Connecting',\r\n  Connected = 'Connected',\r\n  Reconnecting = 'Reconnecting'\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SignalRConnectionService implements OnDestroy {\r\n  private hubConnection: HubConnection | null = null;\r\n  private readonly connectionState = new BehaviorSubject<ConnectionState>(ConnectionState.Disconnected);\r\n  private readonly messageSubject = new Subject<any>();\r\n  private readonly receiveMessageSubject = new Subject<any>();\r\n  private readonly initialProcessSubject = new Subject<boolean>();\r\n  private readonly sessionClosedSubject = new Subject<string>(); // Novo: para notificar quando sessão é fechada\r\n  private readonly openAppSubject = new Subject<void>(); // Novo: para notificar quando app foi aberto no celular\r\n  private credentials: Credentials | null = null;\r\n  private tokenCache: { token: string; timestamp: number } | null = null;\r\n  private tokenPromise: Promise<string> | null = null;\r\n  private connectionPromise: Promise<void> | null = null;\r\n  private currentHubUrl: string | null = null;\r\n  private currentSessionId: string | null = null;\r\n  private currentSignalRConnectionId: string | null = null;\r\n  private customJwtToken: string | null = null; // Novo: para armazenar JWT da rota\r\n\r\n  readonly connectionState$ = this.connectionState.asObservable();\r\n  readonly messages$ = this.messageSubject.asObservable();\r\n  readonly receiveMessage$ = this.receiveMessageSubject.asObservable();\r\n  readonly initialProcess$ = this.initialProcessSubject.asObservable();\r\n  readonly sessionClosed$ = this.sessionClosedSubject.asObservable(); // Novo: observável para sessão fechada\r\n  readonly openApp$ = this.openAppSubject.asObservable(); // Novo: observável para app aberto no celular\r\n\r\n  constructor(\r\n    private readonly jwtAuthApi: JwtAuthApi,\r\n  ) {}\r\n\r\n  /**\r\n   * Define um token JWT customizado para usar ao invés do token gerado pela API\r\n   * Útil quando o token vem da rota ou outras fontes\r\n   */\r\n  public setCustomJwtToken(token: string | null): void {\r\n    this.customJwtToken = token;\r\n    // Limpar cache para forçar uso do novo token\r\n    this.clearTokenCache();\r\n    console.log('[SignalR] Custom JWT token set:', token ? 'Token provided' : 'Token cleared');\r\n  }\r\n\r\n  /**\r\n   * Retorna o token JWT customizado se disponível\r\n   */\r\n  public getCustomJwtToken(): string | null {\r\n    return this.customJwtToken;\r\n  }\r\n\r\n  private async fetchToken(): Promise<string> {\r\n    // PRIMEIRO: Verificar se existe token JWT customizado (da rota)\r\n    if (this.customJwtToken) {\r\n      console.log('[SignalR] Using custom JWT token from route parameter');\r\n      return this.customJwtToken;\r\n    }\r\n\r\n    if (!this.credentials) return '';\r\n\r\n    // Se já existe uma promise em andamento, retorna a mesma\r\n    if (this.tokenPromise) {\r\n      return this.tokenPromise;\r\n    }\r\n\r\n    // Verifica se o token cached ainda é válido (5 minutos de cache)\r\n    if (this.tokenCache && (Date.now() - this.tokenCache.timestamp) < 300000) {\r\n      return this.tokenCache.token;\r\n    }\r\n\r\n    // Cria uma nova promise para buscar o token\r\n    this.tokenPromise = this.createTokenPromise();\r\n    \r\n    try {\r\n      const token = await this.tokenPromise;\r\n      // Cache o token\r\n      this.tokenCache = { token, timestamp: Date.now() };\r\n      return token;\r\n    } finally {\r\n      // Limpa a promise depois de completada\r\n      this.tokenPromise = null;\r\n    }\r\n  }\r\n\r\n  private async createTokenPromise(): Promise<string> {\r\n    if (!this.credentials) return '';\r\n    return await firstValueFrom(this.jwtAuthApi.getValidToken(this.credentials));\r\n  }\r\n\r\n  async connect(hubUrl: string, credentials: Credentials): Promise<void> {\r\n    // Se já está conectado com as mesmas credenciais e URL, não reconectar\r\n    if (this.hubConnection?.state === HubConnectionState.Connected && \r\n        this.credentials && this.isSameCredentials(credentials, this.credentials) &&\r\n        this.currentHubUrl === hubUrl) {\r\n      console.log('SignalR already connected with same credentials and URL');\r\n      return;\r\n    }\r\n\r\n    // Se já existe uma promise de conexão em andamento, retorna a mesma\r\n    if (this.connectionPromise) {\r\n      console.log('SignalR connection already in progress, returning existing promise');\r\n      return this.connectionPromise;\r\n    }\r\n\r\n    // Se está conectado mas com credenciais ou URL diferentes, desconectar primeiro\r\n    if (this.hubConnection?.state === HubConnectionState.Connected) {\r\n      console.log('SignalR reconnecting with different credentials or URL');\r\n      await this.disconnect();\r\n    }\r\n\r\n    // Criar uma única promise de conexão\r\n    this.connectionPromise = this.createConnectionPromise(hubUrl, credentials);\r\n    \r\n    try {\r\n      await this.connectionPromise;\r\n    } finally {\r\n      // Limpar a promise depois de completada (sucesso ou erro)\r\n      this.connectionPromise = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Conecta ao SignalR e chama RegisterSession (método simplificado)\r\n   * O RegisterSession já cria a sessão internamente\r\n   */\r\n  async connectAndRegisterSession(hubUrl: string, credentials: Credentials, jsonData: string, context: string): Promise<{ sessionId: string; connectionId: string }> {\r\n    try {\r\n      console.log('Connecting to SignalR and registering session...');\r\n      \r\n      // Conecta ao SignalR\r\n      await this.connect(hubUrl, credentials);\r\n\r\n      // Chama RegisterSession que já cria a sessão internamente\r\n      console.log('Calling RegisterSession with jsonData and context');\r\n      const result = await this.hubConnection!.invoke('RegisterSession', jsonData, context);\r\n      \r\n      // Debug: Log da estrutura do resultado\r\n      console.log('RegisterSession result structure:', result);\r\n      console.log('RegisterSession result type:', typeof result);\r\n      console.log('RegisterSession result keys:', Object.keys(result || {}));\r\n      \r\n      // O resultado deve conter sessionId e connectionId\r\n      const sessionId = result.sessionId || result.SessionId || result;\r\n      const connectionId = result.connectionId || result.ConnectionId || this.hubConnection!.connectionId;\r\n\r\n      // Armazena os IDs para uso posterior\r\n      this.currentSessionId = sessionId;\r\n      this.currentSignalRConnectionId = connectionId;\r\n\r\n      console.log('SignalR session registered successfully:', {\r\n        sessionId: sessionId,\r\n        connectionId: connectionId\r\n      });\r\n      \r\n      // Debug: Log dos valores extraídos\r\n      console.log('Extracted sessionId:', sessionId, 'type:', typeof sessionId);\r\n      console.log('Extracted connectionId:', connectionId, 'type:', typeof connectionId);\r\n\r\n      return {\r\n        sessionId: sessionId,\r\n        connectionId: connectionId\r\n      };\r\n    } catch (error) {\r\n      console.error('Error in connectAndRegisterSession:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Registra a sessão no Hub SignalR\r\n   */\r\n  async registerSession(sessionId: string, jsonData: string, context: string): Promise<string> {\r\n    if (this.hubConnection?.state !== HubConnectionState.Connected) {\r\n      throw new Error('SignalR connection is not established');\r\n    }\r\n\r\n    try {\r\n      const connectionId = await this.hubConnection.invoke('RegisterSession', sessionId, jsonData, context);\r\n      console.log('Session registered with connectionId:', connectionId);\r\n      return connectionId;\r\n    } catch (error) {\r\n      console.error('Error registering session:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  private async createConnectionPromise(hubUrl: string, credentials: Credentials): Promise<void> {\r\n    this.credentials = credentials;\r\n    this.currentHubUrl = hubUrl;\r\n    this.connectionState.next(ConnectionState.Connecting);\r\n\r\n    try {\r\n      this.hubConnection = new HubConnectionBuilder()\r\n        .withUrl(hubUrl, {\r\n          accessTokenFactory: () => this.fetchToken(),\r\n          withCredentials: false // <--- importante\r\n        })\r\n        // .withAutomaticReconnect({\r\n        //   nextRetryDelayInMilliseconds: retryContext => {\r\n        //     // Exponential backoff: 0s, 2s, 10s, 30s\r\n        //     const delays = [0, 2000, 10000, 30000];\r\n        //     return delays[retryContext.previousRetryCount] || 30000;\r\n        //   }\r\n        // })\r\n        .configureLogging(LogLevel.Information)\r\n        .build();\r\n\r\n      this.setupConnectionEvents();\r\n\r\n      await this.hubConnection.start();\r\n      this.connectionState.next(ConnectionState.Connected);\r\n      console.log('SignalR connected successfully');\r\n    } catch (error) {\r\n      console.error('SignalR connection failed:', error);\r\n      this.connectionState.next(ConnectionState.Disconnected);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  private isSameCredentials(a: Credentials, b: Credentials): boolean {\r\n    return (\r\n      a.totvsId === b.totvsId &&\r\n      a.projectId === b.projectId &&\r\n      a.user === b.user &&\r\n      a.contingency === b.contingency\r\n    );\r\n  }\r\n\r\n  async disconnect(): Promise<void> {\r\n    if (this.hubConnection) {\r\n      await this.hubConnection.stop();\r\n      this.hubConnection = null;\r\n      this.connectionState.next(ConnectionState.Disconnected);\r\n      console.log('SignalR disconnected');\r\n    }\r\n    // Limpar o cache de token ao desconectar\r\n    this.clearTokenCache();\r\n    // Limpar a promise de conexão\r\n    this.connectionPromise = null;\r\n    this.currentHubUrl = null;\r\n    this.currentSessionId = null;\r\n    this.currentSignalRConnectionId = null;\r\n    // Limpar token customizado\r\n    this.customJwtToken = null;\r\n  }\r\n\r\n  private clearTokenCache(): void {\r\n    this.tokenCache = null;\r\n    this.tokenPromise = null;\r\n  }\r\n\r\n  async sendMessage(methodName: string, ...args: any[]): Promise<void> {\r\n    if (this.hubConnection?.state !== HubConnectionState.Connected) {\r\n      throw new Error('SignalR connection is not established');\r\n    }\r\n\r\n    try {\r\n      await this.hubConnection.invoke(methodName, ...args);\r\n    } catch (error) {\r\n      console.error('Error sending SignalR message:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  onMessage(methodName: string, callback: (...args: any[]) => void): void {\r\n    if (this.hubConnection) {\r\n      this.hubConnection.on(methodName, callback);\r\n    }\r\n  }\r\n\r\n  offMessage(methodName: string): void {\r\n    if (this.hubConnection) {\r\n      this.hubConnection.off(methodName);\r\n    }\r\n  }\r\n\r\n  private setupConnectionEvents(): void {\r\n    if (!this.hubConnection) return;\r\n\r\n    this.hubConnection.onreconnecting(() => {\r\n      this.connectionState.next(ConnectionState.Reconnecting);\r\n      console.log('SignalR reconnecting...');\r\n    });\r\n\r\n    this.hubConnection.onreconnected((connectionId) => {\r\n      this.connectionState.next(ConnectionState.Connected);\r\n      console.log('SignalR reconnected:', connectionId);\r\n      // Não precisa renovar o token aqui: o accessTokenFactory é chamado novamente.\r\n    });\r\n\r\n    this.hubConnection.onclose((error) => {\r\n      this.connectionState.next(ConnectionState.Disconnected);\r\n      if (error) {\r\n        console.error('SignalR connection closed with error:', error);\r\n        // Se a conexão foi fechada devido ao OnDisconnectedAsync do servidor,\r\n        // notificar que a sessão foi fechada\r\n        if (this.currentSessionId) {\r\n          console.log('Session closed by server, notifying components...');\r\n          this.sessionClosedSubject.next(this.currentSessionId);\r\n        }\r\n      } else {\r\n        console.log('SignalR connection closed');\r\n      }\r\n    });\r\n\r\n    // Configurar listener para ReceiveMessage\r\n    this.hubConnection.on('ReceiveMessage', (message: any) => {\r\n      console.log('SignalR ReceiveMessage received:', message);\r\n      this.receiveMessageSubject.next(message);\r\n    });\r\n\r\n    // Configurar listener para InitialProcess\r\n    this.hubConnection.on('InitialProcess', (isProcessing: boolean) => {\r\n      console.log('SignalR InitialProcess received:', isProcessing);\r\n      this.initialProcessSubject.next(isProcessing);\r\n    });\r\n\r\n    // Novo: Configurar listener para CloseSession (enviado pelo servidor)\r\n    this.hubConnection.on('CloseSession', (sessionId: string) => {\r\n      console.log('SignalR CloseSession received for sessionId:', sessionId);\r\n      this.sessionClosedSubject.next(sessionId);\r\n    });\r\n\r\n    // Novo: Configurar listener para OpenApp (enviado pelo servidor)\r\n    this.hubConnection.on('OpenApp', () => {\r\n      console.log('SignalR OpenApp received - App foi aberto no celular');\r\n      this.openAppSubject.next();\r\n    });\r\n  }\r\n\r\n  get isConnected(): boolean {\r\n    return this.hubConnection?.state === HubConnectionState.Connected;\r\n  }\r\n\r\n  get currentState(): ConnectionState {\r\n    return this.connectionState.value;\r\n  }\r\n\r\n  get sessionId(): string | null {\r\n    return this.currentSessionId;\r\n  }\r\n\r\n  get signalRConnectionId(): string | null {\r\n    return this.currentSignalRConnectionId;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.disconnect();\r\n    this.connectionState.complete();\r\n    this.messageSubject.complete();\r\n    this.receiveMessageSubject.complete();\r\n    this.initialProcessSubject.complete();\r\n    this.sessionClosedSubject.complete(); // Novo: limpar o subject da sessão fechada\r\n    this.openAppSubject.complete(); // Novo: limpar o subject do app aberto\r\n  }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { environment } from \"../../../environments/environment\";\r\nimport { AudioProcessResponse } from \"../../shared/models/signalr-dto.model\";\r\n\r\n@Injectable({\r\n    providedIn: 'root',\r\n})\r\nexport class AudioApi {\r\n    private readonly host: string = environment.apiUrl;\r\n    private readonly audioEndpoint = 'api/voice';\r\n\r\n    constructor(private readonly http: HttpClient) { }\r\n\r\n    // Audio Processing Methods\r\n\r\n    /**\r\n     * Processa áudio com arquivos enviados via FormData - autenticação via SessionId\r\n     */\r\n    processAudioForSession(sessionId: string, audioFiles: File[]): Observable<AudioProcessResponse> {\r\n        const formData = new FormData();\r\n        \r\n        // Adiciona os arquivos de áudio ao FormData\r\n        audioFiles.forEach((file, index) => {\r\n            formData.append('audioFiles', file, file.name + \" \" + index);\r\n        });\r\n\r\n        const headers = new HttpHeaders()\r\n            .set('sessionId', sessionId);\r\n\r\n        return this.http.post<AudioProcessResponse>(`${this.host}/${this.audioEndpoint}/process`, formData, { headers });\r\n    }\r\n\r\n    /**\r\n     * Notifica que o aplicativo foi aberto no celular - enviando sessionId via header\r\n     */\r\n    notifyAppOpened(sessionId: string): Observable<any> {\r\n        const headers = new HttpHeaders()\r\n            .set('sessionId', sessionId);\r\n\r\n        return this.http.get(`${this.host}/${this.audioEndpoint}/open/app`, { headers });\r\n    }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable, switchMap } from \"rxjs\";\r\nimport { AudioRequestModel, JsonReturnAiModel } from \"../../shared/models\";\r\nimport { JwtAuthApi } from \"./jwt-auth.api\";\r\nimport { environment } from \"../../../environments/environment\";\r\n\r\n@Injectable({\r\n    providedIn: 'root',\r\n})\r\nexport class SendAudiosTracksApi {\r\n    private readonly host: string = environment.apiUrl;\r\n    private readonly endpoint = 'api/voice/audioTotext';\r\n\r\n    constructor(private readonly http: HttpClient, private readonly jwtAuthApi: JwtAuthApi) { }\r\n\r\n    postAudiosTracks(formData: FormData, audioRequest: AudioRequestModel): Observable<JsonReturnAiModel> {\r\n        const credentials = {\r\n            totvsId: audioRequest.totvsId,\r\n            projectId: audioRequest.projectId,\r\n            user: audioRequest.user,\r\n            contingency: audioRequest.contingency\r\n        };\r\n        return this.jwtAuthApi.getValidToken(credentials).pipe(\r\n            switchMap(token => {\r\n                const headers = new HttpHeaders()\r\n                    .set('Authorization', `Bearer ${token}`);\r\n                return this.http.post<JsonReturnAiModel>(`${this.host}/${this.endpoint}`, formData, { headers });\r\n            })\r\n        );\r\n    }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { AudioRequestModel } from '../models';\r\nimport { AudioApi } from '../../core/https/audio-http';\r\nimport { SendAudiosTracksApi } from '../../core/https/send-audios-tracks.http';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SendAudiosTracksService {\r\n\r\n  constructor(private readonly audioApi: AudioApi, private readonly sendAudiosTracksApi: SendAudiosTracksApi) { }\r\n\r\n  sendAudiosSignalTracks(sessionId: string, audioRequest: AudioRequestModel): Observable<any> {\r\n    return this.audioApi.processAudioForSession(sessionId, audioRequest.audioFiles);\r\n  }\r\n\r\n  /**\r\n   * Notifica que o aplicativo foi aberto no celular\r\n   */\r\n  notifyAppOpened(sessionId: string): Observable<any> {\r\n    return this.audioApi.notifyAppOpened(sessionId);\r\n  }\r\n\r\n  sendAudiosTracks(audioRequest: AudioRequestModel): Observable<any> {\r\n    const formData = new FormData();\r\n\r\n    // Adiciona cada arquivo\r\n    audioRequest.audioFiles.forEach(audio => {\r\n      formData.append('audioFiles', audio, audio.name);\r\n      console.log('Added audio file:', audio.type);\r\n    });\r\n    console.log('Audio files added to FormData:', audioRequest.audioFiles);\r\n\r\n    const jsonString = JSON.stringify(audioRequest.jsonReturn);\r\n    formData.append('jsonReturn', jsonString);\r\n    formData.append('context', audioRequest.context);\r\n\r\n    // envia usando o outro service\r\n    return this.sendAudiosTracksApi.postAudiosTracks(formData, audioRequest);\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SignalRConnectionService } from '../web-socket/signal-r.service';\r\nimport { AudioRequestModel } from '../../shared/models';\r\nimport { environment } from '../../../environments/environment';\r\n\r\ninterface Credentials {\r\n  totvsId: string;\r\n  projectId: string;\r\n  user: string;\r\n  contingency: string;\r\n}\r\n\r\ninterface GlobalSessionConfig {\r\n  createSession: boolean;\r\n  sessionData?: {\r\n    jsonData?: string;\r\n    context?: string;\r\n  };\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SignalRInitializerService {\r\n   private static isGloballyInitialized = false;\r\n  private static globalInitializationPromise: Promise<void> | null = null;\r\n  private static globalSessionInfo: { sessionId: string; connectionId: string } | null = null;\r\n  private static autoReconnectCallbacks: (() => Promise<void>)[] = []; // Novo: callbacks para reconexão automática\r\n\r\n  constructor(private readonly signalRService: SignalRConnectionService) {\r\n    // Registrar listener para desconexões e tentar reconectar automaticamente\r\n    this.setupAutoReconnectListener();\r\n  }\r\n\r\n  async ensureGlobalConnection(credentials: Credentials, sessionConfig?: GlobalSessionConfig): Promise<void> {\r\n    // Se já foi inicializado globalmente, não fazer nada\r\n    if (SignalRInitializerService.isGloballyInitialized && this.signalRService.isConnected) {\r\n      console.log('[SignalRInitializer] Global connection already established');\r\n      return;\r\n    }\r\n\r\n    // Se já existe uma inicialização global em andamento, aguardar\r\n    if (SignalRInitializerService.globalInitializationPromise) {\r\n      console.log('[SignalRInitializer] Global initialization already in progress, waiting...');\r\n      return SignalRInitializerService.globalInitializationPromise;\r\n    }\r\n\r\n    // Criar uma única promise de inicialização global\r\n    SignalRInitializerService.globalInitializationPromise = this.performGlobalInitialization(credentials, sessionConfig);\r\n\r\n    try {\r\n      await SignalRInitializerService.globalInitializationPromise;\r\n    } catch (error) {\r\n      // Se falhar, permitir nova tentativa\r\n      SignalRInitializerService.isGloballyInitialized = false;\r\n      throw error;\r\n    } finally {\r\n      // Sempre limpar a promise após uso\r\n      SignalRInitializerService.globalInitializationPromise = null;\r\n    }\r\n  }\r\n\r\n  private async performGlobalInitialization(credentials: Credentials, sessionConfig?: GlobalSessionConfig): Promise<void> {\r\n    console.log('[SignalRInitializer] Starting GLOBAL SignalR initialization');\r\n    \r\n    try {\r\n      // Verificar se deve criar uma sessão durante a inicialização\r\n      if (sessionConfig?.createSession) {\r\n        console.log('[SignalRInitializer] Initializing with session creation');\r\n        \r\n        const audioRequest: AudioRequestModel = {\r\n          audioFiles: [],\r\n          context: sessionConfig.sessionData?.context || 'Global SignalR Session',\r\n          totvsId: credentials.totvsId,\r\n          projectId: credentials.projectId,\r\n          user: credentials.user,\r\n          contingency: credentials.contingency,\r\n          jsonReturn: []\r\n        };\r\n\r\n        const jsonData = sessionConfig.sessionData?.jsonData || JSON.stringify(audioRequest.jsonReturn);\r\n        const context = sessionConfig.sessionData?.context || 'Global SignalR Session';\r\n\r\n        // Usar o novo método simplificado que conecta e registra a sessão\r\n        const sessionInfo = await this.signalRService.connectAndRegisterSession(\r\n          environment.signalrUrl,\r\n          credentials,\r\n          jsonData,\r\n          context\r\n        );\r\n\r\n        SignalRInitializerService.globalSessionInfo = sessionInfo;\r\n        console.log('[SignalRInitializer] GLOBAL SignalR initialized with session:', sessionInfo);\r\n      } else {\r\n        // Conectar sem criar sessão (comportamento original)\r\n        await this.signalRService.connect(environment.signalrUrl, credentials);\r\n        console.log('[SignalRInitializer] GLOBAL SignalR initialized without session');\r\n      }\r\n\r\n      SignalRInitializerService.isGloballyInitialized = true;\r\n      console.log('[SignalRInitializer] GLOBAL SignalR initialized successfully');\r\n    } catch (error) {\r\n      console.error('[SignalRInitializer] Failed to initialize GLOBAL SignalR:', error);\r\n      SignalRInitializerService.isGloballyInitialized = false;\r\n      SignalRInitializerService.globalSessionInfo = null;\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  static resetGlobalState(): void {\r\n    SignalRInitializerService.isGloballyInitialized = false;\r\n    SignalRInitializerService.globalInitializationPromise = null;\r\n    SignalRInitializerService.globalSessionInfo = null;\r\n    SignalRInitializerService.clearAutoReconnectCallbacks(); // Limpar callbacks de reconexão\r\n  }\r\n\r\n  // Método para componentes verificarem se está conectado sem tentar conectar\r\n  isConnected(): boolean {\r\n    return SignalRInitializerService.isGloballyInitialized && this.signalRService.isConnected;\r\n  }\r\n\r\n  /**\r\n   * Método público para forçar reset do estado global\r\n   * Útil para garantir que uma nova sessão seja criada\r\n   */\r\n  public async forceResetGlobalState(): Promise<void> {\r\n    console.log('[SignalRInitializer] Forçando reset do estado global');\r\n    \r\n    // Desconectar SignalR se estiver conectado\r\n    if (this.signalRService.isConnected) {\r\n      console.log('[SignalRInitializer] Desconectando SignalR antes do reset');\r\n      await this.signalRService.disconnect();\r\n    }\r\n    \r\n    SignalRInitializerService.resetGlobalState();\r\n  }\r\n\r\n  /**\r\n   * Inicializa o SignalR globalmente com criação automática de sessão\r\n   */\r\n  async ensureGlobalConnectionWithSession(\r\n    credentials: Credentials, \r\n    sessionData?: { jsonData?: string; context?: string },\r\n    forceNewSession: boolean = false\r\n  ): Promise<{ sessionId: string; connectionId: string } | null> {\r\n    // Se forceNewSession for true, sempre criar uma nova sessão\r\n    if (!forceNewSession && this.isConnected() && SignalRInitializerService.globalSessionInfo) {\r\n      console.log('[SignalRInitializer] Already connected with session:', SignalRInitializerService.globalSessionInfo);\r\n      return SignalRInitializerService.globalSessionInfo;\r\n    }\r\n\r\n    // Forçar reset para garantir nova sessão\r\n    await this.forceResetGlobalState();\r\n\r\n    try {\r\n      console.log('[SignalRInitializer] Creating new SignalR connection with session');\r\n      \r\n      const jsonData = sessionData?.jsonData || JSON.stringify([]);\r\n      const context = sessionData?.context || 'Global SignalR Session';\r\n\r\n      // Usar o novo método simplificado\r\n      const sessionInfo = await this.signalRService.connectAndRegisterSession(\r\n        environment.signalrUrl,\r\n        credentials,\r\n        jsonData,\r\n        context\r\n      );\r\n\r\n      // Armazenar informações da sessão globalmente\r\n      SignalRInitializerService.globalSessionInfo = sessionInfo;\r\n      SignalRInitializerService.isGloballyInitialized = true;\r\n      \r\n      console.log('[SignalRInitializer] SignalR connection with session successful:', sessionInfo);\r\n      return sessionInfo;\r\n    } catch (error) {\r\n      console.error('[SignalRInitializer] Failed to connect with session:', error);\r\n      SignalRInitializerService.isGloballyInitialized = false;\r\n      SignalRInitializerService.globalSessionInfo = null;\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Inicializa o SignalR globalmente sem criar sessão (comportamento original)\r\n   */\r\n  async ensureGlobalConnectionOnly(credentials: Credentials): Promise<void> {\r\n    const sessionConfig: GlobalSessionConfig = {\r\n      createSession: false\r\n    };\r\n\r\n    await this.ensureGlobalConnection(credentials, sessionConfig);\r\n  }\r\n\r\n  /**\r\n   * Obtém informações da sessão global (se foi criada)\r\n   */\r\n  get globalSessionInfo(): { sessionId: string; connectionId: string } | null {\r\n    return SignalRInitializerService.globalSessionInfo;\r\n  }\r\n\r\n  /**\r\n   * Obtém o ID da sessão atual\r\n   */\r\n  get currentSessionId(): string | null {\r\n    return this.signalRService.sessionId;\r\n  }\r\n\r\n  /**\r\n   * Obtém o ID da conexão SignalR atual\r\n   */\r\n  get currentSignalRConnectionId(): string | null {\r\n    return this.signalRService.signalRConnectionId;\r\n  }\r\n\r\n  /**\r\n   * Configura listener para reconexão automática em caso de desconexão\r\n   */\r\n  private setupAutoReconnectListener(): void {\r\n    // Escutar quando a sessão é fechada pelo servidor\r\n    this.signalRService.sessionClosed$.subscribe({\r\n      next: async (closedSessionId: string) => {\r\n        console.log('[SignalRInitializer] Sessão fechada detectada:', closedSessionId);\r\n        \r\n        // Executar todos os callbacks de reconexão registrados\r\n        for (const callback of SignalRInitializerService.autoReconnectCallbacks) {\r\n          try {\r\n            await callback();\r\n          } catch (error) {\r\n            console.error('[SignalRInitializer] Erro ao executar callback de reconexão:', error);\r\n          }\r\n        }\r\n      },\r\n      error: (error) => {\r\n        console.error('[SignalRInitializer] Erro no listener de sessão fechada:', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Registra um callback para ser executado quando uma reconexão automática for necessária\r\n   */\r\n  public registerAutoReconnectCallback(callback: () => Promise<void>): void {\r\n    SignalRInitializerService.autoReconnectCallbacks.push(callback);\r\n  }\r\n\r\n  /**\r\n   * Remove um callback de reconexão automática\r\n   */\r\n  public unregisterAutoReconnectCallback(callback: () => Promise<void>): void {\r\n    const index = SignalRInitializerService.autoReconnectCallbacks.indexOf(callback);\r\n    if (index > -1) {\r\n      SignalRInitializerService.autoReconnectCallbacks.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Limpa todos os callbacks de reconexão automática\r\n   */\r\n  public static clearAutoReconnectCallbacks(): void {\r\n    SignalRInitializerService.autoReconnectCallbacks = [];\r\n  }\r\n}\r\n","import { EventEmitter, Input, Output, OnInit, OnDestroy, Directive, ChangeDetectorRef } from '@angular/core';\r\nimport { AudioJsonModel, AudioRecordModel, AudioRequestModel, JsonReturnAiModel } from '../shared/models';\r\nimport { AudioUtils } from './audio-utils';\r\nimport { Subscription } from 'rxjs';\r\nimport { SignalRInitializerService } from '../core/services/signalr-initializer.service';\r\nimport { ConnectionState, SignalRConnectionService } from '../core/web-socket/signal-r.service';\r\nimport { SendAudiosTracksService } from './services';\r\n\r\n\r\n@Directive()\r\nexport abstract class BaseVoiceCaptureComponent implements OnInit, OnDestroy {\r\n  startRecord = false;\r\n  selectedAudios: AudioRecordModel[] = [];\r\n  audioProcessingFinished = false;\r\n  loading = false;\r\n  private receiveMessageSubscription?: Subscription;\r\n  private initialProcessSubscription?: Subscription;\r\n  private responseTimeout?: any;\r\n\r\n  @Input() public enableTour: boolean = false;\r\n  @Input() public labelHeader: string = '';\r\n  @Input() public context: string = '';\r\n  @Input() public totvsId: string = '';\r\n  @Input() public projectId: string = '';\r\n  @Input() public user: string = '';\r\n  @Input() public contingency: string = '';\r\n  @Input() jsonReturn: AudioJsonModel[] = [];\r\n  @Input() welcomeTitle: string = '';\r\n  @Input() welcomeDescription: string = '';\r\n  @Input() welcomeFeatures: string = '';\r\n\r\n  @Output() informacaoEnviada = new EventEmitter<{\r\n    message: JsonReturnAiModel,\r\n    uniqueKey: number\r\n  }>();\r\n\r\n  constructor(\r\n    protected readonly sendAudiosTracks: SendAudiosTracksService,\r\n    protected readonly signalRService: SignalRConnectionService,\r\n    private readonly signalRInitializer: SignalRInitializerService,\r\n    protected readonly cdr: ChangeDetectorRef\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    this.resetState();\r\n    this.startRecord = localStorage.getItem('hideWelcomeMessage') === 'true';\r\n\r\n    // Não inicializar SignalR automaticamente - será feito sob demanda\r\n    // this.initializeSignalROnce();\r\n    \r\n    // Configurar listeners apenas se já conectado, senão configurar após conexão\r\n    this.setupSignalRListeners();\r\n  }\r\n\r\n  private setupSignalRListeners(): void {\r\n    if (this.signalRService.isConnected) {\r\n      console.log(`[${this.constructor.name}] SignalR já conectado, configurando listeners`);\r\n      this.setupReceiveMessageListener();\r\n      this.setupInitialProcessListener();\r\n    } else {\r\n      console.log(`[${this.constructor.name}] SignalR não conectado ainda, aguardando conexão`);\r\n      // Escutar mudanças no estado da conexão\r\n      const connectionSubscription = this.signalRService.connectionState$.subscribe(state => {\r\n        if (state === ConnectionState.Connected) {\r\n          console.log(`[${this.constructor.name}] SignalR conectado, configurando listeners`);\r\n          this.setupReceiveMessageListener();\r\n          this.setupInitialProcessListener();\r\n          connectionSubscription.unsubscribe();\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Método que pode ser sobrescrito por componentes filhos para fornecer sessionId da rota\r\n   */\r\n  protected getSessionIdForInitialization(): string | undefined {\r\n    return undefined;\r\n  }\r\n\r\n  private setupReceiveMessageListener(): void {\r\n    if (this.receiveMessageSubscription) {\r\n      console.log(`[${this.constructor.name}] ReceiveMessage listener já configurado, pulando`);\r\n      return;\r\n    }\r\n    \r\n    console.log(`[${this.constructor.name}] Setting up ReceiveMessage listener`);\r\n    \r\n    this.receiveMessageSubscription = this.signalRService.receiveMessage$.subscribe({\r\n      next: (message: any) => {\r\n        console.log(`[${this.constructor.name}] ReceiveMessage received:`, message);\r\n        this.handleReceiveMessage(message);\r\n      },\r\n      error: (error) => {\r\n        console.error(`[${this.constructor.name}] Error in ReceiveMessage subscription:`, error);\r\n        this.loading = false;\r\n      }\r\n    });\r\n    \r\n    console.log(`[${this.constructor.name}] ReceiveMessage listener configured`);\r\n  }\r\n\r\n  private setupInitialProcessListener(): void {\r\n    if (this.initialProcessSubscription) {\r\n      console.log(`[${this.constructor.name}] InitialProcess listener já configurado, pulando`);\r\n      return;\r\n    }\r\n    \r\n    console.log(`[${this.constructor.name}] Setting up InitialProcess listener`);\r\n    \r\n    this.initialProcessSubscription = this.signalRService.initialProcess$.subscribe({\r\n      next: (isProcessing: boolean) => {\r\n        console.log(`[${this.constructor.name}] InitialProcess received:`, isProcessing);\r\n        this.handleInitialProcess(isProcessing);\r\n      },\r\n      error: (error) => {\r\n        console.error(`[${this.constructor.name}] Error in InitialProcess subscription:`, error);\r\n      }\r\n    });\r\n    \r\n    console.log(`[${this.constructor.name}] InitialProcess listener configured`);\r\n  }\r\n\r\n  /**\r\n   * Método público para reconfigurar listeners SignalR\r\n   * Útil quando uma conexão SignalR é estabelecida posteriormente\r\n   */\r\n  public reconfigureSignalRListeners(): void {\r\n    console.log(`[${this.constructor.name}] Reconfigurando listeners SignalR`);\r\n    this.setupSignalRListeners();\r\n  }\r\n\r\n  protected handleInitialProcess(isProcessing: boolean): void {\r\n    console.log(`[${this.constructor.name}] Processing InitialProcess event: ${isProcessing}`);\r\n    console.log(`[${this.constructor.name}] Estado antes - loading: ${this.loading}, audioProcessingFinished: ${this.audioProcessingFinished}`);\r\n    \r\n    if (isProcessing) {\r\n      // Quando InitialProcess for true, definir loading como true\r\n      this.loading = true;\r\n      \r\n      // Forçar detecção de mudanças\r\n      this.cdr.detectChanges();\r\n      \r\n      console.log(`[${this.constructor.name}] Loading set to true due to InitialProcess`);\r\n      console.log(`[${this.constructor.name}] Estado depois - loading: ${this.loading}, audioProcessingFinished: ${this.audioProcessingFinished}`);\r\n    }\r\n    // Nota: Não definir loading = false aqui quando isProcessing for false\r\n    // O loading será controlado pela resposta final do ReceiveMessage\r\n  }\r\n\r\n  protected handleReceiveMessage(message: any): void {\r\n    try {\r\n      console.log(`[${this.constructor.name}] Processing ReceiveMessage:`, message);\r\n      console.log(`[${this.constructor.name}] Estado antes ReceiveMessage - loading: ${this.loading}, audioProcessingFinished: ${this.audioProcessingFinished}`);\r\n      \r\n      // Limpar timeout de segurança\r\n      if (this.responseTimeout) {\r\n        clearTimeout(this.responseTimeout);\r\n        this.responseTimeout = undefined;\r\n      }\r\n      \r\n      // Processar a mensagem recebida do SignalR\r\n      if (message && typeof message === 'object') {\r\n        const jsonReturnAiModel: JsonReturnAiModel = message;\r\n        \r\n        console.log(`[${this.constructor.name}] Emitting informacaoEnviada with data:`, jsonReturnAiModel);\r\n        \r\n        // Emitir a informação recebida\r\n        this.informacaoEnviada.emit({\r\n          message: jsonReturnAiModel,\r\n          uniqueKey: AudioUtils.generateUniqueKey()\r\n        });\r\n        \r\n        // Finalizar o processamento de áudio\r\n        this.audioProcessingFinished = true;\r\n        this.loading = false;\r\n        \r\n        // Forçar detecção de mudanças\r\n        this.cdr.detectChanges();\r\n        \r\n        console.log(`[${this.constructor.name}] Message processed successfully, audioProcessingFinished: ${this.audioProcessingFinished}, loading: ${this.loading}`);\r\n      } else {\r\n        console.warn(`[${this.constructor.name}] Invalid message format received:`, message);\r\n        this.loading = false;\r\n        this.cdr.detectChanges();\r\n        console.log(`[${this.constructor.name}] Loading set to false due to invalid message`);\r\n      }\r\n    } catch (error) {\r\n      console.error(`[${this.constructor.name}] Error processing ReceiveMessage:`, error);\r\n      this.loading = false;\r\n      this.cdr.detectChanges();\r\n      console.log(`[${this.constructor.name}] Loading set to false due to error`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Conecta ao SignalR sob demanda (método público)\r\n   */\r\n  public async connectToSignalR(): Promise<{ sessionId: string; connectionId: string } | null> {\r\n    try {\r\n      const sessionInfo = await this.initializeSignalROnce();\r\n      return sessionInfo;\r\n    } catch (error) {\r\n      console.error(`[${this.constructor.name}] Erro ao conectar SignalR sob demanda:`, error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Verifica se o SignalR está conectado\r\n   */\r\n  public isSignalRConnected(): boolean {\r\n    return this.signalRInitializer.isConnected();\r\n  }\r\n\r\n  private async initializeSignalROnce(): Promise<{ sessionId: string; connectionId: string } | null> {\r\n    // Log para debug\r\n    console.log(`[${this.constructor.name}] Checking if SignalR needs initialization`);\r\n    \r\n    const credentials = {\r\n      totvsId: this.totvsId,\r\n      projectId: this.projectId,\r\n      user: this.user,\r\n      contingency: this.contingency\r\n    };\r\n\r\n    try {\r\n      // Verificar se há sessionId fornecido pela rota\r\n      const routeSessionId = this.getSessionIdForInitialization();\r\n      \r\n      if (routeSessionId) {\r\n        // Usar sessionId da rota - não criar nova sessão\r\n        console.log(`[${this.constructor.name}] Using sessionId from route: ${routeSessionId}`);\r\n        \r\n        // Inicializar SignalR sem criar nova sessão\r\n        await this.signalRInitializer.ensureGlobalConnectionOnly(credentials);\r\n        \r\n        // Armazenar o sessionId da rota no sessionStorage\r\n        const sessionInfo = { sessionId: routeSessionId, connectionId: this.signalRInitializer.currentSignalRConnectionId || '' };\r\n        sessionStorage.setItem('signalRSession', JSON.stringify(sessionInfo));\r\n        \r\n        console.log(`[${this.constructor.name}] SignalR initialized with route sessionId:`, sessionInfo);\r\n        return sessionInfo;\r\n      } else {\r\n        // Inicializar com criação de sessão automática (comportamento original)\r\n        const sessionInfo: any = await this.signalRInitializer.ensureGlobalConnectionWithSession(\r\n          credentials,\r\n          {\r\n            jsonData: JSON.stringify(this.jsonReturn),\r\n            context: this.context || 'Base Voice Capture Component'\r\n          }\r\n        );\r\n\r\n        if (sessionInfo) {\r\n          console.log(`[${this.constructor.name}] SignalR initialized with new session:`, sessionInfo);\r\n          sessionStorage.setItem('signalRSession', JSON.stringify(sessionInfo));\r\n          return sessionInfo;\r\n        } else {\r\n          console.log(`[${this.constructor.name}] SignalR initialization completed (session already existed)`);\r\n          // Tentar obter info da sessão do sessionStorage\r\n          const storedSession = sessionStorage.getItem('signalRSession');\r\n          return storedSession ? JSON.parse(storedSession) : null;\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error(`[${this.constructor.name}] SignalR initialization failed:`, error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  private async ensureSignalRConnection(): Promise<void> {\r\n    // Verificar se já está conectado\r\n    if (this.signalRInitializer.isConnected()) {\r\n      return;\r\n    }\r\n\r\n    // Log para debug\r\n    console.log(`[${this.constructor.name}] Checking existing SignalR session`);\r\n    \r\n    // Verificar se há uma sessão existente antes de tentar reconectar\r\n    const storedSession = sessionStorage.getItem('signalRSession');\r\n    if (!storedSession) {\r\n      console.log(`[${this.constructor.name}] Nenhuma sessão SignalR existente - não criando automaticamente`);\r\n      return;\r\n    }\r\n    \r\n    const credentials = {\r\n      totvsId: this.totvsId,\r\n      projectId: this.projectId,\r\n      user: this.user,\r\n      contingency: this.contingency\r\n    };\r\n\r\n    try {\r\n      // Apenas reconectar se há sessão existente - NÃO criar nova sessão\r\n      await this.signalRInitializer.ensureGlobalConnectionOnly(credentials);\r\n      console.log(`[${this.constructor.name}] SignalR reconnected to existing session`);\r\n    } catch (error) {\r\n      console.error(`[${this.constructor.name}] SignalR reconnection failed:`, error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  protected resetState(): void {\r\n    this.selectedAudios = [];\r\n    this.audioProcessingFinished = false;\r\n    this.loading = false;\r\n    \r\n    // Limpar timeout se existir\r\n    if (this.responseTimeout) {\r\n      clearTimeout(this.responseTimeout);\r\n      this.responseTimeout = undefined;\r\n    }\r\n  }\r\n\r\n  startVoiceCapture(): void {\r\n    this.startRecord = true;\r\n  }\r\n\r\n  restartVoiceCapture(): void {\r\n    this.audioProcessingFinished = false;\r\n    this.selectedAudios = [];\r\n    this.startRecord = true;\r\n  }\r\n\r\n  handleSelectedAudios(selectedAudios: AudioRecordModel[]): void {\r\n    this.selectedAudios = selectedAudios;\r\n  }\r\n\r\n  async finishVoiceCapture(): Promise<void> {\r\n    const filesToSend = this.selectedAudios.map(audio =>\r\n      new File([audio.blob], audio.name, { type: audio.blob.type })\r\n    );\r\n\r\n    this.loading = true;\r\n\r\n    try {\r\n      // Verificar se há sessão SignalR existente\r\n      const storedSession = sessionStorage.getItem('signalRSession');\r\n      if (storedSession) {\r\n        // Se há sessão SignalR, garantir que está conectado\r\n        await this.ensureSignalRConnection();\r\n        console.log(`[${this.constructor.name}] Usando fluxo SignalR para processamento`);\r\n      } else {\r\n        console.log(`[${this.constructor.name}] Nenhuma sessão SignalR - usando fluxo HTTP direto`);\r\n      }\r\n\r\n      const audioRequest: AudioRequestModel = {\r\n        audioFiles: filesToSend,\r\n        context: this.context,\r\n        totvsId: this.totvsId,\r\n        projectId: this.projectId,\r\n        user: this.user,\r\n        contingency: this.contingency,\r\n        jsonReturn: this.jsonReturn\r\n      };\r\n\r\n      this.sendAudiosTracks.sendAudiosTracks(audioRequest).subscribe({\r\n        next: (response) => {\r\n          this.informacaoEnviada.emit({\r\n            message: response,\r\n            uniqueKey: AudioUtils.generateUniqueKey()\r\n          });\r\n          this.audioProcessingFinished = true;\r\n          this.loading = false;\r\n        },\r\n        error: (error) => {\r\n          this.loading = false;\r\n          console.error('Error sending audios:', error);\r\n        }\r\n      });\r\n    } catch (error) {\r\n      // Se falhar ao conectar SignalR, continuar com HTTP direto\r\n      console.warn(`[${this.constructor.name}] Falha na conexão SignalR, continuando com HTTP direto:`, error);\r\n      \r\n      const audioRequest: AudioRequestModel = {\r\n        audioFiles: filesToSend,\r\n        context: this.context,\r\n        totvsId: this.totvsId,\r\n        projectId: this.projectId,\r\n        user: this.user,\r\n        contingency: this.contingency,\r\n        jsonReturn: this.jsonReturn\r\n      };\r\n\r\n      this.sendAudiosTracks.sendAudiosTracks(audioRequest).subscribe({\r\n        next: (response) => {\r\n          this.informacaoEnviada.emit({\r\n            message: response,\r\n            uniqueKey: AudioUtils.generateUniqueKey()\r\n          });\r\n          this.audioProcessingFinished = true;\r\n          this.loading = false;\r\n        },\r\n        error: (error) => {\r\n          this.loading = false;\r\n          console.error('Error sending audios:', error);\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Limpar subscription do ReceiveMessage\r\n    if (this.receiveMessageSubscription) {\r\n      this.receiveMessageSubscription.unsubscribe();\r\n    }\r\n    \r\n    // Limpar subscription do InitialProcess\r\n    if (this.initialProcessSubscription) {\r\n      this.initialProcessSubscription.unsubscribe();\r\n    }\r\n    \r\n    // Limpar timeout se existir\r\n    if (this.responseTimeout) {\r\n      clearTimeout(this.responseTimeout);\r\n    }\r\n    \r\n    // Conexão SignalR permanece ativa para ser reutilizada por outros componentes\r\n  }\r\n\r\n  /**\r\n   * Método utilitário para conectar ao SignalR criando uma sessão via RegisterSession\r\n   * Usa o novo método simplificado que conecta e registra em uma única operação\r\n   */\r\n  protected async connectWithSignalRSession(jsonData: string, context?: string): Promise<{ sessionId: string; connectionId: string }> {\r\n    const credentials = {\r\n      totvsId: this.totvsId,\r\n      projectId: this.projectId,\r\n      user: this.user,\r\n      contingency: this.contingency\r\n    };\r\n\r\n    try {\r\n      const result = await this.signalRInitializer.ensureGlobalConnectionWithSession(\r\n        credentials,\r\n        {\r\n          jsonData: jsonData,\r\n          context: context || this.context\r\n        }\r\n      );\r\n\r\n      console.log('SignalR session created successfully:', result);\r\n      if (!result) {\r\n        throw new Error('Failed to create SignalR session');\r\n      }\r\n      return result;\r\n    } catch (error) {\r\n      console.error('Error creating SignalR session:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Obtém informações da sessão atual\r\n   */\r\n  protected getCurrentSessionInfo(): { sessionId: string | null; connectionId: string | null } {\r\n    return {\r\n      sessionId: this.signalRInitializer.currentSessionId,\r\n      connectionId: this.signalRInitializer.currentSignalRConnectionId\r\n    };\r\n  }\r\n}","import { Component, Input, Output, EventEmitter, OnInit, SimpleChanges, OnChanges, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PoAccordionModule, PoIconModule, PoButtonModule } from '@po-ui/ng-components';\r\nimport { QRCodeComponent } from 'angularx-qrcode';\r\nimport { SessionIdModel } from '../shared/models';\r\nimport { SignalRInitializerService } from '../core/services';\r\nimport { environment } from '../../environments/environment';\r\nimport { Subscription } from 'rxjs';\r\nimport { SignalRConnectionService } from '../core/web-socket/signal-r.service';\r\n\r\n\r\n@Component({\r\n  selector: 'app-mobile-session-accordion',\r\n  standalone: true,\r\n  imports: [CommonModule, PoAccordionModule, PoIconModule, PoButtonModule, QRCodeComponent],\r\n  templateUrl: './mobile-session-accordion.component.html',\r\n  styleUrls: ['./mobile-session-accordion.component.scss']\r\n})\r\nexport class MobileSessionAccordionComponent implements OnInit, OnDestroy, OnChanges {\r\n  @Input() totvsId: string = '';\r\n  @Input() projectId: string = '';\r\n  @Input() user: string = '';\r\n  @Input() contingency: string = '';\r\n  @Input() context: string = '';\r\n  @Input() jsonReturn: any[] = [];\r\n  \r\n  // Propriedades de estado recebidas do componente pai\r\n  @Input() loading: boolean = false;\r\n  @Input() audioProcessingFinished: boolean = false;\r\n  @Input() startRecord: boolean = false;\r\n  \r\n  @Output() signalRConnected = new EventEmitter<{ sessionId: string; connectionId: string }>();\r\n  @Output() connectionError = new EventEmitter<string>();\r\n  @Output() sessionCancelled = new EventEmitter<void>();\r\n  @Output() loadingStateReset = new EventEmitter<void>();\r\n\r\n  sessionInfo: SessionIdModel | null = null;\r\n  qrCodeData: string = '';\r\n  isConnecting: boolean = false;\r\n  isConnected: boolean = false;\r\n  errorMessage: string = '';\r\n  isCancelling: boolean = false;\r\n  \r\n  // Propriedade para controlar se o app foi aberto no celular\r\n  appOpenedOnMobile: boolean = false;\r\n  \r\n  // Subscriptions\r\n  private subscriptions: Subscription[] = [];\r\n\r\n  // Configurações do accordion\r\n  accordionItems = [\r\n    {\r\n      label: 'Continua esta sessão no celular',\r\n      expanded: false,\r\n      icon: 'po-icon-device-mobile'\r\n    }\r\n  ];\r\n\r\n  constructor(\r\n    private readonly signalRInitializer: SignalRInitializerService,\r\n    private readonly signalRService: SignalRConnectionService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Limpar qualquer sessão anterior que possa estar em conflito\r\n    this.clearPreviousSessionState();\r\n    \r\n    // NÃO verificar sessionStorage automaticamente - usuário deve clicar no botão\r\n    console.log('[MobileSessionAccordion] Inicializado - aguardando usuário clicar em \"Gerar QR Code\"');\r\n    \r\n    // Verificar se há inconsistência no estado loading - caso comum após envio de áudio\r\n    this.checkLoadingStateConsistency();\r\n  }\r\n\r\n  /**\r\n   * Limpar qualquer estado de sessão anterior para evitar conflitos\r\n   */\r\n  private clearPreviousSessionState(): void {\r\n    console.log('[MobileSessionAccordion] Limpando estado de sessão anterior');\r\n    \r\n    // Resetar propriedades locais\r\n    this.sessionInfo = null;\r\n    this.qrCodeData = '';\r\n    this.isConnected = false;\r\n    this.isConnecting = false;\r\n    this.errorMessage = '';\r\n    this.isCancelling = false;\r\n    this.appOpenedOnMobile = false;\r\n    \r\n    // Limpar subscriptions existentes\r\n    this.subscriptions.forEach(sub => sub.unsubscribe());\r\n    this.subscriptions = [];\r\n    \r\n    // Limpar sessionStorage - força usuário a criar nova sessão\r\n    sessionStorage.removeItem('signalRSession');\r\n    \r\n    console.log('[MobileSessionAccordion] Estado de sessão anterior limpo');\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Monitorar mudanças no Input loading para detectar inconsistências\r\n    if (changes['loading']) {\r\n      console.log('[MobileSessionAccordion] Loading mudou:', {\r\n        currentValue: changes['loading'].currentValue,\r\n        previousValue: changes['loading'].previousValue,\r\n        audioProcessingFinished: this.audioProcessingFinished,\r\n        isConnected: this.isConnected\r\n      });\r\n      \r\n      // Se loading mudou para true mas o processamento já terminou, isso é uma inconsistência\r\n      if (changes['loading'].currentValue && this.audioProcessingFinished) {\r\n        console.log('[MobileSessionAccordion] Loading inconsistente detectado - processamento já finalizado');\r\n        this.checkLoadingStateConsistency();\r\n      }\r\n    }\r\n    \r\n    // Monitorar mudanças no audioProcessingFinished\r\n    if (changes['audioProcessingFinished']) {\r\n      console.log('[MobileSessionAccordion] AudioProcessingFinished mudou:', {\r\n        currentValue: changes['audioProcessingFinished'].currentValue,\r\n        loading: this.loading\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Verifica e corrige inconsistências no estado loading\r\n   * Isso resolve o bug onde o mobile accordion fica travado em \"Processando áudios recebidos...\"\r\n   */\r\n  private checkLoadingStateConsistency(): void {\r\n    // Se loading é true mas o processamento já terminou, isso é uma inconsistência\r\n    if (this.loading && this.audioProcessingFinished) {\r\n      console.log('[MobileSessionAccordion] Detectada inconsistência: loading=true mas audioProcessingFinished=true');\r\n      this.loadingStateReset.emit();\r\n      return;\r\n    }\r\n    \r\n    // Se loading é true mas não há sessão SignalR ativa, isso também é inconsistente\r\n    if (this.loading && !this.isConnected && !this.sessionInfo) {\r\n      console.log('[MobileSessionAccordion] Detectada inconsistência: loading=true mas não há sessão SignalR ativa');\r\n      this.loadingStateReset.emit();\r\n      return;\r\n    }\r\n    \r\n    // Se loading é true há muito tempo sem mudança, pode ser um estado orfão\r\n    if (this.loading) {\r\n      // Aguardar 2 segundos e verificar novamente se o estado persiste\r\n      setTimeout(() => {\r\n        if (this.loading && !this.isConnected && !this.sessionInfo) {\r\n          console.log('[MobileSessionAccordion] Loading órfão detectado após timeout - solicitando reset');\r\n          this.loadingStateReset.emit();\r\n        }\r\n      }, 2000);\r\n    }\r\n  }\r\n\r\n  private setupSignalRListeners(): void {\r\n    // Só escutar o OpenApp se há uma sessão ativa e ainda não foi aberta\r\n    if (this.sessionInfo && !this.appOpenedOnMobile) {\r\n      console.log('[MobileSessionAccordion] Configurando listener OpenApp para sessionId:', this.sessionInfo.sessionId);\r\n      \r\n      const openAppSubscription = this.signalRService.openApp$.subscribe(() => {\r\n        console.log('[MobileSessionAccordion] Evento OpenApp recebido - App foi aberto no celular');\r\n        this.appOpenedOnMobile = true;\r\n      });\r\n      \r\n      this.subscriptions.push(openAppSubscription);\r\n    }\r\n  }\r\n\r\n  private updateQRCode(): void {\r\n    if (this.sessionInfo?.sessionId) {\r\n      this.qrCodeData = `${environment.webApp}/${this.sessionInfo.sessionId}`;\r\n    }\r\n  }\r\n\r\n  async createSignalRSession(): Promise<void> {\r\n    this.isConnecting = true;\r\n    this.errorMessage = '';\r\n\r\n    try {\r\n      // Garantir limpeza total antes de criar nova sessão\r\n      console.log('[MobileSessionAccordion] Garantindo limpeza completa antes de criar nova sessão...');\r\n      await this.forceResetSignalRState();\r\n      \r\n      const credentials = {\r\n        totvsId: this.totvsId,\r\n        projectId: this.projectId,\r\n        user: this.user,\r\n        contingency: this.contingency\r\n      };\r\n\r\n      const sessionData = {\r\n        jsonData: JSON.stringify(this.jsonReturn),\r\n        context: `${this.context || 'Mobile Session QR Code'} - User Generated - ${new Date().getTime()}`\r\n      };\r\n\r\n      console.log('[MobileSessionAccordion] Criando NOVA sessão SignalR via botão do usuário...');\r\n      \r\n      // Forçar criação de nova sessão (não reutilizar sessões existentes)\r\n      const sessionInfo = await this.signalRInitializer.ensureGlobalConnectionWithSession(\r\n        credentials,\r\n        sessionData,\r\n        true // ← SEMPRE forçar nova sessão quando usuário clica no botão\r\n      );\r\n\r\n      if (sessionInfo) {\r\n        this.sessionInfo = sessionInfo;\r\n        this.updateQRCode();\r\n        this.isConnected = true;\r\n        \r\n        // Configurar listeners agora que temos uma sessão\r\n        this.setupSignalRListeners();\r\n        \r\n        // Salvar no sessionStorage\r\n        sessionStorage.setItem('signalRSession', JSON.stringify(sessionInfo));\r\n        \r\n        // Emitir evento de conexão bem-sucedida\r\n        this.signalRConnected.emit(sessionInfo);\r\n        \r\n        console.log('[MobileSessionAccordion] Sessão SignalR criada com sucesso:', sessionInfo);\r\n      }\r\n    } catch (error) {\r\n      this.errorMessage = 'Erro ao criar sessão. Tente novamente.';\r\n      this.connectionError.emit(this.errorMessage);\r\n      console.error('[MobileSessionAccordion] Erro ao criar sessão SignalR:', error);\r\n    } finally {\r\n      this.isConnecting = false;\r\n    }\r\n  }\r\n\r\n  async reconnectSignalR(): Promise<void> {\r\n    console.log('[MobileSessionAccordion] Recriando sessão SignalR - força nova sessão');\r\n    \r\n    // Limpar subscriptions existentes\r\n    this.subscriptions.forEach(sub => sub.unsubscribe());\r\n    this.subscriptions = [];\r\n    \r\n    // Reset completo do estado local\r\n    this.isConnected = false;\r\n    this.sessionInfo = null;\r\n    this.qrCodeData = '';\r\n    this.errorMessage = '';\r\n    this.appOpenedOnMobile = false; // Reset do estado do app aberto\r\n    \r\n    // Limpar sessionStorage\r\n    sessionStorage.removeItem('signalRSession');\r\n    \r\n    // Forçar reset do estado global do SignalR para garantir nova sessão\r\n    await this.forceResetSignalRState();\r\n    \r\n    // Criar nova sessão forçadamente\r\n    await this.createNewSession();\r\n  }\r\n\r\n  private async createNewSession(): Promise<void> {\r\n    this.isConnecting = true;\r\n    this.errorMessage = '';\r\n\r\n    try {\r\n      const credentials = {\r\n        totvsId: this.totvsId,\r\n        projectId: this.projectId,\r\n        user: this.user,\r\n        contingency: this.contingency\r\n      };\r\n\r\n      const sessionData = {\r\n        jsonData: JSON.stringify(this.jsonReturn),\r\n        context: `${this.context || 'Mobile Session QR Code'} - New Session - ${new Date().getTime()}`\r\n      };\r\n\r\n      console.log('[MobileSessionAccordion] Forçando criação de nova sessão SignalR...');\r\n      \r\n      // Usar forceNewSession = true para garantir nova sessão\r\n      const sessionInfo = await this.signalRInitializer.ensureGlobalConnectionWithSession(\r\n        credentials,\r\n        sessionData,\r\n        true // ← Força nova sessão\r\n      );\r\n\r\n      if (sessionInfo) {\r\n        this.sessionInfo = sessionInfo;\r\n        this.updateQRCode();\r\n        this.isConnected = true;\r\n        \r\n        // Configurar listeners agora que temos uma sessão\r\n        this.setupSignalRListeners();\r\n        \r\n        // Salvar no sessionStorage\r\n        sessionStorage.setItem('signalRSession', JSON.stringify(sessionInfo));\r\n        \r\n        // Emitir evento de conexão bem-sucedida\r\n        this.signalRConnected.emit(sessionInfo);\r\n        \r\n        console.log('[MobileSessionAccordion] Nova sessão SignalR criada com sucesso:', sessionInfo);\r\n      }\r\n    } catch (error) {\r\n      this.errorMessage = 'Erro ao criar nova sessão. Tente novamente.';\r\n      this.connectionError.emit(this.errorMessage);\r\n      console.error('[MobileSessionAccordion] Erro ao criar nova sessão SignalR:', error);\r\n    } finally {\r\n      this.isConnecting = false;\r\n    }\r\n  }\r\n\r\n  async cancelSignalRSession(): Promise<void> {\r\n    this.isCancelling = true;\r\n    this.errorMessage = '';\r\n\r\n    try {\r\n      console.log('[MobileSessionAccordion] Cancelando sessão SignalR...');\r\n      \r\n      // Desconectar do SignalR se estiver conectado\r\n      if (this.signalRInitializer.isConnected()) {\r\n        console.log('[MobileSessionAccordion] Desconectando do SignalR...');\r\n        // Forçar reset do estado global\r\n        await this.forceResetSignalRState();\r\n      }\r\n\r\n      // Limpar dados da sessão local\r\n      this.sessionInfo = null;\r\n      this.qrCodeData = '';\r\n      this.isConnected = false;\r\n      this.appOpenedOnMobile = false; // Reset do estado do app aberto\r\n      \r\n      // Limpar subscriptions\r\n      this.subscriptions.forEach(sub => sub.unsubscribe());\r\n      this.subscriptions = [];\r\n      \r\n      // Remover do sessionStorage\r\n      sessionStorage.removeItem('signalRSession');\r\n      \r\n      // Emitir evento de cancelamento\r\n      this.sessionCancelled.emit();\r\n      \r\n      console.log('[MobileSessionAccordion] Sessão SignalR cancelada com sucesso');\r\n      \r\n    } catch (error) {\r\n      this.errorMessage = 'Erro ao cancelar sessão SignalR.';\r\n      this.connectionError.emit(this.errorMessage);\r\n      console.error('[MobileSessionAccordion] Erro ao cancelar sessão SignalR:', error);\r\n    } finally {\r\n      this.isCancelling = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Força o reset do estado global do SignalR para garantir que uma nova sessão seja criada\r\n   */\r\n  private async forceResetSignalRState(): Promise<void> {\r\n    console.log('[MobileSessionAccordion] Forçando reset do estado global SignalR');\r\n    \r\n    // Usar o método público do SignalRInitializerService para resetar estado\r\n    await this.signalRInitializer.forceResetGlobalState();\r\n    \r\n    console.log('[MobileSessionAccordion] Estado global SignalR resetado');\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Limpar todas as subscriptions\r\n    this.subscriptions.forEach(sub => sub.unsubscribe());\r\n  }\r\n}","<div class=\"mobile-session-container\">\r\n  <div class=\"qr-description\">\r\n    <p><strong>Continuar a sessão no celular ou tablet</strong></p>\r\n    <p>Escaneie o QR Code abaixo e, automaticamente,\r\n      você continuará a sessão do seu celular ou tablet.\r\n      Não feche esta tela.</p>\r\n  </div>\r\n      <div class=\"qr-code-container\">\r\n        <!-- Estado: Aguardando conexão SignalR -->\r\n        @if (!isConnected && !isConnecting) {\r\n          <div class=\"connection-status\">\r\n            <div class=\"status-icon\">\r\n              <i class=\"po-icon po-icon-device-mobile\" style=\"font-size: 48px; color: #666;\"></i>\r\n            </div>\r\n            <div class=\"status-message\">\r\n              <p><strong>Iniciar Sessão em Dispositivo Móvel</strong></p>\r\n              <p>Clique no botão para gerar o QR Code de acesso</p>\r\n            </div>\r\n            <po-button \r\n              p-label=\"Gerar QR Code\"\r\n              p-kind=\"primary\"\r\n              p-icon=\"po-icon-plus\"\r\n              (p-click)=\"createSignalRSession()\"\r\n              class=\"create-session-btn\">\r\n            </po-button>\r\n          </div>\r\n        }\r\n\r\n        @if (isConnecting || loading) {\r\n          <div class=\"connection-status-wrapper\">\r\n            <div class=\"connection-status\">\r\n                <div class=\"status-icon loading\">\r\n                    <i class=\"po-icon po-icon-loading\" style=\"font-size: 48px;\"></i>\r\n                </div>\r\n                <div class=\"status-message\">\r\n                    @if (loading) {\r\n                      <p>Processando áudios recebidos...</p>\r\n                    } @else {\r\n                      <p>Conectando à sessão...</p>\r\n                    }\r\n                </div>\r\n            </div>\r\n          </div>\r\n          <div class=\"session-actions\">\r\n            <po-button \r\n              p-label=\"Recriar sessão\"\r\n              p-kind=\"tertiary\"\r\n              p-icon=\"po-icon-refresh\"\r\n              (p-click)=\"reconnectSignalR()\"\r\n              class=\"reconnect-btn\">\r\n            </po-button>\r\n            \r\n            <po-button \r\n              p-label=\"Cancelar\"\r\n              p-kind=\"secondary\"\r\n              p-icon=\"po-icon-close\"\r\n              (p-click)=\"cancelSignalRSession()\"\r\n              class=\"cancel-btn\">\r\n            </po-button>\r\n          </div>\r\n        }\r\n        \r\n        <!-- Estado: Conectado - Mostrar QR Code ou imagem OpenApp -->\r\n        @if (isConnected && qrCodeData && !isCancelling && !loading && !audioProcessingFinished) {\r\n          <!-- Se app foi aberto no celular, mostrar imagem openapp.svg -->\r\n          @if (appOpenedOnMobile) {\r\n            <div class=\"app-opened-container\">\r\n              <div class=\"app-opened-icon\">\r\n                <img src=\"https://cdn.jsdelivr.net/gh/yuriduartetotvs/cdn@main/image/openapp.svg\" alt=\"App aberto no celular\" width=\"120\" height=\"120\">\r\n              </div>\r\n              <div class=\"app-opened-description\">\r\n                <p><strong>Aplicativo Aberto no Celular</strong></p>\r\n                <p>A sessão está sendo utilizada no dispositivo móvel</p>\r\n              </div>\r\n            </div>\r\n          } @else {\r\n            <!-- Caso contrário, mostrar QR Code normalmente -->\r\n            <div class=\"qr-code-wrapper\">\r\n              <qrcode \r\n                [qrdata]=\"qrCodeData\" \r\n                [width]=\"180\" \r\n                [errorCorrectionLevel]=\"'M'\"\r\n                [colorDark]=\"'#000000'\"\r\n                [colorLight]=\"'#ffffff'\">\r\n              </qrcode>\r\n            </div>\r\n            \r\n            <div class=\"qr-description\">\r\n              <p><strong>Sessão Ativa</strong></p>\r\n              <p>Escaneie o QR Code para continuar a sessão no seu celular</p>\r\n            </div>\r\n          }\r\n          \r\n          <div class=\"session-actions\">\r\n            <po-button \r\n              p-label=\"Recriar\"\r\n              p-kind=\"tertiary\"\r\n              p-icon=\"po-icon-refresh\"\r\n              (p-click)=\"reconnectSignalR()\"\r\n              class=\"reconnect-btn\">\r\n            </po-button>\r\n            \r\n            <po-button \r\n              p-label=\"Cancelar\"\r\n              p-kind=\"secondary\"\r\n              p-icon=\"po-icon-close\"\r\n              (p-click)=\"cancelSignalRSession()\"\r\n              class=\"cancel-btn\">\r\n            </po-button>\r\n          </div>\r\n        }\r\n        \r\n        <!-- Estado: Processamento Finalizado -->\r\n        @if (audioProcessingFinished && isConnected) {\r\n          <div class=\"connection-status\">\r\n            <div class=\"status-icon\">\r\n              <i class=\"po-icon po-icon-ok\" style=\"font-size: 48px; color: #28a745;\"></i>\r\n            </div>\r\n            <div class=\"status-message\">\r\n              <p><strong>Processamento Concluído</strong></p>\r\n              <p>Os áudios foram processados com sucesso no dispositivo móvel</p>\r\n            </div>\r\n          </div>\r\n          \r\n          <div class=\"session-actions\">\r\n            <po-button \r\n              p-label=\"Nova Sessão\"\r\n              p-kind=\"tertiary\"\r\n              p-icon=\"po-icon-refresh\"\r\n              (p-click)=\"reconnectSignalR()\"\r\n              class=\"reconnect-btn\">\r\n            </po-button>\r\n            \r\n            <po-button \r\n              p-label=\"Encerrar\"\r\n              p-kind=\"secondary\"\r\n              p-icon=\"po-icon-close\"\r\n              (p-click)=\"cancelSignalRSession()\"\r\n              class=\"cancel-btn\">\r\n            </po-button>\r\n          </div>\r\n        }\r\n        \r\n        <!-- Estado: Cancelando Sessão -->\r\n        @if (isCancelling) {\r\n          <div class=\"connection-status\">\r\n            <div class=\"status-icon loading\">\r\n              <i class=\"po-icon po-icon-loading\" style=\"font-size: 48px; color: #d9534f;\"></i>\r\n            </div>\r\n            <div class=\"status-message\">\r\n              <p><strong>Cancelando Sessão...</strong></p>\r\n              <p>Removendo sessão SignalR</p>\r\n            </div>\r\n          </div>\r\n        }\r\n        \r\n        <!-- Estado: Erro -->\r\n        @if (errorMessage) {\r\n          <div class=\"connection-status error\">\r\n            <div class=\"status-icon\">\r\n              <i class=\"po-icon po-icon-warning\" style=\"font-size: 48px; color: #d9534f;\"></i>\r\n            </div>\r\n            <div class=\"status-message\">\r\n              <p><strong>Erro na Conexão</strong></p>\r\n              <p>{{ errorMessage }}</p>\r\n            </div>\r\n            <po-button \r\n              p-label=\"Tentar Novamente\"\r\n              p-kind=\"secondary\"\r\n              p-icon=\"po-icon-refresh\"\r\n              (p-click)=\"reconnectSignalR()\"\r\n              class=\"retry-btn\">\r\n            </po-button>\r\n          </div>\r\n        }\r\n      </div>\r\n</div>\r\n","import { ChangeDetectorRef, Component, ViewChild } from '@angular/core';\r\nimport { PoButtonModule, PoPageSlideComponent, PoPageSlideModule, PoTabsModule } from '@po-ui/ng-components';\r\nimport { AudioFinishComponent } from '../audio-finish/audio-finish.component';\r\nimport { HomeScreenComponent } from '../home-screen/home-screen.component';\r\nimport { VoiceRecorderComponent } from '../voice-recorder/voice-recorder.component';\r\nimport { BaseVoiceCaptureComponent } from '../shared/base-voice-capture.component';\r\nimport { MobileSessionAccordionComponent } from '../shared';\r\nimport { SignalRInitializerService } from '../core/services';\r\nimport { SignalRConnectionService } from '../core/web-socket/signal-r.service';\r\nimport { SendAudiosTracksService } from '../shared/services';\r\n\r\n@Component({\r\n  selector: 'dta-voice',\r\n  imports: [\r\n    MobileSessionAccordionComponent,\r\n    PoPageSlideModule,\r\n    HomeScreenComponent,\r\n    VoiceRecorderComponent,\r\n    AudioFinishComponent,\r\n    PoButtonModule,\r\n    PoTabsModule\r\n  ],\r\n  templateUrl: './voice-page-slide.component.html',\r\n  styleUrl: './voice-page-slide.component.scss'\r\n})\r\nexport class VoicePageSlideComponent extends BaseVoiceCaptureComponent {\r\n\r\n  // Propriedades para customização do home-screen\r\n  override welcomeTitle = 'Boas-vindas ao DTA Voice, a inteligência artificial que otimiza o preenchimento de listas, tabelas e campos, a partir do uso de voz.';\r\n  override welcomeDescription = 'Para utilizá-la é muito simples: basta que você conte para ela o que você quer que seja utilizado para o preenchimento dos campos. Pode conversar normalmente que nossa IA irá interpretar sua fala e extrair as informações para o correto preenchimento dos campos.';\r\n  override welcomeFeatures = 'Além disso, você poderá, durante o processo, realizar mais de uma gravação, escutar suas gravações, e até mesmo deletar e regravar, caso considere necessário.';\r\n\r\n  @ViewChild(PoPageSlideComponent, { static: true }) sliderNewVoice?: PoPageSlideComponent;\r\n  \r\n  constructor(\r\n    sendAudiosTracks: SendAudiosTracksService, \r\n    signalRService: SignalRConnectionService,\r\n    signalRInitializer: SignalRInitializerService,\r\n    cdr: ChangeDetectorRef\r\n  ) {\r\n    super(sendAudiosTracks, signalRService, signalRInitializer, cdr);\r\n  }\r\n\r\n  /**\r\n   * Handler para quando SignalR conecta com sucesso\r\n   */\r\n  onSignalRConnected(sessionInfo: { sessionId: string; connectionId: string }): void {\r\n    console.log('[VoicePageSlide] SignalR conectado:', sessionInfo);\r\n    \r\n    // Reconfigurar os listeners SignalR para garantir que estão funcionando\r\n    this.reconfigureSignalRListeners();\r\n  }\r\n\r\n  /**\r\n   * Handler para erros de conexão SignalR\r\n   */\r\n  onConnectionError(error: string): void {\r\n    console.error('[VoicePageSlide] Erro na conexão SignalR:', error);\r\n    // Aqui você pode adicionar lógica para mostrar mensagens de erro ao usuário\r\n  }\r\n\r\n  /**\r\n   * Handler para quando a sessão SignalR é cancelada\r\n   */\r\n  onSessionCancelled(): void {\r\n    console.log('[VoicePageSlide] Sessão SignalR cancelada');\r\n    // Aqui você pode adicionar lógica adicional após cancelamento\r\n    // Por exemplo, resetar estados ou mostrar mensagens ao usuário\r\n  }\r\n\r\n  /**\r\n   * Handler para quando o mobile-session-accordion detecta inconsistência no loading state\r\n   */\r\n  onLoadingStateReset(): void {\r\n    console.log('[VoicePageSlide] Solicitação de reset do loading state recebida');\r\n    \r\n    // Resetar o loading state quando detectado inconsistência\r\n    this.loading = false;\r\n    \r\n    // Log para debug\r\n    console.log('[VoicePageSlide] Loading state resetado para false devido a inconsistência detectada');\r\n  }\r\n\r\n  openNewVoice(): void {\r\n    this.sliderNewVoice?.open();\r\n  }\r\n\r\n  closeVoiceCapture(): void {\r\n    this.resetState();\r\n    this.sliderNewVoice?.close();\r\n  }\r\n}\r\n","<po-page-slide #pageSlide p-title=\"DTA Voice\" p-subtitle=\"\" #sliderNewVoice p-size=\"md\">\r\n    <po-tabs p-active=\"0\">\r\n        <po-tab p-label=\"Captura e upload\" [p-active]=\"true\">\r\n            @if(!startRecord) {\r\n                <app-home-screen\r\n                    [welcomeTitle]=\"welcomeTitle\"\r\n                    [welcomeDescription]=\"welcomeDescription\"\r\n                    [welcomeFeatures]=\"welcomeFeatures\"\r\n                ></app-home-screen>\r\n            }\r\n            @else if(!audioProcessingFinished) {\r\n                <app-voice-recorder \r\n                    (selectedAudiosEvent)=\"handleSelectedAudios($event)\" \r\n                    [enableTour]=\"enableTour\"\r\n                    [loading]=\"loading\">\r\n                </app-voice-recorder>\r\n            }\r\n            @else {\r\n                <app-audio-finish></app-audio-finish>\r\n            }\r\n        </po-tab>\r\n        <po-tab p-label=\"Sessão mobile\" [p-disabled]=\"!startRecord\">\r\n            <app-mobile-session-accordion\r\n                [totvsId]=\"totvsId\"\r\n                [projectId]=\"projectId\"\r\n                [user]=\"user\"\r\n                [contingency]=\"contingency\"\r\n                [context]=\"context\"\r\n                [jsonReturn]=\"jsonReturn\"\r\n                [loading]=\"loading\"\r\n                [audioProcessingFinished]=\"audioProcessingFinished\"\r\n                [startRecord]=\"startRecord\"\r\n                (signalRConnected)=\"onSignalRConnected($event)\"\r\n                (connectionError)=\"onConnectionError($event)\"\r\n                (sessionCancelled)=\"onSessionCancelled()\"\r\n                (loadingStateReset)=\"onLoadingStateReset()\">\r\n            </app-mobile-session-accordion>\r\n        </po-tab>\r\n    </po-tabs>\r\n    \r\n    <po-page-slide-footer>\r\n        @if(!startRecord) {\r\n            <div class=\"footer-buttons\">\r\n                <po-button \r\n                    p-label=\"Iniciar captura de voz\" \r\n                    p-kind=\"primary\" \r\n                    (p-click)=\"startVoiceCapture()\"\r\n                    p-icon=\"po-icon-voice\" \r\n                    class=\"responsive-button\">\r\n                </po-button>\r\n            </div>\r\n        }\r\n        @else if(!audioProcessingFinished) {\r\n            <div class=\"send-actions po-mt-3\">\r\n                <po-button \r\n                    [p-disabled]=\"selectedAudios.length === 0\" \r\n                    [p-label]=\"'Finalizar captura'\" \r\n                    p-kind=\"primary\"\r\n                    (p-click)=\"finishVoiceCapture()\">\r\n                </po-button>\r\n            </div>\r\n        }\r\n        @else {\r\n            <div class=\"send-actions po-mt-3\">\r\n                <po-button \r\n                    p-label=\"Gravar mais audios\" \r\n                    p-kind=\"secondary\" \r\n                    (p-click)=\"restartVoiceCapture()\" \r\n                    class=\"responsive-button\">\r\n                </po-button>\r\n                <po-button \r\n                    p-label=\"Encerrar DTA Voice\" \r\n                    p-kind=\"primary\" \r\n                    (p-click)=\"closeVoiceCapture()\"\r\n                    class=\"responsive-button\">\r\n                </po-button>\r\n            </div>\r\n        }\r\n    </po-page-slide-footer>\r\n</po-page-slide>","import { Component, ViewChild, OnInit, EventEmitter, Output, Input, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { PoAccordionModule, PoButtonModule, PoIconModule, PoPageSlideComponent } from '@po-ui/ng-components';\r\nimport { AudioFinishComponent } from '../audio-finish/audio-finish.component';\r\nimport { SignalRConnectionService } from '../core/web-socket/signal-r.service';\r\nimport { HomeScreenComponent } from '../home-screen/home-screen.component';\r\nimport { AudioUtils } from '../shared';\r\nimport { SendAudiosTracksService } from '../shared/services';\r\nimport { VoiceRecorderComponent } from '../voice-recorder/voice-recorder.component';\r\nimport { AudioJsonModel, AudioRecordModel, AudioRequestModel, JsonReturnAiModel } from '../shared/models';\r\nimport { environment } from '../../environments/environment';\r\nimport { CommonModule } from '@angular/common';\r\nimport { QRCodeComponent } from 'angularx-qrcode';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n  selector: 'dta-voice-web-app',\r\n  imports: [\r\n    CommonModule,\r\n    QRCodeComponent,\r\n    HomeScreenComponent, \r\n    VoiceRecorderComponent, \r\n    AudioFinishComponent, \r\n    PoButtonModule,\r\n    PoAccordionModule,\r\n    PoIconModule\r\n  ],\r\n  templateUrl: './voice-web-app.component.html',\r\n  styleUrl: './voice-web-app.component.scss'\r\n})\r\nexport class VoiceWebAppComponent implements OnInit, OnDestroy {\r\n  @ViewChild(PoPageSlideComponent, { static: true }) sliderNewVoice?: PoPageSlideComponent;\r\n  @Input() sessionId: string = '';\r\n\r\n  // Propriedades para controle do componente\r\n  startRecord = false;\r\n  selectedAudios: AudioRecordModel[] = [];\r\n  audioProcessingFinished = false;\r\n  loading = false;\r\n\r\n  // Detecção de dispositivo mobile\r\n  isMobile = false;\r\n  showQRCode = false;\r\n\r\n  // QR Code data - usar sessão existente ao invés de criar nova conexão\r\n  qrCodeData = '';\r\n\r\n  // Propriedades de configuração\r\n  enableTour: boolean = false;\r\n  labelHeader: string = '';\r\n  context: string = '';\r\n  totvsId: string = '';\r\n  projectId: string = '';\r\n  user: string = '';\r\n  contingency: string = '';\r\n  jsonReturn: AudioJsonModel[] = [];\r\n\r\n  // Propriedade para controlar exibição da imagem OpenApp\r\n  showOpenApp: boolean = false;\r\n\r\n  @Output() informacaoEnviada = new EventEmitter<{\r\n    message: JsonReturnAiModel,\r\n    uniqueKey: number\r\n  }>();\r\n\r\n  private subscriptions: Subscription[] = [];\r\n\r\n  constructor(\r\n    private readonly sendAudiosTracks: SendAudiosTracksService,\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    this.resetState();\r\n    this.detectMobile();\r\n    this.loadDataFromLocalStorage();\r\n    this.startRecord = localStorage.getItem('hideWelcomeMessage') === 'true';\r\n\r\n    // Mostrar QR code apenas em dispositivos web (não mobile)\r\n    this.showQRCode = !this.isMobile;\r\n\r\n    // Gerar QR code com a sessão existente\r\n    this.updateQRCodeData();\r\n\r\n    //notificar o formulario que o celular foi aberto\r\n    this.notifyAppOpenedOnMobile();\r\n  }\r\n\r\n  private detectMobile(): void {\r\n    const userAgent = navigator.userAgent;\r\n    const isMobileUserAgent = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);\r\n    const isMobileScreen = window.innerWidth <= 768;\r\n    this.isMobile = isMobileUserAgent || isMobileScreen;\r\n  }\r\n\r\n  private loadDataFromLocalStorage(): void {\r\n    // Carregar dados do localStorage com os mesmos nomes dos parâmetros\r\n    const contextFromStorage = localStorage.getItem('context');\r\n    const jsonReturnFromStorage = localStorage.getItem('jsonReturn');\r\n    const totvsIdFromStorage = localStorage.getItem('totvsId');\r\n    const projectIdFromStorage = localStorage.getItem('projectId');\r\n    const userFromStorage = localStorage.getItem('user');\r\n    const contingencyFromStorage = localStorage.getItem('contingency');\r\n\r\n    if (contextFromStorage) {\r\n      this.context = contextFromStorage;\r\n    }\r\n\r\n    if (jsonReturnFromStorage) {\r\n      try {\r\n        this.jsonReturn = JSON.parse(jsonReturnFromStorage);\r\n      } catch (error) {\r\n        console.warn('Erro ao parsing jsonReturn do localStorage:', error);\r\n        this.jsonReturn = [];\r\n      }\r\n    }\r\n\r\n    if (totvsIdFromStorage) {\r\n      this.totvsId = totvsIdFromStorage;\r\n    }\r\n\r\n    if (projectIdFromStorage) {\r\n      this.projectId = projectIdFromStorage;\r\n    }\r\n\r\n    if (userFromStorage) {\r\n      this.user = userFromStorage;\r\n    }\r\n\r\n    if (contingencyFromStorage) {\r\n      this.contingency = contingencyFromStorage;\r\n    }\r\n  }\r\n\r\n  private updateQRCodeData(): void {\r\n    if (this.sessionId) {\r\n      this.qrCodeData = `${environment.webApp}/${this.sessionId}`;\r\n      console.log('QR Code gerado com sessão existente:', this.qrCodeData);\r\n    }\r\n  }\r\n\r\n  protected resetState(): void {\r\n    this.selectedAudios = [];\r\n    this.audioProcessingFinished = false;\r\n    this.loading = false;\r\n  }\r\n\r\n  startVoiceCapture(): void {\r\n    this.startRecord = true;\r\n  }\r\n\r\n  // Métodos para gerenciamento de QR code - usando sessão existente (sem criar nova conexão SignalR)\r\n  onConnectionError(error: any): void {\r\n    console.error('Erro na conexão SignalR:', error);\r\n    // Implementar lógica de tratamento de erro conforme necessário\r\n  }\r\n\r\n  onSessionCancelled(): void {\r\n    console.log('Sessão cancelada pelo usuário');\r\n    this.resetState();\r\n  }\r\n\r\n  restartVoiceCapture(): void {\r\n    this.audioProcessingFinished = false;\r\n    this.selectedAudios = [];\r\n    this.startRecord = true;\r\n  }\r\n\r\n  handleSelectedAudios(selectedAudios: AudioRecordModel[]): void {\r\n    this.selectedAudios = selectedAudios;\r\n  }\r\n\r\n  async finishVoiceCapture(): Promise<void> {\r\n    if (!this.sessionId) {\r\n      console.error('SessionID não encontrado na rota');\r\n      return;\r\n    }\r\n\r\n    const filesToSend = this.selectedAudios.map(audio =>\r\n      new File([audio.blob], audio.name, { type: audio.blob.type })\r\n    );\r\n\r\n    this.loading = true;\r\n\r\n    try {\r\n      const audioRequest: AudioRequestModel = {\r\n        audioFiles: filesToSend,\r\n        context: this.context,\r\n        totvsId: this.totvsId,\r\n        projectId: this.projectId,\r\n        user: this.user,\r\n        contingency: this.contingency,\r\n        jsonReturn: this.jsonReturn\r\n      };\r\n\r\n      // Enviar áudios apenas com sessionId, sem SignalR\r\n      this.sendAudiosTracks.sendAudiosSignalTracks(this.sessionId, audioRequest).subscribe({\r\n        next: (response) => {\r\n          console.log('Audio enviado com sucesso:', response);\r\n\r\n          // Como não há SignalR, simular uma resposta ou processar a resposta diretamente\r\n          if (response) {\r\n            // Assumindo que a resposta já contém o resultado processado\r\n            const jsonReturnAiModel: JsonReturnAiModel = response as JsonReturnAiModel;\r\n\r\n            this.informacaoEnviada.emit({\r\n              message: jsonReturnAiModel,\r\n              uniqueKey: AudioUtils.generateUniqueKey()\r\n            });\r\n\r\n            this.audioProcessingFinished = true;\r\n          }\r\n\r\n          this.loading = false;\r\n        },\r\n        error: (error) => {\r\n          this.loading = false;\r\n          console.error('Erro ao enviar áudios:', error);\r\n        }\r\n      });\r\n    } catch (error) {\r\n      this.loading = false;\r\n      console.error('Erro no processamento dos áudios:', error);\r\n    }\r\n  }\r\n\r\n  openNewVoice(): void {\r\n    this.sliderNewVoice?.open();\r\n  }\r\n\r\n  closeVoiceCapture(): void {\r\n    this.resetState();\r\n    this.sliderNewVoice?.close();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Limpar todas as subscriptions\r\n    this.subscriptions.forEach(sub => sub.unsubscribe());\r\n  }\r\n\r\n  /**\r\n   * Notifica que o aplicativo foi aberto no celular\r\n   */\r\n  notifyAppOpenedOnMobile(): void {\r\n    if (!this.sessionId) {\r\n      console.error('SessionID não encontrado para notificar abertura do app');\r\n      return;\r\n    }\r\n\r\n    this.sendAudiosTracks.notifyAppOpened(this.sessionId).subscribe({\r\n      error: (error) => {\r\n        console.error('Erro ao notificar abertura do app:', error);\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\n","<div class=\"voice-webapp-container\">\r\n    <!-- Exibir imagem openapp.svg quando evento OpenApp for recebido -->\r\n    @if(showOpenApp) {\r\n        <div class=\"openapp-notification\" style=\"position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 9999; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.2); text-align: center;\">\r\n            <img src=\"https://cdn.jsdelivr.net/gh/yuriduartetotvs/cdn@main/image/openapp.svg\" alt=\"App aberto no celular\" width=\"100\" height=\"100\">\r\n            <p style=\"margin-top: 10px; font-weight: bold;\">Aplicativo aberto no celular!</p>\r\n        </div>\r\n    }\r\n\r\n    @if(!startRecord) {\r\n        <div class=\"welcome-section\">\r\n            <app-home-screen></app-home-screen>\r\n        </div>\r\n        \r\n        <div class=\"action-section\">\r\n            <po-button \r\n                p-label=\"Iniciar captura de voz\" \r\n                p-kind=\"primary\" \r\n                (p-click)=\"startVoiceCapture()\" \r\n                p-icon=\"an an-arrow-right\"\r\n                class=\"primary-action-button\">\r\n            </po-button>\r\n        </div>\r\n    }\r\n    @else if(!audioProcessingFinished) {\r\n        <!-- Seção de abertura do app no celular - apenas para versão web -->\r\n        @if(showQRCode && qrCodeData) {\r\n            <div class=\"qr-code-section\">\r\n                <po-accordion class=\"mobile-session-accordion\">\r\n                    <po-accordion-item p-label=\"Continua esta sessão no celular\">\r\n                        <div class=\"qr-code-container\">\r\n                            <div class=\"qr-code-content\">\r\n                                <h3>Abrir aplicativo no celular</h3>\r\n                                <div class=\"qr-code-wrapper\" (click)=\"notifyAppOpenedOnMobile()\" style=\"cursor: pointer;\">\r\n                                    <img src=\"openapp.svg\" alt=\"Abrir aplicativo\" width=\"200\" height=\"200\">\r\n                                </div>\r\n                                <p class=\"qr-code-instructions\">\r\n                                    Clique na imagem acima para notificar que o aplicativo foi aberto no dispositivo móvel.\r\n                                </p>\r\n                            </div>\r\n                        </div>\r\n                    </po-accordion-item>\r\n                </po-accordion>\r\n            </div>\r\n        }\r\n        \r\n        <div class=\"recording-section\">\r\n            <app-voice-recorder \r\n                (selectedAudiosEvent)=\"handleSelectedAudios($event)\" \r\n                [enableTour]=\"enableTour\"\r\n                [loading]=\"loading\">\r\n            </app-voice-recorder>\r\n        </div>\r\n        <div class=\"action-section\">\r\n            <po-button \r\n                [p-disabled]=\"selectedAudios.length === 0\" \r\n                [p-label]=\"'Finalizar captura (' + selectedAudios.length + ')'\" \r\n                p-kind=\"primary\"\r\n                (p-click)=\"finishVoiceCapture()\"\r\n                class=\"primary-action-button\">\r\n            </po-button>\r\n        </div>\r\n    }\r\n    @else {\r\n        <div class=\"completion-section\">\r\n            <app-audio-finish></app-audio-finish>\r\n        </div>\r\n    }\r\n</div>","/*\r\n * Public API Surface of dta-voice\r\n */\r\n\r\nexport * from './lib/dta-voice/voice-page-slide/voice-page-slide.component';\r\nexport * from './lib/dta-voice/voice-web-app/voice-web-app.component';\r\nexport * from './lib/dta-voice/shared/models'\r\nexport * from './lib/dta-voice/core/services';\r\nexport * from './lib/dta-voice/core/https/jwt-auth.api';\r\nexport * from './lib/environments/environment';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i1.JwtAuthApi","i2.JwtAuthApi","i1.AudioApi","i2.SendAudiosTracksApi","i1.SignalRConnectionService","i1.SendAudiosTracksService","i2.SignalRConnectionService","i3.SignalRInitializerService","i1.SignalRInitializerService","i3","i4"],"mappings":"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"}