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 { ApiService, Environment } from '../../services/api.service'; @Component({ selector: 'app-environment', standalone: true, imports: [ CommonModule, FormsModule, MatCardModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule, MatSnackBarModule ], template: `
settings Environment Configuration
Work Mode HF Cloud Cloud On-Premise cloud Cloud Token vpn_key Required for HF Cloud and Cloud modes Spark Endpoint link
`, 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; } } } .full-width { width: 100%; margin-bottom: 20px; } .form-actions { display: flex; gap: 16px; margin-top: 24px; padding-top: 24px; border-top: 1px solid #e0e0e0; button { display: flex; align-items: center; gap: 8px; mat-spinner { margin-right: 8px; } } } ::ng-deep { .mat-mdc-form-field-icon-prefix { padding-right: 12px; } .mat-mdc-progress-spinner { --mdc-circular-progress-active-indicator-color: white; } } `] }) export class EnvironmentComponent implements OnInit { private apiService = inject(ApiService); private snackBar = inject(MatSnackBar); environment: Environment = { work_mode: 'hfcloud', cloud_token: '', spark_endpoint: '' }; 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; } }); } onWorkModeChange() { if (this.environment.work_mode === 'on-premise') { this.environment.cloud_token = ''; } } save() { this.saving = true; this.apiService.updateEnvironment(this.environment).subscribe({ next: () => { 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() { this.snackBar.open('Reloading configuration from Spark...', undefined, { duration: 2000 }); setTimeout(() => { this.loadEnvironment(); this.snackBar.open('Configuration reloaded', 'Close', { duration: 3000 }); }, 1000); } }