h-usersite/angular/src/app/pages/cart/cart.component.ts
gofnnp 2428870ba8 dev #14253
Добавил состояние приложения(профиль)
Сделал проверку на активность карты, на то, хватает ли баланса для совершения заказа, доработал обработку ошибок, пофиксил некоторые баги
2023-05-26 01:35:37 +04:00

190 lines
5.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
Component,
EventEmitter,
HostListener,
OnInit,
Output,
} from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Store } from '@ngrx/store';
import { MessageService } from 'primeng/api';
import { combineLatest } from 'rxjs';
import { SnackBarComponent } from 'src/app/components/snack-bar/snack-bar.component';
import { ICardCustomer } from 'src/app/interface/data';
import { Order } from 'src/app/models/order';
import { OrderProduct } from 'src/app/models/order-product';
import {
CartService,
ProductAmountAction,
} from 'src/app/services/cart.service';
import { OrderService } from 'src/app/services/order.service';
import {
selectCustomerCards,
selectCustomerWalletBalance,
} from 'src/app/state/profile/profile.reducer';
import * as ProfileActions from '../../state/profile/profile.actions';
import { CookiesService } from 'src/app/services/cookies.service';
@Component({
selector: 'app-cart',
templateUrl: './cart.component.html',
styleUrls: ['./cart.component.scss'],
})
export class CartComponent implements OnInit {
@Output() showAuthoriztion = new EventEmitter<boolean>();
public loading = false;
public orderConfirmed = false;
public order!: Order;
public price!: number;
public visibleSidebar: boolean = false;
public isFullScreen!: boolean;
public width!: number;
public CardsCustomer!: ICardCustomer[];
public WalletBalanceCustomer!: number;
private CardsCustomer$ = this.store.select(selectCustomerCards);
private WalletBalanceCustomer$ = this.store.select(
selectCustomerWalletBalance
);
constructor(
private orderService: OrderService,
private cartService: CartService,
private messageService: MessageService,
private _snackBar: MatSnackBar,
private store: Store,
private cookiesService: CookiesService
) {}
async ngOnInit() {
this.width = window.innerWidth;
this.changeDullScreenMode();
await this.loadCart();
combineLatest([this.CardsCustomer$, this.WalletBalanceCustomer$]).subscribe(
{
next: ([cards, balance]) => {
this.CardsCustomer = cards!;
this.WalletBalanceCustomer = balance!;
if (cards && balance) this.loading = false;
},
error: (err) => {
console.error('Произошла ошибка!');
},
}
);
}
// Изменение размера окна
@HostListener('window:resize', ['$event'])
onResize(event: any) {
this.width = event.target.innerWidth;
this.changeDullScreenMode();
}
toggleSideBar(): void {
this.visibleSidebar = !this.visibleSidebar;
this.orderConfirmed = false;
this.loadCart();
}
hide() {
this.orderConfirmed = false;
}
changeDullScreenMode() {
if (this.width < 650) {
this.isFullScreen = true;
} else {
this.isFullScreen = false;
}
}
async loadCart(): Promise<void> {
this.loading = true;
this.order = await this.orderService.getOrder(true);
const token = this.cookiesService.getItem('token');
if (!token) {
this._snackBar.open('Авторизуйтесь!', 'Ок');
this.userNotFound();
return;
}
if (this.order?.userData?.errorCode === 'Customer_CustomerNotFound') {
this.userNotFound();
return;
}
if (this.order) this.price = this.order.price;
this.store.dispatch(ProfileActions.getProfile());
}
userNotFound(event: null = null) {
this.visibleSidebar = false;
// this._snackBar.open('Пользователь не найден в системе! Обратитесь к руководству', 'Ок')
}
async removeFromCart(event: Event, guid: string) {
event.preventDefault();
this.orderService.removeFromCart(guid);
await this.loadCart();
}
confirmOrder(event: Event): void {
event.preventDefault();
this.showAuthoriztion.emit(true);
if (!this.CardsCustomer[0].IsActivated || !this.CardsCustomer.length) {
this._snackBar.open(
'Ваша карта неактивна! Обратитесь к руководству',
'Ок'
);
return;
}
if (this.WalletBalanceCustomer < this.order.price) {
this._snackBar.open(
'На Вашей карте недостаточно средств для оформления заказа!',
'Ок'
);
return;
}
this.orderConfirmed = true;
// this.confirm.emit();
}
setAmount(product: OrderProduct, method: 'plus' | 'minus') {
if (method === 'plus') {
this.cartService.changeAmountProduct(
product.guid,
ProductAmountAction.increment
);
product.amount++;
this.price = this.price + Number(product.price);
} else if (method === 'minus' && product.amount > 1) {
this.cartService.changeAmountProduct(
product.guid,
ProductAmountAction.decrement
);
product.amount--;
this.price = this.price - Number(product.price);
}
}
orderSubmitted(orderid: number) {
this.visibleSidebar = false;
this._snackBar.open(`Заказ оформлен! Номер заказа: ${orderid}`, 'Ок');
}
confirmClearCart() {
const snackBar = this._snackBar.openFromComponent(SnackBarComponent, {
duration: 4000,
data: {
text: 'Очистить корзину?',
},
});
snackBar.afterDismissed().subscribe(({ dismissedByAction }) => {
if (dismissedByAction) {
this.cartService.clearCart();
this.loadCart();
this.visibleSidebar = false;
}
});
}
}