Search code examples
javascriptangularreduxngrx

Get data after api call in ngrx effect


I'm using Ngrx Effect to get data from API, then I would get that data in my component.

In component

schedules$ = this.store.pipe(select(selectSchedulings));
ngOnInit() {
  this.store.dispatch(new GetSchedules());
}

In actions I have created two types

export class GetSchedules implements Action {
  public readonly type = ESchedulesActions.GetSchedulesByDate;
}
export class GetSchedulesSuccess implements Action {
  public readonly type = ESchedulesActions.GetSchedulesByDateSuccess;
  constructor(public payload: ISchedules[]) {}
}

export type SchedulesAction = GetSchedules | GetSchedulesSuccess;

Then In my effects

export class SchedulingsEffects {
  loadSchedulings$ = createEffect(() =>
    this.actions$.pipe(
      ofType(ESchedulesActions.GetSchedulesByDate),
      mergeMap(() =>
        this.apiCallsService.getSchedulings().pipe(
          map(movies => ({ type: ESchedulesActions.GetSchedulesByDateSuccess, payload: movies })),
          catchError(() => EMPTY)
        )
      )
    )
  );

  constructor(private actions$: Actions, private apiCallsService: ApiCallsService) {}
}

I have initialized my store in state

import { ISchedules } from '../../shared/interfaces/scheduling.interface';
export interface ISchedulesState {
  schedulings: ISchedules;
}

    export const initialSchedulingState: ISchedulesState = {
      schedulings: {
        status: '',
        data: [
          {
          ..... Init values....
          }
        ]
      }
    };

And reducers

export const SchedulingReducers = (
  state = initialSchedulingState,
  action: SchedulesAction
): ISchedulesState => {
  switch (action.type) {
    case ESchedulesActions.GetSchedulesByDate: {
      return {
        ...state
      };
    }
    case ESchedulesActions.GetSchedulesByDateSuccess: {
      return {
        ...state
      };
    }
    default:
      return state;
  }
};

When I run my app , I only get Init values. I see in store dev tools that the api is triggered and data is stored, but why schedules$ don't get update ?


Solution

  •  case ESchedulesActions.GetSchedulesByDateSuccess: {
          return {
            ...state
          };
        }
    

    Here, you're just returning a cope of the state. What you should do is using the action payload to update the state (I don't exactly know how your state is structured, but this gives an idea):

     case ESchedulesActions.GetSchedulesByDateSuccess: {
          return {
            ...state,
            schedulings: action.payload
          };
        }