import { observer } from "mobx-react"; import * as React from "react"; import { Trans, useTranslation } from "react-i18next"; import styled from "styled-components"; import { FileOperationFormat, NotificationEventType } from "@shared/types"; import Collection from "~/models/Collection"; import ConfirmationDialog from "~/components/ConfirmationDialog"; import Flex from "~/components/Flex"; import Text from "~/components/Text"; import env from "~/env"; import useCurrentUser from "~/hooks/useCurrentUser"; import useStores from "~/hooks/useStores"; import useToasts from "~/hooks/useToasts"; type Props = { collection?: Collection; onSubmit: () => void; }; function ExportDialog({ collection, onSubmit }: Props) { const [format, setFormat] = React.useState( FileOperationFormat.MarkdownZip ); const [includeAttachments, setIncludeAttachments] = React.useState(true); const user = useCurrentUser(); const { showToast } = useToasts(); const { collections } = useStores(); const { t } = useTranslation(); const appName = env.APP_NAME; const handleFormatChange = React.useCallback( (ev: React.ChangeEvent) => { setFormat(ev.target.value as FileOperationFormat); }, [] ); const handleIncludeAttachmentsChange = React.useCallback( (ev: React.ChangeEvent) => { setIncludeAttachments(ev.target.checked); }, [] ); const handleSubmit = async () => { if (collection) { await collection.export(format, includeAttachments); } else { await collections.export(format, includeAttachments); } onSubmit(); showToast(t("Export started"), { type: "success" }); }; const items = [ { title: "Markdown", description: t( "A ZIP file containing the images, and documents in the Markdown format." ), value: FileOperationFormat.MarkdownZip, }, { title: "HTML", description: t( "A ZIP file containing the images, and documents as HTML files." ), value: FileOperationFormat.HTMLZip, }, { title: "JSON", description: t( "Structured data that can be used to transfer data to another compatible {{ appName }} instance.", { appName, } ), value: FileOperationFormat.JSON, }, ]; return ( {collection && ( , }} />{" "} {user.subscribedToEventType(NotificationEventType.ExportCompleted) && t("You will receive an email when it's complete.")} )} {items.map((item) => ( ))}
); } const Option = styled.label` display: flex; align-items: center; gap: 16px; p { margin: 0; } `; export default observer(ExportDialog);