/* eslint-disable @typescript-eslint/member-ordering */ import { Component, inject, signal } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { NgIcon, provideIcons } from '@ng-icons/core'; import { lucideShield, lucidePlus, lucideTrash2, lucideArrowUp, lucideArrowDown, lucideRotateCcw } from '@ng-icons/lucide'; import { IceServerSettingsService, IceServerEntry } from '../../../../infrastructure/realtime/ice-server-settings.service'; import { APP_TRANSLATE_IMPORTS, AppI18nService } from '../../../../core/i18n'; @Component({ selector: 'app-ice-server-settings', standalone: true, host: { style: 'display: block;' }, imports: [ CommonModule, FormsModule, NgIcon, ...APP_TRANSLATE_IMPORTS ], viewProviders: [ provideIcons({ lucideShield, lucidePlus, lucideTrash2, lucideArrowUp, lucideArrowDown, lucideRotateCcw }) ], templateUrl: './ice-server-settings.component.html' }) export class IceServerSettingsComponent { private iceSettings = inject(IceServerSettingsService); private readonly appI18n = inject(AppI18nService); entries = this.iceSettings.entries; addError = signal(null); newType: 'stun' | 'turn' = 'stun'; newUrl = ''; newUsername = ''; newCredential = ''; addEntry(): void { this.addError.set(null); const url = this.newUrl.trim(); if (!url) { this.addError.set(this.appI18n.instant('settings.network.ice.errors.urlRequired')); return; } const prefix = this.newType === 'stun' ? 'stun:' : 'turn'; if (!url.startsWith(prefix) && !url.startsWith('turns:')) { this.addError.set(this.appI18n.instant( this.newType === 'stun' ? 'settings.network.ice.errors.urlPrefixStun' : 'settings.network.ice.errors.urlPrefixTurn' )); return; } if (this.newType === 'turn' && !this.newUsername.trim()) { this.addError.set(this.appI18n.instant('settings.network.ice.errors.usernameRequired')); return; } if (this.newType === 'turn' && !this.newCredential.trim()) { this.addError.set(this.appI18n.instant('settings.network.ice.errors.credentialRequired')); return; } if (this.entries().some((entry) => entry.urls === url)) { this.addError.set(this.appI18n.instant('settings.network.ice.errors.duplicateUrl')); return; } this.iceSettings.addEntry({ type: this.newType, urls: url, ...(this.newType === 'turn' ? { username: this.newUsername.trim(), credential: this.newCredential.trim() } : {}) }); this.newUrl = ''; this.newUsername = ''; this.newCredential = ''; } removeEntry(id: string): void { this.iceSettings.removeEntry(id); } moveUp(index: number): void { if (index > 0) this.iceSettings.moveEntry(index, index - 1); } moveDown(index: number): void { if (index < this.entries().length - 1) this.iceSettings.moveEntry(index, index + 1); } restoreDefaults(): void { this.iceSettings.restoreDefaults(); } trackEntry(_index: number, entry: IceServerEntry): string { return entry.id; } }