import { useParams, Link } from "react-router-dom"; import React, { useEffect, useState } from "react"; import { Channel, Messages, User } from "../types"; import TopBar from "../components/TopBar"; import MessageComponent from "../components/MessageComponent"; import axios from "axios"; import "../styles/ChannelPage.css"; export default function ChannelPage({socket}: {socket: WebSocket}) { const { name } = useParams(); const [channel, setChannel] = useState(); const [messages, setMessages] = useState(); const [token, setToken] = useState(""); const [user, setUser] = useState(); const [message, setMessage] = useState(""); const [maxMessageToShown, setMaxMessageToShown] = useState(10); const [searchedUsers, setSearchedUsers] = useState([]); const ref = React.createRef(); function handleSubmit(e: React.FormEvent) { e.preventDefault(); axios .post(`/api/channels/${name}/messages/send`, { token, message}) .then(() => { setMessage(""); setSearchedUsers([]); }) .catch((err) => { console.error(err.response); }); } function deleteMessage(message_id: number) { axios .post(`/api/channels/${name}/messages/delete`, { token, message_id }) .catch((err) => { console.error(err.response); }); } function purgeChannel() { axios .post(`/api/channels/${name}/purge`, { token }) .catch((err) => { console.error(err.response); } ); } useEffect(() => { const localToken = localStorage.getItem("token"); if (localToken) { setToken(localToken); axios.post("/api/auth/me", { token: localToken }).then((res) => { setUser(res.data); } ); } axios.get(`/api/channels/${name}`).then((res) => { setChannel(res.data); }); axios.get(`/api/channels/${name}/messages`).then((res) => { setMessages(res.data); }); }, [name]); useEffect(() => { socket.addEventListener('message', function (event) { const data = JSON.parse(event.data); if ((data.type === "new_message" || data.type === "delete_message" || data.type === "purge_channel") && data.channel_id === channel?.id) { axios .get(`/api/channels/${name}/messages`).then((res) => { setMessages(res.data) }) } }); }, [channel]) useEffect(() => { const words = message.toString().split(" "); const lastWord = words[words.length - 1]; if (lastWord && lastWord.startsWith("@")) { const username = lastWord.slice(1); axios .get(`/api/searchuser?search=${username}`) .then((res) => { setSearchedUsers(res.data); }) .catch((err) => { console.error(err.response); }); } else { setSearchedUsers([]); } }, [message]); if (!channel || !messages) { return (

Loading...

) } return (

Channel {channel.name}

{channel.description}

Owner: {channel.owner_username}

{channel.name.toLowerCase().includes("cat") && ( cat )} {user?.admin && ( )} {token ? (
setMessage(e.target.value)} ref={ref} /> {searchedUsers.length > 0 && (
{searchedUsers.map((user) => (
{user.username}
))}
)}
) : (
Login Register
)}
{messages.slice(0, maxMessageToShown).map((message) => ( ))} {messages.length > maxMessageToShown && ( )}
); }