@qbs-origin/origin-form 0.5.0

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.
Files changed (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # OriginForm
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project origin-form` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project origin-form`.
8
+ > Note: Don't forget to add `--project origin-form` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build origin-form` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build origin-form`, go to the dist folder `cd dist/origin-form` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test origin-form` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,163 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, firstValueFrom } from 'rxjs';
3
+ import { FluxType } from './models/forms.model';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./services/applicationData.service";
6
+ import * as i2 from "./services/dialog.service";
7
+ export class ActionStepHandler {
8
+ constructor(applicationDataService, dialog) {
9
+ this.applicationDataService = applicationDataService;
10
+ this.dialog = dialog;
11
+ this.isExecuting = false;
12
+ this.executionCompleted = new Subject();
13
+ this.actionExecuting$ = new Subject();
14
+ this.actionCompleted$ = this.executionCompleted.asObservable();
15
+ }
16
+ /**
17
+ * Checks if a step is an action step that should be handled automatically
18
+ */
19
+ isActionStep(step) {
20
+ return step.type === FluxType.Status || step.type === FluxType.Action;
21
+ }
22
+ /**
23
+ * Filters out action steps from the visible steps array
24
+ */
25
+ filterVisibleSteps(steps, stepIds = []) {
26
+ var visibleSteps = steps.filter((step) => !this.isActionStep(step));
27
+ if (stepIds?.length > 0) {
28
+ visibleSteps = visibleSteps.filter((s) => stepIds.includes(s.identifier));
29
+ }
30
+ return visibleSteps;
31
+ }
32
+ /**
33
+ * Gets action steps that should be executed when moving to the next step
34
+ */
35
+ getActionStepsAtIndex(allSteps, currentVisibleStepIndex) {
36
+ const visibleSteps = this.filterVisibleSteps(allSteps);
37
+ const actionSteps = [];
38
+ // Find the current visible step in the original flux
39
+ if (currentVisibleStepIndex < visibleSteps.length) {
40
+ const currentVisibleStep = visibleSteps[currentVisibleStepIndex];
41
+ const currentVisibleStepIndexInFlux = allSteps.findIndex((step) => step.identifier === currentVisibleStep.identifier);
42
+ // Check for action steps immediately after current step in the original flux
43
+ for (let i = currentVisibleStepIndexInFlux + 1; i < allSteps.length; i++) {
44
+ const step = allSteps[i];
45
+ if (this.isActionStep(step)) {
46
+ actionSteps.push(step);
47
+ }
48
+ else {
49
+ // Stop at first non-action step (next visible step)
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ return actionSteps;
55
+ }
56
+ /**
57
+ * Executes action steps automatically
58
+ */
59
+ async executeActionSteps(actionSteps, appDataUuid, onStepStart) {
60
+ if (this.isExecuting || actionSteps.length === 0) {
61
+ return { success: true };
62
+ }
63
+ this.isExecuting = true;
64
+ this.actionExecuting$.next(true);
65
+ try {
66
+ for (let i = 0; i < actionSteps.length; i++) {
67
+ const step = actionSteps[i];
68
+ const isLastStep = i === actionSteps.length - 1;
69
+ const shouldSetNextStep = !isLastStep;
70
+ if (onStepStart) {
71
+ onStepStart(step);
72
+ }
73
+ console.log(`🎬 Executing action step ${i + 1}/${actionSteps.length}: ${step.identifier}, setNextStep: ${shouldSetNextStep}`);
74
+ const result = await this.executeActionStep(step, appDataUuid, shouldSetNextStep);
75
+ if (!result.success) {
76
+ console.error(`❌ Action step ${step.identifier} failed:`, result.error);
77
+ let errorContent = 'unknown';
78
+ if (result.error) {
79
+ errorContent = result.error;
80
+ }
81
+ else if (result.data.errorMessage) {
82
+ errorContent = result.data.errorMessage;
83
+ }
84
+ this.dialog.popError('flux.components.action.failedToExecuteWithParams', errorContent);
85
+ this.isExecuting = false;
86
+ this.actionExecuting$.next(false);
87
+ this.executionCompleted.next(result);
88
+ return result;
89
+ }
90
+ console.log(`✅ Action step ${step.identifier} completed successfully`);
91
+ // Add a small delay between action steps to prevent change detection conflicts
92
+ if (!isLastStep) {
93
+ await new Promise((resolve) => setTimeout(resolve, 10));
94
+ }
95
+ }
96
+ const successResult = { success: true };
97
+ // Use setTimeout to ensure the completion notification happens outside the current change detection cycle
98
+ setTimeout(() => {
99
+ this.isExecuting = false;
100
+ this.actionExecuting$.next(false);
101
+ this.executionCompleted.next(successResult);
102
+ }, 0);
103
+ return successResult;
104
+ }
105
+ catch (error) {
106
+ const errorResult = { success: false, error };
107
+ // Use setTimeout to ensure the error notification happens outside the current change detection cycle
108
+ setTimeout(() => {
109
+ this.isExecuting = false;
110
+ this.actionExecuting$.next(false);
111
+ this.executionCompleted.next(errorResult);
112
+ }, 0);
113
+ return errorResult;
114
+ }
115
+ }
116
+ /**
117
+ * Executes a single action step
118
+ */
119
+ async executeActionStep(step, appDataUuid, setNextStep = false) {
120
+ try {
121
+ let result;
122
+ if (step.type === FluxType.Action) {
123
+ const actionRequest = {
124
+ appDataId: appDataUuid,
125
+ stepId: step.identifier,
126
+ setNextStep: setNextStep,
127
+ };
128
+ result = await firstValueFrom(this.applicationDataService.makeActionApiCall(actionRequest));
129
+ return { success: result.success, data: result };
130
+ }
131
+ else if (step.type === FluxType.Status) {
132
+ result = await firstValueFrom(this.applicationDataService.makeStatusApiCall(appDataUuid, step.identifier, setNextStep));
133
+ }
134
+ return { success: true, data: result };
135
+ }
136
+ catch (error) {
137
+ console.error(`Error executing action step ${step.identifier}:`, error);
138
+ return { success: false, error };
139
+ }
140
+ }
141
+ /**
142
+ * Checks if currently executing actions
143
+ */
144
+ get isExecutingActions() {
145
+ return this.isExecuting;
146
+ }
147
+ /**
148
+ * Clean up resources
149
+ */
150
+ destroy() {
151
+ this.executionCompleted.complete();
152
+ this.actionExecuting$.complete();
153
+ }
154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionStepHandler, deps: [{ token: i1.ApplicationDataService }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Injectable }); }
155
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionStepHandler, providedIn: 'root' }); }
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionStepHandler, decorators: [{
158
+ type: Injectable,
159
+ args: [{
160
+ providedIn: 'root',
161
+ }]
162
+ }], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i2.DialogService }] });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXN0ZXAtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvYWN0aW9uLXN0ZXAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQWNoRCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCLFlBQW9CLHNCQUE4QyxFQUFVLE1BQXFCO1FBQTdFLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBTnpGLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO1FBRXRELHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDMUMscUJBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRW9DLENBQUM7SUFFdEc7O09BRUc7SUFDSCxZQUFZLENBQUMsSUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsS0FBaUIsRUFBRSxVQUFvQixFQUFFO1FBQzFELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksT0FBTyxFQUFFLE1BQU0s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QU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUMzQixJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQzNDLFdBQVcsRUFDWCxJQUFJLENBQUMsVUFBVSxFQUNmLFdBQVcsQ0FDWixDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQzsrR0FwTVUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNYWtlQWN0aW9uUmVxdWVzdCB9IGZyb20gJy4vbW9kZWxzL2FwcGxpY2F0aW9uLm1vZGVsJztcbmltcG9ydCB7IEZsdXhUeXBlIH0gZnJvbSAnLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXBwbGljYXRpb25EYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RlcERhdGEgfSBmcm9tICcuL21vZGVscy9mbHV4Lm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25TdGVwUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZGF0YT86IGFueTtcbiAgZXJyb3I/OiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25TdGVwSGFuZGxlciB7XG4gIHByaXZhdGUgaXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBleGVjdXRpb25Db21wbGV0ZWQgPSBuZXcgU3ViamVjdDxBY3Rpb25TdGVwUmVzdWx0PigpO1xuXG4gIHB1YmxpYyBhY3Rpb25FeGVjdXRpbmckID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHVibGljIGFjdGlvbkNvbXBsZXRlZCQgPSB0aGlzLmV4ZWN1dGlvbkNvbXBsZXRlZC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcGxpY2F0aW9uRGF0YVNlcnZpY2U6IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UsIHByaXZhdGUgZGlhbG9nOiBEaWFsb2dTZXJ2aWNlKSB7IH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgc3RlcCBpcyBhbiBhY3Rpb24gc3RlcCB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHlcbiAgICovXG4gIGlzQWN0aW9uU3RlcChzdGVwOiBTdGVwRGF0YSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGVwLnR5cGUgPT09IEZsdXhUeXBlLlN0YXR1cyB8fCBzdGVwLnR5cGUgPT09IEZsdXhUeXBlLkFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIG91dCBhY3Rpb24gc3RlcHMgZnJvbSB0aGUgdmlzaWJsZSBzdGVwcyBhcnJheVxuICAgKi9cbiAgZmlsdGVyVmlzaWJsZVN0ZXBzKHN0ZXBzOiBTdGVwRGF0YVtdLCBzdGVwSWRzOiBzdHJpbmdbXSA9IFtdKTogU3RlcERhdGFbXSB7XG4gICAgdmFyIHZpc2libGVTdGVwcyA9IHN0ZXBzLmZpbHRlcigoc3RlcCkgPT4gIXRoaXMuaXNBY3Rpb25TdGVwKHN0ZXApKTtcbiAgICBpZiAoc3RlcElkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdmlzaWJsZVN0ZXBzID0gdmlzaWJsZVN0ZXBzLmZpbHRlcigocykgPT4gc3RlcElkcy5pbmNsdWRlcyhzLmlkZW50aWZpZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVTdGVwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFjdGlvbiBzdGVwcyB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBzdGVwXG4gICAqL1xuICBnZXRBY3Rpb25TdGVwc0F0SW5kZXgoXG4gICAgYWxsU3RlcHM6IFN0ZXBEYXRhW10sXG4gICAgY3VycmVudFZpc2libGVTdGVwSW5kZXg6IG51bWJlclxuICApOiBTdGVwRGF0YVtdIHtcbiAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmZpbHRlclZpc2libGVTdGVwcyhhbGxTdGVwcyk7XG4gICAgY29uc3QgYWN0aW9uU3RlcHM6IFN0ZXBEYXRhW10gPSBbXTtcblxuICAgIC8vIEZpbmQgdGhlIGN1cnJlbnQgdmlzaWJsZSBzdGVwIGluIHRoZSBvcmlnaW5hbCBmbHV4XG4gICAgaWYgKGN1cnJlbnRWaXNpYmxlU3RlcEluZGV4IDwgdmlzaWJsZVN0ZXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFZpc2libGVTdGVwID0gdmlzaWJsZVN0ZXBzW2N1cnJlbnRWaXNpYmxlU3RlcEluZGV4XTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWaXNpYmxlU3RlcEluZGV4SW5GbHV4ID0gYWxsU3RlcHMuZmluZEluZGV4KFxuICAgICAgICAoc3RlcCkgPT4gc3RlcC5pZGVudGlmaWVyID09PSBjdXJyZW50VmlzaWJsZVN0ZXAuaWRlbnRpZmllclxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGFjdGlvbiBzdGVwcyBpbW1lZGlhdGVseSBhZnRlciBjdXJyZW50IHN0ZXAgaW4gdGhlIG9yaWdpbmFsIGZsdXhcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gY3VycmVudFZpc2libGVTdGVwSW5kZXhJbkZsdXggKyAxO1xuICAgICAgICBpIDwgYWxsU3RlcHMubGVuZ3RoO1xuICAgICAgICBpKytcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzdGVwID0gYWxsU3RlcHNbaV07XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aW9uU3RlcChzdGVwKSkge1xuICAgICAgICAgIGFjdGlvblN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RvcCBhdCBmaXJzdCBub24tYWN0aW9uIHN0ZXAgKG5leHQgdmlzaWJsZSBzdGVwKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvblN0ZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFjdGlvbiBzdGVwcyBhdXRvbWF0aWNhbGx5XG4gICAqL1xuICBhc3luYyBleGVjdXRlQWN0aW9uU3RlcHMoXG4gICAgYWN0aW9uU3RlcHM6IFN0ZXBEYXRhW10sXG4gICAgYXBwRGF0YVV1aWQ6IHN0cmluZyxcbiAgICBvblN0ZXBTdGFydD86IChzdGVwOiBhbnkpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxBY3Rpb25TdGVwUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuaXNFeGVjdXRpbmcgfHwgYWN0aW9uU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgfVxuXG4gICAgdGhpcy5pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpb25FeGVjdXRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3Rpb25TdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzdGVwID0gYWN0aW9uU3RlcHNbaV07XG4gICAgICAgIGNvbnN0IGlzTGFzdFN0ZXAgPSBpID09PSBhY3Rpb25TdGVwcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBzaG91bGRTZXROZXh0U3RlcCA9ICFpc0xhc3RTdGVwO1xuICAgICAgICBpZiAob25TdGVwU3RhcnQpIHtcbiAgICAgICAgICBvblN0ZXBTdGFydChzdGVwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDwn46sIEV4ZWN1dGluZyBhY3Rpb24gc3RlcCAke2kgKyAxfS8ke2FjdGlvblN0ZXBzLmxlbmd0aH06ICR7c3RlcC5pZGVudGlmaWVyXG4gICAgICAgICAgfSwgc2V0TmV4dFN0ZXA6ICR7c2hvdWxkU2V0TmV4dFN0ZXB9YFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFjdGlvblN0ZXAoXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBhcHBEYXRhVXVpZCxcbiAgICAgICAgICBzaG91bGRTZXROZXh0U3RlcFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGDinYwgQWN0aW9uIHN0ZXAgJHtzdGVwLmlkZW50aWZpZXJ9IGZhaWxlZDpgLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICAgIGxldCBlcnJvckNvbnRlbnQgPSAndW5rbm93bic7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgZXJyb3JDb250ZW50ID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuZGF0YS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yQ29udGVudCA9IHJlc3VsdC5kYXRhLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaWFsb2cucG9wRXJyb3IoJ2ZsdXguY29tcG9uZW50cy5hY3Rpb24uZmFpbGVkVG9FeGVjdXRlV2l0aFBhcmFtcycsIGVycm9yQ29udGVudCk7XG4gICAgICAgICAgdGhpcy5pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuYWN0aW9uRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmV4ZWN1dGlvbkNvbXBsZXRlZC5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGDinIUgQWN0aW9uIHN0ZXAgJHtzdGVwLmlkZW50aWZpZXJ9IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcblxuICAgICAgICAvLyBBZGQgYSBzbWFsbCBkZWxheSBiZXR3ZWVuIGFjdGlvbiBzdGVwcyB0byBwcmV2ZW50IGNoYW5nZSBkZXRlY3Rpb24gY29uZmxpY3RzXG4gICAgICAgIGlmICghaXNMYXN0U3RlcCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3VjY2Vzc1Jlc3VsdDogQWN0aW9uU3RlcFJlc3VsdCA9IHsgc3VjY2VzczogdHJ1ZSB9O1xuXG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgdGhlIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIGhhcHBlbnMgb3V0c2lkZSB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjdGlvbkV4ZWN1dGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uQ29tcGxldGVkLm5leHQoc3VjY2Vzc1Jlc3VsdCk7XG4gICAgICB9LCAwKTtcblxuICAgICAgcmV0dXJuIHN1Y2Nlc3NSZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yUmVzdWx0OiBBY3Rpb25TdGVwUmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3IgfTtcblxuICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHRoZSBlcnJvciBub3RpZmljYXRpb24gaGFwcGVucyBvdXRzaWRlIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5leGVjdXRpb25Db21wbGV0ZWQubmV4dChlcnJvclJlc3VsdCk7XG4gICAgICB9LCAwKTtcblxuICAgICAgcmV0dXJuIGVycm9yUmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHNpbmdsZSBhY3Rpb24gc3RlcFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWN0aW9uU3RlcChcbiAgICBzdGVwOiBTdGVwRGF0YSxcbiAgICBhcHBEYXRhVXVpZDogc3RyaW5nLFxuICAgIHNldE5leHRTdGVwOiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxBY3Rpb25TdGVwUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICAgIGlmIChzdGVwLnR5cGUgPT09IEZsdXhUeXBlLkFjdGlvbikge1xuICAgICAgICBjb25zdCBhY3Rpb25SZXF1ZXN0OiBNYWtlQWN0aW9uUmVxdWVzdCA9IHtcbiAgICAgICAgICBhcHBEYXRhSWQ6IGFwcERhdGFVdWlkLFxuICAgICAgICAgIHN0ZXBJZDogc3RlcC5pZGVudGlmaWVyLFxuICAgICAgICAgIHNldE5leHRTdGVwOiBzZXROZXh0U3RlcCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UubWFrZUFjdGlvbkFwaUNhbGwoYWN0aW9uUmVxdWVzdClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogcmVzdWx0LnN1Y2Nlc3MsIGRhdGE6IHJlc3VsdCB9O1xuICAgICAgfSBlbHNlIGlmIChzdGVwLnR5cGUgPT09IEZsdXhUeXBlLlN0YXR1cykge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UubWFrZVN0YXR1c0FwaUNhbGwoXG4gICAgICAgICAgICBhcHBEYXRhVXVpZCxcbiAgICAgICAgICAgIHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHNldE5leHRTdGVwLFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBleGVjdXRpbmcgYWN0aW9uIHN0ZXAgJHtzdGVwLmlkZW50aWZpZXJ9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgY3VycmVudGx5IGV4ZWN1dGluZyBhY3Rpb25zXG4gICAqL1xuICBnZXQgaXNFeGVjdXRpbmdBY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXhlY3V0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGlvbkNvbXBsZXRlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuYWN0aW9uRXhlY3V0aW5nJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,69 @@
1
+ import { HttpHeaders, } from '@angular/common/http';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import { catchError, throwError } from 'rxjs';
4
+ import { ConfigService } from './others/config-service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "@angular/router";
8
+ export class AuthenticationClient {
9
+ constructor(http, router) {
10
+ this.http = http;
11
+ this.router = router;
12
+ this.configService = inject(ConfigService);
13
+ this.headers = new HttpHeaders({
14
+ 'Content-Type': 'application/x-www-form-urlencoded',
15
+ });
16
+ }
17
+ // public login(
18
+ // username: string,
19
+ // password: string
20
+ // ): Observable<AuthResponseDto> {
21
+ // const formData: UserForAuthenticationDto = {
22
+ // client_id: this.configService.readConfig().clientId,
23
+ // client_secret: this.configService.readConfig().clientSecret,
24
+ // grant_type: 'password',
25
+ // username: username,
26
+ // password: password,
27
+ // scope: this.configService.readConfig().clientScope,
28
+ // };
29
+ // return this.http.post<AuthResponseDto>(
30
+ // this.configService.readConfig().baseUrlGateway + '/connect/token',
31
+ // this.urlEncodeFormData(formData),
32
+ // { headers: this.headers }
33
+ // );
34
+ // }
35
+ refreshToken(refreshToken) {
36
+ var clientId = this.configService.readConfig().clientId;
37
+ const formData = {
38
+ client_id: clientId,
39
+ grant_type: 'refresh_token',
40
+ refresh_token: refreshToken,
41
+ };
42
+ return this.http
43
+ .post(this.configService.readConfig().baseUrlGateway + '/connect/token', this.urlEncodeFormData(formData), { headers: this.headers })
44
+ .pipe(catchError((error) => {
45
+ if (error.status === 401 || error.status === 400) {
46
+ this.router.navigate(['/login']);
47
+ }
48
+ return throwError(error);
49
+ }));
50
+ }
51
+ urlEncodeFormData(formData) {
52
+ const urlEncodedParams = new URLSearchParams();
53
+ for (const key in formData) {
54
+ if (Object.prototype.hasOwnProperty.call(formData, key)) {
55
+ urlEncodedParams.append(key, formData[key]);
56
+ }
57
+ }
58
+ return urlEncodedParams.toString();
59
+ }
60
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthenticationClient, deps: [{ token: i1.HttpClient }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
61
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthenticationClient, providedIn: 'root' }); }
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthenticationClient, decorators: [{
64
+ type: Injectable,
65
+ args: [{
66
+ providedIn: 'root',
67
+ }]
68
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.Router }] });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1jbGllbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvYXV0aC1jbGllbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsV0FBVyxHQUNaLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBU3hELE1BQU0sT0FBTyxvQkFBb0I7SUFLL0IsWUFBb0IsSUFBZ0IsRUFBVSxNQUFjO1FBQXhDLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRjVELGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBR3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDN0IsY0FBYyxFQUFFLG1DQUFtQztTQUNwRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixxQkFBcUI7SUFDckIsbUNBQW1DO0lBQ25DLGlEQUFpRDtJQUNqRCwyREFBMkQ7SUFDM0QsbUVBQW1FO0lBQ25FLDhCQUE4QjtJQUM5QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDBEQUEwRDtJQUMxRCxPQUFPO0lBRVAsNENBQTRDO0lBQzVDLHlFQUF5RTtJQUN6RSx3Q0FBd0M7SUFDeEMsZ0NBQWdDO0lBQ2hDLE9BQU87SUFDUCxJQUFJO0lBRUcsWUFBWSxDQUFDLFlBQW9CO1FBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3hELE1BQU0sUUFBUSxHQUFvQztZQUNoRCxTQUFTLEVBQUUsUUFBUTtZQUNuQixVQUFVLEVBQUUsZUFBZTtZQUMzQixhQUFhLEVBQUUsWUFBWTtTQUM1QixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLElBQUksQ0FDSCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsRUFDakUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUNoQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQzFCO2FBQ0EsSUFBSSxDQUNILFVBQVUsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFhO1FBQ3JDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUMvQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQyxDQUFDOytHQS9EVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSHR0cENsaWVudCxcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBIZWFkZXJzLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL290aGVycy9jb25maWctc2VydmljZSc7XG5pbXBvcnQge1xuICBBdXRoUmVzcG9uc2VEdG8sXG4gIFVzZXJGb3JBdXRoZW50aWNhdGlvbkR0b1JlZnJlc2gsXG59IGZyb20gJy4vbW9kZWxzL2F1dGgvdXNlcnMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25DbGllbnQge1xuICBwcml2YXRlIGhlYWRlcnM6IEh0dHBIZWFkZXJzO1xuXG4gIGNvbmZpZ1NlcnZpY2UgPSBpbmplY3QoQ29uZmlnU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHB1YmxpYyBsb2dpbihcbiAgLy8gICB1c2VybmFtZTogc3RyaW5nLFxuICAvLyAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgLy8gKTogT2JzZXJ2YWJsZTxBdXRoUmVzcG9uc2VEdG8+IHtcbiAgLy8gICBjb25zdCBmb3JtRGF0YTogVXNlckZvckF1dGhlbnRpY2F0aW9uRHRvID0ge1xuICAvLyAgICAgY2xpZW50X2lkOiB0aGlzLmNvbmZpZ1NlcnZpY2UucmVhZENvbmZpZygpLmNsaWVudElkLFxuICAvLyAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jb25maWdTZXJ2aWNlLnJlYWRDb25maWcoKS5jbGllbnRTZWNyZXQsXG4gIC8vICAgICBncmFudF90eXBlOiAncGFzc3dvcmQnLFxuICAvLyAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAvLyAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAvLyAgICAgc2NvcGU6IHRoaXMuY29uZmlnU2VydmljZS5yZWFkQ29uZmlnKCkuY2xpZW50U2NvcGUsXG4gIC8vICAgfTtcblxuICAvLyAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBdXRoUmVzcG9uc2VEdG8+KFxuICAvLyAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnJlYWRDb25maWcoKS5iYXNlVXJsR2F0ZXdheSArICcvY29ubmVjdC90b2tlbicsXG4gIC8vICAgICB0aGlzLnVybEVuY29kZUZvcm1EYXRhKGZvcm1EYXRhKSxcbiAgLy8gICAgIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH1cbiAgLy8gICApO1xuICAvLyB9XG5cbiAgcHVibGljIHJlZnJlc2hUb2tlbihyZWZyZXNoVG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8QXV0aFJlc3BvbnNlRHRvPiB7XG4gICAgdmFyIGNsaWVudElkID0gdGhpcy5jb25maWdTZXJ2aWNlLnJlYWRDb25maWcoKS5jbGllbnRJZDtcbiAgICBjb25zdCBmb3JtRGF0YTogVXNlckZvckF1dGhlbnRpY2F0aW9uRHRvUmVmcmVzaCA9IHtcbiAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEF1dGhSZXNwb25zZUR0bz4oXG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5yZWFkQ29uZmlnKCkuYmFzZVVybEdhdGV3YXkgKyAnL2Nvbm5lY3QvdG9rZW4nLFxuICAgICAgICB0aGlzLnVybEVuY29kZUZvcm1EYXRhKGZvcm1EYXRhKSxcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfVxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVybEVuY29kZUZvcm1EYXRhKGZvcm1EYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybEVuY29kZWRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybURhdGEpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybURhdGEsIGtleSkpIHtcbiAgICAgICAgdXJsRW5jb2RlZFBhcmFtcy5hcHBlbmQoa2V5LCBmb3JtRGF0YVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVybEVuY29kZWRQYXJhbXMudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19