import { AvatarUploadError, AvatarUploadMetadata, AvatarUploadResult } from '../avatar-upload/types'; import { ShareProfileModalMetadata } from '../share-profile-modal/types'; import { CtaCardMetadata } from '../../molecules/cta-card/types'; import { EmptyStateMetadata } from '../../molecules/empty-state/types'; import { FormMetadata, FormSubmit } from '../../types'; import { GetProfileResponse } from '../../../services/auth/types'; import { ProfileViewConfig } from './types'; import * as i0 from "@angular/core"; /** * `val-profile-view` — vista Perfil full-feature autocontenida (organism). * * Edita los campos públicos del usuario en UN solo formulario con UN solo botón * "Guardar". Wireup: * - Avatar — val-avatar-upload (Firebase Storage + backend sync). Separado del * form porque es upload sync independiente. * - Handle (@usuario) — InputType.HANDLE (val-username-input con check de * disponibilidad async resuelto vía AuthService inyectado). * - Nombre — InputType.TEXT. * - Teléfono — InputType.PHONE. * * Submit handler dispatcha: * 1. Si handle cambió → updateHandle PRIMERO (uniqueness). * 2. Si name o phone cambió → updateProfile con ambos. * * Lectura del perfil: suscribe al doc Firestore /users/{uid} (mirror que mantiene * el backend). Reactivo cross-tab + auto-refresca tras save. Fallback REST * (auth.getProfile) si el doc no existe o el listener falla. * * NO renderiza ion-content — vive dentro de val-page-wrapper. * * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no * proveyó el namespace configurado (default `Settings.Profile`). */ export declare class ProfileViewComponent { private nav; private auth; private i18n; private toast; private errors; private firebase; private collections; private route; /** * Config vía @Input (object-first). Si no se pasa, se cae al route data * `profileConfig` (poblado por `provideValtechProfileRoutes`). `resolvedConfig` * mergea con los defaults. */ config?: ProfileViewConfig; /** Config mergeada con defaults. @Input gana sobre route data. */ readonly resolvedConfig: import("@angular/core").Signal> & Pick>; /** Namespace i18n resuelto (capturado una vez para llamadas no-reactivas). */ private get ns(); /** * Colección global /users/{uid} (skipAppPrefix: true — el doc vive fuera de * apps/{appId}/... porque es cross-app, ver firestore.rules). */ private usersCol; private formCmp; readonly profile: import("@angular/core").WritableSignal; readonly loading: import("@angular/core").WritableSignal; readonly saving: import("@angular/core").WritableSignal; readonly loadError: import("@angular/core").WritableSignal; readonly shareOpen: import("@angular/core").WritableSignal; readonly shareCta: import("@angular/core").Signal; readonly shareModal: import("@angular/core").Signal; private readonly _userId; readonly errorState: import("@angular/core").Signal; readonly avatarProps: import("@angular/core").Signal; formMeta: FormMetadata; constructor(); /** Construcción inicial — UNA vez. Gatea handle/phone según config. */ private buildFormMeta; /** Re-aplica labels/hints/placeholders en cambio de idioma. */ private applyI18nLabels; /** * Fallback REST. Capa 4 (UI declarativa): NO toasteamos acá — el * val-empty-state ES la UI del error. */ private loadFromApi; private mapMirrorToProfile; onSubmit(event: FormSubmit): Promise; onAvatarUploaded(result: AvatarUploadResult): void; onAvatarError(_err: AvatarUploadError): void; /** Lee del namespace configurado. */ protected t(key: string): string; private initialsFromName; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }