diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fe4f9ed3..76b0fae1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - UI: added backdrop blur behind modals. - Admin: let admins configure media preview for attachment thumbnails. - Login: accept `?server` param in external login, eg `fe.soapbox.pub/login/external?server=gleasonator.com`. +- Backups: restored Pleroma backups functionality. +- Export: restored "Export data" to CSV. ### Changed - Posts: letterbox images to 19:6 again. - Status Info: moved context (repost, pinned) to improve UX. - Posts: remove file icon from empty link previews. +- Settings: moved "Import data" under settings. ### Fixed - Layout: use accent color for "floating action button" (mobile compose button). diff --git a/app/soapbox/components/sidebar-menu.tsx b/app/soapbox/components/sidebar-menu.tsx index 766d3dc87..7f3397bb2 100644 --- a/app/soapbox/components/sidebar-menu.tsx +++ b/app/soapbox/components/sidebar-menu.tsx @@ -28,7 +28,6 @@ const messages = defineMessages({ mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, soapboxConfig: { id: 'navigation_bar.soapbox_config', defaultMessage: 'Soapbox config' }, - importData: { id: 'navigation_bar.import_data', defaultMessage: 'Import data' }, accountMigration: { id: 'navigation_bar.account_migration', defaultMessage: 'Move account' }, accountAliases: { id: 'navigation_bar.account_aliases', defaultMessage: 'Account aliases' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, @@ -305,15 +304,6 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { /> )} - {features.import && ( - - )} - { const [isLoading, setIsLoading] = useState(true); - const handleCreateBackup: React.MouseEventHandler = e => { + const handleCreateBackup: React.MouseEventHandler = e => { dispatch(createBackup()); e.preventDefault(); }; - const makeColumnMenu = () => { - return [{ - text: intl.formatMessage(messages.create), - action: handleCreateBackup, - icon: require('@tabler/icons/plus.svg'), - }]; - }; - useEffect(() => { dispatch(fetchBackups()).then(() => { - setIsLoading(true); + setIsLoading(false); }).catch(() => {}); }, []); @@ -46,16 +37,14 @@ const Backups = () => { const emptyMessageAction = ( - {intl.formatMessage(messages.emptyMessageAction)} + + {intl.formatMessage(messages.emptyMessageAction)} + ); return ( - + { > {backups.map((backup) => (
{backup.processed ? {backup.inserted_at} - :
{intl.formatMessage(messages.pending)}: {backup.inserted_at}
+ : {intl.formatMessage(messages.pending)}: {backup.inserted_at} }
))}
+ + + +
); }; diff --git a/app/soapbox/features/settings/index.tsx b/app/soapbox/features/settings/index.tsx index a0842984a..e01ed848c 100644 --- a/app/soapbox/features/settings/index.tsx +++ b/app/soapbox/features/settings/index.tsx @@ -27,6 +27,9 @@ const messages = defineMessages({ other: { id: 'settings.other', defaultMessage: 'Other options' }, mfaEnabled: { id: 'mfa.enabled', defaultMessage: 'Enabled' }, mfaDisabled: { id: 'mfa.disabled', defaultMessage: 'Disabled' }, + backups: { id: 'column.backups', defaultMessage: 'Backups' }, + importData: { id: 'navigation_bar.import_data', defaultMessage: 'Import data' }, + exportData: { id: 'column.export_data', defaultMessage: 'Export data' }, }); /** User settings page. */ @@ -47,6 +50,9 @@ const Settings = () => { const navigateToDeleteAccount = () => history.push('/settings/account'); const navigateToMoveAccount = () => history.push('/settings/migration'); const navigateToAliases = () => history.push('/settings/aliases'); + const navigateToBackups = () => history.push('/settings/backups'); + const navigateToImportData = () => history.push('/settings/import'); + const navigateToExportData = () => history.push('/settings/export'); const isMfaEnabled = mfa.getIn(['settings', 'totp']); @@ -130,6 +136,18 @@ const Settings = () => { + {features.importData && ( + + )} + + {features.exportData && ( + + )} + + {features.backups && ( + + )} + {features.federating && (features.accountMoving ? ( ) : features.accountAliases && ( diff --git a/app/soapbox/features/ui/components/link-footer.tsx b/app/soapbox/features/ui/components/link-footer.tsx index 26d2ff59f..62c88cf95 100644 --- a/app/soapbox/features/ui/components/link-footer.tsx +++ b/app/soapbox/features/ui/components/link-footer.tsx @@ -57,9 +57,6 @@ const LinkFooter: React.FC = (): JSX.Element => { {account.locked && ( )} - {features.import && ( - - )} } diff --git a/app/soapbox/features/ui/index.tsx b/app/soapbox/features/ui/index.tsx index a5f0739b8..41310c6af 100644 --- a/app/soapbox/features/ui/index.tsx +++ b/app/soapbox/features/ui/index.tsx @@ -76,9 +76,9 @@ import { EmailConfirmation, DeleteAccount, SoapboxConfig, - // ExportData, + ExportData, ImportData, - // Backups, + Backups, MfaForm, ChatIndex, ChatWidget, @@ -277,11 +277,11 @@ const SwitchingColumnsArea: React.FC = ({ children }) => {features.scheduledStatuses && } - {/* FIXME: this could DDoS our API? :\ */} - {/* */} + {features.exportData && } {features.importData && } {features.accountAliases && } {features.accountMoving && } + {features.backups && } @@ -289,7 +289,6 @@ const SwitchingColumnsArea: React.FC = ({ children }) => - {/* */} diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index d224502ff..e59cdfff3 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -178,6 +178,13 @@ const getInstanceFeatures = (instance: Instance) => { */ announcementsReactions: v.software === MASTODON && gte(v.compatVersion, '3.1.0'), + /** + * Pleroma backups. + * @see GET /api/v1/pleroma/backups + * @see POST /api/v1/pleroma/backups + */ + backups: v.software === PLEROMA, + /** * Set your birthday and view upcoming birthdays. * @see GET /api/v1/pleroma/birthdays @@ -381,6 +388,9 @@ const getInstanceFeatures = (instance: Instance) => { v.software === TRUTHSOCIAL, ]), + /** Whether to allow exporting follows/blocks/mutes to CSV by paginating the API. */ + exportData: true, + /** Whether the accounts who favourited or emoji-reacted to a status can be viewed through the API. */ exposableReactions: any([ v.software === MASTODON, diff --git a/app/styles/application.scss b/app/styles/application.scss index 828c678d1..d8a9cbe3d 100644 --- a/app/styles/application.scss +++ b/app/styles/application.scss @@ -43,7 +43,6 @@ @import 'components/video-player'; @import 'components/audio-player'; @import 'components/filters'; -@import 'components/backups'; @import 'components/crypto-donate'; @import 'components/aliases'; @import 'components/icon'; diff --git a/app/styles/components/backups.scss b/app/styles/components/backups.scss deleted file mode 100644 index 728d9375e..000000000 --- a/app/styles/components/backups.scss +++ /dev/null @@ -1,12 +0,0 @@ -.backup { - padding: 15px; - border-bottom: 1px solid var(--brand-color--faint); - - a { - color: var(--brand-color--hicontrast); - } - - &--pending { - @apply text-gray-400 italic; - } -}