File

projects/core/src/user/facade/user-interests.service.ts

Index

Methods

Constructor

constructor(store: Store, userIdService: UserIdService)
Parameters :
Name Type Optional
store Store<StateWithUser | StateWithProcess> No
userIdService UserIdService No

Methods

addProductInterest
addProductInterest(productCode: string, notificationType: NotificationType)

Add a new product interest.

Parameters :
Name Type Optional Description
productCode string No

the product code

notificationType NotificationType No

the notification type

Returns : void
clearProductInterests
clearProductInterests()

Clears product interests

Returns : void
getAddProductInterestError
getAddProductInterestError()

Returns a error flag for adding a product interest.

Returns : Observable<boolean>
getAddProductInterestSuccess
getAddProductInterestSuccess()

Returns a success flag for adding a product interest.

Returns : Observable<boolean>
getAndLoadProductInterests
getAndLoadProductInterests(pageSize?: number)

Returns product interests

Parameters :
Name Type Optional Description
pageSize number Yes

the page size

Returns : Observable<ProductInterestSearchResult>
getProductInterests
getProductInterests()

Returns product interests

Returns : Observable<ProductInterestSearchResult>
getProdutInterestsLoading
getProdutInterestsLoading()

Returns a loading flag for product interests

Returns : Observable<boolean>
getRemoveProdutInterestLoading
getRemoveProdutInterestLoading()

Returns a loading flag for removing product interests.

Returns : Observable<boolean>
getRemoveProdutInterestSuccess
getRemoveProdutInterestSuccess()

Returns a success flag for removing a product interests.

Returns : Observable<boolean>
loadProductInterests
loadProductInterests(pageSize?: number, currentPage?: number, sort?: string, productCode?: string, notificationType?: NotificationType)

Retrieves an product interest list

Parameters :
Name Type Optional Description
pageSize number Yes

page size

currentPage number Yes

current page

sort string Yes

sort

productCode string Yes
notificationType NotificationType Yes
Returns : void
removeProdutInterest
removeProdutInterest(item: ProductInterestEntryRelation, singleDelete?: boolean)

Removes a ProductInterestRelation

Parameters :
Name Type Optional Description
item ProductInterestEntryRelation No

product interest relation item

singleDelete boolean Yes

flag to delete only one interest

Returns : void
resetAddInterestState
resetAddInterestState()

Reset product interest adding state.

Returns : void
resetRemoveInterestState
resetRemoveInterestState()

Reset product interest removing state.

Returns : void
import { Injectable } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { UserIdService } from '../../auth/user-auth/facade/user-id.service';
import {
  NotificationType,
  ProductInterestEntryRelation,
  ProductInterestSearchResult,
} from '../../model/product-interest.model';
import { StateWithProcess } from '../../process/store/process-state';
import {
  getProcessErrorFactory,
  getProcessLoadingFactory,
  getProcessSuccessFactory,
} from '../../process/store/selectors/process.selectors';
import { UserActions } from '../store/actions/index';
import { UsersSelectors } from '../store/selectors/index';
import {
  ADD_PRODUCT_INTEREST_PROCESS_ID,
  REMOVE_PRODUCT_INTERESTS_PROCESS_ID,
  StateWithUser,
} from '../store/user-state';

@Injectable({
  providedIn: 'root',
})
export class UserInterestsService {
  constructor(
    protected store: Store<StateWithUser | StateWithProcess<void>>,
    protected userIdService: UserIdService
  ) {}

  /**
   * Retrieves an product interest list
   * @param pageSize page size
   * @param currentPage current page
   * @param sort sort
   */
  loadProductInterests(
    pageSize?: number,
    currentPage?: number,
    sort?: string,
    productCode?: string,
    notificationType?: NotificationType
  ): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.LoadProductInterests({
          userId,
          pageSize: pageSize,
          currentPage: currentPage,
          sort: sort,
          productCode: productCode,
          notificationType: notificationType,
        })
      );
    });
  }

  /**
   * Returns product interests
   */
  getProductInterests(): Observable<ProductInterestSearchResult> {
    return this.store.pipe(select(UsersSelectors.getInterests));
  }

  /**
   * Returns product interests
   * @param pageSize the page size
   */
  getAndLoadProductInterests(
    pageSize?: number
  ): Observable<ProductInterestSearchResult> {
    return this.store.pipe(
      select(UsersSelectors.getInterestsState),
      tap((interestListState) => {
        const attemptedLoad =
          interestListState.loading ||
          interestListState.success ||
          interestListState.error;
        if (!attemptedLoad) {
          this.loadProductInterests(pageSize);
        }
      }),
      map((interestListState) => interestListState.value)
    );
  }

  /**
   * Returns a loading flag for product interests
   */
  getProdutInterestsLoading(): Observable<boolean> {
    return this.store.pipe(select(UsersSelectors.getInterestsLoading));
  }

  /**
   * Removes a ProductInterestRelation
   * @param item product interest relation item
   * @param singleDelete flag to delete only one interest
   */
  removeProdutInterest(
    item: ProductInterestEntryRelation,
    singleDelete?: boolean
  ): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.RemoveProductInterest({
          userId,
          item: item,
          singleDelete: singleDelete,
        })
      );
    });
  }

  /**
   * Returns a loading flag for removing product interests.
   */
  getRemoveProdutInterestLoading(): Observable<boolean> {
    return this.store.pipe(
      select(getProcessLoadingFactory(REMOVE_PRODUCT_INTERESTS_PROCESS_ID))
    );
  }

  /**
   * Returns a success flag for removing a product interests.
   */
  getRemoveProdutInterestSuccess(): Observable<boolean> {
    return this.store.pipe(
      select(getProcessSuccessFactory(REMOVE_PRODUCT_INTERESTS_PROCESS_ID))
    );
  }

  /**
   * Add a new product interest.
   *
   * @param productCode the product code
   * @param notificationType the notification type
   */
  addProductInterest(
    productCode: string,
    notificationType: NotificationType
  ): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.AddProductInterest({
          userId,
          productCode: productCode,
          notificationType: notificationType,
        })
      );
    });
  }

  /**
   * Returns a success flag for adding a product interest.
   */
  getAddProductInterestSuccess(): Observable<boolean> {
    return this.store.pipe(
      select(getProcessSuccessFactory(ADD_PRODUCT_INTEREST_PROCESS_ID))
    );
  }

  /**
   * Returns a error flag for adding a product interest.
   */
  getAddProductInterestError(): Observable<boolean> {
    return this.store.pipe(
      select(getProcessErrorFactory(ADD_PRODUCT_INTEREST_PROCESS_ID))
    );
  }

  /**
   * Reset product interest adding state.
   */
  resetAddInterestState(): void {
    this.store.dispatch(new UserActions.ResetAddInterestState());
  }

  /**
   * Reset product interest removing state.
   */
  resetRemoveInterestState(): void {
    this.store.dispatch(new UserActions.ResetRemoveInterestState());
  }

  /**
   * Clears product interests
   */
  clearProductInterests(): void {
    this.store.dispatch(new UserActions.ClearProductInterests());
  }
}

result-matching ""

    No results matching ""