From a65d6d9127c3fa7f6a8ecaec5d1ffd1f47c2bc98 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:08:53 +0300 Subject: refactor: port to typescript --- frontend/src/components/Discussions.tsx | 151 ++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 frontend/src/components/Discussions.tsx (limited to 'frontend/src/components/Discussions.tsx') diff --git a/frontend/src/components/Discussions.tsx b/frontend/src/components/Discussions.tsx new file mode 100644 index 0000000..1cd3523 --- /dev/null +++ b/frontend/src/components/Discussions.tsx @@ -0,0 +1,151 @@ +import React from 'react'; + +import { MapDiscussion, MapDiscussions, MapDiscussionsDetail } from '../types/Map'; +import { MapDiscussionCommentContent, MapDiscussionContent } from '../types/Content'; +import { time_ago } from '../utils/Time'; +import { API } from '../api/Api'; +import "../css/Maps.css" + +interface DiscussionsProps { + data?: MapDiscussions; + isModerator: boolean; + mapID: string; + onRefresh: () => void; +} + +const Discussions: React.FC = ({ data, isModerator, mapID, onRefresh }) => { + + 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({ + comment: "", + }); + + 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 () => { + await API.post_map_discussion(mapID, createDiscussionContent); + setCreateDiscussion(false); + onRefresh(); + }; + + const _create_map_discussion_comment = async (discussion_id: number) => { + await API.post_map_discussion_comment(mapID, discussion_id, createDiscussionCommentContent); + await _open_map_discussion(discussion_id); + }; + + const _delete_map_discussion = async (discussion: MapDiscussionsDetail) => { + if (window.confirm(`Are you sure you want to remove post: ${discussion.title}?`)) { + await API.delete_map_discussion(mapID, discussion.id); + onRefresh(); + } + }; + + return ( +
+ + + { // janky ternary operators here, could divide them to more components? + createDiscussion ? + ( +
+ Create Post + +
+ setCreateDiscussionContent({ + ...createDiscussionContent, + title: e.target.value, + })} /> + setCreateDiscussionContent({ + ...createDiscussionContent, + title: 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({ + ...createDiscussionContent, + comment: 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; -- cgit v1.2.3