import { Storage } from '@angular/fire/storage'; import { Observable } from 'rxjs'; import { StorageListResult, StorageMetadata, UploadProgress, UploadResult } from './types'; import * as i0 from "@angular/core"; /** * Servicio para Firebase Storage. * * @example * ```typescript * @Component({...}) * export class FileUploadComponent { * private storage = inject(StorageService); * * uploadProgress = signal(0); * downloadUrl = signal(null); * * async onFileSelected(event: Event) { * const file = (event.target as HTMLInputElement).files?.[0]; * if (!file) return; * * // Upload con progreso * this.storage.upload(`uploads/${file.name}`, file).subscribe({ * next: (progress) => this.uploadProgress.set(progress.percentage), * complete: async () => { * const url = await this.storage.getDownloadUrl(`uploads/${file.name}`); * this.downloadUrl.set(url); * } * }); * } * } * ``` */ export declare class StorageService { private storage; private config; constructor(storage: Storage); /** * Prefija el path de storage con el appId si está configurado. * Si no hay appId o skipPrefix es true, retorna el path sin modificar. * * @param path - Ruta original * @param skipPrefix - Si es true, no aplica el prefix (útil para paths compartidos como avatares) * @internal */ private prefixStoragePath; /** * Sube un archivo con tracking de progreso. * * @param path - Ruta en Storage donde guardar el archivo * @param file - Archivo a subir (File o Blob) * @param metadata - Metadata opcional (contentType, customMetadata) * @returns Observable que emite el progreso y completa cuando termina * * @example * ```typescript * // Upload básico * storage.upload('images/photo.jpg', file).subscribe({ * next: (progress) => console.log(`${progress.percentage}%`), * complete: () => console.log('Upload completado') * }); * * // Con metadata * storage.upload('docs/report.pdf', file, { * contentType: 'application/pdf', * customMetadata: { uploadedBy: 'user123' } * }).subscribe(...); * ``` */ upload(path: string, file: File | Blob, metadata?: StorageMetadata): Observable; /** * Sube un archivo y retorna la URL de descarga al completar. * * @param path - Ruta en Storage * @param file - Archivo a subir * @param metadata - Metadata opcional * @returns Resultado del upload con URL de descarga * * @example * ```typescript * const result = await storage.uploadAndGetUrl('avatars/user123.jpg', file); * console.log('URL:', result.downloadUrl); * ``` */ uploadAndGetUrl(path: string, file: File | Blob, metadata?: StorageMetadata): Promise; /** * Sube un archivo desde una Data URL (base64). * * @param path - Ruta en Storage * @param dataUrl - Data URL (ej: 'data:image/png;base64,...') * @param metadata - Metadata opcional * @returns Resultado del upload * * @example * ```typescript * // Desde canvas * const dataUrl = canvas.toDataURL('image/png'); * const result = await storage.uploadFromDataUrl('images/drawing.png', dataUrl); * ``` */ uploadFromDataUrl(path: string, dataUrl: string, metadata?: StorageMetadata): Promise; /** * Obtiene la URL de descarga de un archivo. * * @param path - Ruta del archivo en Storage * @returns URL de descarga * * @example * ```typescript * const url = await storage.getDownloadUrl('images/photo.jpg'); * // Usar en * ``` */ getDownloadUrl(path: string): Promise; /** * Obtiene la metadata de un archivo. * * @param path - Ruta del archivo * @returns Metadata del archivo */ getMetadata(path: string): Promise; /** * Elimina un archivo. * * @param path - Ruta del archivo a eliminar * * @example * ```typescript * await storage.delete('images/old-photo.jpg'); * ``` */ delete(path: string): Promise; /** * Elimina múltiples archivos. * * @param paths - Array de rutas a eliminar * * @example * ```typescript * await storage.deleteMultiple([ * 'images/photo1.jpg', * 'images/photo2.jpg' * ]); * ``` */ deleteMultiple(paths: string[]): Promise; /** * Lista archivos en un directorio. * * @param path - Ruta del directorio * @returns Lista de rutas de archivos * * @example * ```typescript * const result = await storage.list('images/'); * console.log(result.items); // ['images/photo1.jpg', 'images/photo2.jpg'] * ``` */ list(path: string): Promise; /** * Genera un nombre de archivo único con timestamp. * * @param originalName - Nombre original del archivo * @param prefix - Prefijo opcional * @returns Nombre único * * @example * ```typescript * const uniqueName = storage.generateFileName('photo.jpg', 'user123'); * // => 'user123_1703091234567_photo.jpg' * ``` */ generateFileName(originalName: string, prefix?: string): string; /** * Genera una ruta única para un archivo. * * @param directory - Directorio base * @param originalName - Nombre original * @param prefix - Prefijo opcional * @returns Ruta completa única * * @example * ```typescript * const path = storage.generatePath('uploads', 'photo.jpg', 'user123'); * // => 'uploads/user123_1703091234567_photo.jpg' * ``` */ generatePath(directory: string, originalName: string, prefix?: string): string; /** * Obtiene la extensión de un archivo. * * @param filename - Nombre del archivo * @returns Extensión (sin el punto) */ getExtension(filename: string): string; /** * Verifica si un archivo es una imagen basándose en su extensión. */ isImage(filename: string): boolean; /** * Verifica si un archivo es un documento. */ isDocument(filename: string): boolean; /** * Construye la URL de avatar de un usuario. * * Los avatares se almacenan en paths predecibles: `users/{userId}/avatar.jpg` * Esto permite que cualquier app pueda mostrar avatares sin pedir la URL al backend, * solo necesita el userId. * * @param userId - ID del usuario (ULID) * @param type - 'avatar' para imagen completa, 'thumb' para thumbnail * @returns URL directa de Firebase Storage * * @example * ```typescript * // Mostrar avatar de cualquier usuario * const avatarUrl = storage.getUserAvatarUrl('01ABCD...'); * const thumbUrl = storage.getUserAvatarUrl('01ABCD...', 'thumb'); * * // Con cache-busting * const freshUrl = storage.getUserAvatarUrl(userId) + `&t=${Date.now()}`; * ``` */ getUserAvatarUrl(userId: string, type?: 'avatar' | 'thumb'): string; /** * Mapea el estado de la tarea de upload */ private mapTaskState; /** * Convierte errores de Storage a mensajes en español */ private getErrorMessage; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; }