valtech-components 4.0.976 → 4.0.978
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/molecules/profile-card/profile-card.component.mjs +86 -12
- package/esm2022/lib/services/video-upload/types.mjs +2 -0
- package/esm2022/lib/services/video-upload/video-upload.service.mjs +101 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/valtech-components.mjs +185 -13
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/profile-card/profile-card.component.d.ts +12 -0
- package/lib/services/video-upload/types.d.ts +23 -0
- package/lib/services/video-upload/video-upload.service.d.ts +59 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -5,11 +5,16 @@ export interface ProfileCardLinks {
|
|
|
5
5
|
whatsapp?: string | null;
|
|
6
6
|
phone?: string | null;
|
|
7
7
|
email?: string | null;
|
|
8
|
+
facebook?: string | null;
|
|
8
9
|
}
|
|
9
10
|
export interface ProfileCardStat {
|
|
10
11
|
label: string;
|
|
11
12
|
value: number | string;
|
|
12
13
|
}
|
|
14
|
+
export interface ProfileCardPlace {
|
|
15
|
+
city?: string;
|
|
16
|
+
region?: string;
|
|
17
|
+
}
|
|
13
18
|
/**
|
|
14
19
|
* Datos agnósticos al dominio (ADR-063) — sirve refugio (Chesed), creador de
|
|
15
20
|
* recetas (Mealplan) o cualquier publisher/entidad con perfil público.
|
|
@@ -20,7 +25,10 @@ export interface ProfileCardData {
|
|
|
20
25
|
handle?: string | null;
|
|
21
26
|
verified?: boolean;
|
|
22
27
|
verifiedLabel?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
place?: ProfileCardPlace;
|
|
23
30
|
stat?: ProfileCardStat;
|
|
31
|
+
stats?: Array<ProfileCardStat>;
|
|
24
32
|
links?: ProfileCardLinks;
|
|
25
33
|
}
|
|
26
34
|
/**
|
|
@@ -36,7 +44,11 @@ export declare class ProfileCardComponent {
|
|
|
36
44
|
readonly safeWhatsapp: import("@angular/core").Signal<string>;
|
|
37
45
|
readonly safePhone: import("@angular/core").Signal<string>;
|
|
38
46
|
readonly safeEmail: import("@angular/core").Signal<string>;
|
|
47
|
+
readonly safeFacebook: import("@angular/core").Signal<string>;
|
|
39
48
|
readonly hasLinks: import("@angular/core").Signal<boolean>;
|
|
49
|
+
readonly statsToShow: import("@angular/core").Signal<ProfileCardStat[]>;
|
|
50
|
+
private facebookUrl;
|
|
51
|
+
formatPlace(place: ProfileCardPlace): string;
|
|
40
52
|
static ɵfac: i0.ɵɵFactoryDeclaration<ProfileCardComponent, never>;
|
|
41
53
|
static ɵcmp: i0.ɵɵComponentDeclaration<ProfileCardComponent, "val-profile-card", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
42
54
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contrato de subida directa a S3 vía POST presignado (ADR-087). El consumer
|
|
3
|
+
* nunca arma este objeto a mano — lo recibe tal cual del backend
|
|
4
|
+
* (`RequestVideoUploadResponse`) y se lo pasa a `VideoUploadService.upload()`.
|
|
5
|
+
*/
|
|
6
|
+
export interface S3PostUploadIntent {
|
|
7
|
+
uploadUrl: string;
|
|
8
|
+
uploadFields: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Los dos pasos que SÍ dependen del dominio (receta, contenido, animal en
|
|
12
|
+
* adopción...) y que la lib no puede conocer: cómo pedir el intent de subida
|
|
13
|
+
* y cómo avisar que terminó. Todo lo demás (armar el FormData, el POST a S3,
|
|
14
|
+
* el orden intent→S3→finalize) lo resuelve `VideoUploadService`.
|
|
15
|
+
*/
|
|
16
|
+
export interface VideoUploadHandlers {
|
|
17
|
+
requestIntent: (file: File) => Promise<S3PostUploadIntent>;
|
|
18
|
+
finalize: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export type VideoUploadStatus = 'uploading' | 'processing';
|
|
21
|
+
export interface VideoUploadProgress {
|
|
22
|
+
status: VideoUploadStatus;
|
|
23
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { VideoUploadHandlers, VideoUploadProgress } from './types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Subida directa a S3 vía POST presignado (ADR-087, "el video no puede pasar
|
|
6
|
+
* por la API" — API Gateway tiene un tope duro de ~10MB de payload y un
|
|
7
|
+
* timeout de integración de 29s, ninguno de los dos configurable). El
|
|
8
|
+
* archivo nunca toca nuestro backend.
|
|
9
|
+
*
|
|
10
|
+
* Antes de este servicio, `uploadVideoToS3` vivía copiado literal en cada app
|
|
11
|
+
* consumidora (Eklesee, Okhelia) — mismo texto, mismo comentario, mismo
|
|
12
|
+
* riesgo de que un fix quede aplicado en una sola copia. Este servicio es al
|
|
13
|
+
* video lo que `StorageService` es a Firebase Storage: la app nunca ve el
|
|
14
|
+
* bucket, nunca arma un `FormData`, nunca sabe que el proveedor es S3.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* private videoUpload = inject(VideoUploadService);
|
|
19
|
+
*
|
|
20
|
+
* onFileSelected(file: File) {
|
|
21
|
+
* this.videoUpload.upload(file, {
|
|
22
|
+
* requestIntent: (f) => firstValueFrom(this.recipeSvc.requestVideoUpload(recipeId, {
|
|
23
|
+
* filename: f.name, contentType: f.type || 'video/mp4', sizeBytes: f.size,
|
|
24
|
+
* })),
|
|
25
|
+
* finalize: () => firstValueFrom(this.recipeSvc.finalizeVideoUpload(recipeId)),
|
|
26
|
+
* }).subscribe({
|
|
27
|
+
* next: (progress) => this.state.set(progress.status),
|
|
28
|
+
* error: (err) => this.errors.handle(err, { context: 'my-page.uploadVideo', ... }),
|
|
29
|
+
* complete: () => this.state.set('done'),
|
|
30
|
+
* });
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class VideoUploadService {
|
|
35
|
+
/**
|
|
36
|
+
* Orquesta el flujo completo: pide el intent al backend del dominio, sube
|
|
37
|
+
* el archivo a S3, y avisa que terminó. Emite el progreso en dos pasos
|
|
38
|
+
* (`uploading` mientras sube a S3, `processing` mientras el backend hace
|
|
39
|
+
* `finalize`) y completa cuando el backend confirma — el estado real del
|
|
40
|
+
* video (`ready`/`failed`) sigue siendo async del lado del backend
|
|
41
|
+
* (EventBridge → worker), esto solo cubre la subida.
|
|
42
|
+
*/
|
|
43
|
+
upload(file: File, handlers: VideoUploadHandlers): Observable<VideoUploadProgress>;
|
|
44
|
+
/**
|
|
45
|
+
* Arma el `FormData` de la subida POST de S3 y lo envía. **Orden del
|
|
46
|
+
* FormData**: los campos de la policy PRIMERO, el archivo AL FINAL — es un
|
|
47
|
+
* requisito del form-based upload de S3 (RFC de multipart/form-data + cómo
|
|
48
|
+
* S3 procesa la policy), no un detalle de estilo.
|
|
49
|
+
*
|
|
50
|
+
* Usa `fetch()` nativo A PROPÓSITO, nunca `HttpClient`: el interceptor de
|
|
51
|
+
* `provideValtechAuth` agrega `Authorization: Bearer <token>` a cualquier
|
|
52
|
+
* request que pase por él, y no corresponde que ese token viaje a un
|
|
53
|
+
* dominio de S3 que no es nuestro backend.
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
private postToS3;
|
|
57
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<VideoUploadService, never>;
|
|
58
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<VideoUploadService>;
|
|
59
|
+
}
|
package/lib/version.d.ts
CHANGED
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -430,6 +430,8 @@ export * from './lib/services/icons.service';
|
|
|
430
430
|
export * from './lib/services/in-app-browser.service';
|
|
431
431
|
export * from './lib/services/link-processor.service';
|
|
432
432
|
export * from './lib/services/local-storage.service';
|
|
433
|
+
export * from './lib/services/video-upload/types';
|
|
434
|
+
export * from './lib/services/video-upload/video-upload.service';
|
|
433
435
|
export * from './lib/services/locale.service';
|
|
434
436
|
export * from './lib/services/navigation';
|
|
435
437
|
export * from './lib/services/theme.service';
|