From 13f6f2a451feede8037d18cfbac64843e108ccbd Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 29 Jul 2023 18:26:24 +0800 Subject: ... --- FrontEnd/src/pages/setting/index.tsx | 42 ++++++++++++---------- FrontEnd/src/views/common/button/Button.css | 2 +- FrontEnd/src/views/common/button/LoadingButton.css | 14 ++++++++ FrontEnd/src/views/common/button/LoadingButton.tsx | 20 +++++------ FrontEnd/src/views/common/dialog/Dialog.css | 1 + FrontEnd/src/views/common/dialog/Dialog.tsx | 10 ++++-- .../src/views/common/dialog/OperationDialog.tsx | 1 - FrontEnd/src/views/common/input/InputGroup.tsx | 2 +- 8 files changed, 57 insertions(+), 35 deletions(-) create mode 100644 FrontEnd/src/views/common/button/LoadingButton.css diff --git a/FrontEnd/src/pages/setting/index.tsx b/FrontEnd/src/pages/setting/index.tsx index 2599f2f5..cec81530 100644 --- a/FrontEnd/src/pages/setting/index.tsx +++ b/FrontEnd/src/pages/setting/index.tsx @@ -282,25 +282,29 @@ export default function SettingPage() { open={dialog === "change-password"} close={() => setDialog(null)} /> - setDialog(null)} - open={dialog === "logout"} - onConfirm={() => { - void userService.logout().then(() => { - navigate("/"); - }); - }} - /> - setDialog(null)} - /> - setDialog(null)} - /> + {user && ( + <> + setDialog(null)} + open={dialog === "logout"} + onConfirm={() => { + void userService.logout().then(() => { + navigate("/"); + }); + }} + /> + setDialog(null)} + /> + setDialog(null)} + /> + + )} ); } diff --git a/FrontEnd/src/views/common/button/Button.css b/FrontEnd/src/views/common/button/Button.css index fe619f9d..14b019b9 100644 --- a/FrontEnd/src/views/common/button/Button.css +++ b/FrontEnd/src/views/common/button/Button.css @@ -56,7 +56,7 @@ border-color: var(--cru-key-2-color); } -.cru-button.outline:disabled { +.cru-button.outline:not(.cru-loading-button):disabled { color: var(--cru-surface-on-color); border-color: var(--cru-surface-on-color); background-color: white; diff --git a/FrontEnd/src/views/common/button/LoadingButton.css b/FrontEnd/src/views/common/button/LoadingButton.css new file mode 100644 index 00000000..8d929383 --- /dev/null +++ b/FrontEnd/src/views/common/button/LoadingButton.css @@ -0,0 +1,14 @@ +.cru-loading-button { + display: flex; + align-items: center; +} + +.cru-loading-button:disabled { + color: var(--cru-key-2-color); + border-color: var(--cru-key-2-color); + cursor: auto; +} + +.cru-loading-button-spinner { + margin-left: 0.5em; +} diff --git a/FrontEnd/src/views/common/button/LoadingButton.tsx b/FrontEnd/src/views/common/button/LoadingButton.tsx index 249f3e1d..f23369de 100644 --- a/FrontEnd/src/views/common/button/LoadingButton.tsx +++ b/FrontEnd/src/views/common/button/LoadingButton.tsx @@ -1,19 +1,19 @@ -import * as React from "react"; import classNames from "classnames"; -import { useTranslation } from "react-i18next"; -import { I18nText, ThemeColor, convertI18nText } from "../common"; +import { I18nText, ThemeColor, useC } from "../common"; import Spinner from "../Spinner"; +import "./LoadingButton.css"; + interface LoadingButtonProps extends React.ComponentPropsWithoutRef<"button"> { color?: ThemeColor; text?: I18nText; loading?: boolean; } -function LoadingButton(props: LoadingButtonProps): JSX.Element { - const { t } = useTranslation(); +export default function LoadingButton(props: LoadingButtonProps) { + const c = useC(); const { color, text, loading, className, children, ...otherProps } = props; @@ -23,17 +23,15 @@ function LoadingButton(props: LoadingButtonProps): JSX.Element { return ( ); } - -export default LoadingButton; diff --git a/FrontEnd/src/views/common/dialog/Dialog.css b/FrontEnd/src/views/common/dialog/Dialog.css index 8f12614b..0123a29d 100644 --- a/FrontEnd/src/views/common/dialog/Dialog.css +++ b/FrontEnd/src/views/common/dialog/Dialog.css @@ -6,6 +6,7 @@ right: 0; bottom: 0; display: flex; + align-items: center; overflow: auto; } diff --git a/FrontEnd/src/views/common/dialog/Dialog.tsx b/FrontEnd/src/views/common/dialog/Dialog.tsx index 9ce344dc..2ff7bea8 100644 --- a/FrontEnd/src/views/common/dialog/Dialog.tsx +++ b/FrontEnd/src/views/common/dialog/Dialog.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from "react"; +import { ReactNode, useRef } from "react"; import ReactDOM from "react-dom"; import { CSSTransition } from "react-transition-group"; import classNames from "classnames"; @@ -30,15 +30,21 @@ export default function Dialog({ }: DialogProps) { color = color ?? "primary"; + const nodeRef = useRef(null); + return ReactDOM.createPortal( -
+
(props: OperationDialogProps) { {c("operationDialog.confirm")} diff --git a/FrontEnd/src/views/common/input/InputGroup.tsx b/FrontEnd/src/views/common/input/InputGroup.tsx index eed8266b..858fa1a5 100644 --- a/FrontEnd/src/views/common/input/InputGroup.tsx +++ b/FrontEnd/src/views/common/input/InputGroup.tsx @@ -294,7 +294,7 @@ export function useInputs(options: { init: Initializer }): { }, }); - if (Object.keys(newErrors).length === 0) { + if (Object.keys(newErrors).length !== 0) { return { type: "error", errors: newErrors, -- cgit v1.2.3