File

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

Index

Properties
Methods

Constructor

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

Methods

addUserAddress
addUserAddress(address: Address)

Adds user address

Parameters :
Name Type Optional Description
address Address No

a user address

Returns : void
clearRegions
clearRegions()

Clear regions in store - useful when changing country

Returns : void
deleteUserAddress
deleteUserAddress(addressId: string)

Deletes existing user address

Parameters :
Name Type Optional Description
addressId string No

a user address ID

Returns : void
getAddresses
getAddresses()

Returns addresses

Returns : Observable<Address[]>
getAddressesLoadedSuccess
getAddressesLoadedSuccess()
Returns : Observable<boolean>
getAddressesLoading
getAddressesLoading()

Returns a loading flag for addresses

Returns : Observable<boolean>
getCountry
getCountry(isocode: string)

Returns a country based on the provided isocode

Parameters :
Name Type Optional Description
isocode string No

an isocode for a country

Returns : Observable<Country>
getDeliveryCountries
getDeliveryCountries()

Returns all delivery countries

Returns : Observable<Country[]>
getRegions
getRegions(countryIsoCode: string)

Returns all regions

Parameters :
Name Type Optional
countryIsoCode string No
Returns : Observable<Region[]>
loadAddresses
loadAddresses()

Retrieves user's addresses

Returns : void
loadDeliveryCountries
loadDeliveryCountries()

Retrieves delivery countries

Returns : void
loadRegions
loadRegions(countryIsoCode: string)

Retrieves regions for specified country by countryIsoCode

Parameters :
Name Type Optional
countryIsoCode string No
Returns : void
setAddressAsDefault
setAddressAsDefault(addressId: string)

Sets user address as default

Parameters :
Name Type Optional Description
addressId string No

a user address ID

Returns : void
updateUserAddress
updateUserAddress(addressId: string, address: Address)

Updates existing user address

Parameters :
Name Type Optional Description
addressId string No

a user address ID

address Address No

a user address

Returns : void
verifyAddress
verifyAddress(address: Address)

Verifies the address

Parameters :
Name Type Optional Description
address Address No

: the address to be verified

Returns : Observable<AddressValidation>

Properties

Protected userAddressVerificationCommand
Type : Command<literal type | AddressValidation>
Default value : this.command.create((payload) => this.userIdService .takeUserId(false) .pipe( switchMap((userId) => this.userAddressConnector.verify(userId, payload.address) ) ) )
import { Injectable } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { UserIdService } from '../../auth/user-auth/facade/user-id.service';
import {
  Address,
  AddressValidation,
  Country,
  Region,
} from '../../model/address.model';
import { StateWithProcess } from '../../process/store/process-state';
import {
  Command,
  CommandService,
} from '../../util/command-query/command.service';
import { UserAddressConnector } from '../connectors/address/user-address.connector';
import { UserActions } from '../store/actions/index';
import { UsersSelectors } from '../store/selectors/index';
import { StateWithUser } from '../store/user-state';

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

  /**
   * Retrieves user's addresses
   */
  loadAddresses(): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(new UserActions.LoadUserAddresses(userId));
    });
  }

  /**
   * Adds user address
   * @param address a user address
   */
  addUserAddress(address: Address): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.AddUserAddress({
          userId,
          address,
        })
      );
    });
  }

  /**
   * Sets user address as default
   * @param addressId a user address ID
   */
  setAddressAsDefault(addressId: string): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.UpdateUserAddress({
          userId,
          addressId,
          address: { defaultAddress: true },
        })
      );
    });
  }

  /**
   * Updates existing user address
   * @param addressId a user address ID
   * @param address a user address
   */
  updateUserAddress(addressId: string, address: Address): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.UpdateUserAddress({
          userId,
          addressId,
          address,
        })
      );
    });
  }

  /**
   * Deletes existing user address
   * @param addressId a user address ID
   */
  deleteUserAddress(addressId: string): void {
    this.userIdService.takeUserId().subscribe((userId) => {
      this.store.dispatch(
        new UserActions.DeleteUserAddress({
          userId,
          addressId,
        })
      );
    });
  }

  /**
   * Returns addresses
   */
  getAddresses(): Observable<Address[]> {
    return this.store.pipe(select(UsersSelectors.getAddresses));
  }

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

  getAddressesLoadedSuccess(): Observable<boolean> {
    return this.store.pipe(select(UsersSelectors.getAddressesLoadedSuccess));
  }
  /**
   * Retrieves delivery countries
   */
  loadDeliveryCountries(): void {
    this.store.dispatch(new UserActions.LoadDeliveryCountries());
  }

  /**
   * Returns all delivery countries
   */
  getDeliveryCountries(): Observable<Country[]> {
    return this.store.pipe(select(UsersSelectors.getAllDeliveryCountries));
  }

  /**
   * Returns a country based on the provided `isocode`
   * @param isocode an isocode for a country
   */
  getCountry(isocode: string): Observable<Country> {
    return this.store.pipe(
      select(UsersSelectors.countrySelectorFactory(isocode))
    );
  }

  /**
   * Retrieves regions for specified country by `countryIsoCode`
   * @param countryIsoCode
   */
  loadRegions(countryIsoCode: string): void {
    this.store.dispatch(new UserActions.LoadRegions(countryIsoCode));
  }

  /**
   * Clear regions in store - useful when changing country
   */
  clearRegions(): void {
    this.store.dispatch(new UserActions.ClearRegions());
  }

  /**
   * Returns all regions
   */
  getRegions(countryIsoCode: string): Observable<Region[]> {
    return this.store.pipe(
      select(UsersSelectors.getRegionsDataAndLoading),
      map(({ regions, country, loading, loaded }) => {
        if (!countryIsoCode && (loading || loaded)) {
          this.clearRegions();
          return [];
        } else if (loading && !loaded) {
          // don't interrupt loading
          return [];
        } else if (!loading && countryIsoCode !== country && countryIsoCode) {
          // country changed - clear store and load new regions
          if (country) {
            this.clearRegions();
          }
          this.loadRegions(countryIsoCode);
          return [];
        }
        return regions;
      })
    );
  }
  /**
   * Verifies the address
   * @param address : the address to be verified
   */
  verifyAddress(address: Address): Observable<AddressValidation> {
    return this.userAddressVerificationCommand.execute({ address });
  }

  protected userAddressVerificationCommand: Command<
    {
      address: Address;
    },
    AddressValidation
  > = this.command.create((payload) =>
    this.userIdService
      .takeUserId(false)
      .pipe(
        switchMap((userId) =>
          this.userAddressConnector.verify(userId, payload.address)
        )
      )
  );
}

result-matching ""

    No results matching ""