generated from lucien/api-template
161 lines
No EOL
5.3 KiB
TypeScript
161 lines
No EOL
5.3 KiB
TypeScript
import { Link, useParams, useNavigate } from "react-router-dom";
|
|
import { useEffect, useState } from "react";
|
|
import { User, Messages } from "../types";
|
|
import TopBar from "../components/TopBar";
|
|
import MessageComponent from "../components/MessageComponent";
|
|
import axios from "axios";
|
|
|
|
import "../styles/UserPage.css";
|
|
|
|
export default function UserPage({socket}: {socket: WebSocket}) {
|
|
const navigate = useNavigate();
|
|
const { username } = useParams();
|
|
const [pageUser, setPageUser] = useState<User>();
|
|
const [messages, setMessages] = useState<Messages>();
|
|
const [user, setUser] = useState<User>();
|
|
const [noUser, setNoUser] = useState<boolean>(false);
|
|
const [token, setToken] = useState<string>("");
|
|
|
|
function deleteUser() {
|
|
if (!window.confirm(`Are you sure you want to delete ${pageUser?.username}?`)) {
|
|
return;
|
|
}
|
|
axios
|
|
.post(`/api/users/${pageUser?.username}/delete`, { token })
|
|
.then(() => {
|
|
navigate("/");
|
|
})
|
|
.catch((err) => {
|
|
console.error(err.response.data);
|
|
});
|
|
}
|
|
|
|
function deleteUserPfp() {
|
|
if (!window.confirm(`Are you sure you want to delete ${pageUser?.username}'s profile picture?`)) {
|
|
return;
|
|
}
|
|
axios
|
|
.post(`/api/users/${pageUser?.username}/deletepfp`, { token })
|
|
.then(() => {
|
|
window.location.reload();
|
|
})
|
|
.catch((err) => {
|
|
console.error(err.response.data);
|
|
});
|
|
}
|
|
|
|
useEffect(() => {
|
|
const localToken = localStorage.getItem("token");
|
|
|
|
if (localToken) {
|
|
setToken(localToken);
|
|
axios
|
|
.post("/api/auth/me", { token: localToken }).then((res) => {
|
|
setUser(res.data);
|
|
});
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
axios
|
|
.get(`/api/users/${username}`)
|
|
.then((res) => {
|
|
setPageUser(res.data);
|
|
})
|
|
.catch((err) => {
|
|
if (err.response.data.error === "No user found") {
|
|
setNoUser(true);
|
|
}
|
|
console.error(err.response.data);
|
|
});
|
|
|
|
axios
|
|
.get(`/api/users/${username}/lastmessages`)
|
|
.then((res) => {
|
|
setMessages(res.data);
|
|
})
|
|
.catch((err) => {
|
|
console.error(err.response.data);
|
|
});
|
|
}, [username]);
|
|
|
|
useEffect(() => {
|
|
socket.addEventListener('message', function (event) {
|
|
const data = JSON.parse(event.data);
|
|
if (((data.type === "new_message" || data.type === "delete_message") && data.user_id === pageUser?.id) || data.type === "purge_channel" || data.type === "delete_channel") {
|
|
axios
|
|
.get(`/api/users/${username}/lastmessages`)
|
|
.then((res) => {
|
|
setMessages(res.data);
|
|
})
|
|
.catch((err) => {
|
|
console.error(err.response);
|
|
});
|
|
}
|
|
});
|
|
}, [pageUser]);
|
|
|
|
if (noUser) {
|
|
return (
|
|
<div className="user-page">
|
|
<TopBar user={user} />
|
|
<div className="user">
|
|
<h2>User Not Found</h2>
|
|
<p>Sorry, the user you are looking for does not exist.</p>
|
|
<Link to="/">Go back to the homepage</Link>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
if (!pageUser) {
|
|
return (
|
|
<div className="user-page">
|
|
<TopBar user={user} />
|
|
<div className="user">
|
|
<h2>Loading...</h2>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<div className="user-page">
|
|
<TopBar user={user} />
|
|
<div className="user">
|
|
<div className="user-top">
|
|
<img src={`/api/users/${pageUser.username}/pfp`} alt="pfp" className="user-page-pfp" />
|
|
<h2>{pageUser.username}</h2>
|
|
</div>
|
|
{pageUser.admin ? <p>Admin</p> : <p>User</p>}
|
|
{pageUser.id === user?.id && (
|
|
<Link to="/edit-profile">Edit profile</Link>
|
|
)}
|
|
{user?.admin == 1 && (
|
|
<div>
|
|
<button onClick={deleteUser}>
|
|
Delete user
|
|
</button>
|
|
<button onClick={deleteUserPfp}>
|
|
Delete profile picture
|
|
</button>
|
|
</div>
|
|
)}
|
|
</div>
|
|
<div className="user-messages">
|
|
<h2>Last messages</h2>
|
|
<div className="messages-list">
|
|
{messages?.map((message) => (
|
|
<MessageComponent
|
|
key={message.id}
|
|
message={message}
|
|
user={pageUser}
|
|
channel={undefined}
|
|
deleteMessage={undefined}
|
|
/>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
} |