import React from "react"; import { MapDiscussion, MapDiscussions, MapDiscussionsDetail, } from "@customTypes/Map"; import { MapDiscussionContent } from "@customTypes/Content"; import { time_ago } from "@utils/Time"; import { API } from "@api/Api"; import "@css/Maps.css"; import { Link } from "react-router-dom"; import useConfirm from "@hooks/UseConfirm"; interface DiscussionsProps { token?: string; data?: MapDiscussions; isModerator: boolean; mapID: string; onRefresh: () => void; } const Discussions: React.FC = ({ token, data, isModerator, mapID, onRefresh, }) => { const { confirm, ConfirmDialogComponent } = useConfirm(); const [discussionThread, setDiscussionThread] = React.useState< MapDiscussion | undefined >(undefined); const [discussionSearch, setDiscussionSearch] = React.useState(""); const [createDiscussion, setCreateDiscussion] = React.useState(false); const [createDiscussionContent, setCreateDiscussionContent] = React.useState({ title: "", content: "", }); const [createDiscussionCommentContent, setCreateDiscussionCommentContent] = React.useState(""); const _open_map_discussion = async (discussion_id: number) => { const mapDiscussion = await API.get_map_discussion(mapID, discussion_id); setDiscussionThread(mapDiscussion); }; const _create_map_discussion = async () => { if (token) { await API.post_map_discussion(token, mapID, createDiscussionContent); setCreateDiscussion(false); onRefresh(); } }; const _create_map_discussion_comment = async (discussion_id: number) => { if (token) { await API.post_map_discussion_comment( token, mapID, discussion_id, createDiscussionCommentContent ); await _open_map_discussion(discussion_id); } }; const _delete_map_discussion = async (discussion: MapDiscussionsDetail) => { if ( await confirm( "Delete Map Discussion", `Are you sure you want to remove post: ${discussion.title}?` ) ) { if (token) { await API.delete_map_discussion(token, mapID, discussion.id); onRefresh(); } } }; return (
{ConfirmDialogComponent} { // janky ternary operators here, could divide them to more components? createDiscussion ? (
Create Post
setCreateDiscussionContent({ ...createDiscussionContent, title: e.target.value, }) } /> setCreateDiscussionContent({ ...createDiscussionContent, content: e.target.value, }) } />
) : discussionThread ? (
{discussionThread.discussion.title}
{discussionThread.discussion.creator.user_name} {time_ago( new Date( discussionThread.discussion.created_at .replace("T", " ") .replace("Z", "") ) )} {discussionThread.discussion.content}
{discussionThread.discussion.comments ? discussionThread.discussion.comments .sort( (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime() ) .map((e) => ( <>
{e.user.user_name} {time_ago( new Date( e.date.replace("T", " ").replace("Z", "") ) )} {e.comment}
)) : ""}
e.key === "Enter" && _create_map_discussion_comment(discussionThread.discussion.id) } onChange={(e) => setCreateDiscussionCommentContent(e.target.value) } />
) : data ? ( <> {data.discussions .filter((f) => f.title.includes(discussionSearch)) .sort( (a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime() ) .map((e, i) => (
) : ( )} {e.creator.user_name}: {e.content} Last Updated:{" "} {time_ago( new Date( e.updated_at.replace("T", " ").replace("Z", "") ) )}
))} ) : ( No Discussions... ) }
); }; export default Discussions;