Files
sign/apps/remix/app/components/dialogs/document-duplicate-dialog.tsx

130 lines
3.6 KiB
TypeScript
Raw Normal View History

2025-01-02 15:33:37 +11:00
import { msg } from '@lingui/core/macro';
2024-08-27 20:34:39 +09:00
import { useLingui } from '@lingui/react';
2025-01-02 15:33:37 +11:00
import { Trans } from '@lingui/react/macro';
import { useNavigate } from 'react-router';
2024-08-27 20:34:39 +09:00
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
2023-11-08 09:25:44 +00:00
import { trpc as trpcReact } from '@documenso/trpc/react';
import { Button } from '@documenso/ui/primitives/button';
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@documenso/ui/primitives/dialog';
2025-02-26 21:48:06 +11:00
import { PDFViewer } from '@documenso/ui/primitives/pdf-viewer';
2023-11-08 09:25:44 +00:00
import { useToast } from '@documenso/ui/primitives/use-toast';
2025-01-02 15:33:37 +11:00
import { useOptionalCurrentTeam } from '~/providers/team';
type DocumentDuplicateDialogProps = {
2023-11-08 09:25:44 +00:00
id: number;
open: boolean;
onOpenChange: (_open: boolean) => void;
};
2025-01-02 15:33:37 +11:00
export const DocumentDuplicateDialog = ({
2023-11-08 09:25:44 +00:00
id,
open,
onOpenChange,
2025-01-02 15:33:37 +11:00
}: DocumentDuplicateDialogProps) => {
const navigate = useNavigate();
2024-08-27 20:34:39 +09:00
2023-11-08 09:25:44 +00:00
const { toast } = useToast();
2024-08-27 20:34:39 +09:00
const { _ } = useLingui();
2025-01-02 15:33:37 +11:00
const team = useOptionalCurrentTeam();
const { data: document, isLoading } = trpcReact.document.getDocumentById.useQuery(
{
documentId: id,
},
{
enabled: open === true,
},
);
2023-11-16 07:35:45 +05:30
const documentData = document?.documentData
? {
2023-11-16 07:35:45 +05:30
...document.documentData,
data: document.documentData.initialData,
}
: undefined;
const documentsPath = formatDocumentsPath(team?.url);
const { mutateAsync: duplicateDocument, isPending: isDuplicateLoading } =
2023-11-08 09:25:44 +00:00
trpcReact.document.duplicateDocument.useMutation({
2025-01-02 15:33:37 +11:00
onSuccess: async ({ documentId }) => {
2023-11-08 09:25:44 +00:00
toast({
2024-08-27 20:34:39 +09:00
title: _(msg`Document Duplicated`),
description: _(msg`Your document has been successfully duplicated.`),
2023-11-08 09:25:44 +00:00
duration: 5000,
});
2025-01-02 15:33:37 +11:00
await navigate(`${documentsPath}/${documentId}/edit`);
2023-11-08 09:25:44 +00:00
onOpenChange(false);
},
});
const onDuplicate = async () => {
try {
await duplicateDocument({ documentId: id });
2023-11-08 09:25:44 +00:00
} catch {
toast({
2024-08-27 20:34:39 +09:00
title: _(msg`Something went wrong`),
description: _(msg`This document could not be duplicated at this time. Please try again.`),
2023-11-08 09:25:44 +00:00
variant: 'destructive',
duration: 7500,
});
}
};
return (
<Dialog open={open} onOpenChange={(value) => !isLoading && onOpenChange(value)}>
<DialogContent>
<DialogHeader>
2024-08-27 20:34:39 +09:00
<DialogTitle>
<Trans>Duplicate</Trans>
</DialogTitle>
2023-11-08 09:25:44 +00:00
</DialogHeader>
{!documentData || isLoading ? (
2023-11-08 09:25:44 +00:00
<div className="mx-auto -mt-4 flex w-full max-w-screen-xl flex-col px-4 md:px-8">
<h1 className="mt-4 grow-0 truncate text-2xl font-semibold md:text-3xl">
2024-08-27 20:34:39 +09:00
<Trans>Loading Document...</Trans>
2023-11-08 09:25:44 +00:00
</h1>
</div>
) : (
2024-12-10 16:11:20 +09:00
<div className="p-2 [&>div]:h-[50vh] [&>div]:overflow-y-scroll">
2025-02-26 21:48:06 +11:00
<PDFViewer key={document?.id} documentData={documentData} />
2023-11-08 09:25:44 +00:00
</div>
)}
<DialogFooter>
<div className="flex w-full flex-1 flex-nowrap gap-4">
<Button
type="button"
variant="secondary"
onClick={() => onOpenChange(false)}
className="flex-1"
>
2024-08-27 20:34:39 +09:00
<Trans>Cancel</Trans>
2023-11-08 09:25:44 +00:00
</Button>
<Button
type="button"
disabled={isDuplicateLoading || isLoading}
loading={isDuplicateLoading}
onClick={onDuplicate}
className="flex-1"
>
2024-08-27 20:34:39 +09:00
<Trans>Duplicate</Trans>
2023-11-08 09:25:44 +00:00
</Button>
</div>
</DialogFooter>
</DialogContent>
</Dialog>
);
};