import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { map, mergeMap, catchError } from 'rxjs/operators';
import { UserService } from '../core/services/user.service';
import { APP_ACTIONS, getUsersFailure, getUsersSuccess } from './app.actions';

@Injectable()
export class AppEffects {
  getUsers$ = createEffect(() =>
    this.actions$.pipe(
      ofType(APP_ACTIONS.GET_USERS),
      mergeMap(() =>
        this.userService.getUsers().pipe(
          map((users) => {
            return getUsersSuccess({
              users,
            });
          }),
          catchError((error) =>
            of(
              getUsersFailure({
                error,
              })
            )
          )
        )
      )
    )
  );

  constructor(private actions$: Actions, private userService: UserService) {}
}
