UNPKG

ngx-jenga-api

Version:

Angular wrapper for Equity's Jenga API. Still in progress

1 lines 72.1 kB
{"version":3,"file":"ngx-jenga-api.mjs","sources":["../../../projects/ngx-jenga-api/src/lib/interfaces.ts","../../../projects/ngx-jenga-api/src/lib/services/api.service.ts","../../../projects/ngx-jenga-api/src/lib/jenga.keys.ts","../../../projects/ngx-jenga-api/src/lib/services/auth.service.ts","../../../projects/ngx-jenga-api/src/lib/ngx-jenga-api.component.ts","../../../projects/ngx-jenga-api/src/lib/interceptors/api-key.interceptor.ts","../../../projects/ngx-jenga-api/src/lib/interceptors/auth.interceptor.ts","../../../projects/ngx-jenga-api/src/lib/error-handler/error.service.ts","../../../projects/ngx-jenga-api/src/lib/error-handler/error.-logger.service.ts","../../../projects/ngx-jenga-api/src/lib/error-handler/error.notification.service.ts","../../../projects/ngx-jenga-api/src/lib/error-handler/global-error-handler.ts","../../../projects/ngx-jenga-api/src/lib/services/loader.service.ts","../../../projects/ngx-jenga-api/src/lib/components/merchants/merchants.component.ts","../../../projects/ngx-jenga-api/src/lib/components/merchants/merchants.component.html","../../../projects/ngx-jenga-api/src/lib/services/general.service.ts","../../../projects/ngx-jenga-api/src/lib/components/bill-payments/bill-payments.component.ts","../../../projects/ngx-jenga-api/src/lib/components/bill-payments/bill-payments.component.html","../../../projects/ngx-jenga-api/src/lib/components/merchant-payments/merchant-payments.component.ts","../../../projects/ngx-jenga-api/src/lib/components/merchant-payments/merchant-payments.component.html","../../../projects/ngx-jenga-api/src/lib/components/billers/billers.component.ts","../../../projects/ngx-jenga-api/src/lib/components/billers/billers.component.html","../../../projects/ngx-jenga-api/src/lib/interceptors/loader.interceptor.ts","../../../projects/ngx-jenga-api/src/lib/ngx-jenga-api.module.ts","../../../projects/ngx-jenga-api/src/lib/interceptors/error.interceptor.ts","../../../projects/ngx-jenga-api/src/lib/interceptors/signature.interceptor.ts","../../../projects/ngx-jenga-api/src/public-api.ts","../../../projects/ngx-jenga-api/src/ngx-jenga-api.ts"],"sourcesContent":["import { FormControl, FormGroup } from \"@angular/forms\"\r\n\r\ninterface baseLink {\r\n myUrl: URL,\r\n myAuthUrl: URL\r\n}\r\nconst link = new URL('https://uat.finserve.africa/v3-apis/transaction-api/v3.0')\r\nconst authLink = new URL('https://uat.finserve.africa/authentication/api/v3/authenticate/merchant')\r\nexport const BaseURL: baseLink = {\r\n myUrl: link,\r\n myAuthUrl: authLink\r\n}\r\n\r\n\r\nexport interface IauthReq {\r\n merchantCode: string\r\n consumerSecret: string\r\n}\r\n\r\n\r\nexport interface IauthRes {\r\n accessToken: string\r\n refreshToken: string\r\n expiresIn: string\r\n issuedAt: string\r\n tokenType: string\r\n}\r\n\r\n\r\nexport interface IrecbillPayments {\r\n biller: {\r\n billerCode: string\r\n countryCode: string\r\n },\r\n bill: {\r\n reference: string\r\n amount: string\r\n currency: string\r\n },\r\n payer: {\r\n name: string\r\n account: string\r\n reference: string\r\n mobileNumber: string\r\n },\r\n partnerId: string\r\n remarks: string\r\n}\r\n\r\n\r\nexport interface IBillForm extends FormGroup {\r\n value: IrecbillPayments,\r\n controls: {\r\n billerCode: FormControl\r\n countryCode: FormControl\r\n reference: FormControl\r\n amount: FormControl\r\n currency: FormControl\r\n name: FormControl\r\n account: FormControl\r\n reference2: FormControl\r\n mobileNumber: FormControl\r\n partnerId: FormControl\r\n remarks: FormControl\r\n }\r\n}\r\n\r\n\r\nexport interface IrecMerchantPayments {\r\n biller: {\r\n billerCode: string\r\n countryCode: string\r\n }\r\n bill: {\r\n reference: string\r\n amount: string\r\n currency: string\r\n }\r\n payer: {\r\n name: string\r\n account: string\r\n reference: string\r\n mobileNumber: string\r\n }\r\n partnerId: string\r\n remarks: string\r\n}\r\n\r\n\r\nexport interface IMerchantForm extends FormGroup {\r\n value: IrecMerchantPayments\r\n controls: {\r\n billerCode: FormControl\r\n countryCode: FormControl\r\n reference: FormControl\r\n amount: FormControl\r\n currency: FormControl\r\n name: FormControl\r\n account: FormControl\r\n reference2: FormControl\r\n mobileNumber: FormControl\r\n partnerId: FormControl\r\n remarks: FormControl\r\n }\r\n}\r\n\r\n\r\nexport interface IMerchantPayments {\r\n merchant: {\r\n till: string\r\n },\r\n payment: {\r\n ref: string\r\n amount: string\r\n currency: string\r\n },\r\n partner: {\r\n id: string\r\n ref: string\r\n }\r\n}\r\n\r\nexport interface IMerchantPaymentsForm extends FormGroup {\r\n value: IMerchantPayments \r\n controls: {\r\n till: FormControl\r\n ref: FormControl\r\n amount: FormControl\r\n currency: FormControl\r\n id: FormControl\r\n ref2: FormControl\r\n }\r\n}\r\n\r\n\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseURL, IMerchantPayments, IrecbillPayments, IrecMerchantPayments } from '../interfaces';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService {\n \n constructor(\n private api: HttpClient\n ) { }\n\n// ***************************GET REQUESTS***************************\n\n\n // Get All EazzyPay Merchants\n getAllEazzyPayMerchants(page:number, per_page:number): Observable<any> {\n let params = new HttpParams()\n .set('page', page)\n .set('per_page', per_page)\n\n return this.api.get(`${BaseURL.myUrl}/merchants`, { params })\n }\n\n // Get All Billers\n getAllBillers(page:number, per_page:number, category:string): Observable<any> {\n let params = new HttpParams()\n .set('page', page)\n .set('per_page', per_page)\n .set('category', category)\n\n return this.api.get(`${BaseURL.myUrl}/billers`, { params })\n }\n\n\n\n\n// ***************************POST REQUESTS***************************\n\n\n // Receive Payments - Bill Payments\n receiveBillPayments(data:IrecbillPayments): Observable<IrecbillPayments> {\n return this.api.post<IrecbillPayments>(`${BaseURL.myUrl}/bills/pay`, data)\n }\n\n // Receive Payments - Merchant Payments\n receiveMerchantPayments(data:IMerchantPayments): Observable<IrecMerchantPayments> {\n return this.api.post<IrecMerchantPayments>(`${BaseURL.myUrl}/tills/pay`, data)\n }\n\n\n}\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const JENGA_API_KEYS = new InjectionToken<any>('jenga.keys')","import { HttpBackend, HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { BaseURL, IauthReq } from '../interfaces';\nimport { map, Observable } from 'rxjs';\nimport { JENGA_API_KEYS } from '../jenga.keys';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private httpClient: HttpClient\n\n constructor(\n handler: HttpBackend,\n @Inject(JENGA_API_KEYS) private token:any\n ) {\n this.httpClient = new HttpClient(handler)\n }\n\n authenticateMerchant(): Observable<IauthReq> {\n const httpOptions = {\n headers: new HttpHeaders({\n 'API-Key': `${this.token.api_key}`\n })\n }\n\n return this.httpClient.post<IauthReq>(`${BaseURL.myAuthUrl}`, {\n merchantCode: this.token.merchant_code,\n consumerSecret: this.token.consumer_secret,\n }, httpOptions ).pipe(map((res:any) => {\n this.isAuthenticated() == true\n return res\n }))\n }\n\n isAuthenticated(): boolean {\n return false\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-ngx-jenga-api',\n template: ``,\n styles: [\n ]\n})\nexport class NgxJengaApiComponent {\n\n}\n","import { Inject, Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { JENGA_API_KEYS } from '../jenga.keys';\n\n@Injectable()\nexport class ApiKeyInterceptor implements HttpInterceptor {\n\n constructor(\n @Inject(JENGA_API_KEYS) private token: any\n ) {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n request = request.clone({\n setHeaders: {\n 'API-Key': `${this.token.api_key}`\n }\n });\n return next.handle(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n \n constructor() {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n const token = localStorage.getItem(\"jenga-tkn\")\n request = request.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`,\n }\n });\n return next.handle(request);\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorService {\r\n\r\n getClientErrorMessage(error:Error): string {\r\n return error.message ? error.message : error.toString()\r\n }\r\n\r\n getServerErrorMessage(error:HttpErrorResponse): string {\r\n return navigator.onLine ? error.message : 'Kindly check your internet connection'\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoggingService {\r\n\r\n constructor(){}\r\n\r\n logError(message:any, stack:string){\r\n // send the errors to database\r\n // console.log(\"LoggingService:\" + message)\r\n }\r\n}","import { Injectable, NgZone } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n\r\n constructor(\r\n private zone:NgZone,\r\n private snack:MatSnackBar\r\n ) { }\r\n\r\n showSuccess(message:string){\r\n this.zone.run(()=> {\r\n this.snack.open(message, 'close', {\r\n duration: 4000\r\n });\r\n })\r\n }\r\n\r\n showWarning(message:string){\r\n this.zone.run(()=>{\r\n this.snack.open(message, 'close', {\r\n duration: 6000\r\n })\r\n })\r\n }\r\n\r\n showError(message:string){\r\n this.zone.run(()=> {\r\n this.snack.open(message, 'close', {\r\n duration: 4000\r\n })\r\n })\r\n }\r\n}","import { ErrorHandler, Injectable, Injector } from \"@angular/core\";\r\nimport { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { ErrorService } from \"../error-handler/error.service\";\r\nimport { LoggingService } from \"./error.-logger.service\";\r\nimport { NotificationService } from \"./error.notification.service\";\r\n\r\n\r\ntype NewType = Error | HttpErrorResponse;\r\n\r\n@Injectable()\r\nexport class GlobalErrorHndler implements ErrorHandler{\r\n\r\n constructor(\r\n private injector: Injector\r\n ){ }\r\n\r\n handleError(error: NewType) {\r\n const errorService = this.injector.get(ErrorService)\r\n const logger = this.injector.get(LoggingService)\r\n const notifier = this.injector.get(NotificationService)\r\n\r\n let message\r\n let stackTrace:any\r\n if (error instanceof HttpErrorResponse){\r\n message = errorService.getServerErrorMessage(error)\r\n notifier.showError(message)\r\n } else {\r\n message = errorService.getClientErrorMessage(error)\r\n notifier.showError(message)\r\n }\r\n logger.logError(message, stackTrace)\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoaderService {\n\n private isLoading$$ = new BehaviorSubject<boolean>(false)\n isLoading$ = this.isLoading$$.asObservable()\n \n setLoading(isLoading: boolean) {\n this.isLoading$$.next(isLoading)\n }\n}","import { AfterViewInit, Component, Input, OnDestroy, ViewChild } from '@angular/core';\nimport { MatSort } from '@angular/material/sort';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatTableDataSource } from '@angular/material/table'; \nimport { ApiService } from '../../services/api.service';\nimport { AuthService } from '../../services/auth.service';\nimport { LoaderService } from '../../services/loader.service';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'jenga-all-merchants',\n templateUrl: './merchants.component.html',\n styleUrls: ['./merchants.component.css']\n})\nexport class MerchantsComponent implements AfterViewInit, OnDestroy {\n\n merchantList: any\n dataSource!: MatTableDataSource<any>\n destroyComponent = new Subject<void>()\n\n @Input() tableShadow: boolean = true\n @Input() showSearchBar: boolean = true\n @ViewChild(MatPaginator) paginator!: MatPaginator\n @ViewChild(MatSort, {static: false}) sort!: MatSort\n \n constructor(\n private api: ApiService,\n public loadingService: LoaderService,\n private authenticateEndpoint: AuthService\n ){\n this.authenticateEndpoint.authenticateMerchant().subscribe({\n next: (res:any) => {\n localStorage.setItem('jenga-tkn', res.accessToken)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n ngAfterViewInit(): void {\n this.getMerchants()\n }\n\n ngOnDestroy(): void {\n this.destroyComponent.next()\n this.destroyComponent.complete()\n }\n\n getMerchants(per_page:number = 25):void {\n this.api.getAllEazzyPayMerchants(1, per_page)\n .pipe(takeUntil(this.destroyComponent))\n .subscribe({\n next: (res:any) => {\n this.merchantList = res.data.merchants\n this.dataSource = new MatTableDataSource(res.data.merchants)\n this.dataSource.paginator = this.paginator\n this.dataSource.sort = this.sort\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n updatePageSize(event:any) {\n const per_page = event.pageSize\n this.getMerchants(per_page)\n }\n\n applyFilter(event: Event) {\n const filterValue = (event.target as HTMLInputElement).value\n this.dataSource.filter = filterValue.trim().toLowerCase()\n if (this.dataSource.paginator) {\n this.dataSource.paginator.firstPage()\n }\n }\n \n}\n","<div class=\"table\">\n <div class=\"searchBar\" *ngIf=\"showSearchBar\">\n <input (keyup)=\"applyFilter($event)\" id=\"searchQueryInput\" type=\"text\" name=\"searchQueryInput\" placeholder=\"Search {{ merchantList?.length }} merchants\" />\n </div>\n <table mat-table [dataSource]=\"dataSource\" matSort [class.mat-elevation-z8]=\"tableShadow\">\n\n <ng-container matColumnDef=\"name\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by name\">Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"tillNumber\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by tillNumber\">Till Number</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.tillNumber }} </td>\n </ng-container>\n\n\n <!-- <ng-container matColumnDef=\"outlets\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by tillnumber\">Outlets</th>\n\n <td mat-cell *matCellDef=\"let row\">\n <table mat-table [dataSource]=\"row.outlets\">\n\n <ng-container matColumnDef=\"Oname\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Otillnumber\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Till Number</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.tillnumber }} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"['Oname', 'Otillnumber']\" RowDef=\"['Oname', 'Otillnumber']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['Oname', 'Otillnumber'];\"></tr>\n </table>\n </td>\n </ng-container> -->\n\n\n <tr mat-header-row *matHeaderRowDef=\"['name', 'tillNumber']\" RowDef=\"['name', 'tillNumber']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['name', 'tillNumber'];\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"loadingService.isLoading$ | async\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-paginator #paginator [pageSizeOptions]=\"[25, 50, 100]\" showFirstLastButtons (page)=\"updatePageSize($event)\"></mat-paginator>\n</div>","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GeneralService {\n\n // general functions and such\n constructor() { }\n \n generateRandomString(length: number): string {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * characters.length))\n }\n return result\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { IBillForm, IrecbillPayments } from '../../interfaces';\nimport { ApiService } from '../../services/api.service';\nimport { AuthService } from '../../services/auth.service';\nimport { GeneralService } from '../../services/general.service';\n\n@Component({\n selector: 'jenga-bill-payments',\n templateUrl: './bill-payments.component.html',\n styleUrls: ['./bill-payments.component.css']\n})\nexport class BillPaymentsComponent implements OnInit {\n\n billForm!: FormGroup\n paymentData!: IrecbillPayments\n\n @Input() billerCode!: string\n @Input() countryCode!: string\n @Input() reference!: string\n @Input() amount!: string\n @Input() currency!: string\n @Input() name!: string\n @Input() account!: string\n @Input() reference2!: string\n @Input() partnerId!: string\n @Input() authorization!: string\n @Input() signature!: string\n @Input() mobileNumber!: string\n @Input() remarks!: string\n @Input() cardShadow: boolean = true\n\n\n constructor(\n private api: ApiService,\n private gs: GeneralService,\n private formbuilder: FormBuilder,\n private authenticateEndpoint: AuthService\n ){\n this.authenticateEndpoint.authenticateMerchant().subscribe({\n next: (res:any) => {\n localStorage.setItem('jenga-tkn', res.accessToken)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n ngOnInit(): void {\n this.billForm = this.formbuilder.group({\n billerCode: [this.billerCode, [Validators.required]],\n countryCode: [this.countryCode, [Validators.required]],\n reference: [this.reference, [Validators.required]],\n amount: [this.amount, [Validators.required]],\n currency: [this.currency, [Validators.required]],\n name: [this.name, [Validators.required]],\n account: [this.account, [Validators.required]],\n reference2: [this.gs.generateRandomString(12), [Validators.required]],\n partnerId: [this.partnerId, [Validators.required]],\n mobileNumber: [this.mobileNumber, [Validators.required]],\n remarks: [this.remarks, [Validators.required]],\n }) as IBillForm\n }\n\n billPayments(): void {\n this.paymentData = {\n biller: {\n billerCode: this.billForm.value.billerCode,\n countryCode: this.billForm.value.countryCode\n },\n bill: {\n reference: this.billForm.value.reference,\n amount: this.billForm.value.amount,\n currency: this.billForm.value.currency\n },\n payer: {\n name: this.billForm.value.name,\n account: this.billForm.value.reference,\n reference: this.billForm.value.reference2,\n mobileNumber: this.billForm.value.mobileNumber\n },\n partnerId: this.billForm.value.partnerId,\n remarks: this.billForm.value.remarks\n }\n this.api.receiveBillPayments(this.paymentData).subscribe({\n next: (res:any) => {\n console.log(\"Bill payment is: \", res)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n}\n","<mat-card [class.mat-elevation-z8]=\"cardShadow\">\n <form class=\"user-form\" [formGroup]=\"billForm\">\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\">\n <mat-error>Kindly add your name</mat-error>\n </mat-form-field>\n <br>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Account Number</mat-label>\n <input matInput formControlName=\"reference\">\n <mat-error>Kindly add yur account number</mat-error>\n </mat-form-field>\n <br>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Mobile Number</mat-label>\n <input matInput formControlName=\"mobileNumber\">\n <mat-error>Kindly add a mobile number</mat-error>\n </mat-form-field>\n <br>\n\n <mat-form-field class=\"form-field full-width\" appearance=\"outline\" class=\"example-full-width\">\n <mat-label>Leave a Remark</mat-label>\n <textarea matInput formControlName=\"remarks\"></textarea>\n <mat-error>Kindly add a remark</mat-error>\n </mat-form-field>\n <br>\n\n <button (click)=\"billPayments()\" mat-raised-button color=\"primary\">Make Payment</button>\n\n </form>\n</mat-card>","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Subject, takeUntil } from 'rxjs';\nimport { IMerchantPayments, IrecMerchantPayments } from '../../interfaces';\nimport { ApiService } from '../../services/api.service';\nimport { AuthService } from '../../services/auth.service';\nimport { GeneralService } from '../../services/general.service';\n\n@Component({\n selector: 'jenga-merchant-payments',\n templateUrl: './merchant-payments.component.html',\n styleUrls: ['./merchant-payments.component.css']\n})\nexport class MerchantPaymentsComponent implements OnInit, OnDestroy {\n\n destroyComponent = new Subject<void>()\n merchantForm!: FormGroup\n paymentData!: IMerchantPayments\n\n @Input() till!: string\n @Input() uniqueRef!: string\n @Input() amount!: string\n @Input() currency!: string\n @Input() bankId!: string\n @Input() mobileNumber!: string\n\n \n constructor(\n private api: ApiService,\n private general: GeneralService,\n private formbuilder: FormBuilder,\n private authenticateEndpoint: AuthService\n ){\n this.authenticateEndpoint.authenticateMerchant().subscribe({\n next: (res:any) => {\n localStorage.setItem('jenga-tkn', res.accessToken)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n ngOnInit(): void {\n this.merchantForm = this.formbuilder.group({\n till: [this.till, [Validators.required]],\n uniqueRef: [this.general.generateRandomString(12), [Validators.required]],\n amount: [this.amount, [Validators.required]],\n currency: [this.currency, [Validators.required]],\n bankId: [this.bankId, [Validators.required]],\n mobileNumber: [this.mobileNumber, [Validators.required]],\n })\n }\n\n ngOnDestroy(): void {\n this.destroyComponent.next()\n this.destroyComponent.complete()\n }\n\n \n merchantPayments(): void {\n const data: IMerchantPayments = {\n merchant: {\n till: this.merchantForm.value.till\n },\n payment: {\n ref: this.merchantForm.value.uniqueRef,\n amount: this.merchantForm.value.amount,\n currency: this.merchantForm.value.currency\n },\n partner: {\n id: this.merchantForm.value.bankId,\n ref: this.merchantForm.value.mobileNumber\n }\n }\n this.api.receiveMerchantPayments(data).pipe(\n takeUntil(this.destroyComponent)).subscribe({\n next: (res:any) => {\n console.log(res)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n}\n","<mat-card>\n <form class=\"user-form\" [formGroup]=\"merchantForm\">\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Till number</mat-label>\n <input matInput formControlName=\"till\">\n <mat-error>Kindly add the till number</mat-error>\n </mat-form-field>\n <br>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Amount</mat-label>\n <input matInput formControlName=\"amount\">\n <mat-error>Kindly add your amount</mat-error>\n </mat-form-field>\n <br>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\">\n <mat-label>Mobile Number</mat-label>\n <input matInput formControlName=\"mobileNumber\">\n <mat-error>Kindly add a mobile number</mat-error>\n </mat-form-field>\n <br>\n\n <button [disabled]=\"!merchantForm.valid\" (click)=\"merchantPayments()\" mat-raised-button color=\"primary\">Make Payment</button>\n\n </form>\n</mat-card>","import { AfterViewInit, Component, Input, ViewChild } from '@angular/core';\nimport { MatSort } from '@angular/material/sort';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatTableDataSource } from '@angular/material/table'; \nimport { ApiService } from '../../services/api.service';\nimport { LoaderService } from '../../services/loader.service';\nimport { AuthService } from '../../services/auth.service';\n\n@Component({\n selector: 'jenga-all-billers',\n templateUrl: './billers.component.html',\n styleUrls: ['./billers.component.css']\n})\nexport class BillersComponent implements AfterViewInit {\n\n billersList: any\n dataSource!: MatTableDataSource<any>\n @Input() showSearchBar: boolean = true\n @Input() tableShadow: boolean = true\n @Input() categories: string = 'utilities'\n @ViewChild(MatPaginator) paginator!: MatPaginator\n @ViewChild(MatSort, {static: false}) sort!: MatSort\n\n constructor(\n private api: ApiService,\n public loadingService: LoaderService,\n private authenticateEndpoint: AuthService\n ){\n this.authenticateEndpoint.authenticateMerchant().subscribe({\n next: (res:any) => {\n localStorage.setItem('jenga-tkn', res.accessToken)\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n ngAfterViewInit(): void {\n this.getBillers(25)\n }\n\n getBillers(per_page:number): void {\n this.api.getAllBillers(1, per_page, this.categories)\n .subscribe({\n next: (res:any) => { \n this.billersList = res.data.billers\n this.dataSource = new MatTableDataSource(res.data.billers)\n this.dataSource.paginator = this.paginator\n this.dataSource.sort = this.sort\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n updatePageSize(event:any) {\n const per_page = event.pageSize\n this.getBillers(per_page)\n }\n\n onCategorySelected(event: any) {\n console.log('event is: ', event)\n this.api.getAllBillers(1, 25, event.value).subscribe({\n next: (res:any) => { \n this.billersList = res.data.billers\n this.dataSource = new MatTableDataSource(res.data.billers)\n this.dataSource.paginator = this.paginator\n this.dataSource.sort = this.sort\n },\n error: (e:any) => {\n throw new Error(e.error.message)\n }\n })\n }\n\n applyFilter(event: Event) {\n const filterValue = (event.target as HTMLInputElement).value\n this.dataSource.filter = filterValue.trim().toLowerCase()\n if (this.dataSource.paginator) {\n this.dataSource.paginator.firstPage()\n }\n }\n\n}\n","<div class=\"table\">\n <div class=\"searchBar\" *ngIf=\"showSearchBar\">\n <input (keyup)=\"applyFilter($event)\" id=\"searchQueryInput\" type=\"text\" name=\"searchQueryInput\" placeholder=\"Search {{ billersList?.length }} merchants\" />\n <br>\n </div>\n <table mat-table [dataSource]=\"dataSource\" matSort [class.mat-elevation-z8]=\"tableShadow\">\n\n <ng-container [style.width]=\"'170px'\" matColumnDef=\"category\">\n <th [style.width]=\"'170px'\" class=\"table-header\" mat-header-cell *matHeaderCellDef>\n <mat-select (selectionChange)=\"onCategorySelected($event)\" [style.width]=\"'170px'\" [(value)]=\"categories\">\n <mat-option value=\"utilities\">Utilities</mat-option>\n <mat-option value=\"services\">Services</mat-option>\n </mat-select>\n </th>\n <td mat-cell *matCellDef=\"let row\"></td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"name\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by name\">Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"code\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by code\">Code</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.code }} </td>\n </ng-container>\n\n\n <!-- <ng-container matColumnDef=\"outlets\">\n <th class=\"table-header\" mat-header-cell *matHeaderCellDef mat-sort-header sortActionDescription=\"Sort by tillnumber\">Outlets</th>\n\n <td mat-cell *matCellDef=\"let row\">\n <table mat-table [dataSource]=\"row.outlets\">\n\n <ng-container matColumnDef=\"Oname\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.name }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Otillnumber\">\n <th class=\"sub-table\" mat-header-cell *matHeaderCellDef>Till Number</th>\n <td mat-cell *matCellDef=\"let row\"> {{ row.tillnumber }} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"['Oname', 'Otillnumber']\" RowDef=\"['Oname', 'Otillnumber']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['Oname', 'Otillnumber'];\"></tr>\n </table>\n </td>\n </ng-container> -->\n\n\n <tr mat-header-row *matHeaderRowDef=\"['category', 'name', 'code']\" RowDef=\"['category', 'name', 'code']\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['category', 'name', 'code'];\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"loadingService.isLoading$ | async\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-paginator #paginator [pageSizeOptions]=\"[25, 50, 100]\" showFirstLastButtons (page)=\"updatePageSize($event)\"></mat-paginator>\n</div>","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor\n} from '@angular/common/http';\nimport { finalize, Observable } from 'rxjs';\nimport { LoaderService } from '../services/loader.service';\n\n@Injectable()\nexport class LoaderInterceptor implements HttpInterceptor {\n totalRequests: number = 0\n\n constructor(\n private loadingService: LoaderService\n ) {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n this.totalRequests++\n this.loadingService.setLoading(true)\n\n return next.handle(request).pipe(\n finalize(() => {\n this.totalRequests--\n if (this.totalRequests === 0) {\n // plz work\n this.loadingService.setLoading(false)\n }\n })\n )\n }\n}\n","import { ErrorHandler, ModuleWithProviders, NgModule } from '@angular/core';\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n// configs\nimport { JENGA_API_KEYS } from './jenga.keys';\nimport { ApiKeyInterceptor } from './interceptors/api-key.interceptor';\nimport { AuthInterceptor } from './interceptors/auth.interceptor';\nimport { GlobalErrorHndler } from './error-handler/global-error-handler';\nimport { ErrorInterceptor } from './interceptors/error.interceptor';\n\n// components\nimport { NgxJengaApiComponent } from './ngx-jenga-api.component';\nimport { MerchantsComponent } from './components/merchants/merchants.component';\nimport { BillPaymentsComponent } from './components/bill-payments/bill-payments.component';\nimport { MerchantPaymentsComponent } from './components/merchant-payments/merchant-payments.component';\nimport { BillersComponent } from './components/billers/billers.component';\n\n// material\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { LoaderInterceptor } from './interceptors/loader.interceptor';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatPaginatorModule } from '@angular/material/paginator';\n\n\n\n@NgModule({\n declarations: [\n NgxJengaApiComponent,\n MerchantsComponent,\n BillPaymentsComponent,\n MerchantPaymentsComponent,\n BillersComponent\n ],\n imports: [\n HttpClientModule,\n CommonModule,\n\n // material\n MatProgressBarModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatPaginatorModule,\n MatSnackBarModule, \n MatSelectModule,\n MatButtonModule,\n MatTableModule,\n MatInputModule,\n MatSortModule,\n MatCardModule,\n FormsModule\n ],\n exports: [\n NgxJengaApiComponent,\n MerchantsComponent,\n BillPaymentsComponent,\n MerchantPaymentsComponent,\n BillersComponent\n ],\n providers: [\n { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: ApiKeyInterceptor, multi: true },\n // { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true },\n { provide: ErrorHandler, useClass: GlobalErrorHndler },\n // { \n // provide: APP_INITIALIZER, \n // useFactory: (authAPI: AuthService) => () => \n // authAPI.authenticateMerchant().subscribe({\n // next: (res:any) => {\n // console.log(\"RES IS: \", res)\n // localStorage.setItem('jenga-tkn', res.accessToken)\n // },\n // error: (e:any) => {\n // console.error(\"Error is: \", e)\n // }\n // }), \n // deps: [AuthService], multi: true\n // }\n ]\n})\nexport class NgxJengaApiModule { \n static forRoot(\n merchant_code: string, \n consumer_secret: string,\n api_key: string\n ): ModuleWithProviders<NgxJengaApiModule> {\n return {\n ngModule: NgxJengaApiModule,\n providers: [\n { \n provide: JENGA_API_KEYS, \n useValue: \n { \n merchant_code, \n consumer_secret, \n api_key \n } \n }\n ]\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor,\n HttpErrorResponse\n} from '@angular/common/http';\nimport { catchError, Observable, throwError } from 'rxjs';\n\n@Injectable()\nexport class ErrorInterceptor implements HttpInterceptor {\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n // retry(1), //retry 2 times on error\n catchError((error:HttpErrorResponse) =>{\n if (error.status === 404){\n throw new Error(\"Failure fetching data. Kindly refresh your browser\")\n } else {\n throw new Error(\"Something went wrong :/\")\n }\n })\n )\n }\n}","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class SignatureInterceptor implements HttpInterceptor {\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n return next.handle(request)\n }\n}\n","/*\n * Public API Surface of ngx-jenga-api\n */\n\nexport * from './lib/services/api.service'\nexport * from './lib/services/auth.service'\nexport * from './lib/ngx-jenga-api.component'\nexport * from './lib/ngx-jenga-api.module'\nexport * from './lib/components/merchants/merchants.component'\nexport * from './lib/interfaces'\nexport * from './lib/jenga.keys'\nexport * from './lib/components/bill-payments/bill-payments.component'\nexport * from './lib/components/merchant-payments/merchant-payments.component'\nexport * from './lib/components/billers/billers.component'\nexport * from './lib/interceptors/api-key.interceptor'\nexport * from './lib/interceptors/auth.interceptor'\nexport * from './lib/interceptors/error.interceptor'\nexport * from './lib/interceptors/loader.interceptor'\nexport * from './lib/interceptors/signature.interceptor'\n\n// error handler exports\nexport * from './lib/error-handler/error.-logger.service'\nexport * from './lib/error-handler/error.notification.service'\nexport * from './lib/error-handler/error.service'\nexport * from './lib/error-handler/global-error-handler'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.ApiService","i2.LoaderService","i3.AuthService","i2.GeneralService","i4.AuthService","i5","i6","i7","i8","i9","i10","i1.LoaderService"],"mappings":"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