File

src/app/core/ngxs/contact-person.state.ts

Index

Properties

Properties

contactPersons
contactPersons: ContactPerson[]
Type : ContactPerson[]
import { State, Selector, Action, StateContext, createSelector, NgxsOnInit } from '@ngxs/store';
import { patch, updateItem, removeItem, append } from '@ngxs/store/operators';
import { Injectable } from '@angular/core';
import { ContactPerson } from '../data/models/contact-person.model';
import {
  AddContactPerson,
  DeleteContactPerson,
  UpdateContactPerson,
} from './actions/contact-person.action';
import { ContactPersonService } from '../http/contact-person.service';

export interface ContactPersonStateModel {
  contactPersons: ContactPerson[];
}

/**
 * State for managing the contact people of the application.
 *
 * Has: Action handlers to read, write, update and delete a contact person.
 * Static and dynamic selectors to select contact people.
 */
@State<ContactPersonStateModel>({
  name: 'contactPerson',
})
@Injectable()
export class ContactPersonState implements NgxsOnInit {
  constructor(private contactPersonService: ContactPersonService) {}

  ngxsOnInit({ patchState }: StateContext<ContactPersonStateModel>) {
    this.contactPersonService.getContactPersons().subscribe(contactPersons => {
      patchState({ contactPersons });
    });
  }

  @Selector()
  static contactPersons(state: ContactPersonStateModel) {
    return state.contactPersons;
  }

  static contactPerson(id: number) {
    return createSelector([ContactPersonState], (state: ContactPersonStateModel) => {
      return state.contactPersons.find(x => x.id === id);
    });
  }

  @Action(AddContactPerson)
  addContactPerson(
    { setState }: StateContext<ContactPersonStateModel>,
    { contactPerson }: AddContactPerson,
  ) {
    this.contactPersonService.postContactPerson(contactPerson).subscribe(contactPerson => {
      setState(
        patch({
          contactPersons: append<ContactPerson>([contactPerson]),
        }),
      );
    });
  }

  @Action(UpdateContactPerson)
  updateContactPerson(
    { setState }: StateContext<ContactPersonStateModel>,
    { id, contactPerson }: UpdateContactPerson,
  ) {
    this.contactPersonService
      .putContactPerson({ ...contactPerson, id })
      .subscribe(contactPerson => {
        setState(
          patch({
            contactPersons: updateItem<ContactPerson>(
              x => x.id === contactPerson.id,
              contactPerson,
            ),
          }),
        );
      });
  }

  @Action(DeleteContactPerson)
  deleteContactPerson(
    { setState }: StateContext<ContactPersonStateModel>,
    { id }: DeleteContactPerson,
  ) {
    setState(
      patch({
        contactPersons: removeItem<ContactPerson>(x => x.id === id),
      }),
    );
  }
}

result-matching ""

    No results matching ""