room info is implemented

This commit is contained in:
병준 박 2019-10-08 11:19:47 +09:00
parent bf2490dda3
commit 9aae0885aa
13 changed files with 205 additions and 5 deletions

View File

@ -1 +1,3 @@
<div *ngFor="let room of roomList$ | async">{{ room.finalEventMessage }}</div> <div *ngFor="let room of roomList$ | async" (click)="onSelectedRoom(room)">
{{ room.finalEventMessage }}
</div>

View File

@ -5,6 +5,7 @@ import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { RoomInfo } from '@ucap-webmessenger/protocol-room'; import { RoomInfo } from '@ucap-webmessenger/protocol-room';
import * as AppStore from '@app/store'; import * as AppStore from '@app/store';
import * as ChatStore from '@app/store/messenger/chat';
@Component({ @Component({
selector: 'app-layout-chat-left-sidenav-chat', selector: 'app-layout-chat-left-sidenav-chat',
@ -22,4 +23,8 @@ export class ChatComponent implements OnInit {
select(AppStore.MessengerSelector.SyncSelector.roomList) select(AppStore.MessengerSelector.SyncSelector.roomList)
); );
} }
onSelectedRoom(roomInfo: RoomInfo) {
this.store.dispatch(ChatStore.selectedRoom({ roomSeq: roomInfo.roomSeq }));
}
} }

View File

@ -136,7 +136,7 @@ export class GroupComponent implements OnInit {
} }
onSelectBuddy(buddy: UserInfo) { onSelectBuddy(buddy: UserInfo) {
this.store.dispatch(ChatStore.selectedRoom({ roomSeq: buddy.seq })); this.store.dispatch(ChatStore.selectedRoom({ roomSeq: String(buddy.seq) }));
} }
onKeyDownEnterOrganizationTenantSearch(params: { onKeyDownEnterOrganizationTenantSearch(params: {

View File

@ -11,7 +11,7 @@ import { Observable } from 'rxjs';
styleUrls: ['./main.page.component.scss'] styleUrls: ['./main.page.component.scss']
}) })
export class MainPageComponent implements OnInit { export class MainPageComponent implements OnInit {
selectedChat$: Observable<number | null>; selectedChat$: Observable<string | null>;
constructor(private store: Store<any>) {} constructor(private store: Store<any>) {}

View File

@ -2,5 +2,5 @@ import { createAction, props } from '@ngrx/store';
export const selectedRoom = createAction( export const selectedRoom = createAction(
'[Messenger::Chat] selectedRoom', '[Messenger::Chat] selectedRoom',
props<{ roomSeq: number }>() props<{ roomSeq: string }>()
); );

View File

@ -1,7 +1,7 @@
import { Selector, createSelector } from '@ngrx/store'; import { Selector, createSelector } from '@ngrx/store';
export interface State { export interface State {
selectedRoom: number | null; selectedRoom: string | null;
} }
export const initialState: State = { export const initialState: State = {

View File

@ -4,6 +4,7 @@ import { Action, combineReducers, Selector, createSelector } from '@ngrx/store';
import * as ChatStore from './chat'; import * as ChatStore from './chat';
import * as OptionStore from './option'; import * as OptionStore from './option';
import * as QueryStore from './query'; import * as QueryStore from './query';
import * as RoomStore from './room';
import * as StatusStore from './status'; import * as StatusStore from './status';
import * as SyncStore from './sync'; import * as SyncStore from './sync';
@ -11,6 +12,7 @@ export interface State {
chat: ChatStore.State; chat: ChatStore.State;
option: OptionStore.State; option: OptionStore.State;
query: QueryStore.State; query: QueryStore.State;
room: RoomStore.State;
status: StatusStore.State; status: StatusStore.State;
sync: SyncStore.State; sync: SyncStore.State;
} }
@ -19,6 +21,7 @@ export const effects: Type<any>[] = [
ChatStore.Effects, ChatStore.Effects,
OptionStore.Effects, OptionStore.Effects,
QueryStore.Effects, QueryStore.Effects,
RoomStore.Effects,
StatusStore.Effects, StatusStore.Effects,
SyncStore.Effects SyncStore.Effects
]; ];
@ -28,6 +31,7 @@ export function reducers(state: State | undefined, action: Action) {
chat: ChatStore.reducer, chat: ChatStore.reducer,
option: OptionStore.reducer, option: OptionStore.reducer,
query: QueryStore.reducer, query: QueryStore.reducer,
room: RoomStore.reducer,
status: StatusStore.reducer, status: StatusStore.reducer,
sync: SyncStore.reducer sync: SyncStore.reducer
})(state, action); })(state, action);
@ -47,6 +51,12 @@ export function selectors<S>(selector: Selector<any, State>) {
(state: State) => state.option (state: State) => state.option
) )
), ),
RoomSelector: RoomStore.selectors(
createSelector(
selector,
(state: State) => state.room
)
),
QuerySelector: QueryStore.selectors( QuerySelector: QueryStore.selectors(
createSelector( createSelector(
selector, selector,

View File

@ -0,0 +1,26 @@
import { createAction, props } from '@ngrx/store';
import {
InfoRequest,
RoomInfo,
UserInfoShort,
UserInfo
} from '@ucap-webmessenger/protocol-room';
export const info = createAction(
'[Messenger::Room] Info',
props<InfoRequest>()
);
export const infoSuccess = createAction(
'[Messenger::Room] Info Success',
props<{
roomInfo: RoomInfo;
userInfoShortList: UserInfoShort[];
userInfoList: UserInfo[];
}>()
);
export const infoFailure = createAction(
'[Messenger::Room] Info Failure',
props<{ error: any }>()
);

View File

@ -0,0 +1,101 @@
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { Store } from '@ngrx/store';
import { NGXLogger } from 'ngx-logger';
import { of } from 'rxjs';
import { tap, switchMap, map, catchError } from 'rxjs/operators';
import {
RoomInfo,
UserInfoShort,
UserInfo,
RoomProtocolService,
SSVC_TYPE_ROOM_INFO_ROOM,
InfoData,
SSVC_TYPE_ROOM_INFO_USER,
SSVC_TYPE_ROOM_INFO_USER2,
SSVC_TYPE_ROOM_INFO_RES,
UserShortData,
UserData
} from '@ucap-webmessenger/protocol-room';
import * as ChatStore from '@app/store/messenger/chat';
import { info, infoSuccess, infoFailure } from './actions';
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { LoginInfo, KEY_LOGIN_INFO } from '@app/types';
@Injectable()
export class Effects {
selectedRoomForInfo$ = createEffect(() =>
this.actions$.pipe(
ofType(ChatStore.selectedRoom),
map(action => {
const loginInfo = this.sessionStorageService.get<LoginInfo>(
KEY_LOGIN_INFO
);
return info({
roomSeq: action.roomSeq,
isDetail: true,
localeCode: loginInfo.localeCode
});
})
)
);
info$ = createEffect(
() => {
let roomInfo: RoomInfo;
let userInfoShortList: UserInfoShort[];
let userInfoList: UserInfo[];
return this.actions$.pipe(
ofType(info),
tap(() => {
roomInfo = null;
userInfoShortList = [];
userInfoList = [];
}),
switchMap(req => {
return this.roomProtocolService.info(req).pipe(
map(res => {
switch (res.Type) {
case SSVC_TYPE_ROOM_INFO_ROOM:
roomInfo = (res as InfoData).roomInfo;
break;
case SSVC_TYPE_ROOM_INFO_USER:
userInfoShortList.push(...(res as UserShortData).userInfos);
break;
case SSVC_TYPE_ROOM_INFO_USER2:
userInfoList.push(...(res as UserData).userInfos);
break;
case SSVC_TYPE_ROOM_INFO_RES:
this.store.dispatch(
infoSuccess({
roomInfo,
userInfoShortList,
userInfoList
})
);
break;
}
}),
catchError(error => of(infoFailure({ error })))
);
})
);
},
{ dispatch: false }
);
constructor(
private actions$: Actions,
private store: Store<any>,
private roomProtocolService: RoomProtocolService,
private sessionStorageService: SessionStorageService,
private logger: NGXLogger
) {}
}

View File

@ -0,0 +1,4 @@
export * from './actions';
export * from './effects';
export * from './reducers';
export * from './state';

View File

@ -0,0 +1,15 @@
import { createReducer, on } from '@ngrx/store';
import { initialState } from './state';
import { infoSuccess } from './actions';
export const reducer = createReducer(
initialState,
on(infoSuccess, (state, action) => {
return {
...state,
roomInfo: action.roomInfo,
userInfoList: action.userInfoList,
userInfoShortList: action.userInfoShortList
};
})
);

View File

@ -0,0 +1,36 @@
import { Selector, createSelector } from '@ngrx/store';
import {
InfoRequest,
RoomInfo,
UserInfoShort,
UserInfo
} from '@ucap-webmessenger/protocol-room';
export interface State {
roomInfo: RoomInfo | null;
userInfoShortList: UserInfoShort[] | null;
userInfoList: UserInfo[] | null;
}
export const initialState: State = {
roomInfo: null,
userInfoShortList: null,
userInfoList: null
};
export function selectors<S>(selector: Selector<any, State>) {
return {
roomInfo: createSelector(
selector,
(state: State) => state.roomInfo
),
userInfoShortList: createSelector(
selector,
(state: State) => state.userInfoShortList
),
userInfoList: createSelector(
selector,
(state: State) => state.userInfoList
)
};
}

View File

@ -13,5 +13,6 @@ export * from './lib/protocols/open';
export * from './lib/services/room-protocol.service'; export * from './lib/services/room-protocol.service';
export * from './lib/types/employee.type'; export * from './lib/types/employee.type';
export * from './lib/types/room.type'; export * from './lib/types/room.type';
export * from './lib/types/service';
export * from './lib/ucap-room-protocol.module'; export * from './lib/ucap-room-protocol.module';