From 42eb432b5891509db441a14b8c72fea8d1367943 Mon Sep 17 00:00:00 2001 From: Lukian Date: Mon, 24 Mar 2025 20:27:32 +0100 Subject: [PATCH] add: added message sending --- back/libs/mysql.js | 2 +- front/src/main.tsx | 4 ++- front/src/pages/Channel.tsx | 58 ++++++++++++++++++++++++++++--- front/src/pages/CreateChannel.tsx | 50 ++++++++++++++++++++++++++ front/src/pages/Home.tsx | 3 +- 5 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 front/src/pages/CreateChannel.tsx diff --git a/back/libs/mysql.js b/back/libs/mysql.js index d3d7edd..2b92d73 100644 --- a/back/libs/mysql.js +++ b/back/libs/mysql.js @@ -96,7 +96,7 @@ function addChannel(connection, name, description) { function getMessages(connection, channel_id) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date FROM messages JOIN users ON messages.user_id = users.id WHERE channel_id = ${channel_id}`, + `SELECT messages.id, user_id, username, content, date FROM messages JOIN users ON messages.user_id = users.id WHERE channel_id = ${channel_id} ORDER BY date DESC`, (error, result) => { if (error) { reject(new Error(error)); diff --git a/front/src/main.tsx b/front/src/main.tsx index db1c8ea..beef788 100644 --- a/front/src/main.tsx +++ b/front/src/main.tsx @@ -6,14 +6,16 @@ import Home from './pages/Home' import Channel from './pages/Channel' import Login from './pages/Login' import Register from './pages/Register' +import CreateChannel from './pages/CreateChannel' createRoot(document.getElementById('root')!).render( } /> - } /> + } /> } /> } /> + } /> ) diff --git a/front/src/pages/Channel.tsx b/front/src/pages/Channel.tsx index 3017c14..27fd159 100644 --- a/front/src/pages/Channel.tsx +++ b/front/src/pages/Channel.tsx @@ -1,5 +1,5 @@ -import { useParams } from "react-router-dom"; -import { useEffect, useState } from "react"; +import { useParams, Link } from "react-router-dom"; +import React, { useEffect, useState } from "react"; import { Channel_type, Messages } from "../types"; import axios from "axios"; @@ -7,8 +7,31 @@ export default function Channel() { const { name } = useParams(); const [channel, setChannel] = useState(); const [messages, setMessages] = useState(); + const [token, setToken] = useState(""); + const [message, setMessage] = useState(""); + const [maxMessageToShown, setMaxMessageToShown] = useState(10); + + function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + axios + .post(`/api/channels/${name}/messages/send`, { token, message}) + .then(() => { + axios + .get(`/api/channels/${name}/messages`) + .then((res) => { + setMessages(res.data); + setMessage(""); + } + ); + }) + .catch((err) => { + console.error(err.response.data.message); + }); + } useEffect(() => { + const localToken = localStorage.getItem("token"); + if (localToken) setToken(localToken); axios.get(`/api/channels/${name}`).then((res) => { setChannel(res.data); }); @@ -24,12 +47,39 @@ export default function Channel() { return (
+ Home

Channel {channel.name}

+

{channel.description}

+ { + token ? ( +
+ setMessage(e.target.value)} + /> + +
+ ) : ( +
+ Login + Register +
+ ) + }
    - {messages.map((message) => ( -
  • {`${message.username}: ${message.content}`}
  • + {messages.slice(0, maxMessageToShown).map((message) => ( +
  • +

    {message.username}: {message.content}

    +
  • ))}
+ { + messages.length > maxMessageToShown && ( + + ) + }
); } \ No newline at end of file diff --git a/front/src/pages/CreateChannel.tsx b/front/src/pages/CreateChannel.tsx new file mode 100644 index 0000000..bcbeea5 --- /dev/null +++ b/front/src/pages/CreateChannel.tsx @@ -0,0 +1,50 @@ +import { useState, useEffect } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import axios from "axios"; + + +export default function CreateChannel() { + const navigate = useNavigate(); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [token, setToken] = useState(""); + + useEffect(() => { + const localToken = localStorage.getItem("token"); + if (localToken) setToken(localToken); + }, []); + + function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + axios + .post("/api/channels/add", { name, description, token }) + .then(() => { + navigate("/"); + }) + .catch((err) => { + console.error(err.response.data.message); + }); + } + + return ( +
+ Home +

Create Channel

+
+ setName(e.target.value)} + /> + setDescription(e.target.value)} + /> + +
+
+ ); +} \ No newline at end of file diff --git a/front/src/pages/Home.tsx b/front/src/pages/Home.tsx index 9f1fd91..c807d7a 100644 --- a/front/src/pages/Home.tsx +++ b/front/src/pages/Home.tsx @@ -43,11 +43,12 @@ export default function Home() { Register )} + Create Channel

Channels

    {channels?.map((channel) => (
  • - {channel.name} + {channel.name}
  • ))}