import React from 'react'; import { MapDiscussion, MapDiscussions, MapDiscussionsDetail } from '@customTypes/Map'; import { MapDiscussionCommentContent, 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(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;