diff --git a/web/apps/photos/src/components/Upload/UploadTypeSelector.tsx b/web/apps/photos/src/components/Upload/UploadTypeSelector.tsx index 0a055764ec..b989983f20 100644 --- a/web/apps/photos/src/components/Upload/UploadTypeSelector.tsx +++ b/web/apps/photos/src/components/Upload/UploadTypeSelector.tsx @@ -1,7 +1,7 @@ import { useIsTouchscreen } from "@/base/hooks"; -import { FocusVisibleButton } from "@/new/photos/components/FocusVisibleButton"; import { SpaceBetweenFlex } from "@/new/photos/components/mui"; import { DialogCloseIconButton } from "@/new/photos/components/mui/Dialog"; +import { FocusVisibleButton } from "@/new/photos/components/mui/FocusVisibleButton"; import DialogTitleWithCloseButton, { dialogCloseHandler, } from "@ente/shared/components/DialogBox/TitleWithCloseButton"; diff --git a/web/packages/new/photos/components/CollectionMappingChoiceDialog.tsx b/web/packages/new/photos/components/CollectionMappingChoiceDialog.tsx index 5c16915dc9..89ea187304 100644 --- a/web/packages/new/photos/components/CollectionMappingChoiceDialog.tsx +++ b/web/packages/new/photos/components/CollectionMappingChoiceDialog.tsx @@ -1,5 +1,4 @@ import type { CollectionMapping } from "@/base/types/ipc"; -import { FocusVisibleButton } from "@/new/photos/components/FocusVisibleButton"; import FolderIcon from "@mui/icons-material/Folder"; import FolderCopyIcon from "@mui/icons-material/FolderCopy"; import { @@ -16,6 +15,7 @@ import { DialogCloseIconButton, type DialogVisibilityProps, } from "./mui/Dialog"; +import { FocusVisibleButton } from "./mui/FocusVisibleButton"; type CollectionMappingChoiceModalProps = DialogVisibilityProps & { didSelect: (mapping: CollectionMapping) => void; diff --git a/web/packages/new/photos/components/DevSettings.tsx b/web/packages/new/photos/components/DevSettings.tsx index 2235a1b60d..89e0273fb7 100644 --- a/web/packages/new/photos/components/DevSettings.tsx +++ b/web/packages/new/photos/components/DevSettings.tsx @@ -18,7 +18,7 @@ import { useFormik } from "formik"; import { t } from "i18next"; import React, { useEffect, useState } from "react"; import { z } from "zod"; -import { FocusVisibleButton } from "./FocusVisibleButton"; +import { FocusVisibleButton } from "./mui/FocusVisibleButton"; import { SlideUpTransition } from "./mui/SlideUpTransition"; interface DevSettingsProps { diff --git a/web/packages/new/photos/components/SingleInputFormV2.tsx b/web/packages/new/photos/components/SingleInputFormV2.tsx index 1caa137090..a13287683e 100644 --- a/web/packages/new/photos/components/SingleInputFormV2.tsx +++ b/web/packages/new/photos/components/SingleInputFormV2.tsx @@ -2,7 +2,6 @@ import log from "@/base/log"; import { wait } from "@/utils/promise"; import { Box, - CircularProgress, Dialog, DialogContent, DialogTitle, @@ -12,8 +11,9 @@ import { import { useFormik } from "formik"; import { t } from "i18next"; import React from "react"; -import { FocusVisibleButton } from "./FocusVisibleButton"; import type { DialogVisibilityProps } from "./mui/Dialog"; +import { FocusVisibleButton } from "./mui/FocusVisibleButton"; +import { LoadingButton } from "./mui/LoadingButton"; type SingleInputFormProps = Pick< TextFieldProps, @@ -109,24 +109,14 @@ export const SingleInputFormV2: React.FC = ({ > {t("cancel")} - - {formik.isSubmitting ? ( - - ) : ( - submitButtonTitle - )} - + {submitButtonTitle} + ); @@ -169,6 +159,7 @@ export const SingleInputDialogTest: React.FC = ({ autoFocus label="Add name" placeholder="Enter name" + initialValue="tt" submitButtonTitle="Add person" onCancel={onClose} onSubmit={handleSubmit} diff --git a/web/packages/new/photos/components/WhatsNew.tsx b/web/packages/new/photos/components/WhatsNew.tsx index 997afc30e8..1a8555d244 100644 --- a/web/packages/new/photos/components/WhatsNew.tsx +++ b/web/packages/new/photos/components/WhatsNew.tsx @@ -14,7 +14,7 @@ import { } from "@mui/material"; import React, { useEffect } from "react"; import { didShowWhatsNew } from "../services/changelog"; -import { FocusVisibleButton } from "./FocusVisibleButton"; +import { FocusVisibleButton } from "./mui/FocusVisibleButton"; import { SlideUpTransition } from "./mui/SlideUpTransition"; interface WhatsNewProps { diff --git a/web/packages/new/photos/components/FocusVisibleButton.tsx b/web/packages/new/photos/components/mui/FocusVisibleButton.tsx similarity index 100% rename from web/packages/new/photos/components/FocusVisibleButton.tsx rename to web/packages/new/photos/components/mui/FocusVisibleButton.tsx diff --git a/web/packages/new/photos/components/mui/LoadingButton.tsx b/web/packages/new/photos/components/mui/LoadingButton.tsx new file mode 100644 index 0000000000..af328e3457 --- /dev/null +++ b/web/packages/new/photos/components/mui/LoadingButton.tsx @@ -0,0 +1,37 @@ +import { CircularProgress, type ButtonProps } from "@mui/material"; +import React from "react"; +import { FocusVisibleButton } from "./FocusVisibleButton"; + +/** + * A button that shows a indeterminate progress indicator if the {@link loading} + * prop is set. + * + * The button is also disabled when in the loading state. + * + * TODO: This duplicates the existing SubmitButton and EnteButton. Merge these + * three gradually (didn't want to break existing layouts, so will do it + * piecewise). + */ +export const LoadingButton: React.FC = ({ + loading, + disabled, + color, + sx, + children, + ...rest +}) => ( + + {loading ? : children} + +); diff --git a/web/packages/shared/components/DialogBox/index.tsx b/web/packages/shared/components/DialogBox/index.tsx index 74fca76b77..b0f4b67928 100644 --- a/web/packages/shared/components/DialogBox/index.tsx +++ b/web/packages/shared/components/DialogBox/index.tsx @@ -1,4 +1,4 @@ -import { FocusVisibleButton } from "@/new/photos/components/FocusVisibleButton"; +import { FocusVisibleButton } from "@/new/photos/components/mui/FocusVisibleButton"; import { Breakpoint, DialogActions,