import { useParams, Link, useNavigate } from "react-router-dom"; import React, { useEffect, useState } from "react"; import { Channel, Messages, User, Users, Emojis } 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 navigate = useNavigate(); 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 [searchedEmojis, setSearchedEmojis] = useState([]); const [noChannel, setNoChannel] = useState(false); 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 purgeChannel() { if (!window.confirm(`Are you sure you want to purge ${channel?.name}?`)) { return; } axios .post(`/api/channels/${name}/purge`, { token }) .catch((err) => { console.error(err.response); } ); } function deleteChannel() { if (!window.confirm(`Are you sure you want to delete ${channel?.name}?`)) { return; } axios .post(`/api/channels/${name}/delete`, { token }) .then(() => { navigate("/"); }) .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); }) .catch((err) => { console.error(err.response.data); }); } axios .get(`/api/channels/${name}`).then((res) => { setChannel(res.data); }) .catch((err) => { if (err.response.data.error === 'No channel found') { setNoChannel(true); } console.error(err.response.data); }); axios .get(`/api/channels/${name}/messages`).then((res) => { setMessages(res.data); }) .catch((err) => { console.error(err.response.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) }) } if (data.type === "delete_channel" && data.channel_id === channel?.id) { navigate("/"); } }); }, [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.data); }); } else { setSearchedUsers([]); } if (lastWord && lastWord.startsWith(":")) { const emojiName = lastWord.slice(1); axios .get(`/api/searchemojis?search=${emojiName}`) .then((res) => { setSearchedEmojis(res.data); }) .catch((err) => { console.error(err.response.data); }); } else { setSearchedEmojis([]); } }, [message]); if (noChannel) { return (

Channel Not Found

Sorry, the channel you are looking for does not exist.

Go back to the homepage
) } if (!channel) { return (

Loading...

) } return (

Channel {channel.name}

{channel.description}

Owner: {channel.owner_username}

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

No messages yet.

} {messages.slice(0, maxMessageToShown).map((message) => ( ))} {messages.length > maxMessageToShown && ( )}
) : (

Loading messages...

)}
); }