import { Component, inject, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';
import { MatExpansionModule } from '@angular/material/expansion';
import { ApiService, Environment } from '../../services/api.service';
import { EnvironmentService } from '../../services/environment.service';
@Component({
selector: 'app-environment',
standalone: true,
imports: [
CommonModule,
FormsModule,
MatCardModule,
MatFormFieldModule,
MatInputModule,
MatSelectModule,
MatButtonModule,
MatIconModule,
MatProgressSpinnerModule,
MatSnackBarModule,
MatExpansionModule
],
template: `
settings
Environment Configuration
@if (isGPTMode()) {
info
{{ environment.work_mode === 'gpt4o' ? 'GPT-4o' : 'GPT-4o Mini' }} Mode
This mode uses OpenAI's API which has usage-based pricing.
Approximate cost: {{ environment.work_mode === 'gpt4o' ? '$0.01-0.03' : '$0.001-0.003' }} per conversation turn.
}
`,
styles: [`
.environment-container {
max-width: 800px;
margin: 0 auto;
}
mat-card-header {
margin-bottom: 24px;
mat-card-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 24px;
mat-icon {
font-size: 28px;
width: 28px;
height: 28px;
}
}
}
.info-card {
margin-bottom: 20px;
background-color: #e3f2fd;
mat-card-content {
display: flex;
gap: 16px;
align-items: flex-start;
mat-icon {
color: #1976d2;
margin-top: 4px;
}
p {
margin: 4px 0;
font-size: 14px;
}
}
}
.full-width {
width: 100%;
margin-bottom: 20px;
}
.engine-row {
display: flex;
gap: 16px;
align-items: flex-start;
margin-bottom: 20px;
.engine-field {
flex: 1;
}
.api-key-field {
flex: 1.5;
}
}
.prompt-panel {
margin-bottom: 20px;
mat-expansion-panel-header {
mat-panel-title {
display: flex;
align-items: center;
gap: 8px;
mat-icon {
color: #666;
}
}
}
}
.form-actions {
display: flex;
gap: 16px;
margin-top: 24px;
padding-top: 24px;
border-top: 1px solid #e0e0e0;
button {
mat-spinner {
margin-right: 8px;
vertical-align: middle; // Spinner'ı hizalamak için ekleyin
}
mat-icon {
vertical-align: middle; // Icon'u hizalamak için ekleyin
margin-right: 4px; // Icon ile text arasına boşluk
}
}
}
::ng-deep {
.mat-mdc-form-field-icon-prefix {
padding-right: 12px;
}
.mat-mdc-progress-spinner {
--mdc-circular-progress-active-indicator-color: white;
}
.mat-expansion-panel-body {
padding: 16px 0 !important;
}
}
`]
})
export class EnvironmentComponent implements OnInit {
private apiService = inject(ApiService);
private snackBar = inject(MatSnackBar);
private environmentService = inject(EnvironmentService);
environment: Environment = {
work_mode: 'hfcloud',
cloud_token: '',
spark_endpoint: '',
internal_prompt: '',
tts_engine: 'no_tts',
tts_engine_api_key: '',
stt_engine: 'no_stt',
stt_engine_api_key: ''
};
loading = true;
saving = false;
ngOnInit() {
this.loadEnvironment();
}
loadEnvironment() {
this.loading = true;
this.apiService.getEnvironment().subscribe({
next: (env) => {
this.environment = env;
this.loading = false;
},
error: (err) => {
this.snackBar.open('Failed to load environment configuration', 'Close', {
duration: 5000,
panelClass: 'error-snackbar'
});
this.loading = false;
}
});
}
getTokenLabel(): string {
switch(this.environment.work_mode) {
case 'gpt4o':
case 'gpt4o-mini':
return 'OpenAI API Key';
case 'hfcloud':
case 'cloud':
return 'Cloud Token';
default:
return 'Cloud Token';
}
}
getTokenPlaceholder(): string {
switch(this.environment.work_mode) {
case 'gpt4o':
case 'gpt4o-mini':
return 'Enter OpenAI API key (sk-...)';
case 'hfcloud':
case 'cloud':
return 'Enter cloud token';
default:
return 'Enter cloud token';
}
}
isGPTMode(): boolean {
return this.environment.work_mode === 'gpt4o' || this.environment.work_mode === 'gpt4o-mini';
}
onWorkModeChange() {
if (this.environment.work_mode === 'on-premise') {
this.environment.cloud_token = '';
}
}
onTTSEngineChange() {
if (this.environment.tts_engine === 'no_tts') {
this.environment.tts_engine_api_key = '';
}
}
onSTTEngineChange() {
if (this.environment.stt_engine === 'no_stt') {
this.environment.stt_engine_api_key = '';
}
}
save() {
this.saving = true;
this.apiService.updateEnvironment(this.environment).subscribe({
next: () => {
// Environment service'i güncelle
this.environmentService.updateEnvironment(this.environment);
this.snackBar.open('Environment configuration saved successfully', 'Close', {
duration: 3000
});
this.saving = false;
},
error: (err) => {
this.snackBar.open(
err.error?.detail || 'Failed to save configuration',
'Close',
{ duration: 5000, panelClass: 'error-snackbar' }
);
this.saving = false;
}
});
}
testConnection() {
this.snackBar.open('Testing connection to Spark endpoint...', undefined, {
duration: 2000
});
// TODO: Implement actual connection test
setTimeout(() => {
this.snackBar.open('Connection successful!', 'Close', {
duration: 3000
});
}, 2000);
}
reloadFromSpark() {
if (this.isGPTMode()) {
return;
}
this.snackBar.open('Reloading configuration from Spark...', undefined, {
duration: 2000
});
setTimeout(() => {
this.loadEnvironment();
this.snackBar.open('Configuration reloaded', 'Close', {
duration: 3000
});
}, 1000);
}
}