From 1e2b58534cf31c827dede5003205f6edaa9e983a Mon Sep 17 00:00:00 2001 From: leejh Date: Wed, 6 Nov 2019 13:58:56 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=B6=94=EA=B0=80=20::?= =?UTF-8?q?=20=EB=8C=80=ED=99=94=EB=B0=A9=20=EC=84=A4=EC=A0=95=20/=20?= =?UTF-8?q?=EB=B0=A9=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20||=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=EB=A8=B8=20=EB=8C=80=ED=99=94=EB=B0=A9=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/messages.component.html | 3 + .../components/messages.component.ts | 53 +++++++++++++++ .../chat/edit-chat-room.dialog.component.html | 54 +++++++++++++++ .../chat/edit-chat-room.dialog.component.scss | 38 +++++++++++ .../edit-chat-room.dialog.component.spec.ts | 24 +++++++ .../chat/edit-chat-room.dialog.component.ts | 68 +++++++++++++++++++ .../layouts/messenger/dialogs/chat/index.ts | 3 +- .../messenger/messenger.layout.module.ts | 9 ++- .../src/app/store/messenger/room/actions.ts | 19 +++++- .../src/app/store/messenger/room/effects.ts | 22 +++++- .../src/app/store/messenger/room/reducers.ts | 13 +++- .../src/app/store/messenger/sync/reducers.ts | 15 ++++ 12 files changed, 314 insertions(+), 7 deletions(-) create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html index 8b09b433..12664ece 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html @@ -64,6 +64,9 @@ + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts index 20f78302..c218b0de 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts @@ -70,6 +70,11 @@ import { import { CONST } from '@ucap-webmessenger/core'; import { PerfectScrollbarComponent } from 'ngx-perfect-scrollbar'; import { StatusCode } from '@ucap-webmessenger/api'; +import { + EditChatRoomDialogComponent, + EditChatRoomDialogResult, + EditChatRoomDialogData +} from '../dialogs/chat/edit-chat-room.dialog.component'; @Component({ selector: 'app-layout-messenger-messages', @@ -674,6 +679,54 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { } } break; + case 'EDIT_ROOM': + { + const result = await this.dialogService.open< + EditChatRoomDialogComponent, + EditChatRoomDialogData, + EditChatRoomDialogResult + >(EditChatRoomDialogComponent, { + width: '600px', + data: { + title: 'Edit Chat Room', + roomInfo: this.roomInfo + } + }); + + if (!!result && !!result.choice && result.choice) { + const roomName: string = result.roomName; + const roomNameChangeTarget: string = result.roomNameChangeTarget; + const timeRoomInterval: number = result.timeRoomInterval; + const roomInfo: RoomInfo = result.roomInfo; + + // 방제목 업데이트. + this.store.dispatch( + RoomStore.update({ + req: { + roomSeq: roomInfo.roomSeq, + roomName, + receiveAlarm: roomInfo.receiveAlarm, + syncAll: + roomNameChangeTarget.toUpperCase() === 'ALL' ? true : false + } + }) + ); + + if ( + roomInfo.isTimeRoom && + timeRoomInterval > 0 && + roomInfo.timeRoomInterval !== timeRoomInterval + ) { + this.store.dispatch( + RoomStore.updateTimeRoomInterval({ + roomSeq: roomInfo.roomSeq, + timerInterval: timeRoomInterval + }) + ); + } + } + } + break; case 'CLOSE_ROOM': { this.store.dispatch(ChatStore.clearSelectedRoom()); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html new file mode 100644 index 00000000..1ca26aff --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html @@ -0,0 +1,54 @@ + + + {{ data.title }} + + +
+
+ + + {{ input.value?.length || 0 }}/20 + +
+
+ 변경 대상자 + + + 전체 + +
+
+ + Setting Timer + + + {{ timer.text }} + + + +
+
+
+ + + + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss new file mode 100644 index 00000000..eb97286f --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss @@ -0,0 +1,38 @@ +::ng-deep .mat-card-header-tex { + margin: 0; +} +.confirm-card { + min-width: 500px; + .mat-card-header { + margin-bottom: 20px; + .mat-card-header-text { + .mat-card-title { + margin: 0 -16px; + } + } + } + .button-farm { + text-align: right; + .mat-primary { + margin-left: 4px; + } + } +} + +form { + div { + padding-bottom: 5px; + height: 65px; + + &.targetSelect { + line-height: 65px; + + mat-radio-button { + padding-left: 10px; + } + } + } + .mat-form-field { + width: 100%; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts new file mode 100644 index 00000000..755589d0 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditChatRoomDialogComponent } from './edit-chat-room.dialog.component'; + +describe('app::layouts::messenger::EditChatRoomDialogComponent', () => { + let component: EditChatRoomDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EditChatRoomDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditChatRoomDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts new file mode 100644 index 00000000..dd29bec1 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts @@ -0,0 +1,68 @@ +import { RoomInfo } from '@ucap-webmessenger/protocol-room'; +import { Component, OnInit, Inject } from '@angular/core'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +export interface EditChatRoomDialogData { + title: string; + roomInfo: RoomInfo; +} + +export interface EditChatRoomDialogResult { + choice: boolean; + roomName?: string; + roomNameChangeTarget?: string; + timeRoomInterval?: number; + roomInfo: RoomInfo; +} + +@Component({ + selector: 'app-layout-messenger-edit-chat-room', + templateUrl: './edit-chat-room.dialog.component.html', + styleUrls: ['./edit-chat-room.dialog.component.scss'] +}) +export class EditChatRoomDialogComponent implements OnInit { + roomName: string; + inputForm: FormGroup; + + timerArray: { value: number; text: string }[] = [ + { value: 5, text: '5 초' }, + { value: 10, text: '10 초' }, + { value: 30, text: '30 초' }, + { value: 60, text: '1 분' }, + { value: 300, text: '5 분' }, + { value: 600, text: '10 분' }, + { value: 1800, text: '30 분' }, + { value: 3600, text: '1 시간' }, + { value: 21600, text: '6 시간' }, + { value: 43200, text: '12 시간' }, + { value: 86400, text: '24 시간' } + ]; + + constructor( + public dialogRef: MatDialogRef< + EditChatRoomDialogData, + EditChatRoomDialogResult + >, + @Inject(MAT_DIALOG_DATA) public data: EditChatRoomDialogData, + private formBuilder: FormBuilder + ) {} + + ngOnInit(): void { + this.inputForm = this.formBuilder.group({ + roomName: [this.data.roomInfo.roomName], + changeTarget: ['me'], + timerInterval: [this.data.roomInfo.timeRoomInterval] + }); + } + + onClickChoice(choice: boolean): void { + this.dialogRef.close({ + choice, + roomName: this.inputForm.get('roomName').value, + roomNameChangeTarget: this.inputForm.get('changeTarget').value, + timeRoomInterval: this.inputForm.get('timerInterval').value, + roomInfo: this.data.roomInfo + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts index a2b25b02..5e9a00ab 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts @@ -1,3 +1,4 @@ import { CreateChatDialogComponent } from './create-chat.dialog.component'; +import { EditChatRoomDialogComponent } from './edit-chat-room.dialog.component'; -export const DIALOGS = [CreateChatDialogComponent]; +export const DIALOGS = [CreateChatDialogComponent, EditChatRoomDialogComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts index c020ed38..a766d9e8 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts @@ -1,5 +1,6 @@ -import { MatListModule } from '@angular/material/list'; -import { MatChipsModule } from '@angular/material/chips'; +import { MatSelectModule } from '@angular/material/select'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; @@ -22,6 +23,8 @@ import { MatToolbarModule } from '@angular/material/toolbar'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatCheckboxModule } from '@angular/material'; +import { MatListModule } from '@angular/material/list'; +import { MatChipsModule } from '@angular/material/chips'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { OverlayModule } from '@angular/cdk/overlay'; @@ -65,6 +68,8 @@ import { DIALOGS } from './dialogs'; MatToolbarModule, MatChipsModule, MatCheckboxModule, + MatRadioModule, + MatSelectModule, PerfectScrollbarModule, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts index d0857791..c87465f0 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts @@ -17,7 +17,9 @@ import { Open3Request, Open3Response, InviteRequest, - InviteResponse + InviteResponse, + UpdateTimerSetRequest, + UpdateTimerSetResponse } from '@ucap-webmessenger/protocol-room'; import { ReadNotification } from '@ucap-webmessenger/protocol-event'; @@ -87,6 +89,21 @@ export const updateFailure = createAction( props<{ error: any }>() ); +export const updateTimeRoomInterval = createAction( + '[Messenger::Room] Update Interval for TimeRoom', + props() +); +export const updateTimeRoomIntervalSuccess = createAction( + '[Messenger::Room] Update Interval for TimeRoom Success', + props<{ + res: UpdateTimerSetResponse; + }>() +); +export const updateTimeRoomIntervalFailure = createAction( + '[Messenger::Room] Update Interval for TimeRoom Failure', + props<{ error: any }>() +); + export const open = createAction( '[Messenger::Room] Open', props<{ req: OpenRequest }>() diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts index b45d6eb3..a72c4b2a 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts @@ -32,7 +32,8 @@ import { ExitResponse, Open3Response, RoomType, - InviteResponse + InviteResponse, + UpdateTimerSetResponse } from '@ucap-webmessenger/protocol-room'; import * as ChatStore from '@app/store/messenger/chat'; @@ -60,7 +61,10 @@ import { openTimerFailure, inviteOrOpen, inviteSuccess, - inviteFailure + inviteFailure, + updateTimeRoomInterval, + updateTimeRoomIntervalSuccess, + updateTimeRoomIntervalFailure } from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; @@ -163,6 +167,20 @@ export class Effects { ) ); + updateTimeRoomInterval$ = createEffect(() => + this.actions$.pipe( + ofType(updateTimeRoomInterval), + exhaustMap(action => { + return this.roomProtocolService.updateTimerSet(action).pipe( + map((res: UpdateTimerSetResponse) => { + return updateTimeRoomIntervalSuccess({ res }); + }), + catchError(error => of(updateTimeRoomIntervalFailure({ error }))) + ); + }) + ) + ); + open$ = createEffect(() => this.actions$.pipe( ofType(open), diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts index bc929d8a..921038af 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts @@ -3,7 +3,8 @@ import { initialState, adapterUserInfo, adapterUserInfoShort } from './state'; import { infoSuccess, updateSuccess, - updateRoomUserLastReadSeq + updateRoomUserLastReadSeq, + updateTimeRoomIntervalSuccess } from './actions'; import * as AuthenticationStore from '@app/store/account/authentication'; @@ -35,6 +36,16 @@ export const reducer = createReducer( }; }), + on(updateTimeRoomIntervalSuccess, (state, action) => { + return { + ...state, + roomInfo: { + ...state.roomInfo, + timeRoomInterval: action.res.timerInterval + } + }; + }), + on(updateRoomUserLastReadSeq, (state, action) => { const userSeq = action.SENDER_SEQ; diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts index 8420f361..98fdde8b 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts @@ -148,6 +148,21 @@ export const reducer = createReducer( }; }), + on(RoomStore.updateTimeRoomIntervalSuccess, (state, action) => { + const roomInfo: RoomInfo = { + ...state.room.entities[action.res.roomSeq], + timeRoomInterval: action.res.timerInterval + }; + + return { + ...state, + room: adapterRoom.updateOne( + { id: action.res.roomSeq, changes: roomInfo }, + { ...state.room } + ) + }; + }), + on(RoomStore.exitSuccess, (state, action) => { return { ...state, From ee1938799e194f25ec84f668894ea57068425a50 Mon Sep 17 00:00:00 2001 From: leejh Date: Wed, 6 Nov 2019 14:06:25 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[[=EC=A4=91=EC=9A=94=EC=A4=91=EC=9A=94!!!]]?= =?UTF-8?q?=20Issue=20:=20=EB=B0=A9=EC=9D=B4=EB=A6=84=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EC=8B=9C=20=EA=B0=99=EC=9D=80=20requestId?= =?UTF-8?q?=20=EB=A5=BC=20=EA=B0=80=EC=A7=80=EA=B3=A0=20SSVC=5FTYPE=5FROOM?= =?UTF-8?q?=5FUPD=5FREQ=20(10/31)=20=EC=9A=94=EC=B2=AD=EC=8B=9C=20RES(10/3?= =?UTF-8?q?2)=20=EB=8F=84=EC=B0=A9=20=EC=A0=84=EC=97=90=20EVENT=5FSEND=5FR?= =?UTF-8?q?ES=20(20/12)=20=EA=B0=80=20=EB=A8=BC=EC=A0=80=20=EB=8F=84?= =?UTF-8?q?=EC=B0=A9=ED=95=A8.=20service=20Id=20=EC=99=80=20sub=20service?= =?UTF-8?q?=20id=20=EB=A5=BC=20=EA=B0=99=EC=9D=B4=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=ED=95=98=EB=A9=B4=20=EC=A2=8B=EC=A7=80=EB=A7=8C=20=EC=9A=B0?= =?UTF-8?q?=EC=84=A0=20service=20ID=20=EB=A5=BC=20=EA=B0=99=EC=9D=B4=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=9D=84=20=EB=84=A3=EC=96=B4=EB=91=90=EA=B3=A0,=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=EC=97=90=EC=84=9C=20=EC=88=9C=EC=84=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=94=EA=BF=94=EC=A4=84=20=EC=88=98=20=EC=97=86=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EC=9A=94=EC=B2=AD=ED=95=B4=20=EB=B4=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 궁극적으로는 내가 요청한 건에 대한 응답 프로토콜에만 requestID 를 실어 보내줘야 하고, noti 나 noti 성격의 res 에는 request id 를 달아 보내주면 안됨. 더 궁극적으로는 noti 는 noti 로,, noti 성격의 res 를 noti 로 보낼 수 있도록 서버가 수정되어 줘야 함. --- .../src/lib/services/protocol.service.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.ts b/projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.ts index df698334..e0eea6ca 100644 --- a/projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.ts +++ b/projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.ts @@ -101,7 +101,10 @@ export class ProtocolService { return; } - if (requestState) { + if ( + requestState && + requestState.request.serviceType === res.message.serviceType + ) { requestState.subject.next(res.message); return; }