From c89d4027d6dda3416544624bdfad20973c3d12b0 Mon Sep 17 00:00:00 2001 From: ahasani194 Date: Tue, 28 Apr 2026 20:06:21 +0330 Subject: [PATCH] feat: update consumer and partner components for improved data handling and UI enhancements - Refactor ConsumerPosListComponent to dynamically set cookie domain based on hostname. - Modify ConsumerUserFormContentComponent to correctly handle type selection and initialization. - Enhance single.component.html to conditionally display consumer details based on type. - Update ConsumerAccountListComponent to include nested role translation and pos details. - Adjust IConsumerAccountRawResponse to use IEnumTranslate for role and add pos details. - Refine ConsumersComponent to display translated status in the list view. - Revise single.component.html for superAdmin to show translated consumer type and details. - Improve AdminPartnerChargeAccountListComponent and AdminPartnerChargeLicenseTransactionListComponent by updating header labels. - Add file upload functionality in form.component.html for partner creation. - Enhance GuildFormComponent to handle file uploads and form data submission. - Update AdminPartnerLicensesComponent to display consumer names correctly. - Modify IPartnerActivatedLicenseResponse to include consumer_name for better clarity. - Add logo_url to IPartnerRawResponse for displaying partner logos. - Refactor PartnersService to handle FormData for partner creation and updates. - Enhance list.component.html to include partner logos in the display. - Update single.component.html for partners to show total counts for licenses and users. - Implement payment result handling in AuthComponent for improved payment integration. - Refactor SharedUploadFileComponent to manage file previews and uploads more effectively. - Introduce IEnumTranslate interface for better type handling in consumer models. - Update form-data utility to allow skipping specific fields during FormData construction. - Add RTL support styles for file upload and avatar components. - Change environment configuration for API base URL. --- .../poses/components/list.component.ts | 2 +- .../consumers/components/form.component.ts | 6 +- .../consumers/views/single.component.html | 11 ++- .../components/accounts/list.component.ts | 15 +++- .../modules/consumers/models/accounts_io.d.ts | 14 ++- .../modules/consumers/views/list.component.ts | 8 +- .../consumers/views/single.component.html | 11 ++- .../chargeAccount/list.component.ts | 7 +- .../list.component.ts | 7 +- .../partners/components/form.component.html | 1 + .../partners/components/form.component.ts | 23 +++-- .../components/licenses/list.component.ts | 4 +- .../partners/models/activatedLicenses_io.d.ts | 3 +- .../modules/partners/models/io.d.ts | 1 + .../modules/partners/services/main.service.ts | 10 +-- .../partners/views/list.component.html | 12 +++ .../modules/partners/views/list.component.ts | 6 +- .../partners/views/single.component.html | 24 ++--- .../modules/auth/pages/auth.component.html | 12 +++ src/app/modules/auth/pages/auth.component.ts | 72 ++++++++++++++- .../guild/components/select.component.ts | 2 +- .../uploadFile/upload-file.component.html | 90 +++++++++++++++++-- .../uploadFile/upload-file.component.ts | 67 +++++++++++++- src/app/shared/models/consumer.type.ts | 5 +- src/app/shared/models/enum_translate.type.ts | 4 + src/app/utils/form-data.util.ts | 4 + src/assets/rtlSupport.scss | 8 ++ src/environments/environment.ts | 3 +- 28 files changed, 362 insertions(+), 70 deletions(-) create mode 100644 src/app/shared/models/enum_translate.type.ts diff --git a/src/app/domains/consumer/modules/poses/components/list.component.ts b/src/app/domains/consumer/modules/poses/components/list.component.ts index a19d978..3817eac 100644 --- a/src/app/domains/consumer/modules/poses/components/list.component.ts +++ b/src/app/domains/consumer/modules/poses/components/list.component.ts @@ -71,7 +71,7 @@ export class ConsumerPosListComponent extends AbstractList { sameSite: 'Lax', // or 'Strict' for same-site requests only secure: false, path: '/', - domain: 'localhost', + domain: window.location.hostname, }); window.open('/pos', '_blank'); } diff --git a/src/app/domains/partner/modules/consumers/components/form.component.ts b/src/app/domains/partner/modules/consumers/components/form.component.ts index 0247233..fafb78a 100644 --- a/src/app/domains/partner/modules/consumers/components/form.component.ts +++ b/src/app/domains/partner/modules/consumers/components/form.component.ts @@ -1,6 +1,5 @@ import { MustMatch } from '@/core/validators'; import { AbstractForm } from '@/shared/abstractClasses'; -import { fieldControl } from '@/shared/constants/fields'; import { FirstNameComponent, LastNameComponent, @@ -12,6 +11,7 @@ import { UsernameComponent, } from '@/shared/components'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { fieldControl } from '@/shared/constants/fields'; import { Component, inject, Input, signal } from '@angular/core'; import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { Divider } from 'primeng/divider'; @@ -56,10 +56,10 @@ export class ConsumerUserFormContentComponent extends AbstractForm< }, ]; - selectedType = signal(this.initialValues?.type || this.consumerTypes[0].value); + selectedType = signal(this.initialValues?.type?.value || this.consumerTypes[0].value); initForm = () => { - this.selectedType.set(this.initialValues?.type || this.consumerTypes[0].value); + this.selectedType.set(this.initialValues?.type?.value || this.consumerTypes[0].value); const legal = this.fb.group({ name: fieldControl.legal_name(this.initialValues?.legal?.name || ''), registration_code: fieldControl.registration_code( diff --git a/src/app/domains/partner/modules/consumers/views/single.component.html b/src/app/domains/partner/modules/consumers/views/single.component.html index c317862..ae01229 100644 --- a/src/app/domains/partner/modules/consumers/views/single.component.html +++ b/src/app/domains/partner/modules/consumers/views/single.component.html @@ -4,8 +4,15 @@
- - + + + + @if (consumer()?.type?.value === "LEGAL") { + + } @else { + + + }
diff --git a/src/app/domains/superAdmin/modules/consumers/components/accounts/list.component.ts b/src/app/domains/superAdmin/modules/consumers/components/accounts/list.component.ts index 7ec7680..499d962 100644 --- a/src/app/domains/superAdmin/modules/consumers/components/accounts/list.component.ts +++ b/src/app/domains/superAdmin/modules/consumers/components/accounts/list.component.ts @@ -25,12 +25,23 @@ export class ConsumerAccountListComponent extends AbstractList + `${item.pos.name} (${item.pos.complex.name} - ${item.pos.complex.business_activity.name})`, + }, { field: 'status', header: 'وضعیت', type: 'nested', - nestedOption: { path: 'account.status' }, + nestedOption: { path: 'status.translate' }, }, { field: 'created_at', diff --git a/src/app/domains/superAdmin/modules/consumers/models/accounts_io.d.ts b/src/app/domains/superAdmin/modules/consumers/models/accounts_io.d.ts index fca6d27..8955c42 100644 --- a/src/app/domains/superAdmin/modules/consumers/models/accounts_io.d.ts +++ b/src/app/domains/superAdmin/modules/consumers/models/accounts_io.d.ts @@ -1,10 +1,13 @@ import { TAccountType } from '@/core/constants/accountTypes.const'; +import ISummary from '@/core/models/summary'; +import { IEnumTranslate } from '@/shared/models/enum_translate.type'; export interface IConsumerAccountRawResponse { id: string; - role: string; + role: IEnumTranslate; created_at: string; account: AccountInfo; + pos: Pos; } export interface IConsumerAccountResponse extends IConsumerAccountRawResponse {} @@ -22,3 +25,12 @@ interface AccountInfo { username: string; status: string; } + +interface Pos extends ISummary { + complex: { + name: string; + business_activity: { + name: string; + }; + }; +} diff --git a/src/app/domains/superAdmin/modules/consumers/views/list.component.ts b/src/app/domains/superAdmin/modules/consumers/views/list.component.ts index 1075515..9313683 100644 --- a/src/app/domains/superAdmin/modules/consumers/views/list.component.ts +++ b/src/app/domains/superAdmin/modules/consumers/views/list.component.ts @@ -28,7 +28,13 @@ export class ConsumersComponent extends AbstractList { type: 'nested', nestedOption: { path: 'partner.name' }, }, - { field: 'status', header: 'وضعیت' }, + + { + field: 'status', + header: 'وضعیت', + type: 'nested', + nestedOption: { path: 'status.translate' }, + }, // { // field: 'license_expires_at', // header: 'تاریخ انقضای لایسنس', diff --git a/src/app/domains/superAdmin/modules/consumers/views/single.component.html b/src/app/domains/superAdmin/modules/consumers/views/single.component.html index e94e1a4..13ca323 100644 --- a/src/app/domains/superAdmin/modules/consumers/views/single.component.html +++ b/src/app/domains/superAdmin/modules/consumers/views/single.component.html @@ -4,8 +4,15 @@
- - + + + + @if (consumer()?.type?.value === "LEGAL") { + + } @else { + + + }
diff --git a/src/app/domains/superAdmin/modules/partners/components/chargeAccount/list.component.ts b/src/app/domains/superAdmin/modules/partners/components/chargeAccount/list.component.ts index 87349df..89b6ddc 100644 --- a/src/app/domains/superAdmin/modules/partners/components/chargeAccount/list.component.ts +++ b/src/app/domains/superAdmin/modules/partners/components/chargeAccount/list.component.ts @@ -25,17 +25,12 @@ export class AdminPartnerChargeAccountListComponent extends AbstractList
+ @if (!editMode) { diff --git a/src/app/domains/superAdmin/modules/partners/components/form.component.ts b/src/app/domains/superAdmin/modules/partners/components/form.component.ts index f5809a9..bda8ffd 100644 --- a/src/app/domains/superAdmin/modules/partners/components/form.component.ts +++ b/src/app/domains/superAdmin/modules/partners/components/form.component.ts @@ -1,13 +1,17 @@ +import { Maybe } from '@/core'; import { MustMatch } from '@/core/validators'; import { AbstractFormDialog } from '@/shared/abstractClasses'; import { InputComponent, SharedPasswordInputComponent } from '@/shared/components'; +import { SharedDialogComponent } from '@/shared/components/dialog/dialog.component'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; -import { Component, computed, inject, Input } from '@angular/core'; +import { onSelectFileArgs } from '@/shared/components/uploadFile/model'; +import { SharedUploadFileComponent } from '@/shared/components/uploadFile/upload-file.component'; +import { buildFormData } from '@/utils'; +import { Component, computed, inject, Input, signal } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; import { Divider } from 'primeng/divider'; import { IPartnerRequest, IPartnerResponse } from '../models'; import { PartnersService } from '../services/main.service'; -import { SharedDialogComponent } from '@/shared/components/dialog/dialog.component'; @Component({ selector: 'partner-form', @@ -19,6 +23,7 @@ import { SharedDialogComponent } from '@/shared/components/dialog/dialog.compone FormFooterActionsComponent, Divider, SharedPasswordInputComponent, + SharedUploadFileComponent, ], }) export class GuildFormComponent extends AbstractFormDialog { @@ -70,10 +75,16 @@ export class GuildFormComponent extends AbstractFormDialog>(null); + form = this.initForm(); preparedTitle = computed(() => `${this.editMode ? 'ویرایش' : 'ایجاد'} شریک تجاری`); + changeFile(payload: onSelectFileArgs) { + this.logo.set(payload.file); + } + override ngOnChanges() { this.form.patchValue(this.initialValues ?? {}); if (this.editMode && !this.partnerId) { @@ -83,11 +94,11 @@ export class GuildFormComponent extends AbstractFormDialog(this.apiRoutes.single(partnerId)); } - create(userData: IPartnerRequest): Observable { - return this.http.post(this.apiRoutes.list(), userData); + create(data: FormData): Observable { + return this.http.post(this.apiRoutes.list(), data); } - update(partnerId: string, userData: IPartnerRequest): Observable { - return this.http.patch(this.apiRoutes.single(partnerId), userData); + update(partnerId: string, data: FormData): Observable { + return this.http.patch(this.apiRoutes.single(partnerId), data); } } diff --git a/src/app/domains/superAdmin/modules/partners/views/list.component.html b/src/app/domains/superAdmin/modules/partners/views/list.component.html index 6d30f3a..2a754b6 100644 --- a/src/app/domains/superAdmin/modules/partners/views/list.component.html +++ b/src/app/domains/superAdmin/modules/partners/views/list.component.html @@ -15,6 +15,18 @@ (onEdit)="onEditClick($event)" (onRefresh)="refresh()" > + +
+ + {{ item.name }} +
+
{{ item.licenses_status.total }} diff --git a/src/app/domains/superAdmin/modules/partners/views/list.component.ts b/src/app/domains/superAdmin/modules/partners/views/list.component.ts index 1e87884..0386996 100644 --- a/src/app/domains/superAdmin/modules/partners/views/list.component.ts +++ b/src/app/domains/superAdmin/modules/partners/views/list.component.ts @@ -3,6 +3,7 @@ import { AbstractList } from '@/shared/abstractClasses/abstract-list'; import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component'; import { Component, inject, TemplateRef, ViewChild } from '@angular/core'; import { Router } from '@angular/router'; +import { Avatar } from 'primeng/avatar'; import { GuildFormComponent } from '../components/form.component'; import { superAdminPartnersNamedRoutes } from '../constants'; import { IPartnerResponse } from '../models'; @@ -11,19 +12,20 @@ import { PartnersService } from '../services/main.service'; @Component({ selector: 'app-users', templateUrl: './list.component.html', - imports: [PageDataListComponent, GuildFormComponent], + imports: [PageDataListComponent, GuildFormComponent, Avatar], }) export class PartnersComponent extends AbstractList { private readonly service = inject(PartnersService); private readonly router = inject(Router); + @ViewChild('name', { static: true }) name!: TemplateRef; @ViewChild('licensesStatus', { static: true }) licensesStatus!: TemplateRef; @ViewChild('accountQuotaStatus', { static: true }) accountQuotaStatus!: TemplateRef; @ViewChild('licensesRenewStatus', { static: true }) licensesRenewStatus!: TemplateRef; override setColumns(): void { this.columns = [ - { field: 'name', header: 'نام' }, + { field: 'name', header: 'عنوان', customDataModel: this.name }, { field: 'code', header: 'کد' }, { field: 'licenses', header: 'تعداد لایسنس‌ها', customDataModel: this.licensesStatus }, { diff --git a/src/app/domains/superAdmin/modules/partners/views/single.component.html b/src/app/domains/superAdmin/modules/partners/views/single.component.html index b0fadd2..ee57c94 100644 --- a/src/app/domains/superAdmin/modules/partners/views/single.component.html +++ b/src/app/domains/superAdmin/modules/partners/views/single.component.html @@ -9,11 +9,11 @@ اطلاعات لایسنس‌ها - - - + + + اطلاعات شارژ کاربران - - - + + + اطلاعات تمدید لایسنس‌ها - - - + + + +
+

Auth Page

+

WebView payment listener test

+
+ + +
+
{{ text() }}
+
+ --> diff --git a/src/app/modules/auth/pages/auth.component.ts b/src/app/modules/auth/pages/auth.component.ts index 0284402..daf9e4f 100644 --- a/src/app/modules/auth/pages/auth.component.ts +++ b/src/app/modules/auth/pages/auth.component.ts @@ -1,7 +1,8 @@ -import { IAuthResponse, TRoles } from '@/core'; +import { IAuthResponse, Maybe, TRoles } from '@/core'; import { ToastService } from '@/core/services/toast.service'; -import { Component, EventEmitter, inject, Input, Output, signal } from '@angular/core'; +import { Component, EventEmitter, OnDestroy, OnInit, inject, Input, Output, signal } from '@angular/core'; import { Router } from '@angular/router'; +import { ButtonDirective } from 'primeng/button'; import images from 'src/assets/images'; import { LoginComponent } from './login/login.component'; @@ -10,9 +11,9 @@ type TSteps = 'login' | 'otp' | 'modifyLoginInfo' | 'signup'; @Component({ selector: 'app-auth', templateUrl: './auth.component.html', - imports: [LoginComponent], + imports: [LoginComponent, ButtonDirective], }) -export class AuthComponent { +export class AuthComponent implements OnInit, OnDestroy { @Input() redirectUrl!: string; @Input() loginApiUrl!: string; @Input() role?: TRoles; @@ -83,4 +84,67 @@ export class AuthComponent { } this.router.navigateByUrl(redirectUrl); } + + text = signal('waiting for paymentResult...'); + private restorePaymentCallback: Maybe<() => void> = null; + private readonly injectedPaymentResultHandler = (payload: unknown) => { + this.handlePaymentResult(payload); + }; + + ngOnInit() { + this.listenAndroidPaymentResultCallback(); + } + + ngOnDestroy() { + this.restorePaymentCallback?.(); + } + + private listenAndroidPaymentResultCallback() { + const w = window as any; + const previousGlobal = w.onPaymentResult; + // Android app can call this function directly via evaluateJavascript. + w.onPaymentResult = this.injectedPaymentResultHandler; + + const bridge = w.AndroidPSP; + const previousBridge = bridge?.onPaymentResult; + if (bridge) { + bridge.onPaymentResult = this.injectedPaymentResultHandler; + } + + this.restorePaymentCallback = () => { + w.onPaymentResult = previousGlobal; + if (bridge) { + bridge.onPaymentResult = previousBridge; + } + }; + } + + private handlePaymentResult(result: unknown) { + const value = typeof result === 'string' ? result : JSON.stringify(result, null, 2); + this.text.set(value); + this.toastService.success({ text: 'Result received from Android.' }); + } + + async pay() { + //@ts-ignore + this.toastService.success({ text: window.AndroidPSP.pay(100000) }); + //@ts-ignore + await window.AndroidPSP?.pay(100000) + .then((response: any) => { + // alert('payment') + // console.log('Payment response:', response); + this.toastService.success({ text: 'پرداخت با موفقیت انجام شد.' }); + }) + .catch((error: any) => { + // console.error('Payment error:', error); + this.toastService.error({ text: 'خطا در انجام پرداخت.' }); + }); + this.toastService.success({ text: 'پرداخت با موفقیت انجام شد.' }); + // //@ts-ignore + // alert(window.AndroidPSP); + } + + mockPaymentResult() { + this.injectedPaymentResultHandler(`test-result-${Date.now()}`); + } } diff --git a/src/app/shared/catalog/guild/components/select.component.ts b/src/app/shared/catalog/guild/components/select.component.ts index 83a28b5..5fc557b 100644 --- a/src/app/shared/catalog/guild/components/select.component.ts +++ b/src/app/shared/catalog/guild/components/select.component.ts @@ -21,7 +21,7 @@ export class CatalogGuildSelectComponent extends AbstractSelectComponent< @Input() label: string = ''; private readonly service = inject(CatalogsService); - ngOnInit() { + ngAfterViewInit() { this.getData(); } diff --git a/src/app/shared/components/uploadFile/upload-file.component.html b/src/app/shared/components/uploadFile/upload-file.component.html index 6493618..f01a3b0 100644 --- a/src/app/shared/components/uploadFile/upload-file.component.html +++ b/src/app/shared/components/uploadFile/upload-file.component.html @@ -1,8 +1,88 @@ - - -
- -

فایل مورد نظر خود را در اینجا رها کنید

+ + + +
+ @if (filePreview) { +
+
+ Preview +
+ + +
+
+
+ } @else { +
+ +

فایل مورد نظر خود را در اینجا رها کنید

+
+ } +
+
diff --git a/src/app/shared/components/uploadFile/upload-file.component.ts b/src/app/shared/components/uploadFile/upload-file.component.ts index 75dd7e2..a2d38c4 100644 --- a/src/app/shared/components/uploadFile/upload-file.component.ts +++ b/src/app/shared/components/uploadFile/upload-file.component.ts @@ -1,31 +1,90 @@ import { Maybe } from '@/core'; -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnChanges, + OnDestroy, + Output, + SimpleChanges, + ViewChild, +} from '@angular/core'; +import { ButtonDirective } from 'primeng/button'; import { FileSelectEvent, FileUpload } from 'primeng/fileupload'; import { onSelectFileArgs } from './model'; @Component({ selector: 'app-shared-upload-file', templateUrl: './upload-file.component.html', - imports: [FileUpload], + imports: [FileUpload, ButtonDirective], }) -export class SharedUploadFileComponent { - @Input() currentImage: Maybe = null; +export class SharedUploadFileComponent implements OnChanges, OnDestroy { @Input() loading: boolean = false; @Input() name: string = 'file'; @Input() accept: string = 'image/*'; @Input() maxSize: Maybe = 5 * 1024 * 1024; @Input() error: Maybe = null; @Input() hint: Maybe = null; + @Input() initial_file_url: Maybe = null; @Output() onSelect = new EventEmitter(); + @ViewChild(FileUpload) uploader?: FileUpload; + + filePreview: Maybe = null; + private objectUrl: Maybe = null; + + ngOnChanges(changes: SimpleChanges) { + if ('initial_file_url' in changes && !this.objectUrl) { + this.filePreview = this.initial_file_url; + } + } + + ngAfterViewInit() { + this.revokeObjectUrl(); + console.log('first'); + + if (this.initial_file_url && !this.objectUrl) { + this.filePreview = this.initial_file_url; + } + } + + ngOnDestroy() { + this.revokeObjectUrl(); + } + onSelectedFile($event: FileSelectEvent) { const file = $event.files?.[0]; if (!file) { return; } + this.setPreviewFromFile(file); const payload = new FormData(); payload.append(this.name, file, file.name); this.onSelect.emit({ data: payload, file }); } + + onEditFile() { + this.uploader?.choose(); + } + + onDeleteFilePreview() { + this.revokeObjectUrl(); + this.filePreview = null; + } + + private setPreviewFromFile(file: File) { + this.revokeObjectUrl(); + this.objectUrl = URL.createObjectURL(file); + this.filePreview = this.objectUrl; + } + + private revokeObjectUrl() { + if (!this.objectUrl) { + return; + } + this.filePreview = null; + URL.revokeObjectURL(this.objectUrl); + this.objectUrl = null; + } } diff --git a/src/app/shared/models/consumer.type.ts b/src/app/shared/models/consumer.type.ts index d1bf45d..8abe320 100644 --- a/src/app/shared/models/consumer.type.ts +++ b/src/app/shared/models/consumer.type.ts @@ -1,11 +1,12 @@ import { Maybe } from '@/core'; +import { IEnumTranslate } from './enum_translate.type'; export interface IConsumerRawResponse { id: string; - status: string; created_at: string; name: string; - type: 'INDIVIDUAL' | 'LEGAL'; + type: IEnumTranslate; + status: IEnumTranslate; partner: { id: string; name: string; diff --git a/src/app/shared/models/enum_translate.type.ts b/src/app/shared/models/enum_translate.type.ts new file mode 100644 index 0000000..5198554 --- /dev/null +++ b/src/app/shared/models/enum_translate.type.ts @@ -0,0 +1,4 @@ +export interface IEnumTranslate { + value: T; + translate: string; +} diff --git a/src/app/utils/form-data.util.ts b/src/app/utils/form-data.util.ts index c515548..bea1b70 100644 --- a/src/app/utils/form-data.util.ts +++ b/src/app/utils/form-data.util.ts @@ -1,10 +1,14 @@ export function buildFormData( formGroup: any, fileProperties: { [key: string]: File | null } = {}, + skipFieldKeys: string[] = [], ): FormData { const formData = new FormData(); Object.keys(formGroup.controls).forEach((key) => { + if (skipFieldKeys.includes(key)) { + return; + } const control = formGroup.get(key); if (control && control.value !== null && control.value !== undefined) { formData.append(key, control.value); diff --git a/src/assets/rtlSupport.scss b/src/assets/rtlSupport.scss index bedbf2c..fba933e 100644 --- a/src/assets/rtlSupport.scss +++ b/src/assets/rtlSupport.scss @@ -58,3 +58,11 @@ input.p-inputtext { .p-tablist { margin: auto; } + +.p-fileupload-header { + display: none; +} + +.p-avatar-image { + overflow: hidden !important; +} diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 3f7ba4d..8055915 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -2,7 +2,8 @@ export const environment = { production: false, // apiBaseUrl: 'http://194.59.214.243:5002', - apiBaseUrl: 'http://localhost:5002', + apiBaseUrl: 'http://192.168.128.73:5002', + // apiBaseUrl: 'http://localhost:5002', // host: 'http://194.59.214.243', host: 'localhost', port: 5000,