From dccc2a5e4dbe3e62a5a7a899d109c865ce410e0a Mon Sep 17 00:00:00 2001 From: gokhoal Date: Thu, 11 Jun 2026 01:30:33 +0200 Subject: [PATCH] LES MESSAGES MARCHENT --- package-lock.json | 57 ++++++++++--------- src/app/core/chat/chat.service.ts | 18 ++++-- src/app/core/chat/discussion.service.ts | 2 +- .../messages-main/messages-main.component.ts | 15 ++++- ...ots-dto-message-get-message-details-dto.ts | 2 +- 5 files changed, 60 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index c76d3ae..ce0fa02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -247,6 +247,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.23.tgz", "integrity": "sha512-RazHPQkUEsNU/OZ75w9UeHxGFMthRiuAW2B/uA7eXExBj/1meHrrBfoCA56ujW2GUxVjRtSrMjylKh4R4meiYA==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -283,6 +284,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.23.tgz", "integrity": "sha512-Jzs7YM4X6azmHU7Mw5tQSPMuvaqYS8SLnZOJbtiXCy1JyuW9bm/WBBecNHMiuZ8LHXKhvQ6AVX1tKrzF6uiDmw==", "license": "MIT", + "peer": true, "dependencies": { "@angular-devkit/core": "19.2.23", "jsonc-parser": "3.3.1", @@ -430,6 +432,7 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.20.tgz", "integrity": "sha512-1M3W3FjUUbVKXDMs+yQpBhnkD/pCe0Jn79rPE5W+EGWWxFoLSyGX+fhnRO5m4c9k66p3nvYrikWQ0ZzMv3M5tw==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -446,6 +449,7 @@ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.20.tgz", "integrity": "sha512-LvjE8W58EACgTFaAoqmNe7FRsbvoQ0GvCB/rmm6AEMWx/0W/JBvWkQTrOQlwpoeYOHcMZRGdmPcZoUDwU3JySQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -459,6 +463,7 @@ "integrity": "sha512-tYYQk8AUz2sEkVl0a3uebduDUXPuKiGEKl2Jryrbn0xh9i1EsxoCjt1VvHnGnksGp3mz4DQihFVEnte0KeVQ5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -535,6 +540,7 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.20.tgz", "integrity": "sha512-pxzQh8ouqfE57lJlXjIzXFuRETwkfMVwS+NFCfv2yh01Qtx+vymO8ZClcJMgLPfBYinhBYX+hrRYVSa1nzlkRQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -551,6 +557,7 @@ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.20.tgz", "integrity": "sha512-agi7InbMzop1jrud6L7SlNwnZk3iNolORcFIwBQMvKxLkcJ+ttbSYuM0KAw56IundWHf4dL9GP4cSygm4kUeFA==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -569,6 +576,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.20.tgz", "integrity": "sha512-O9ZoQKILPC1T2c64OASS75XlOLBxY81m5AAgsBKhwiFWq+V28RsO0cnwpi1YSh/z4ryH8Fe7IUFz8jGrsJi3hQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -609,6 +617,7 @@ "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.20.tgz", "integrity": "sha512-y0fyKycxJHr82kxXKE50Vac5hPn5Kx3gw9CfqyEuwJ9VQzEixDljU+chrQK4Wods14jJn9Tt2ncNPGH1rLya3Q==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -653,6 +662,7 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -2509,6 +2519,7 @@ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.3.1.tgz", "integrity": "sha512-UF8ItlHguU1Z6GXfPTeT2gakf+ctNI8pAS1kwSBQlsJMlfD4OPoto/SmKnOxKCQvnF4WRcdWeg6C0zREUNaAQg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3202,6 +3213,7 @@ "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@inquirer/checkbox": "^4.1.2", "@inquirer/confirm": "^5.1.6", @@ -4953,6 +4965,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.17.tgz", "integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==", "license": "MIT", + "peer": true, "dependencies": { "file-type": "21.3.2", "iterare": "1.2.1", @@ -7001,6 +7014,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7064,6 +7078,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -7294,6 +7309,7 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", + "peer": true, "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", @@ -7619,6 +7635,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -8802,29 +8819,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", @@ -10569,6 +10563,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -10710,6 +10705,7 @@ "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -12551,6 +12547,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -12958,7 +12955,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/regenerate": { "version": "1.4.2", @@ -13374,6 +13372,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -14432,6 +14431,7 @@ "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -14631,7 +14631,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tuf-js": { "version": "3.1.0", @@ -14687,6 +14688,7 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15092,6 +15094,7 @@ "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -15171,6 +15174,7 @@ "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -15766,7 +15770,8 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT" + "license": "MIT", + "peer": true } } } diff --git a/src/app/core/chat/chat.service.ts b/src/app/core/chat/chat.service.ts index 531c96f..2bc926a 100644 --- a/src/app/core/chat/chat.service.ts +++ b/src/app/core/chat/chat.service.ts @@ -1,14 +1,19 @@ -import { Injectable } from '@angular/core'; -import { HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr'; +import {inject, Injectable} from '@angular/core'; +import { HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr'; +import * as signalR from '@microsoft/signalr'; +import { AuthService } from "../auth/auth.service"; @Injectable({ providedIn: 'root' }) export class ChatService { - private hub: HubConnection; + private authService = inject(AuthService); + private hub: signalR.HubConnection; constructor() { this.hub = new HubConnectionBuilder() - .withUrl('https://localhost:5250/hubs/chat') + .withUrl('http://localhost:5250/hubs/chat', { + accessTokenFactory: () => this.authService.getToken() ?? '' + }) .withAutomaticReconnect() .build(); } @@ -27,4 +32,9 @@ export class ChatService { onMessage(callback: (message: any) => void) { this.hub.on('ReceiveMessage', callback); } + + async joinConversation(discussionId: string) { + await this.connect(); + await this.hub.invoke('JoinConversation', discussionId); + } } \ No newline at end of file diff --git a/src/app/core/chat/discussion.service.ts b/src/app/core/chat/discussion.service.ts index 15e90ee..8dcf16a 100644 --- a/src/app/core/chat/discussion.service.ts +++ b/src/app/core/chat/discussion.service.ts @@ -7,7 +7,7 @@ export interface Message { id: number; contenu: string; date: string; - authorId: number; + userId: number; authorName: string; } diff --git a/src/app/pages/messages/messages-main/messages-main.component.ts b/src/app/pages/messages/messages-main/messages-main.component.ts index 63645b5..9c06923 100644 --- a/src/app/pages/messages/messages-main/messages-main.component.ts +++ b/src/app/pages/messages/messages-main/messages-main.component.ts @@ -6,6 +6,7 @@ import { MessagesSend } from "../messages-send/messages-send.component"; import { ActivatedRoute } from '@angular/router'; import { discussionsService, Message } from "../../../core/chat/discussion.service"; import { AuthService } from "../../../core/auth/auth.service"; +import {ChatService} from "../../../core/chat/chat.service"; @Component({ selector: 'app-messages-main', @@ -18,12 +19,13 @@ export class MessagesMain implements OnInit { private route = inject(ActivatedRoute); private discussionService = inject(discussionsService); private authService = inject(AuthService); + private chatService = inject(ChatService); currentDiscussionId!: string; currentUserId!: number; messages: Message[] = []; - ngOnInit() { + async ngOnInit() { this.currentDiscussionId = this.route.snapshot.paramMap.get('discussionId')!; this.currentUserId = this.authService.getCurrentUserId(); @@ -31,9 +33,18 @@ export class MessagesMain implements OnInit { next: (messages) => this.messages = messages, error: (err) => console.error('Impossible de charger les messages', err) }); + + // réception temps réel + this.chatService.onMessage((message: Message) => { + this.messages = [...this.messages, message]; + }); + + // rejoindre la room pour ne recevoir que cette conversation + await this.chatService.connect(); + await this.chatService.joinConversation(this.currentDiscussionId); } isSent(message: Message): boolean { - return message.authorId === this.currentUserId; + return message.userId === this.currentUserId; } } \ No newline at end of file diff --git a/src/app/services/api/model/knots-dto-message-get-message-details-dto.ts b/src/app/services/api/model/knots-dto-message-get-message-details-dto.ts index 9d31fe7..857b166 100644 --- a/src/app/services/api/model/knots-dto-message-get-message-details-dto.ts +++ b/src/app/services/api/model/knots-dto-message-get-message-details-dto.ts @@ -14,7 +14,7 @@ export interface KnotsDTOMessageGetMessageDetailsDto { contenu?: string | null; date?: string; type?: boolean; - authorId?: number; + userId?: number; authorName?: string; }