From 40b4871c3f7bfe04f332ae7fb687fd7d9ae34734 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 14 Sep 2023 23:47:16 +0800 Subject: ... --- .../src/pages/timeline/ConnectionStatusBadge.css | 2 +- .../src/pages/timeline/ConnectionStatusBadge.tsx | 21 +- FrontEnd/src/pages/timeline/MarkdownPostEdit.css | 34 --- FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx | 216 ---------------- FrontEnd/src/pages/timeline/Timeline.tsx | 2 +- .../src/pages/timeline/TimelinePostCreateView.css | 54 ---- .../src/pages/timeline/TimelinePostCreateView.tsx | 272 --------------------- .../timeline/TimelinePropertyChangeDialog.tsx | 16 +- FrontEnd/src/pages/timeline/edit/ImagePostEdit.css | 4 + FrontEnd/src/pages/timeline/edit/ImagePostEdit.tsx | 36 +++ .../src/pages/timeline/edit/MarkdownPostEdit.css | 34 +++ .../src/pages/timeline/edit/MarkdownPostEdit.tsx | 216 ++++++++++++++++ .../src/pages/timeline/edit/PlainTextPostEdit.css | 18 ++ .../src/pages/timeline/edit/PlainTextPostEdit.tsx | 26 ++ .../pages/timeline/edit/TimelinePostCreateView.css | 33 +++ .../pages/timeline/edit/TimelinePostCreateView.tsx | 200 +++++++++++++++ 16 files changed, 583 insertions(+), 601 deletions(-) delete mode 100644 FrontEnd/src/pages/timeline/MarkdownPostEdit.css delete mode 100644 FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx delete mode 100644 FrontEnd/src/pages/timeline/TimelinePostCreateView.css delete mode 100644 FrontEnd/src/pages/timeline/TimelinePostCreateView.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/ImagePostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/ImagePostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/MarkdownPostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/MarkdownPostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/PlainTextPostEdit.css create mode 100644 FrontEnd/src/pages/timeline/edit/PlainTextPostEdit.tsx create mode 100644 FrontEnd/src/pages/timeline/edit/TimelinePostCreateView.css create mode 100644 FrontEnd/src/pages/timeline/edit/TimelinePostCreateView.tsx diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css index fc01484e..f2f8df66 100644 --- a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.css @@ -22,7 +22,7 @@ } .connection-status-badge.warning { - color: #e4a700; + color: #e4a700; /* TODO: Warning color */ } .connection-status-badge.warning::before { diff --git a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx index 2b820454..63990878 100644 --- a/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx +++ b/FrontEnd/src/pages/timeline/ConnectionStatusBadge.tsx @@ -1,14 +1,13 @@ -import * as React from "react"; -import classnames from "classnames"; +import classNames from "classnames"; import { HubConnectionState } from "@microsoft/signalr"; -import { useTranslation } from "react-i18next"; + +import { useC }from '~/src/components/common'; import "./ConnectionStatusBadge.css"; -export interface ConnectionStatusBadgeProps { +interface ConnectionStatusBadgeProps { status: HubConnectionState; className?: string; - style?: React.CSSProperties; } const classNameMap: Record = { @@ -19,23 +18,19 @@ const classNameMap: Record = { Reconnecting: "warning", }; -const ConnectionStatusBadge: React.FC = (props) => { - const { status, className, style } = props; - - const { t } = useTranslation(); +export default function ConnectionStatusBadge({status, className}: ConnectionStatusBadgeProps) { + const c = useC(); return (
- {t(`connectionState.${status}`)} + {c(`connectionState.${status}`)}
); }; -export default ConnectionStatusBadge; diff --git a/FrontEnd/src/pages/timeline/MarkdownPostEdit.css b/FrontEnd/src/pages/timeline/MarkdownPostEdit.css deleted file mode 100644 index 33a77943..00000000 --- a/FrontEnd/src/pages/timeline/MarkdownPostEdit.css +++ /dev/null @@ -1,34 +0,0 @@ -.timeline-markdown-post-edit-page { - overflow: auto; - max-height: 300px; -} - -.timeline-post-create-markdown-edit-area { - border: 1px solid var(--cru-clickable-primary-normal-color); - border-top: none; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - padding: 0.6em; -} - -.timeline-post-create-markdown-edit-area:hover { - border: 1px solid var(--cru-clickable-primary-normal-color); - border-top: none; -} - -.timeline-markdown-post-edit-image-container { - position: relative; - text-align: center; - margin-bottom: 1em; -} - -.timeline-markdown-post-edit-image { - max-width: 100%; - max-height: 200px; -} - -.timeline-markdown-post-edit-image-delete-button { - position: absolute; - right: 10px; - top: 2px; -} diff --git a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx b/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx deleted file mode 100644 index d10d3f2d..00000000 --- a/FrontEnd/src/pages/timeline/MarkdownPostEdit.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import * as React from "react"; -import classnames from "classnames"; -import { useTranslation } from "react-i18next"; - -import { - getHttpTimelineClient, - HttpTimelinePostInfo, -} from "~src/http/timeline"; - -import TimelinePostBuilder from "~src/services/TimelinePostBuilder"; - -import FlatButton from "~src/components/button/FlatButton"; -import { TabPages } from "~src/components/tab"; -import ConfirmDialog from "~src/components/dialog/ConfirmDialog"; -import Spinner from "~src/components/Spinner"; -import IconButton from "~src/components/button/IconButton"; -import { DialogProvider, useDialog } from "~src/components/dialog"; - -import "./MarkdownPostEdit.css"; - -export interface MarkdownPostEditProps { - owner: string; - timeline: string; - onPosted: (post: HttpTimelinePostInfo) => void; - onPostError: () => void; - onClose: () => void; - className?: string; -} - -const MarkdownPostEdit: React.FC = ({ - owner: ownerUsername, - timeline: timelineName, - onPosted, - onClose, - onPostError, - className, -}) => { - const { t } = useTranslation(); - - const [canLeave, setCanLeave] = React.useState(true); - - const [process, setProcess] = React.useState(false); - - const { controller, switchDialog } = useDialog({ - "leave-confirm": ( - - ), - }); - - const [text, _setText] = React.useState(""); - const [images, _setImages] = React.useState<{ file: File; url: string }[]>( - [], - ); - const [previewHtml, _setPreviewHtml] = React.useState(""); - - const _builder = React.useRef(null); - - const getBuilder = (): TimelinePostBuilder => { - if (_builder.current == null) { - const builder = new TimelinePostBuilder(() => { - setCanLeave(builder.isEmpty); - _setText(builder.text); - _setImages(builder.images); - _setPreviewHtml(builder.renderHtml()); - }); - _builder.current = builder; - } - return _builder.current; - }; - - const canSend = text.length > 0; - - React.useEffect(() => { - return () => { - getBuilder().dispose(); - }; - }, []); - - React.useEffect(() => { - window.onbeforeunload = (): unknown => { - if (!canLeave) { - return t("timeline.confirmLeave"); - } - }; - - return () => { - window.onbeforeunload = null; - }; - }, [canLeave, t]); - - const send = async (): Promise => { - setProcess(true); - try { - const dataList = await getBuilder().build(); - const post = await getHttpTimelineClient().postPost( - ownerUsername, - timelineName, - { - dataList, - }, - ); - onPosted(post); - onClose(); - } catch (e) { - setProcess(false); - onPostError(); - } - }; - - return ( - <> - - ) : ( -
- { - if (canLeave) { - onClose(); - } else { - switchDialog("leave-confirm"); - } - }} - /> - {canSend && ( - void send()} /> - )} -
- ) - } - pages={[ - { - name: "text", - text: "edit", - page: ( -