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;