diff --git a/app/scenes/CollectionDelete.tsx b/app/components/CollectionDeleteDialog.tsx
similarity index 57%
rename from app/scenes/CollectionDelete.tsx
rename to app/components/CollectionDeleteDialog.tsx
index 56d15a0cf..27a82ec63 100644
--- a/app/scenes/CollectionDelete.tsx
+++ b/app/components/CollectionDeleteDialog.tsx
@@ -3,12 +3,10 @@ import * as React from "react";
import { useTranslation, Trans } from "react-i18next";
import { useHistory } from "react-router-dom";
import Collection from "~/models/Collection";
-import Button from "~/components/Button";
-import Flex from "~/components/Flex";
+import ConfirmationDialog from "~/components/ConfirmationDialog";
import Text from "~/components/Text";
import useCurrentTeam from "~/hooks/useCurrentTeam";
import useStores from "~/hooks/useStores";
-import useToasts from "~/hooks/useToasts";
import { homePath } from "~/utils/routeHelpers";
type Props = {
@@ -16,39 +14,29 @@ type Props = {
onSubmit: () => void;
};
-function CollectionDelete({ collection, onSubmit }: Props) {
- const [isDeleting, setIsDeleting] = React.useState(false);
+function CollectionDeleteDialog({ collection, onSubmit }: Props) {
const team = useCurrentTeam();
- const { showToast } = useToasts();
const { ui } = useStores();
const history = useHistory();
const { t } = useTranslation();
- const handleSubmit = React.useCallback(
- async (ev: React.SyntheticEvent) => {
- ev.preventDefault();
- setIsDeleting(true);
- try {
- const redirect = collection.id === ui.activeCollectionId;
- await collection.delete();
- onSubmit();
- if (redirect) {
- history.push(homePath());
- }
- } catch (err) {
- showToast(err.message, {
- type: "error",
- });
- } finally {
- setIsDeleting(false);
- }
- },
- [collection, history, onSubmit, showToast, ui.activeCollectionId]
- );
+ const handleSubmit = async () => {
+ const redirect = collection.id === ui.activeCollectionId;
+ await collection.delete();
+ onSubmit();
+ if (redirect) {
+ history.push(homePath());
+ }
+ };
return (
-
-
-
+ >
+
);
}
-export default observer(CollectionDelete);
+export default observer(CollectionDeleteDialog);
diff --git a/app/components/ConfirmationDialog.tsx b/app/components/ConfirmationDialog.tsx
index ac5baffa1..590be3d4f 100644
--- a/app/components/ConfirmationDialog.tsx
+++ b/app/components/ConfirmationDialog.tsx
@@ -7,20 +7,23 @@ import useStores from "~/hooks/useStores";
import useToasts from "~/hooks/useToasts";
type Props = {
- onSubmit: () => void;
- children: JSX.Element;
+ /** Callback when the dialog is submitted */
+ onSubmit: () => Promise | void;
+ /** Text to display on the submit button */
submitText?: string;
+ /** Text to display while the form is saving */
savingText?: string;
+ /** If true, the submit button will be a dangerous red */
danger?: boolean;
};
-function ConfirmationDialog({
+const ConfirmationDialog: React.FC = ({
onSubmit,
children,
submitText,
savingText,
danger,
-}: Props) {
+}) => {
const [isSaving, setIsSaving] = React.useState(false);
const { dialogs } = useStores();
const { showToast } = useToasts();
@@ -53,6 +56,6 @@ function ConfirmationDialog({
);
-}
+};
export default observer(ConfirmationDialog);
diff --git a/app/components/Flex.tsx b/app/components/Flex.tsx
index ba3afef95..788606591 100644
--- a/app/components/Flex.tsx
+++ b/app/components/Flex.tsx
@@ -11,11 +11,19 @@ const Flex = styled.div<{
align?: AlignValues;
justify?: JustifyValues;
shrink?: boolean;
+ reverse?: boolean;
gap?: number;
}>`
display: flex;
flex: ${({ auto }) => (auto ? "1 1 auto" : "initial")};
- flex-direction: ${({ column }) => (column ? "column" : "row")};
+ flex-direction: ${({ column, reverse }) =>
+ reverse
+ ? column
+ ? "column-reverse"
+ : "row-reverse"
+ : column
+ ? "column"
+ : "row"};
align-items: ${({ align }) => align};
justify-content: ${({ justify }) => justify};
flex-shrink: ${({ shrink }) => (shrink ? 1 : "initial")};
diff --git a/app/components/Modal.tsx b/app/components/Modal.tsx
index 0d3c814a6..59875d199 100644
--- a/app/components/Modal.tsx
+++ b/app/components/Modal.tsx
@@ -67,6 +67,7 @@ const Modal: React.FC = ({