import classNames from 'classnames'; import React, { useEffect, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { fetchBackups, createBackup } from 'soapbox/actions/backups'; import ScrollableList from 'soapbox/components/scrollable_list'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import Column from '../ui/components/better_column'; import type { List as ImmutableList, Map as ImmutableMap } from 'immutable'; const messages = defineMessages({ heading: { id: 'column.backups', defaultMessage: 'Backups' }, create: { id: 'backups.actions.create', defaultMessage: 'Create backup' }, emptyMessage: { id: 'backups.empty_message', defaultMessage: 'No backups found. {action}' }, emptyMessageAction: { id: 'backups.empty_message.action', defaultMessage: 'Create one now?' }, pending: { id: 'backups.pending', defaultMessage: 'Pending' }, }); const Backups = () => { const intl = useIntl(); const dispatch = useAppDispatch(); const backups = useAppSelector>>((state) => state.backups.toList().sortBy((backup: ImmutableMap) => backup.get('inserted_at'))); const [isLoading, setIsLoading] = useState(true); const handleCreateBackup: React.MouseEventHandler = e => { dispatch(createBackup()); e.preventDefault(); }; const makeColumnMenu = () => { return [{ text: intl.formatMessage(messages.create), action: handleCreateBackup, icon: require('@tabler/icons/icons/plus.svg'), }]; }; useEffect(() => { dispatch(fetchBackups()).then(() => { setIsLoading(true); }).catch(() => {}); }, []); const showLoading = isLoading && backups.count() === 0; const emptyMessageAction = ( {intl.formatMessage(messages.emptyMessageAction)} ); return ( {backups.map((backup) => (
{backup.get('processed') ? {backup.get('inserted_at')} :
{intl.formatMessage(messages.pending)}: {backup.get('inserted_at')}
}
))}
); }; export default Backups;