diff --git a/.gitignore b/.gitignore index e417b397..6af908c9 100644 --- a/.gitignore +++ b/.gitignore @@ -113,3 +113,4 @@ postgres/ # Local Uploads /backend/uploads/* +data \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 04da5fd9..fc83002b 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -21,7 +21,7 @@ "@nestjs/serve-static": "^4.0.0", "@nestjs/websockets": "^9.0.0", "@prisma/client": "^4.12.0", - "argon2": "^0.31.1", + "argon2": "^0.30.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", @@ -2980,14 +2980,14 @@ "dev": true }, "node_modules/argon2": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.31.1.tgz", - "integrity": "sha512-ik2xnJrLXazya7m4Nz1XfBSRjXj8Koq8qF9PsQC8059p20ifWc9zx/hgU3ItZh/3TnwXkv0RbhvjodPkmFf0bg==", + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.3.tgz", + "integrity": "sha512-DoH/kv8c9127ueJSBxAVJXinW9+EuPA3EMUxoV2sAY1qDE5H9BjTyVF/aD2XyHqbqUWabgBkIfcP3ZZuGhbJdg==", "hasInstallScript": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", + "@mapbox/node-pre-gyp": "^1.0.10", "@phc/format": "^1.0.0", - "node-addon-api": "^7.0.0" + "node-addon-api": "^5.0.0" }, "engines": { "node": ">=14.0.0" @@ -6607,9 +6607,9 @@ "dev": true }, "node_modules/node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node_modules/node-emoji": { "version": "1.11.0", diff --git a/backend/package.json b/backend/package.json index c012f6c6..3f89035d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -36,7 +36,7 @@ "@nestjs/serve-static": "^4.0.0", "@nestjs/websockets": "^9.0.0", "@prisma/client": "^4.12.0", - "argon2": "^0.31.1", + "argon2": "^0.30.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", diff --git a/backend/src/chat/chat.service.ts b/backend/src/chat/chat.service.ts index c66bef3e..a1c2e02b 100644 --- a/backend/src/chat/chat.service.ts +++ b/backend/src/chat/chat.service.ts @@ -20,6 +20,12 @@ export class ChatService { chatId: number, content: string, ): Promise { + const userId = await this.prisma.user.findUnique({ + where: { + login: userLogin, + }, + }); + const createdMessage = await this.prisma.message.create({ data: { content, @@ -33,6 +39,7 @@ export class ChatService { login: userLogin, }, }, + userId: userId.id, }, }); diff --git a/backend/src/database/schema.prisma b/backend/src/database/schema.prisma index 305afd9f..896aad14 100644 --- a/backend/src/database/schema.prisma +++ b/backend/src/database/schema.prisma @@ -64,6 +64,7 @@ model Message { id String @id @default(uuid()) user User? @relation(fields: [userLogin], references: [login]) userLogin String? + userId String? createdAt DateTime @default(now()) chat Chat @relation(fields: [chatId], references: [id]) chatId Int diff --git a/frontend/src/components/Chat/FriendCard.tsx b/frontend/src/components/Chat/FriendCard.tsx index fe775d19..be0c60b9 100644 --- a/frontend/src/components/Chat/FriendCard.tsx +++ b/frontend/src/components/Chat/FriendCard.tsx @@ -2,6 +2,7 @@ import { api } from "@/services/apiClient"; import { queryClient } from "@/services/queryClient"; import { EnvelopeSimple, Sword, UserMinus } from "@phosphor-icons/react"; import { useMutation } from "@tanstack/react-query"; +import Link from "next/link"; import toast from "react-hot-toast"; type FriendCardProps = { @@ -31,7 +32,12 @@ export default function FriendCard({ displayName, id }: FriendCardProps) { return (
-
{displayName}
+ + {displayName} +
diff --git a/frontend/src/components/Chat/OpenChannel.tsx b/frontend/src/components/Chat/OpenChannel.tsx index 9a28b442..f9aa5f03 100644 --- a/frontend/src/components/Chat/OpenChannel.tsx +++ b/frontend/src/components/Chat/OpenChannel.tsx @@ -1,19 +1,28 @@ -import { ChatContext, ChatList } from "@/contexts/ChatContext"; +import { ChatContext } from "@/contexts/ChatContext"; import { PaperPlaneTilt, UsersThree, XCircle } from "@phosphor-icons/react"; -import { useContext, useEffect, useState } from "react"; +import { useContext, useState } from "react"; import ChatUsersChannelPopOver, { ChatMember } from "./ChatUsersChannelPopOver"; import chatService from "@/services/chatClient"; import { useForm } from "react-hook-form"; +import Link from "next/link"; interface Message { id: number; content: string; userLogin: string; + userId: string; } export function OpenChannel() { - const { selectedChat, handleCloseChat, setShowElement, validationRequired, setValidationRequired, user } = useContext(ChatContext); + const { + selectedChat, + handleCloseChat, + setShowElement, + validationRequired, + setValidationRequired, + user, + } = useContext(ChatContext); // List messages from the websocket - const [message, setMessage] = useState(''); + const [message, setMessage] = useState(""); const [messages, setMessages] = useState([]); const [numberOfUsersInChat, setNumberOfUsersInChat] = useState(0); const [users, setUsers] = useState([]); @@ -21,9 +30,11 @@ export function OpenChannel() { chatService.socket?.on("listMessages", (messages: Message[]) => { setMessages(() => messages); }); + chatService.socket?.on("message", (message: Message) => { setMessages([...messages, message]); }); + chatService.socket?.on("listMembers", (members: ChatMember[]) => { setNumberOfUsersInChat(members.length); setUsers(members); @@ -33,7 +44,7 @@ export function OpenChannel() { if (response.error) { setError("password", { type: "manual", - message: "Senha incorreta" + message: "Senha incorreta", }); return; } @@ -43,7 +54,7 @@ export function OpenChannel() { const handleSendMessage = () => { chatService.socket?.emit("message", { chatId: selectedChat.id, - content: message + content: message, }); setMessage(""); @@ -58,7 +69,7 @@ export function OpenChannel() { type FormInputs = { password: string; - } + }; const { register, @@ -87,7 +98,10 @@ export function OpenChannel() { className="cursor-pointer" color="white" size={20} - onClick={() => { setShowElement("showChannels"); setValidationRequired(true); }} + onClick={() => { + setShowElement("showChannels"); + setValidationRequired(true); + }} />
@@ -100,9 +114,7 @@ export function OpenChannel() { {...register("password", { required: true })} /> {errors.password && ( - - Senha incorreta - + Senha incorreta )}
@@ -115,16 +127,14 @@ export function OpenChannel() {
- ) + ); } return (
- +
({numberOfUsersInChat}) @@ -149,12 +159,18 @@ export function OpenChannel() {
- {message.userLogin}: + + + {message.userLogin} + + :{" "} + {message.content}
))}