import { observer } from "mobx-react"; import * as React from "react"; import { Trans, useTranslation } from "react-i18next"; import { toast } from "sonner"; 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 history from "~/utils/history"; import { settingsPath } from "~/utils/routeHelpers"; 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 { 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); toast.success(t("Export started"), { description: t(`Your file will be available in {{ location }} soon`, { location: `"${t("Settings")} > ${t("Export")}"`, }), action: { label: t("View"), onClick: () => { history.push(settingsPath("export")); }, }, }); } else { await collections.export(format, includeAttachments); toast.success(t("Export started")); } onSubmit(); }; 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);