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 4dab8b5c..0329993b 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
@@ -5,20 +5,37 @@
-
-
- notifications_active
- notifications_off
+
+ notifications_active
+ notifications_off
-
+
more_vert
@@ -31,7 +48,10 @@
-
+
@@ -39,9 +59,16 @@
-
+
@@ -56,3 +83,49 @@
+
+
+
+
+
+
+ 대화 복사
+
+
+ 대화 전달
+
+
+ 대화 나에게 전달
+
+
+ 대화 삭제
+
+
+ 대화 회수
+
+
+
+
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 68fd6ebe..76d8591e 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
@@ -10,7 +10,13 @@ import { ucapAnimations } from '@ucap-webmessenger/ui';
import { Store, select } from '@ngrx/store';
import { NGXLogger } from 'ngx-logger';
import { Observable, Subscription } from 'rxjs';
-import { Info, EventType } from '@ucap-webmessenger/protocol-event';
+import {
+ Info,
+ EventType,
+ isRecalled,
+ isCopyable,
+ isRecallable
+} from '@ucap-webmessenger/protocol-event';
import * as AppStore from '@app/store';
import * as EventStore from '@app/store/messenger/event';
@@ -24,6 +30,7 @@ import { tap } from 'rxjs/operators';
import { FileInfo } from '@ucap-webmessenger/ui-chat';
import { KEY_VER_INFO } from '@app/types/ver-info.type';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
+import { MatMenuTrigger } from '@angular/material';
@Component({
selector: 'app-layout-messenger-messages',
@@ -35,6 +42,10 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
@ViewChild('messageBoxContainer', { static: true })
private messageBoxContainer: ElementRef;
+ @ViewChild('messageContextMenuTrigger', { static: true })
+ messageContextMenuTrigger: MatMenuTrigger;
+ messageContextMenuPosition = { x: '0px', y: '0px' };
+
loginRes: LoginResponse;
loginResSubscription: Subscription;
eventList$: Observable
;
@@ -46,6 +57,10 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
KEY_VER_INFO
);
+ isRecalledMessage = isRecalled;
+ isCopyableMessage = isCopyable;
+ isRecallableMessage = isRecallable;
+
constructor(
private store: Store,
private sessionStorageService: SessionStorageService,
@@ -143,4 +158,46 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
onSave(value: { fileInfo: FileInfo; type: string }) {
this.logger.debug('fileSave', value);
}
+
+ onContextMenuMessage(params: { event: MouseEvent; message: Info }) {
+ params.event.preventDefault();
+ params.event.stopPropagation();
+
+ this.messageContextMenuPosition.x = params.event.clientX + 'px';
+ this.messageContextMenuPosition.y = params.event.clientY + 'px';
+ this.messageContextMenuTrigger.menu.focusFirstItem('mouse');
+ this.messageContextMenuTrigger.menuData = {
+ message: params.message,
+ loginRes: this.loginRes
+ };
+ this.messageContextMenuTrigger.openMenu();
+ }
+
+ onClickMessageContextMenu(menuType: string, message: Info) {
+ switch (menuType) {
+ case 'COPY':
+ {
+ this.logger.debug('onClickMessageContextMenu', menuType, message);
+ }
+ break;
+ case 'REPLAY':
+ {
+ }
+ break;
+ case 'REPLAY_TO_ME':
+ {
+ }
+ break;
+ case 'DELETE':
+ {
+ }
+ break;
+ case 'RECALL':
+ {
+ }
+ break;
+ default:
+ break;
+ }
+ }
}
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/create-group.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/create-group.dialog.component.html
index 09d25dfe..2229c733 100644
--- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/create-group.dialog.component.html
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/create-group.dialog.component.html
@@ -1,5 +1,5 @@
-
+
새 그룹 추가
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.html
new file mode 100644
index 00000000..a6ad0056
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.html
@@ -0,0 +1,18 @@
+
+
+ 그룹 삭제
+
+
+
+
+ No
+
+
+ Yes
+
+
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.spec.ts
new file mode 100644
index 00000000..e279601d
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EditGroupDialogComponent } from './edit-group.dialog.component';
+
+describe('app::layouts::messenger::EditGroupDialogComponent', () => {
+ let component: EditGroupDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [EditGroupDialogComponent]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EditGroupDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.ts
new file mode 100644
index 00000000..db8d4026
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/delete-group.dialog.component.ts
@@ -0,0 +1,34 @@
+import { Component, OnInit, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+export interface DeleteGroupDialogData {
+ title: string;
+ message?: string;
+}
+
+export interface DeleteGroupDialogResult {
+ choice: boolean;
+}
+
+@Component({
+ selector: 'app-layout-messenger-delete-group',
+ templateUrl: './delete-group.dialog.component.html',
+ styleUrls: ['./delete-group.dialog.component.scss']
+})
+export class DeleteGroupDialogComponent implements OnInit {
+ constructor(
+ public dialogRef: MatDialogRef<
+ DeleteGroupDialogData,
+ DeleteGroupDialogResult
+ >,
+ @Inject(MAT_DIALOG_DATA) public data: DeleteGroupDialogData
+ ) {}
+
+ ngOnInit(): void {}
+
+ onClickChoice(choice: boolean): void {
+ this.dialogRef.close({
+ choice
+ });
+ }
+}
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.html
new file mode 100644
index 00000000..f0f997bf
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.html
@@ -0,0 +1,18 @@
+
+
+ 그룹 맴버 수정
+
+
+
+
+ No
+
+
+ Yes
+
+
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.spec.ts
new file mode 100644
index 00000000..24f3444d
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EditGroupMemberDialogComponent } from './edit-group-member.dialog.component';
+
+describe('app::layouts::messenger::EditGroupMemberDialogComponent', () => {
+ let component: EditGroupMemberDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [EditGroupMemberDialogComponent]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EditGroupMemberDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.ts
new file mode 100644
index 00000000..2656c44f
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group-member.dialog.component.ts
@@ -0,0 +1,34 @@
+import { Component, OnInit, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+export interface EditGroupMemberDialogData {
+ title: string;
+ message?: string;
+}
+
+export interface EditGroupMemberDialogResult {
+ choice: boolean;
+}
+
+@Component({
+ selector: 'app-layout-messenger-edit-group-member',
+ templateUrl: './edit-group-member.dialog.component.html',
+ styleUrls: ['./edit-group-member.dialog.component.scss']
+})
+export class EditGroupMemberDialogComponent implements OnInit {
+ constructor(
+ public dialogRef: MatDialogRef<
+ EditGroupMemberDialogData,
+ EditGroupMemberDialogResult
+ >,
+ @Inject(MAT_DIALOG_DATA) public data: EditGroupMemberDialogData
+ ) {}
+
+ ngOnInit(): void {}
+
+ onClickChoice(choice: boolean): void {
+ this.dialogRef.close({
+ choice
+ });
+ }
+}
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.html
new file mode 100644
index 00000000..7e2dcc5e
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.html
@@ -0,0 +1,18 @@
+
+
+ 그룹 이름 수정
+
+
+
+
+ No
+
+
+ Yes
+
+
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.spec.ts
new file mode 100644
index 00000000..e279601d
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EditGroupDialogComponent } from './edit-group.dialog.component';
+
+describe('app::layouts::messenger::EditGroupDialogComponent', () => {
+ let component: EditGroupDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [EditGroupDialogComponent]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EditGroupDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.ts
new file mode 100644
index 00000000..cc70a84b
--- /dev/null
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/edit-group.dialog.component.ts
@@ -0,0 +1,31 @@
+import { Component, OnInit, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+export interface EditGroupDialogData {
+ title: string;
+ message?: string;
+}
+
+export interface EditGroupDialogResult {
+ choice: boolean;
+}
+
+@Component({
+ selector: 'app-layout-messenger-edit-group',
+ templateUrl: './edit-group.dialog.component.html',
+ styleUrls: ['./edit-group.dialog.component.scss']
+})
+export class EditGroupDialogComponent implements OnInit {
+ constructor(
+ public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data: EditGroupDialogData
+ ) {}
+
+ ngOnInit(): void {}
+
+ onClickChoice(choice: boolean): void {
+ this.dialogRef.close({
+ choice
+ });
+ }
+}
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts
index ca2df322..afaf3b73 100644
--- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts
+++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts
@@ -1,4 +1,13 @@
import { CreateGroupDialogComponent } from './create-group.dialog.component';
import { CreateChatDialogComponent } from './create-chat.dialog.component';
+import { DeleteGroupDialogComponent } from './delete-group.dialog.component';
+import { EditGroupDialogComponent } from './edit-group.dialog.component';
+import { EditGroupMemberDialogComponent } from './edit-group-member.dialog.component';
-export const DIALOGS = [CreateGroupDialogComponent, CreateChatDialogComponent];
+export const DIALOGS = [
+ CreateChatDialogComponent,
+ CreateGroupDialogComponent,
+ DeleteGroupDialogComponent,
+ EditGroupDialogComponent,
+ EditGroupMemberDialogComponent
+];
diff --git a/projects/ucap-webmessenger-protocol-event/src/lib/models/info.ts b/projects/ucap-webmessenger-protocol-event/src/lib/models/info.ts
index fa28fc20..6f1b9ca9 100644
--- a/projects/ucap-webmessenger-protocol-event/src/lib/models/info.ts
+++ b/projects/ucap-webmessenger-protocol-event/src/lib/models/info.ts
@@ -14,3 +14,19 @@ export interface Info {
// 수신자수
receiverCount: number;
}
+
+export function isCopyable(eventType: EventType): boolean {
+ return (
+ EventType.Character === eventType || EventType.Translation === eventType
+ );
+}
+
+export function isRecalled(eventType: EventType): boolean {
+ return EventType.RecalledMessage === eventType;
+}
+
+export function isRecallable(event: Info, userSeq: number): boolean {
+ return (
+ event.senderSeq === userSeq && event.type !== EventType.RecalledMessage
+ );
+}
diff --git a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.html b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.html
index 80bec251..522791c0 100644
--- a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.html
+++ b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.html
@@ -92,9 +92,7 @@
@@ -120,23 +118,3 @@
diff --git a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts
index e43b886f..7587dc46 100644
--- a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts
+++ b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts
@@ -43,10 +43,11 @@ export class MessagesComponent implements OnInit {
@Output()
save = new EventEmitter<{ fileInfo: FileInfo; type: string }>();
- @ViewChildren(MatMenuTrigger) menuTriggerList: QueryList