Spaces:
Building
Building
File size: 3,334 Bytes
9f79da5 35b2ee3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
<mat-card class="realtime-chat-container">
<mat-card-header>
<mat-icon mat-card-avatar>voice_chat</mat-icon>
<mat-card-title>Real-time Conversation</mat-card-title>
<mat-card-subtitle>
<mat-chip-listbox>
<mat-chip [class.active]="currentState === state"
*ngFor="let state of conversationStates">
{{ getStateLabel(state) }}
</mat-chip>
</mat-chip-listbox>
</mat-card-subtitle>
<button mat-icon-button class="close-button" (click)="closeDialog()">
<mat-icon>close</mat-icon>
</button>
</mat-card-header>
<mat-divider></mat-divider>
<mat-card-content>
<!-- Error State -->
<div class="error-banner" *ngIf="error">
<mat-icon>error_outline</mat-icon>
<span>{{ error }}</span>
<button mat-icon-button (click)="retryConnection()">
<mat-icon>refresh</mat-icon>
</button>
</div>
<!-- Chat Messages -->
<div class="chat-messages" #scrollContainer>
<div *ngFor="let msg of messages; trackBy: trackByIndex"
[class]="'message ' + msg.role">
<mat-icon class="message-icon">
{{ msg.role === 'user' ? 'person' : msg.role === 'assistant' ? 'smart_toy' : 'info' }}
</mat-icon>
<div class="message-content">
<div class="message-text">{{ msg.text }}</div>
<div class="message-time">{{ msg.timestamp | date:'HH:mm:ss' }}</div>
<button *ngIf="msg.audioUrl && msg.role === 'assistant'"
mat-icon-button
(click)="playAudio(msg.audioUrl)"
class="audio-button"
[disabled]="isPlayingAudio">
<mat-icon>{{ isPlayingAudio ? 'stop' : 'volume_up' }}</mat-icon>
</button>
</div>
</div>
<!-- Empty State -->
<div class="empty-state" *ngIf="messages.length === 0 && !isConversationActive">
<mat-icon>mic_off</mat-icon>
<p>Konuşmaya başlamak için aşağıdaki butona tıklayın</p>
</div>
</div>
<!-- Audio Visualizer -->
<canvas #audioVisualizer
class="audio-visualizer"
width="600"
height="100"
[class.active]="isConversationActive">
</canvas>
</mat-card-content>
<mat-card-actions>
<button mat-raised-button
color="primary"
(click)="toggleConversation()"
[disabled]="!sessionId || loading">
@if (loading) {
<mat-spinner diameter="20"></mat-spinner>
} @else {
<mat-icon>{{ isConversationActive ? 'stop' : 'mic' }}</mat-icon>
{{ isConversationActive ? 'Konuşmayı Bitir' : 'Konuşmaya Başla' }}
}
</button>
<button mat-button
(click)="clearChat()"
[disabled]="messages.length === 0">
<mat-icon>clear</mat-icon>
Temizle
</button>
<!-- Barge-in butonu şimdilik gizlendi
<button mat-button
(click)="performBargeIn()"
[disabled]="!isConversationActive || currentState === 'idle' || currentState === 'listening'">
<mat-icon>pan_tool</mat-icon>
Kesme (Barge-in)
</button>
-->
</mat-card-actions>
</mat-card> |