FarmMapsLib/projects/common/src/fm/effects/app-common.effects.ts

217 lines
8.1 KiB
TypeScript
Raw Normal View History

2020-01-27 16:01:35 +00:00
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { OAuthService,UserInfo } from 'angular-oauth2-oidc';
2020-01-27 16:01:35 +00:00
import { Store, Action } from '@ngrx/store';
import { Effect, Actions,ofType } from '@ngrx/effects';
2020-07-23 07:42:44 +00:00
import { Observable , defer , of,from,zip } from 'rxjs';
import { withLatestFrom,mergeMap,switchMap,map,catchError,first} from 'rxjs/operators';
2020-01-27 16:01:35 +00:00
import * as appCommonActions from '../actions/app-common.actions';
import * as appCommonReducers from '../reducers/app-common.reducer';
import { ItemService } from '../services/item.service';
import { FolderService } from '../services/folder.service';
import { UserService } from '../services/user.service';
import { IItemTypes } from '../models/item.types';
import { IListItem } from '../models/list.item';
import { IUser } from '../models/user';
2020-02-19 11:02:56 +00:00
import {IQueryState} from '../models/query.state';
import {StateSerializerService} from '../services/state-serializer.service';
2020-01-27 16:01:35 +00:00
@Injectable()
export class AppCommonEffects {
@Effect({ dispatch: false })
login$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.LOGIN),
withLatestFrom(this.store$.select(appCommonReducers.selectGetInitialized)),
mergeMap(([action, initialized]) => {
var a = (action as appCommonActions.Login);
2020-06-25 16:52:13 +00:00
this.oauthService$.initCodeFlow(a.url,{"prompt":"login"});
2020-01-27 16:01:35 +00:00
return [];
}));
2020-06-25 16:52:13 +00:00
@Effect({ dispatch: false })
logout$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.LOGOUT),
mergeMap((action) => {
2020-10-09 14:35:14 +00:00
this.oauthService$.revokeTokenAndLogout();
2020-06-25 16:52:13 +00:00
return [];
}));
2020-01-27 16:01:35 +00:00
@Effect()
loadItemTypes$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.LOADITEMTYPES),
switchMap((action) => {
return this.itemService$.getItemTypes().pipe(
map((itemTypes: IItemTypes) => new appCommonActions.LoadItemTypesSuccess(itemTypes)),
catchError(error => of(new appCommonActions.Fail(error))))
}
));
@Effect()
initUser$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.INITUSER),
2020-07-23 07:42:44 +00:00
first(),
switchMap((action) => {
return zip(this.userService$.getCurrentUser(),from(this.oauthService$.loadUserProfile())).pipe(
switchMap(([user,userInfo]) => {return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))} ),
2020-01-27 16:01:35 +00:00
catchError(error => of(new appCommonActions.Fail(error))))
}
));
2020-08-04 14:09:22 +00:00
2020-05-13 10:30:09 +00:00
@Effect()
initUserPackages$:Observable<Action> = this.actions$.pipe(
2020-08-04 14:09:22 +00:00
ofType(appCommonActions.INITUSERPACKAGES),
switchMap(() => {
return this.itemService$.getItemList('vnd.farmmaps.itemtype.package').pipe(
2020-05-13 10:30:09 +00:00
switchMap((items) => of(new appCommonActions.InitUserPackagesSuccess(items))),
catchError(error => of(new appCommonActions.Fail(error)))
)
})
);
2020-01-27 16:01:35 +00:00
2020-08-04 14:09:22 +00:00
@Effect()
userPackagesChanged$:Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.ITEMCHANGEDEVENT),
switchMap((action) => {
let a = action as appCommonActions.ItemChangedEvent;
if(a.itemCode.endsWith(":USER_PACKAGES"))
return of(new appCommonActions.InitUserPackages());
else
2020-08-05 08:33:55 +00:00
return [];
2020-08-04 14:09:22 +00:00
})
);
2020-08-13 11:06:28 +00:00
@Effect()
initUserSettingsRoot$:Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.INITUSERSETTINGSROOT),
withLatestFrom(this.store$.select(appCommonReducers.SelectGetUser)),
switchMap(([, user]) => {
return this.itemService$.getItem(user.code + ':USER_SETTINGS').pipe(
switchMap((item) => of(new appCommonActions.InitUserSettingsRootSuccess(item))),
catchError(error => of(new appCommonActions.Fail(error)))
)
})
);
@Effect()
initUserSettingsRootChanged$:Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.ITEMCHANGEDEVENT),
switchMap((action) => {
let a = action as appCommonActions.ItemChangedEvent;
if(a.itemCode.endsWith(":USER_SETTINGS"))
return of(new appCommonActions.InitUserSettingsRoot());
else
return [];
})
);
2020-08-04 14:09:22 +00:00
2020-01-27 16:01:35 +00:00
@Effect()
initUserSuccess$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.INITUSERSUCCESS),
switchMap(() => {
2020-08-13 11:06:28 +00:00
return [new appCommonActions.InitRoot(),new appCommonActions.InitUserPackages(),new appCommonActions.InitUserSettingsRoot()];
2020-01-27 16:01:35 +00:00
}
));
@Effect()
initRoot$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.INITROOT),
switchMap(() => {
return this.folderService$.getMyRoots().pipe(
map((folders: IListItem[]) => new appCommonActions.InitRootSuccess(folders)),
catchError(error => of(new appCommonActions.Fail(error))))
}
));
@Effect()
deleteItems$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.DELETEITEMS),
switchMap((action:appCommonActions.DeleteItems) => {
return this.itemService$.deleteItems(action.itemCodes).pipe(
map((deletedItemCodes: string[]) => new appCommonActions.DeleteItemsSuccess(deletedItemCodes)),
catchError(error => of(new appCommonActions.Fail(error))))
}
));
@Effect()
editItem$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.EDITITEM),
withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)),
switchMap(([action, itemtypes]) => {
var a = action as appCommonActions.EditItem;
2020-07-22 06:22:35 +00:00
var editor = "property";
if(a.item.itemType) {
var itemType = itemtypes[a.item.itemType];
2020-07-22 06:23:53 +00:00
var editor = itemType && itemType.editor ? itemType.editor : editor;
2020-07-22 06:22:35 +00:00
}
2020-01-27 16:01:35 +00:00
this.router$.navigate(['/editor',editor,'item', a.item.code])
return [];
}
));
@Effect()
viewItem$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.VIEWITEM),
withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)),
switchMap(([action, itemtypes]) => {
var a = action as appCommonActions.EditItem;
var itemType = itemtypes[a.item.itemType];
var viewer = itemType.viewer;
2020-02-21 10:16:30 +00:00
var editor = itemType.editor;
2020-02-21 10:28:46 +00:00
if(viewer == 'select_as_mapitem') {
2020-02-19 11:02:56 +00:00
let queryState = {
2020-02-21 10:28:46 +00:00
itemCode: a.item.code,
parentCode: null,
2020-02-19 11:02:56 +00:00
level: 1,
2020-02-21 10:28:46 +00:00
itemType: null,
2020-02-19 11:02:56 +00:00
bboxFilter: false,
query: null,
tags: null,
endDate: null,
startDate: null,
bbox: []
};
let query = this.stateSerializerService$.serialize(queryState);
this.router$.navigate(['/map', query ])
2020-02-21 10:16:30 +00:00
}else if(viewer == 'edit_in_editor') {
this.router$.navigate(['/editor', editor, 'item', a.item.code])
2020-02-19 11:02:56 +00:00
} else {
this.router$.navigate(['/viewer', viewer, 'item', a.item.code])
}
2020-01-27 16:01:35 +00:00
return [];
}
));
2020-01-27 16:28:17 +00:00
2020-01-27 16:01:35 +00:00
@Effect({ dispatch: false })
fail$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.FAIL),
map((action) => {
let failAction = action as appCommonActions.Fail;
console.debug(failAction.payload)
return null;
}));
2020-07-22 07:05:02 +00:00
@Effect({ dispatch: false })
online$: Observable<Action> = this.actions$.pipe(
ofType(appCommonActions.ONLINE),
2020-07-22 19:16:38 +00:00
switchMap((action) => {
2020-07-22 18:31:12 +00:00
console.debug("Online: Check token");
if(!this.oauthService$.hasValidAccessToken()) {
console.debug("No valid token, try to refresh");
if(this.oauthService$.getRefreshToken() != null ) {
console.debug("We have a refresh token");
2020-10-30 07:22:58 +00:00
this.oauthService$.refreshToken();
2020-07-22 18:31:12 +00:00
}
2020-10-30 07:22:58 +00:00
}
return of(undefined);
2020-07-22 07:05:02 +00:00
}));
2020-02-19 11:02:56 +00:00
constructor(private actions$: Actions, private store$: Store<appCommonReducers.State>, private oauthService$: OAuthService, private itemService$: ItemService, private folderService$:FolderService, private userService$: UserService, private router$: Router, private stateSerializerService$:StateSerializerService) {
2020-01-27 16:01:35 +00:00
store$.dispatch(new appCommonActions.LoadItemTypes());
}
}