Установить состояние с получением пользовательских данных getIdTokenResult () - PullRequest
0 голосов
/ 17 апреля 2019

У меня проблемы с вводом объекта в состояние моего приложения.

Мне нужно смонтировать объект с данными, возвращенными с firebase.user и user.getIdTokenResult(true).

Пример:

userLogged = {
  uid: user.uid, 
  displayName: user.displayName
  admin: false,
};

const token = await user.getIdTokenResult (true);
userLogged.admin = token.claims.admin;

Логика аналогична приведенной выше, однако мне нужно сделать это, используя только операторы Rxjs, чтобы я мог изолировать этот объект в состоянии моего приложения.

@ Эффект

@Effect()
getUser$: Observable<Action> = this.actions$.pipe(
    ofType(auth.AuthActionTypes.GET_USER),
    switchMap(() => this.authService.getUser().pipe(
        map(user => {

            const userLogged = {
                uid: user.uid,
                displayName: user.displayName,
                admin: false,
            }

            // **** i need call user.getIdTokenResult() ******
            // and get claims.admin and assign to userLogged object admin.

            // authState = {
            //    uid: user.uid,
            //    displayName: user.displayName,
            //    admin: true, // true or false
            // }

            return new auth.Authenticated(userLogged);
        }),
        catchError((err => of(new auth.AuthError(err))))
    )

Я все еще адаптируюсь, используя реактивное программирование с использованием Rxjs, поэтому мне трудно объединять инкапсулированные данные Observables.

1 Ответ

0 голосов
/ 17 апреля 2019

Вы можете использовать .map(), чтобы "сохранить" значения объекта user в вашем результате authService.getUser(). Это работает, хотя и грязно.

@Effect()
getUser$: Observable<Action> = this.actions$
    .pipe(
        ofType(auth.AuthActionTypes.GET_USER),
        switchMap(() => this.authService.getUser()),
        switchMap(user => user.getIdTokenResult().pipe(map(claims => ({claims, user}))), //map the user to "retain"
            switchMap(({claims, user}) => {
                const userLogged = {
                    uid: user.uid,
                    displayName: user.displayName,
                    admin: claims.admin,
                };
                return new auth.Authenticated(userLogged);
            }),
            catchError(err => of(new auth.AuthError(err)))))

Если вы хотите переобучить большее количество значений, предложите вам взглянуть на Subjects, чтобы он стал чище (и правильный способ сделать это).

...