diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 64bd38534..f1f4d52f9 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -966,6 +966,8 @@ const getFeatures = (instance: Instance) => { v.software === PLEROMA, ]), + importArchive: false, + /** * Import a .csv file with a list of blocked users. * @see POST /api/pleroma/blocks_import diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index b07ef8a0b..9c1189433 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -98,6 +98,7 @@ "lodash-es": "^4.17.23", "mini-css-extract-plugin": "^2.9.4", "mutative": "^1.3.0", + "object-to-formdata": "^4.5.1", "path-browserify": "^1.0.1", "pl-api": "workspace:*", "postcss": "^8.5.3", diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json index 9077a9a8c..96bae3055 100644 --- a/packages/pl-fe/src/locales/en.json +++ b/packages/pl-fe/src/locales/en.json @@ -1072,16 +1072,20 @@ "icon_button.icons": "Icons", "icon_button.label": "Select icon", "import_data.actions.import": "Import", + "import_data.actions.import_archive": "Import archive", "import_data.actions.import_blocks": "Import blocks", "import_data.actions.import_follows": "Import follows", "import_data.actions.import_mutes": "Import mutes", + "import_data.archive_label": "Archive", "import_data.blocks_label": "Blocks", "import_data.follows_label": "Follows", + "import_data.hints.archive": "Archive containing an archive of statuses", "import_data.hints.blocks": "CSV file containing a list of blocked accounts", "import_data.hints.follows": "CSV file containing a list of followed accounts", "import_data.hints.mutes": "CSV file containing a list of muted accounts", "import_data.mutes_label": "Mutes", "import_data.overwrite": "Overwrite instead of appending", + "import_data.success.archive": "Archive imported successfully", "import_data.success.blocks": "Blocks imported successfully", "import_data.success.followers": "Followers imported successfully", "import_data.success.mutes": "Mutes imported successfully", diff --git a/packages/pl-fe/src/pages/settings/import-data.tsx b/packages/pl-fe/src/pages/settings/import-data.tsx index c15bc00db..8a94e9fae 100644 --- a/packages/pl-fe/src/pages/settings/import-data.tsx +++ b/packages/pl-fe/src/pages/settings/import-data.tsx @@ -1,3 +1,4 @@ +import { serialize } from 'object-to-formdata'; import React, { useState } from 'react'; import { defineMessages, FormattedMessage, useIntl, type MessageDescriptor } from 'react-intl'; @@ -26,6 +27,10 @@ const messages = defineMessages({ defaultMessage: 'Followers imported successfully', }, mutesSuccess: { id: 'import_data.success.mutes', defaultMessage: 'Mutes imported successfully' }, + archiveSuccess: { + id: 'import_data.success.archive', + defaultMessage: 'Archive imported successfully', + }, }); const followMessages = defineMessages({ @@ -55,6 +60,15 @@ const muteMessages = defineMessages({ submit: { id: 'import_data.actions.import_mutes', defaultMessage: 'Import mutes' }, }); +const archiveMessages = defineMessages({ + input_label: { id: 'import_data.archive_label', defaultMessage: 'Archive' }, + input_hint: { + id: 'import_data.hints.archive', + defaultMessage: 'Archive containing an archive of statuses', + }, + submit: { id: 'import_data.actions.import_archive', defaultMessage: 'Import archive' }, +}); + interface IDataImporter { messages: { input_label: MessageDescriptor; @@ -140,20 +154,34 @@ const ImportDataPage = () => { const features = useFeatures(); const importFollows = (list: File | string, overwrite?: boolean) => - client.settings.importFollows(list, overwrite ? 'overwrite' : 'merge').then((response) => { + client.settings.importFollows(list, overwrite ? 'overwrite' : 'merge').then(() => { toast.success(messages.followersSuccess); }); const importBlocks = (list: File | string, overwrite?: boolean) => - client.settings.importBlocks(list, overwrite ? 'overwrite' : 'merge').then((response) => { + client.settings.importBlocks(list, overwrite ? 'overwrite' : 'merge').then(() => { toast.success(messages.blocksSuccess); }); const importMutes = (list: File | string) => - client.settings.importMutes(list).then((response) => { + client.settings.importMutes(list).then(() => { toast.success(messages.mutesSuccess); }); + const importArchive = (file: File) => { + const form = serialize({ file, keep_unlisted: true }, { indices: true }); + + return client + .request('/api/pleroma/archive_import', { + method: 'POST', + body: form, + contentType: '', + }) + .then(() => { + toast.success(messages.archiveSuccess); + }); + }; + return ( {features.importFollows && ( @@ -177,6 +205,13 @@ const ImportDataPage = () => { allowOverwrite={features.importOverwrite} /> )} + {features.importArchive && ( + + )} ); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff642bb63..8735e7ccd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -295,6 +295,9 @@ importers: mutative: specifier: ^1.3.0 version: 1.3.0 + object-to-formdata: + specifier: ^4.5.1 + version: 4.5.1 path-browserify: specifier: ^1.0.1 version: 1.0.1