valtech-components 2.0.445 → 2.0.446
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/public-api.mjs +9 -6
- package/fesm2022/valtech-components.mjs +5 -3237
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/article/article.component.d.ts +5 -5
- package/package.json +1 -1
- package/public-api.d.ts +0 -5
- package/esm2022/lib/components/molecules/feedback-form/feedback-form.component.mjs +0 -352
- package/esm2022/lib/components/molecules/feedback-form/types.mjs +0 -2
- package/esm2022/lib/services/auth/auth-state.service.mjs +0 -173
- package/esm2022/lib/services/auth/auth.service.mjs +0 -454
- package/esm2022/lib/services/auth/config.mjs +0 -76
- package/esm2022/lib/services/auth/guards.mjs +0 -194
- package/esm2022/lib/services/auth/index.mjs +0 -70
- package/esm2022/lib/services/auth/interceptor.mjs +0 -98
- package/esm2022/lib/services/auth/storage.service.mjs +0 -138
- package/esm2022/lib/services/auth/sync.service.mjs +0 -146
- package/esm2022/lib/services/auth/token.service.mjs +0 -113
- package/esm2022/lib/services/auth/types.mjs +0 -29
- package/esm2022/lib/services/content/content-types/blog.mjs +0 -275
- package/esm2022/lib/services/content/content-types/documentation.mjs +0 -303
- package/esm2022/lib/services/content/content-types/news.mjs +0 -277
- package/esm2022/lib/services/content/index.mjs +0 -51
- package/esm2022/lib/services/content/transformer.mjs +0 -265
- package/esm2022/lib/services/content/types.mjs +0 -41
- package/esm2022/lib/services/feedback/config.mjs +0 -49
- package/esm2022/lib/services/feedback/feedback.service.mjs +0 -174
- package/esm2022/lib/services/feedback/index.mjs +0 -44
- package/esm2022/lib/services/feedback/types.mjs +0 -30
- package/lib/components/molecules/feedback-form/feedback-form.component.d.ts +0 -56
- package/lib/components/molecules/feedback-form/types.d.ts +0 -54
- package/lib/services/auth/auth-state.service.d.ts +0 -85
- package/lib/services/auth/auth.service.d.ts +0 -146
- package/lib/services/auth/config.d.ts +0 -38
- package/lib/services/auth/guards.d.ts +0 -123
- package/lib/services/auth/index.d.ts +0 -63
- package/lib/services/auth/interceptor.d.ts +0 -22
- package/lib/services/auth/storage.service.d.ts +0 -48
- package/lib/services/auth/sync.service.d.ts +0 -49
- package/lib/services/auth/token.service.d.ts +0 -51
- package/lib/services/auth/types.d.ts +0 -315
- package/lib/services/content/content-types/blog.d.ts +0 -148
- package/lib/services/content/content-types/documentation.d.ts +0 -183
- package/lib/services/content/content-types/news.d.ts +0 -162
- package/lib/services/content/index.d.ts +0 -49
- package/lib/services/content/transformer.d.ts +0 -96
- package/lib/services/content/types.d.ts +0 -220
- package/lib/services/feedback/config.d.ts +0 -35
- package/lib/services/feedback/feedback.service.d.ts +0 -76
- package/lib/services/feedback/index.d.ts +0 -40
- package/lib/services/feedback/types.d.ts +0 -107
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { firstValueFrom } from 'rxjs';
|
|
4
|
-
import { VALTECH_FEEDBACK_CONFIG } from './config';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* Servicio para gestionar feedback de usuarios.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* @Component({...})
|
|
12
|
-
* export class MyComponent {
|
|
13
|
-
* private feedbackService = inject(FeedbackService);
|
|
14
|
-
*
|
|
15
|
-
* async submitFeedback() {
|
|
16
|
-
* const response = await this.feedbackService.createAsync(
|
|
17
|
-
* 'feedback',
|
|
18
|
-
* 'Mi comentario',
|
|
19
|
-
* 'Descripción detallada...'
|
|
20
|
-
* );
|
|
21
|
-
* console.log('Feedback enviado:', response.feedbackId);
|
|
22
|
-
* }
|
|
23
|
-
* }
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export class FeedbackService {
|
|
27
|
-
constructor() {
|
|
28
|
-
this.config = inject(VALTECH_FEEDBACK_CONFIG);
|
|
29
|
-
this.http = inject(HttpClient);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* URL base para endpoints de feedback.
|
|
33
|
-
*/
|
|
34
|
-
get baseUrl() {
|
|
35
|
-
return `${this.config.apiUrl}${this.config.feedbackPrefix}`;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Captura el contexto del dispositivo automáticamente.
|
|
39
|
-
*/
|
|
40
|
-
captureDeviceContext() {
|
|
41
|
-
const ua = navigator.userAgent;
|
|
42
|
-
return {
|
|
43
|
-
browser: this.detectBrowser(ua),
|
|
44
|
-
os: this.detectOS(ua),
|
|
45
|
-
viewport: `${window.innerWidth}x${window.innerHeight}`,
|
|
46
|
-
language: navigator.language,
|
|
47
|
-
userAgent: ua,
|
|
48
|
-
pageUrl: window.location.href,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Crea un nuevo feedback.
|
|
53
|
-
*
|
|
54
|
-
* @param type - Tipo de feedback
|
|
55
|
-
* @param title - Título del feedback
|
|
56
|
-
* @param description - Descripción detallada
|
|
57
|
-
* @param attachments - URLs de archivos adjuntos (opcional)
|
|
58
|
-
* @param contentRef - Referencia a contenido específico (opcional)
|
|
59
|
-
* @returns Observable con la respuesta
|
|
60
|
-
*/
|
|
61
|
-
create(type, title, description, attachments = [], contentRef) {
|
|
62
|
-
const request = {
|
|
63
|
-
type,
|
|
64
|
-
title,
|
|
65
|
-
description,
|
|
66
|
-
attachments,
|
|
67
|
-
contentRef,
|
|
68
|
-
deviceContext: this.captureDeviceContext(),
|
|
69
|
-
appId: this.config.appId,
|
|
70
|
-
};
|
|
71
|
-
return this.http.post(this.baseUrl, request);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Crea un nuevo feedback (versión async/await).
|
|
75
|
-
*/
|
|
76
|
-
async createAsync(type, title, description, attachments = [], contentRef) {
|
|
77
|
-
return firstValueFrom(this.create(type, title, description, attachments, contentRef));
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Obtiene un feedback por ID (solo el propietario).
|
|
81
|
-
*
|
|
82
|
-
* @param feedbackId - ID del feedback
|
|
83
|
-
* @returns Observable con la respuesta
|
|
84
|
-
*/
|
|
85
|
-
getById(feedbackId) {
|
|
86
|
-
return this.http.get(`${this.baseUrl}/${feedbackId}`);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Obtiene un feedback por ID (versión async/await).
|
|
90
|
-
*/
|
|
91
|
-
async getByIdAsync(feedbackId) {
|
|
92
|
-
return firstValueFrom(this.getById(feedbackId));
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Valida si un archivo cumple con las restricciones.
|
|
96
|
-
*/
|
|
97
|
-
validateFile(file) {
|
|
98
|
-
// Verificar tamaño
|
|
99
|
-
if (file.size > this.config.maxFileSize) {
|
|
100
|
-
const maxSizeMB = Math.round(this.config.maxFileSize / (1024 * 1024));
|
|
101
|
-
return {
|
|
102
|
-
valid: false,
|
|
103
|
-
error: `El archivo excede el tamaño máximo de ${maxSizeMB}MB`,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
// Verificar tipo
|
|
107
|
-
const allowedTypes = this.config.allowedFileTypes || [];
|
|
108
|
-
const isAllowed = allowedTypes.some((pattern) => {
|
|
109
|
-
if (pattern.endsWith('/*')) {
|
|
110
|
-
const baseType = pattern.replace('/*', '');
|
|
111
|
-
return file.type.startsWith(baseType);
|
|
112
|
-
}
|
|
113
|
-
return file.type === pattern;
|
|
114
|
-
});
|
|
115
|
-
if (!isAllowed) {
|
|
116
|
-
return {
|
|
117
|
-
valid: false,
|
|
118
|
-
error: 'Tipo de archivo no permitido',
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
return { valid: true };
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Obtiene la configuración actual del servicio.
|
|
125
|
-
*/
|
|
126
|
-
getConfig() {
|
|
127
|
-
return this.config;
|
|
128
|
-
}
|
|
129
|
-
// =========================================================================
|
|
130
|
-
// Helpers privados para detección de browser/OS
|
|
131
|
-
// =========================================================================
|
|
132
|
-
detectBrowser(ua) {
|
|
133
|
-
if (ua.includes('Edg/'))
|
|
134
|
-
return 'Edge';
|
|
135
|
-
if (ua.includes('Chrome/'))
|
|
136
|
-
return 'Chrome';
|
|
137
|
-
if (ua.includes('Firefox/'))
|
|
138
|
-
return 'Firefox';
|
|
139
|
-
if (ua.includes('Safari/') && !ua.includes('Chrome'))
|
|
140
|
-
return 'Safari';
|
|
141
|
-
if (ua.includes('Opera') || ua.includes('OPR/'))
|
|
142
|
-
return 'Opera';
|
|
143
|
-
return 'Unknown';
|
|
144
|
-
}
|
|
145
|
-
detectOS(ua) {
|
|
146
|
-
if (ua.includes('Windows NT 10'))
|
|
147
|
-
return 'Windows 10';
|
|
148
|
-
if (ua.includes('Windows NT 11'))
|
|
149
|
-
return 'Windows 11';
|
|
150
|
-
if (ua.includes('Windows'))
|
|
151
|
-
return 'Windows';
|
|
152
|
-
if (ua.includes('Mac OS X')) {
|
|
153
|
-
const match = ua.match(/Mac OS X (\d+[._]\d+)/);
|
|
154
|
-
if (match) {
|
|
155
|
-
return `macOS ${match[1].replace('_', '.')}`;
|
|
156
|
-
}
|
|
157
|
-
return 'macOS';
|
|
158
|
-
}
|
|
159
|
-
if (ua.includes('Android'))
|
|
160
|
-
return 'Android';
|
|
161
|
-
if (ua.includes('iPhone') || ua.includes('iPad'))
|
|
162
|
-
return 'iOS';
|
|
163
|
-
if (ua.includes('Linux'))
|
|
164
|
-
return 'Linux';
|
|
165
|
-
return 'Unknown';
|
|
166
|
-
}
|
|
167
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
168
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackService, providedIn: 'root' }); }
|
|
169
|
-
}
|
|
170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackService, decorators: [{
|
|
171
|
-
type: Injectable,
|
|
172
|
-
args: [{ providedIn: 'root' }]
|
|
173
|
-
}] });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZGJhY2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFjLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBVW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFVSxXQUFNLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDekMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQTJKbkM7SUF6SkM7O09BRUc7SUFDSCxJQUFZLE9BQU87UUFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDL0IsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQixFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckIsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RELFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixTQUFTLEVBQUUsRUFBRTtZQUNiLE9BQU8sRUFBRSxNQUFN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QUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzsrR0E1SlUsZUFBZTttSEFBZixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFZBTFRFQ0hfRkVFREJBQ0tfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlRmVlZGJhY2tSZXF1ZXN0LFxuICBDcmVhdGVGZWVkYmFja1Jlc3BvbnNlLFxuICBHZXRGZWVkYmFja1Jlc3BvbnNlLFxuICBEZXZpY2VDb250ZXh0LFxuICBGZWVkYmFja1R5cGUsXG4gIENvbnRlbnRSZWYsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgZ2VzdGlvbmFyIGZlZWRiYWNrIGRlIHVzdWFyaW9zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcbiAqXG4gKiAgIGFzeW5jIHN1Ym1pdEZlZWRiYWNrKCkge1xuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlQXN5bmMoXG4gKiAgICAgICAnZmVlZGJhY2snLFxuICogICAgICAgJ01pIGNvbWVudGFyaW8nLFxuICogICAgICAgJ0Rlc2NyaXBjacOzbiBkZXRhbGxhZGEuLi4nXG4gKiAgICAgKTtcbiAqICAgICBjb25zb2xlLmxvZygnRmVlZGJhY2sgZW52aWFkbzonLCByZXNwb25zZS5mZWVkYmFja0lkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRmVlZGJhY2tTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoVkFMVEVDSF9GRUVEQkFDS19DT05GSUcpO1xuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgLyoqXG4gICAqIFVSTCBiYXNlIHBhcmEgZW5kcG9pbnRzIGRlIGZlZWRiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcGlVcmx9JHt0aGlzLmNvbmZpZy5mZWVkYmFja1ByZWZpeH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmEgZWwgY29udGV4dG8gZGVsIGRpc3Bvc2l0aXZvIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqL1xuICBjYXB0dXJlRGV2aWNlQ29udGV4dCgpOiBEZXZpY2VDb250ZXh0IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyb3dzZXI6IHRoaXMuZGV0ZWN0QnJvd3Nlcih1YSksXG4gICAgICBvczogdGhpcy5kZXRlY3RPUyh1YSksXG4gICAgICB2aWV3cG9ydDogYCR7d2luZG93LmlubmVyV2lkdGh9eCR7d2luZG93LmlubmVySGVpZ2h0fWAsXG4gICAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgICAgdXNlckFnZW50OiB1YSxcbiAgICAgIHBhZ2VVcmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYSB1biBudWV2byBmZWVkYmFjay5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaXBvIGRlIGZlZWRiYWNrXG4gICAqIEBwYXJhbSB0aXRsZSAtIFTDrXR1bG8gZGVsIGZlZWRiYWNrXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIERlc2NyaXBjacOzbiBkZXRhbGxhZGFcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIC0gVVJMcyBkZSBhcmNoaXZvcyBhZGp1bnRvcyAob3BjaW9uYWwpXG4gICAqIEBwYXJhbSBjb250ZW50UmVmIC0gUmVmZXJlbmNpYSBhIGNvbnRlbmlkbyBlc3BlY8OtZmljbyAob3BjaW9uYWwpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGxhIHJlc3B1ZXN0YVxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHR5cGU6IEZlZWRiYWNrVHlwZSxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgY29udGVudFJlZj86IENvbnRlbnRSZWZcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ3JlYXRlRmVlZGJhY2tSZXF1ZXN0ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIGNvbnRlbnRSZWYsXG4gICAgICBkZXZpY2VDb250ZXh0OiB0aGlzLmNhcHR1cmVEZXZpY2VDb250ZXh0KCksXG4gICAgICBhcHBJZDogdGhpcy5jb25maWcuYXBwSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPih0aGlzLmJhc2VVcmwsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgdW4gbnVldm8gZmVlZGJhY2sgKHZlcnNpw7NuIGFzeW5jL2F3YWl0KS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFzeW5jKFxuICAgIHR5cGU6IEZlZWRiYWNrVHlwZSxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgY29udGVudFJlZj86IENvbnRlbnRSZWZcbiAgKTogUHJvbWlzZTxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5jcmVhdGUodHlwZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBhdHRhY2htZW50cywgY29udGVudFJlZilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgdW4gZmVlZGJhY2sgcG9yIElEIChzb2xvIGVsIHByb3BpZXRhcmlvKS5cbiAgICpcbiAgICogQHBhcmFtIGZlZWRiYWNrSWQgLSBJRCBkZWwgZmVlZGJhY2tcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gbGEgcmVzcHVlc3RhXG4gICAqL1xuICBnZXRCeUlkKGZlZWRiYWNrSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8R2V0RmVlZGJhY2tSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldEZlZWRiYWNrUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vJHtmZWVkYmFja0lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgdW4gZmVlZGJhY2sgcG9yIElEICh2ZXJzacOzbiBhc3luYy9hd2FpdCkuXG4gICAqL1xuICBhc3luYyBnZXRCeUlkQXN5bmMoZmVlZGJhY2tJZDogc3RyaW5nKTogUHJvbWlzZTxHZXRGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuZ2V0QnlJZChmZWVkYmFja0lkKSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhIHNpIHVuIGFyY2hpdm8gY3VtcGxlIGNvbiBsYXMgcmVzdHJpY2Npb25lcy5cbiAgICovXG4gIHZhbGlkYXRlRmlsZShmaWxlOiBGaWxlKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgLy8gVmVyaWZpY2FyIHRhbWHDsW9cbiAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5jb25maWcubWF4RmlsZVNpemUhKSB7XG4gICAgICBjb25zdCBtYXhTaXplTUIgPSBNYXRoLnJvdW5kKHRoaXMuY29uZmlnLm1heEZpbGVTaXplISAvICgxMDI0ICogMTAyNCkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYEVsIGFyY2hpdm8gZXhjZWRlIGVsIHRhbWHDsW8gbcOheGltbyBkZSAke21heFNpemVNQn1NQmAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZlcmlmaWNhciB0aXBvXG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5jb25maWcuYWxsb3dlZEZpbGVUeXBlcyB8fCBbXTtcbiAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkVHlwZXMuc29tZSgocGF0dGVybikgPT4ge1xuICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoJy8qJykpIHtcbiAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBwYXR0ZXJuLnJlcGxhY2UoJy8qJywgJycpO1xuICAgICAgICByZXR1cm4gZmlsZS50eXBlLnN0YXJ0c1dpdGgoYmFzZVR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbGUudHlwZSA9PT0gcGF0dGVybjtcbiAgICB9KTtcblxuICAgIGlmICghaXNBbGxvd2VkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnVGlwbyBkZSBhcmNoaXZvIG5vIHBlcm1pdGlkbycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjb25maWd1cmFjacOzbiBhY3R1YWwgZGVsIHNlcnZpY2lvLlxuICAgKi9cbiAgZ2V0Q29uZmlnKCk6IFJlYWRvbmx5PHR5cGVvZiB0aGlzLmNvbmZpZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGVscGVycyBwcml2YWRvcyBwYXJhIGRldGVjY2nDs24gZGUgYnJvd3Nlci9PU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBkZXRlY3RCcm93c2VyKHVhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1YS5pbmNsdWRlcygnRWRnLycpKSByZXR1cm4gJ0VkZ2UnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnQ2hyb21lLycpKSByZXR1cm4gJ0Nocm9tZSc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdGaXJlZm94LycpKSByZXR1cm4gJ0ZpcmVmb3gnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnU2FmYXJpLycpICYmICF1YS5pbmNsdWRlcygnQ2hyb21lJykpIHJldHVybiAnU2FmYXJpJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ09wZXJhJykgfHwgdWEuaW5jbHVkZXMoJ09QUi8nKSkgcmV0dXJuICdPcGVyYSc7XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0T1ModWE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzIE5UIDEwJykpIHJldHVybiAnV2luZG93cyAxMCc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzIE5UIDExJykpIHJldHVybiAnV2luZG93cyAxMSc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzJykpIHJldHVybiAnV2luZG93cyc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdNYWMgT1MgWCcpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHVhLm1hdGNoKC9NYWMgT1MgWCAoXFxkK1suX11cXGQrKS8pO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBgbWFjT1MgJHttYXRjaFsxXS5yZXBsYWNlKCdfJywgJy4nKX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdtYWNPUyc7XG4gICAgfVxuICAgIGlmICh1YS5pbmNsdWRlcygnQW5kcm9pZCcpKSByZXR1cm4gJ0FuZHJvaWQnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnaVBob25lJykgfHwgdWEuaW5jbHVkZXMoJ2lQYWQnKSkgcmV0dXJuICdpT1MnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnTGludXgnKSkgcmV0dXJuICdMaW51eCc7XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxufVxuIl19
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Valtech Feedback Service
|
|
3
|
-
*
|
|
4
|
-
* Servicio para gestionar feedback de usuarios a nivel de plataforma.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```typescript
|
|
8
|
-
* // main.ts - Configuración
|
|
9
|
-
* import { provideValtechFeedback } from 'valtech-components';
|
|
10
|
-
*
|
|
11
|
-
* bootstrapApplication(AppComponent, {
|
|
12
|
-
* providers: [
|
|
13
|
-
* provideValtechAuth({ apiUrl: environment.apiUrl }),
|
|
14
|
-
* provideValtechFeedback({
|
|
15
|
-
* apiUrl: environment.apiUrl,
|
|
16
|
-
* appId: 'my-app-name',
|
|
17
|
-
* }),
|
|
18
|
-
* ],
|
|
19
|
-
* });
|
|
20
|
-
*
|
|
21
|
-
* // component.ts - Uso
|
|
22
|
-
* import { FeedbackService } from 'valtech-components';
|
|
23
|
-
*
|
|
24
|
-
* @Component({...})
|
|
25
|
-
* export class MyComponent {
|
|
26
|
-
* private feedbackService = inject(FeedbackService);
|
|
27
|
-
*
|
|
28
|
-
* async submitFeedback() {
|
|
29
|
-
* const response = await this.feedbackService.createAsync(
|
|
30
|
-
* 'feedback',
|
|
31
|
-
* 'Título',
|
|
32
|
-
* 'Descripción...'
|
|
33
|
-
* );
|
|
34
|
-
* }
|
|
35
|
-
* }
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
// Configuration
|
|
39
|
-
export { VALTECH_FEEDBACK_CONFIG, provideValtechFeedback, DEFAULT_FEEDBACK_CONFIG } from './config';
|
|
40
|
-
// Service
|
|
41
|
-
export { FeedbackService } from './feedback.service';
|
|
42
|
-
// Types
|
|
43
|
-
export { DEFAULT_FEEDBACK_TYPE_OPTIONS, } from './types';
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZlZWRiYWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7QUFFSCxnQkFBZ0I7QUFDaEIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBHLFVBQVU7QUFDVixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsUUFBUTtBQUNSLE9BQU8sRUFZTCw2QkFBNkIsR0FDOUIsTUFBTSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZhbHRlY2ggRmVlZGJhY2sgU2VydmljZVxuICpcbiAqIFNlcnZpY2lvIHBhcmEgZ2VzdGlvbmFyIGZlZWRiYWNrIGRlIHVzdWFyaW9zIGEgbml2ZWwgZGUgcGxhdGFmb3JtYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gbWFpbi50cyAtIENvbmZpZ3VyYWNpw7NuXG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaEZlZWRiYWNrIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZVZhbHRlY2hBdXRoKHsgYXBpVXJsOiBlbnZpcm9ubWVudC5hcGlVcmwgfSksXG4gKiAgICAgcHJvdmlkZVZhbHRlY2hGZWVkYmFjayh7XG4gKiAgICAgICBhcGlVcmw6IGVudmlyb25tZW50LmFwaVVybCxcbiAqICAgICAgIGFwcElkOiAnbXktYXBwLW5hbWUnLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKlxuICogLy8gY29tcG9uZW50LnRzIC0gVXNvXG4gKiBpbXBvcnQgeyBGZWVkYmFja1NlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBwcml2YXRlIGZlZWRiYWNrU2VydmljZSA9IGluamVjdChGZWVkYmFja1NlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgc3VibWl0RmVlZGJhY2soKSB7XG4gKiAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jcmVhdGVBc3luYyhcbiAqICAgICAgICdmZWVkYmFjaycsXG4gKiAgICAgICAnVMOtdHVsbycsXG4gKiAgICAgICAnRGVzY3JpcGNpw7NuLi4uJ1xuICogICAgICk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbi8vIENvbmZpZ3VyYXRpb25cbmV4cG9ydCB7IFZBTFRFQ0hfRkVFREJBQ0tfQ09ORklHLCBwcm92aWRlVmFsdGVjaEZlZWRiYWNrLCBERUZBVUxUX0ZFRURCQUNLX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcblxuLy8gU2VydmljZVxuZXhwb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi9mZWVkYmFjay5zZXJ2aWNlJztcblxuLy8gVHlwZXNcbmV4cG9ydCB7XG4gIFZhbHRlY2hGZWVkYmFja0NvbmZpZyxcbiAgRmVlZGJhY2tUeXBlLFxuICBGZWVkYmFja1N0YXR1cyxcbiAgQ29udGVudFR5cGUsXG4gIENvbnRlbnRSZWYsXG4gIERldmljZUNvbnRleHQsXG4gIEZlZWRiYWNrLFxuICBDcmVhdGVGZWVkYmFja1JlcXVlc3QsXG4gIENyZWF0ZUZlZWRiYWNrUmVzcG9uc2UsXG4gIEdldEZlZWRiYWNrUmVzcG9uc2UsXG4gIEZlZWRiYWNrVHlwZU9wdGlvbixcbiAgREVGQVVMVF9GRUVEQkFDS19UWVBFX09QVElPTlMsXG59IGZyb20gJy4vdHlwZXMnO1xuIl19
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuración por defecto de tipos de feedback.
|
|
3
|
-
*/
|
|
4
|
-
export const DEFAULT_FEEDBACK_TYPE_OPTIONS = [
|
|
5
|
-
{
|
|
6
|
-
value: 'issue',
|
|
7
|
-
label: 'Reportar problema',
|
|
8
|
-
description: 'Algo no funciona correctamente',
|
|
9
|
-
icon: 'bug-outline',
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
value: 'poor-content',
|
|
13
|
-
label: 'Contenido incorrecto',
|
|
14
|
-
description: 'Información incorrecta o desactualizada',
|
|
15
|
-
icon: 'document-text-outline',
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
value: 'feedback',
|
|
19
|
-
label: 'Comentario general',
|
|
20
|
-
description: 'Tu opinión o experiencia',
|
|
21
|
-
icon: 'chatbubble-outline',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
value: 'suggestion',
|
|
25
|
-
label: 'Sugerencia',
|
|
26
|
-
description: 'Propuesta de mejora o nueva funcionalidad',
|
|
27
|
-
icon: 'bulb-outline',
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZlZWRiYWNrL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlIQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUF5QjtJQUNqRTtRQUNFLEtBQUssRUFBRSxPQUFPO1FBQ2QsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUUsZ0NBQWdDO1FBQzdDLElBQUksRUFBRSxhQUFhO0tBQ3BCO0lBQ0Q7UUFDRSxLQUFLLEVBQUUsY0FBYztRQUNyQixLQUFLLEVBQUUsc0JBQXNCO1FBQzdCLFdBQVcsRUFBRSx5Q0FBeUM7UUFDdEQsSUFBSSxFQUFFLHVCQUF1QjtLQUM5QjtJQUNEO1FBQ0UsS0FBSyxFQUFFLFVBQVU7UUFDakIsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixXQUFXLEVBQUUsMEJBQTBCO1FBQ3ZDLElBQUksRUFBRSxvQkFBb0I7S0FDM0I7SUFDRDtRQUNFLEtBQUssRUFBRSxZQUFZO1FBQ25CLEtBQUssRUFBRSxZQUFZO1FBQ25CLFdBQVcsRUFBRSwyQ0FBMkM7UUFDeEQsSUFBSSxFQUFFLGNBQWM7S0FDckI7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmFjacOzbiBkZWwgc2VydmljaW8gZGUgRmVlZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdGVjaEZlZWRiYWNrQ29uZmlnIHtcbiAgLyoqIFVSTCBiYXNlIGRlIGxhIEFQSSAqL1xuICBhcGlVcmw6IHN0cmluZztcbiAgLyoqIElEIGRlIGxhIGFwbGljYWNpw7NuIChlajogJ215LXZhbHRlY2gtYXBwJykgKi9cbiAgYXBwSWQ6IHN0cmluZztcbiAgLyoqIFByZWZpam8gcGFyYSBlbmRwb2ludHMgKGRlZmF1bHQ6ICcvdjEvZmVlZGJhY2snKSAqL1xuICBmZWVkYmFja1ByZWZpeD86IHN0cmluZztcbiAgLyoqIE7Dum1lcm8gbcOheGltbyBkZSBhZGp1bnRvcyAoZGVmYXVsdDogNSkgKi9cbiAgbWF4QXR0YWNobWVudHM/OiBudW1iZXI7XG4gIC8qKiBUYW1hw7FvIG3DoXhpbW8gcG9yIGFyY2hpdm8gZW4gYnl0ZXMgKGRlZmF1bHQ6IDEwTUIpICovXG4gIG1heEZpbGVTaXplPzogbnVtYmVyO1xuICAvKiogVGlwb3MgZGUgYXJjaGl2byBwZXJtaXRpZG9zIChkZWZhdWx0OiBbJ2ltYWdlLyonLCAndmlkZW8vKicsICdhcHBsaWNhdGlvbi9wZGYnXSkgKi9cbiAgYWxsb3dlZEZpbGVUeXBlcz86IHN0cmluZ1tdO1xuICAvKiogUnV0YSBlbiBGaXJlYmFzZSBTdG9yYWdlIHBhcmEgYWRqdW50b3MgKGRlZmF1bHQ6ICdmZWVkYmFjaycpICovXG4gIHN0b3JhZ2VQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRpcG9zIGRlIGZlZWRiYWNrIGRpc3BvbmlibGVzLlxuICovXG5leHBvcnQgdHlwZSBGZWVkYmFja1R5cGUgPSAnaXNzdWUnIHwgJ3Bvb3ItY29udGVudCcgfCAnZmVlZGJhY2snIHwgJ3N1Z2dlc3Rpb24nO1xuXG4vKipcbiAqIEVzdGFkbyBkZSB1biBmZWVkYmFjay5cbiAqL1xuZXhwb3J0IHR5cGUgRmVlZGJhY2tTdGF0dXMgPSAnbmV3JyB8ICdyZXZpZXdlZCcgfCAncmVzb2x2ZWQnO1xuXG4vKipcbiAqIFRpcG9zIGRlIGNvbnRlbmlkbyBwYXJhIHJlZmVyZW5jaWEuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRlbnRUeXBlID1cbiAgfCAnYXJ0aWNsZSdcbiAgfCAnZmFxJ1xuICB8ICduZXdzJ1xuICB8ICdwYWdlJ1xuICB8ICdwcm9kdWN0J1xuICB8ICdldmVudCdcbiAgfCAnb3RoZXInO1xuXG4vKipcbiAqIFJlZmVyZW5jaWEgYSBjb250ZW5pZG8gZXNwZWPDrWZpY28uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudFJlZiB7XG4gIGNvbnRlbnRJZDogc3RyaW5nO1xuICBjb250ZW50VHlwZTogQ29udGVudFR5cGU7XG59XG5cbi8qKlxuICogQ29udGV4dG8gZGVsIGRpc3Bvc2l0aXZvIGRlbCB1c3VhcmlvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUNvbnRleHQge1xuICBicm93c2VyOiBzdHJpbmc7XG4gIG9zOiBzdHJpbmc7XG4gIHZpZXdwb3J0OiBzdHJpbmc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHVzZXJBZ2VudDogc3RyaW5nO1xuICBwYWdlVXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW50cmFkYSBkZSBmZWVkYmFjayBjb21wbGV0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWVkYmFjayB7XG4gIGZlZWRiYWNrSWQ6IHN0cmluZztcbiAgYXBwSWQ6IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIHR5cGU6IEZlZWRiYWNrVHlwZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgYXR0YWNobWVudHM6IHN0cmluZ1tdO1xuICBjb250ZW50UmVmPzogQ29udGVudFJlZjtcbiAgZGV2aWNlQ29udGV4dDogRGV2aWNlQ29udGV4dDtcbiAgc3RhdHVzOiBGZWVkYmFja1N0YXR1cztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgcGFyYSBjcmVhciBmZWVkYmFjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGZWVkYmFja1JlcXVlc3Qge1xuICB0eXBlOiBGZWVkYmFja1R5cGU7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGF0dGFjaG1lbnRzPzogc3RyaW5nW107XG4gIGNvbnRlbnRSZWY/OiBDb250ZW50UmVmO1xuICBkZXZpY2VDb250ZXh0OiBEZXZpY2VDb250ZXh0O1xuICBhcHBJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGFsIGNyZWFyIGZlZWRiYWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZlZWRiYWNrUmVzcG9uc2Uge1xuICBvcGVyYXRpb25JZDogc3RyaW5nO1xuICBmZWVkYmFja0lkOiBzdHJpbmc7XG4gIHN0YXR1czogRmVlZGJhY2tTdGF0dXM7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGFsIG9idGVuZXIgZmVlZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmVlZGJhY2tSZXNwb25zZSB7XG4gIG9wZXJhdGlvbklkOiBzdHJpbmc7XG4gIGZlZWRiYWNrOiBGZWVkYmFjaztcbn1cblxuLyoqXG4gKiBPcGNpb25lcyBkZSB0aXBvIGRlIGZlZWRiYWNrIHBhcmEgVUkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZGJhY2tUeXBlT3B0aW9uIHtcbiAgdmFsdWU6IEZlZWRiYWNrVHlwZTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gcG9yIGRlZmVjdG8gZGUgdGlwb3MgZGUgZmVlZGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZFRURCQUNLX1RZUEVfT1BUSU9OUzogRmVlZGJhY2tUeXBlT3B0aW9uW10gPSBbXG4gIHtcbiAgICB2YWx1ZTogJ2lzc3VlJyxcbiAgICBsYWJlbDogJ1JlcG9ydGFyIHByb2JsZW1hJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FsZ28gbm8gZnVuY2lvbmEgY29ycmVjdGFtZW50ZScsXG4gICAgaWNvbjogJ2J1Zy1vdXRsaW5lJyxcbiAgfSxcbiAge1xuICAgIHZhbHVlOiAncG9vci1jb250ZW50JyxcbiAgICBsYWJlbDogJ0NvbnRlbmlkbyBpbmNvcnJlY3RvJyxcbiAgICBkZXNjcmlwdGlvbjogJ0luZm9ybWFjacOzbiBpbmNvcnJlY3RhIG8gZGVzYWN0dWFsaXphZGEnLFxuICAgIGljb246ICdkb2N1bWVudC10ZXh0LW91dGxpbmUnLFxuICB9LFxuICB7XG4gICAgdmFsdWU6ICdmZWVkYmFjaycsXG4gICAgbGFiZWw6ICdDb21lbnRhcmlvIGdlbmVyYWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVHUgb3BpbmnDs24gbyBleHBlcmllbmNpYScsXG4gICAgaWNvbjogJ2NoYXRidWJibGUtb3V0bGluZScsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGxhYmVsOiAnU3VnZXJlbmNpYScsXG4gICAgZGVzY3JpcHRpb246ICdQcm9wdWVzdGEgZGUgbWVqb3JhIG8gbnVldmEgZnVuY2lvbmFsaWRhZCcsXG4gICAgaWNvbjogJ2J1bGItb3V0bGluZScsXG4gIH0sXG5dO1xuIl19
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
-
import { FormGroup } from '@angular/forms';
|
|
3
|
-
import { FeedbackFormMetadata, FeedbackSubmitEvent } from './types';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* val-feedback-form
|
|
7
|
-
*
|
|
8
|
-
* Formulario reutilizable para enviar feedback desde cualquier parte de la aplicación.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```html
|
|
12
|
-
* <!-- Feedback general -->
|
|
13
|
-
* <val-feedback-form
|
|
14
|
-
* [props]="{ defaultType: 'feedback', showTypeSelector: true }"
|
|
15
|
-
* (onSubmit)="handleSuccess($event)"
|
|
16
|
-
* (onCancel)="closeModal()"
|
|
17
|
-
* />
|
|
18
|
-
*
|
|
19
|
-
* <!-- Reportar contenido incorrecto -->
|
|
20
|
-
* <val-feedback-form
|
|
21
|
-
* [props]="{
|
|
22
|
-
* defaultType: 'poor-content',
|
|
23
|
-
* showTypeSelector: false,
|
|
24
|
-
* contentRef: { contentId: article.id, contentType: 'article' },
|
|
25
|
-
* submitButtonText: 'Reportar contenido'
|
|
26
|
-
* }"
|
|
27
|
-
* />
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare class FeedbackFormComponent implements OnInit {
|
|
31
|
-
/**
|
|
32
|
-
* Configuración del formulario.
|
|
33
|
-
*/
|
|
34
|
-
props: FeedbackFormMetadata;
|
|
35
|
-
/**
|
|
36
|
-
* Evento emitido cuando el feedback se envía exitosamente.
|
|
37
|
-
*/
|
|
38
|
-
onSubmit: EventEmitter<FeedbackSubmitEvent>;
|
|
39
|
-
/**
|
|
40
|
-
* Evento emitido cuando el usuario cancela.
|
|
41
|
-
*/
|
|
42
|
-
onCancel: EventEmitter<void>;
|
|
43
|
-
private fb;
|
|
44
|
-
private feedbackService;
|
|
45
|
-
form: FormGroup;
|
|
46
|
-
typeOptions: import("../../../services/feedback").FeedbackTypeOption[];
|
|
47
|
-
isSubmitting: import("@angular/core").WritableSignal<boolean>;
|
|
48
|
-
isSuccess: import("@angular/core").WritableSignal<boolean>;
|
|
49
|
-
error: import("@angular/core").WritableSignal<string>;
|
|
50
|
-
constructor();
|
|
51
|
-
ngOnInit(): void;
|
|
52
|
-
handleSubmit(): Promise<void>;
|
|
53
|
-
onCancelClick(): void;
|
|
54
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackFormComponent, never>;
|
|
55
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackFormComponent, "val-feedback-form", never, { "props": { "alias": "props"; "required": false; }; }, { "onSubmit": "onSubmit"; "onCancel": "onCancel"; }, never, never, true, never>;
|
|
56
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { FeedbackType, ContentRef, CreateFeedbackResponse, FeedbackTypeOption } from '../../../services/feedback/types';
|
|
2
|
-
/**
|
|
3
|
-
* Metadata para el componente FeedbackForm.
|
|
4
|
-
*/
|
|
5
|
-
export interface FeedbackFormMetadata {
|
|
6
|
-
/** Tipo de feedback preseleccionado */
|
|
7
|
-
defaultType?: FeedbackType;
|
|
8
|
-
/** Referencia a contenido (si aplica) */
|
|
9
|
-
contentRef?: ContentRef;
|
|
10
|
-
/** Mostrar selector de tipo (default: true) */
|
|
11
|
-
showTypeSelector?: boolean;
|
|
12
|
-
/** Tipos de feedback habilitados (por defecto todos) */
|
|
13
|
-
enabledTypes?: FeedbackType[];
|
|
14
|
-
/** Opciones personalizadas para tipos de feedback */
|
|
15
|
-
typeOptions?: FeedbackTypeOption[];
|
|
16
|
-
/** Placeholder para título */
|
|
17
|
-
titlePlaceholder?: string;
|
|
18
|
-
/** Placeholder para descripción */
|
|
19
|
-
descriptionPlaceholder?: string;
|
|
20
|
-
/** Label para campo de título */
|
|
21
|
-
titleLabel?: string;
|
|
22
|
-
/** Label para campo de descripción */
|
|
23
|
-
descriptionLabel?: string;
|
|
24
|
-
/** Texto del botón de envío */
|
|
25
|
-
submitButtonText?: string;
|
|
26
|
-
/** Texto del botón cancelar (si no se proporciona, no se muestra) */
|
|
27
|
-
cancelButtonText?: string;
|
|
28
|
-
/** Mostrar campo de adjuntos (default: true) */
|
|
29
|
-
showAttachments?: boolean;
|
|
30
|
-
/** Label para campo de adjuntos */
|
|
31
|
-
attachmentsLabel?: string;
|
|
32
|
-
/** Mensaje de éxito personalizado */
|
|
33
|
-
successMessage?: string;
|
|
34
|
-
/** CSS class adicional para el contenedor */
|
|
35
|
-
cssClass?: string;
|
|
36
|
-
/** Modo compacto (menos espaciado) */
|
|
37
|
-
compact?: boolean;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Evento emitido cuando el feedback se envía exitosamente.
|
|
41
|
-
*/
|
|
42
|
-
export interface FeedbackSubmitEvent {
|
|
43
|
-
response: CreateFeedbackResponse;
|
|
44
|
-
type: FeedbackType;
|
|
45
|
-
title: string;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Estado del formulario.
|
|
49
|
-
*/
|
|
50
|
-
export interface FeedbackFormState {
|
|
51
|
-
isSubmitting: boolean;
|
|
52
|
-
isSuccess: boolean;
|
|
53
|
-
error: string | null;
|
|
54
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { AuthState, AuthUser, AuthError, MFAPendingState, StoredAuthState } from './types';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
* Servicio para manejo de estado de autenticación con Angular Signals.
|
|
5
|
-
* Proporciona estado reactivo inmutable.
|
|
6
|
-
*/
|
|
7
|
-
export declare class AuthStateService {
|
|
8
|
-
private _state;
|
|
9
|
-
private _mfaPending;
|
|
10
|
-
/** Estado completo de autenticación */
|
|
11
|
-
readonly state: import("@angular/core").Signal<AuthState>;
|
|
12
|
-
/** Estado de MFA pendiente */
|
|
13
|
-
readonly mfaPending: import("@angular/core").Signal<MFAPendingState>;
|
|
14
|
-
/** Usuario está autenticado */
|
|
15
|
-
readonly isAuthenticated: import("@angular/core").Signal<boolean>;
|
|
16
|
-
/** Estado de carga */
|
|
17
|
-
readonly isLoading: import("@angular/core").Signal<boolean>;
|
|
18
|
-
/** Token de acceso */
|
|
19
|
-
readonly accessToken: import("@angular/core").Signal<string>;
|
|
20
|
-
/** Roles del usuario */
|
|
21
|
-
readonly roles: import("@angular/core").Signal<string[]>;
|
|
22
|
-
/** Permisos del usuario */
|
|
23
|
-
readonly permissions: import("@angular/core").Signal<string[]>;
|
|
24
|
-
/** Usuario es super admin */
|
|
25
|
-
readonly isSuperAdmin: import("@angular/core").Signal<boolean>;
|
|
26
|
-
/** Error actual */
|
|
27
|
-
readonly error: import("@angular/core").Signal<AuthError>;
|
|
28
|
-
/** Información del usuario */
|
|
29
|
-
readonly user: import("@angular/core").Signal<AuthUser>;
|
|
30
|
-
/**
|
|
31
|
-
* Establece el estado de carga.
|
|
32
|
-
*/
|
|
33
|
-
setLoading(isLoading: boolean): void;
|
|
34
|
-
/**
|
|
35
|
-
* Establece el estado de autenticación exitosa.
|
|
36
|
-
*/
|
|
37
|
-
setAuthenticated(data: {
|
|
38
|
-
accessToken: string;
|
|
39
|
-
refreshToken: string;
|
|
40
|
-
userId?: string;
|
|
41
|
-
email?: string;
|
|
42
|
-
roles: string[];
|
|
43
|
-
permissions: string[];
|
|
44
|
-
isSuperAdmin: boolean;
|
|
45
|
-
expiresAt: number;
|
|
46
|
-
}): void;
|
|
47
|
-
/**
|
|
48
|
-
* Actualiza solo el access token (después de refresh).
|
|
49
|
-
*/
|
|
50
|
-
updateAccessToken(accessToken: string, expiresIn: number): void;
|
|
51
|
-
/**
|
|
52
|
-
* Actualiza los permisos.
|
|
53
|
-
*/
|
|
54
|
-
updatePermissions(roles: string[], permissions: string[], isSuperAdmin: boolean): void;
|
|
55
|
-
/**
|
|
56
|
-
* Establece un error de autenticación.
|
|
57
|
-
*/
|
|
58
|
-
setError(error: AuthError): void;
|
|
59
|
-
/**
|
|
60
|
-
* Limpia el error.
|
|
61
|
-
*/
|
|
62
|
-
clearError(): void;
|
|
63
|
-
/**
|
|
64
|
-
* Establece estado de MFA pendiente.
|
|
65
|
-
*/
|
|
66
|
-
setMFAPending(mfaState: MFAPendingState): void;
|
|
67
|
-
/**
|
|
68
|
-
* Limpia el estado de MFA pendiente.
|
|
69
|
-
*/
|
|
70
|
-
clearMFAPending(): void;
|
|
71
|
-
/**
|
|
72
|
-
* Resetea todo el estado a valores iniciales.
|
|
73
|
-
*/
|
|
74
|
-
reset(): void;
|
|
75
|
-
/**
|
|
76
|
-
* Restaura estado desde datos almacenados.
|
|
77
|
-
*/
|
|
78
|
-
restoreFromStorage(stored: Partial<StoredAuthState>): void;
|
|
79
|
-
/**
|
|
80
|
-
* Actualiza el userId y email (después de parsear el token).
|
|
81
|
-
*/
|
|
82
|
-
updateUserInfo(userId: string, email: string): void;
|
|
83
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthStateService, never>;
|
|
84
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AuthStateService>;
|
|
85
|
-
}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
5
|
-
import { AuthStateService } from './auth-state.service';
|
|
6
|
-
import { TokenService } from './token.service';
|
|
7
|
-
import { AuthStorageService } from './storage.service';
|
|
8
|
-
import { AuthSyncService } from './sync.service';
|
|
9
|
-
import { SigninRequest, SigninResponse, SignupRequest, SignupResponse, VerifyEmailRequest, VerifyEmailResponse, ResendCodeRequest, ResendCodeResponse, MFAVerifyResponse, RefreshResponse, GetPermissionsResponse, MFASetupResponse, MFAConfirmResponse, MFADisableResponse, MFAMethod, AuthError, ValtechAuthConfig } from './types';
|
|
10
|
-
import { FirebaseService } from '../firebase';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
/**
|
|
13
|
-
* Servicio principal de autenticación.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* import { AuthService } from 'valtech-components';
|
|
18
|
-
*
|
|
19
|
-
* @Component({...})
|
|
20
|
-
* export class LoginComponent {
|
|
21
|
-
* private auth = inject(AuthService);
|
|
22
|
-
*
|
|
23
|
-
* async login() {
|
|
24
|
-
* await firstValueFrom(this.auth.signin({ email, password }));
|
|
25
|
-
* if (this.auth.mfaPending().required) {
|
|
26
|
-
* // Mostrar UI de MFA
|
|
27
|
-
* } else {
|
|
28
|
-
* this.router.navigate(['/']);
|
|
29
|
-
* }
|
|
30
|
-
* }
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export declare class AuthService implements OnDestroy {
|
|
35
|
-
private config;
|
|
36
|
-
private http;
|
|
37
|
-
private router;
|
|
38
|
-
private stateService;
|
|
39
|
-
private tokenService;
|
|
40
|
-
private storageService;
|
|
41
|
-
private syncService;
|
|
42
|
-
private firebaseService;
|
|
43
|
-
private refreshTimerId;
|
|
44
|
-
private syncSubscription;
|
|
45
|
-
constructor(config: ValtechAuthConfig, http: HttpClient, router: Router, stateService: AuthStateService, tokenService: TokenService, storageService: AuthStorageService, syncService: AuthSyncService, firebaseService: FirebaseService);
|
|
46
|
-
/** Estado completo de autenticación */
|
|
47
|
-
readonly state: import("@angular/core").Signal<import("./types").AuthState>;
|
|
48
|
-
/** Usuario está autenticado */
|
|
49
|
-
readonly isAuthenticated: import("@angular/core").Signal<boolean>;
|
|
50
|
-
/** Estado de carga */
|
|
51
|
-
readonly isLoading: import("@angular/core").Signal<boolean>;
|
|
52
|
-
/** Información del usuario */
|
|
53
|
-
readonly user: import("@angular/core").Signal<import("./types").AuthUser>;
|
|
54
|
-
/** Token de acceso */
|
|
55
|
-
readonly accessToken: import("@angular/core").Signal<string>;
|
|
56
|
-
/** Roles del usuario */
|
|
57
|
-
readonly roles: import("@angular/core").Signal<string[]>;
|
|
58
|
-
/** Permisos del usuario */
|
|
59
|
-
readonly permissions: import("@angular/core").Signal<string[]>;
|
|
60
|
-
/** Usuario es super admin */
|
|
61
|
-
readonly isSuperAdmin: import("@angular/core").Signal<boolean>;
|
|
62
|
-
/** Estado de MFA pendiente */
|
|
63
|
-
readonly mfaPending: import("@angular/core").Signal<import("./types").MFAPendingState>;
|
|
64
|
-
/** Error actual */
|
|
65
|
-
readonly error: import("@angular/core").Signal<AuthError>;
|
|
66
|
-
/**
|
|
67
|
-
* Inicializa el servicio de autenticación.
|
|
68
|
-
* Llamado automáticamente por provideValtechAuth.
|
|
69
|
-
*/
|
|
70
|
-
initialize(): Promise<void>;
|
|
71
|
-
ngOnDestroy(): void;
|
|
72
|
-
/**
|
|
73
|
-
* Inicia sesión con email y contraseña.
|
|
74
|
-
*/
|
|
75
|
-
signin(request: SigninRequest): Observable<SigninResponse>;
|
|
76
|
-
/**
|
|
77
|
-
* Registra un nuevo usuario.
|
|
78
|
-
* El usuario queda en estado PENDING hasta verificar su email.
|
|
79
|
-
*/
|
|
80
|
-
signup(request: SignupRequest): Observable<SignupResponse>;
|
|
81
|
-
/**
|
|
82
|
-
* Verifica email con código de 6 dígitos.
|
|
83
|
-
* Si es exitoso, hace auto-login y retorna tokens.
|
|
84
|
-
*/
|
|
85
|
-
verifyEmail(request: VerifyEmailRequest): Observable<VerifyEmailResponse>;
|
|
86
|
-
/**
|
|
87
|
-
* Reenvía código de verificación al email.
|
|
88
|
-
*/
|
|
89
|
-
resendCode(request: ResendCodeRequest): Observable<ResendCodeResponse>;
|
|
90
|
-
/**
|
|
91
|
-
* Verifica código MFA.
|
|
92
|
-
*/
|
|
93
|
-
verifyMFA(code: string): Observable<MFAVerifyResponse>;
|
|
94
|
-
/**
|
|
95
|
-
* Refresca el token de acceso.
|
|
96
|
-
*/
|
|
97
|
-
refreshAccessToken(): Observable<RefreshResponse>;
|
|
98
|
-
/**
|
|
99
|
-
* Cierra sesión.
|
|
100
|
-
*/
|
|
101
|
-
logout(): void;
|
|
102
|
-
/**
|
|
103
|
-
* Configura MFA para el usuario.
|
|
104
|
-
*/
|
|
105
|
-
setupMFA(method: MFAMethod, phone?: string): Observable<MFASetupResponse>;
|
|
106
|
-
/**
|
|
107
|
-
* Confirma la configuración de MFA.
|
|
108
|
-
*/
|
|
109
|
-
confirmMFA(code: string): Observable<MFAConfirmResponse>;
|
|
110
|
-
/**
|
|
111
|
-
* Deshabilita MFA.
|
|
112
|
-
*/
|
|
113
|
-
disableMFA(password: string): Observable<MFADisableResponse>;
|
|
114
|
-
/**
|
|
115
|
-
* Obtiene los permisos actualizados del backend.
|
|
116
|
-
*/
|
|
117
|
-
fetchPermissions(): Observable<GetPermissionsResponse>;
|
|
118
|
-
/**
|
|
119
|
-
* Verifica si el usuario tiene un permiso específico.
|
|
120
|
-
* Formato: "resource:action" (ej: "templates:edit")
|
|
121
|
-
*/
|
|
122
|
-
hasPermission(permission: string): boolean;
|
|
123
|
-
/**
|
|
124
|
-
* Verifica si el usuario tiene alguno de los permisos dados.
|
|
125
|
-
*/
|
|
126
|
-
hasAnyPermission(permissions: string[]): boolean;
|
|
127
|
-
/**
|
|
128
|
-
* Verifica si el usuario tiene todos los permisos dados.
|
|
129
|
-
*/
|
|
130
|
-
hasAllPermissions(permissions: string[]): boolean;
|
|
131
|
-
/**
|
|
132
|
-
* Verifica si el usuario tiene un rol específico.
|
|
133
|
-
*/
|
|
134
|
-
hasRole(role: string): boolean;
|
|
135
|
-
private get baseUrl();
|
|
136
|
-
private handleSuccessfulAuth;
|
|
137
|
-
private clearState;
|
|
138
|
-
private startRefreshTimer;
|
|
139
|
-
private stopRefreshTimer;
|
|
140
|
-
private handleSyncEvent;
|
|
141
|
-
private handleAuthError;
|
|
142
|
-
private signInWithFirebase;
|
|
143
|
-
private signOutFirebase;
|
|
144
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthService, never>;
|
|
145
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AuthService>;
|
|
146
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { EnvironmentProviders, InjectionToken } from '@angular/core';
|
|
2
|
-
import { ValtechAuthConfig } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* Token de inyección para la configuración de Auth.
|
|
5
|
-
*/
|
|
6
|
-
export declare const VALTECH_AUTH_CONFIG: InjectionToken<ValtechAuthConfig>;
|
|
7
|
-
/**
|
|
8
|
-
* Configuración por defecto.
|
|
9
|
-
*/
|
|
10
|
-
export declare const DEFAULT_AUTH_CONFIG: Partial<ValtechAuthConfig>;
|
|
11
|
-
/**
|
|
12
|
-
* Provee el servicio de autenticación a la aplicación Angular.
|
|
13
|
-
*
|
|
14
|
-
* @param config - Configuración de autenticación
|
|
15
|
-
* @returns EnvironmentProviders para usar en bootstrapApplication
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```typescript
|
|
19
|
-
* // main.ts
|
|
20
|
-
* import { bootstrapApplication } from '@angular/platform-browser';
|
|
21
|
-
* import { provideValtechAuth } from 'valtech-components';
|
|
22
|
-
* import { environment } from './environments/environment';
|
|
23
|
-
*
|
|
24
|
-
* bootstrapApplication(AppComponent, {
|
|
25
|
-
* providers: [
|
|
26
|
-
* provideValtechAuth({
|
|
27
|
-
* apiUrl: environment.apiUrl,
|
|
28
|
-
* enableFirebaseIntegration: true,
|
|
29
|
-
* }),
|
|
30
|
-
* ],
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export declare function provideValtechAuth(config: ValtechAuthConfig): EnvironmentProviders;
|
|
35
|
-
/**
|
|
36
|
-
* Provee solo el interceptor (para apps que ya tienen AuthService configurado manualmente).
|
|
37
|
-
*/
|
|
38
|
-
export declare function provideValtechAuthInterceptor(): EnvironmentProviders;
|