bigbuffet-rw/app/soapbox/features/settings/index.tsx

137 lines
5.4 KiB
TypeScript
Raw Normal View History

import React, { useEffect } from 'react';
2022-03-21 11:09:01 -07:00
import { defineMessages, useIntl } from 'react-intl';
2022-05-01 14:21:43 -07:00
import { useDispatch } from 'react-redux';
2022-03-22 05:42:26 -07:00
import { useHistory } from 'react-router-dom';
2022-03-21 11:09:01 -07:00
import { fetchMfa } from 'soapbox/actions/mfa';
import List, { ListItem } from 'soapbox/components/list';
import { Card, CardBody, CardHeader, CardTitle, Column } from 'soapbox/components/ui';
2022-05-01 14:21:43 -07:00
import { useAppSelector, useOwnAccount } from 'soapbox/hooks';
import { getFeatures } from 'soapbox/utils/features';
2022-03-21 11:09:01 -07:00
import Preferences from '../preferences';
const messages = defineMessages({
settings: { id: 'settings.settings', defaultMessage: 'Settings' },
profile: { id: 'settings.profile', defaultMessage: 'Profile' },
security: { id: 'settings.security', defaultMessage: 'Security' },
preferences: { id: 'settings.preferences', defaultMessage: 'Preferences' },
editProfile: { id: 'settings.edit_profile', defaultMessage: 'Edit Profile' },
changeEmail: { id: 'settings.change_email', defaultMessage: 'Change Email' },
changePassword: { id: 'settings.change_password', defaultMessage: 'Change Password' },
configureMfa: { id: 'settings.configure_mfa', defaultMessage: 'Configure MFA' },
sessions: { id: 'settings.sessions', defaultMessage: 'Active sessions' },
2022-03-21 11:09:01 -07:00
deleteAccount: { id: 'settings.delete_account', defaultMessage: 'Delete Account' },
accountMigration: { id: 'settings.account_migration', defaultMessage: 'Move Account' },
accountAliases: { id: 'navigation_bar.account_aliases', defaultMessage: 'Account aliases' },
other: { id: 'settings.other', defaultMessage: 'Other options' },
mfaEnabled: { id: 'mfa.enabled', defaultMessage: 'Enabled' },
mfaDisabled: { id: 'mfa.disabled', defaultMessage: 'Disabled' },
2022-03-21 11:09:01 -07:00
});
2022-05-01 14:21:43 -07:00
/** User settings page. */
2022-03-22 05:42:26 -07:00
const Settings = () => {
2022-03-21 11:09:01 -07:00
const dispatch = useDispatch();
2022-03-22 05:42:26 -07:00
const history = useHistory();
const intl = useIntl();
2022-05-01 14:21:43 -07:00
const mfa = useAppSelector((state) => state.security.get('mfa'));
const features = useAppSelector((state) => getFeatures(state.instance));
2022-05-01 14:21:43 -07:00
const account = useOwnAccount();
2022-03-21 11:09:01 -07:00
const navigateToChangeEmail = () => history.push('/settings/email');
const navigateToChangePassword = () => history.push('/settings/password');
const navigateToMfa = () => history.push('/settings/mfa');
const navigateToSessions = () => history.push('/settings/tokens');
const navigateToEditProfile = () => history.push('/settings/profile');
const navigateToDeleteAccount = () => history.push('/settings/account');
const navigateToMoveAccount = () => history.push('/settings/migration');
const navigateToAliases = () => history.push('/settings/aliases');
2022-03-21 11:09:01 -07:00
const isMfaEnabled = mfa.getIn(['settings', 'totp']);
useEffect(() => {
2022-03-21 11:09:01 -07:00
dispatch(fetchMfa());
}, [dispatch]);
2022-05-01 14:21:43 -07:00
if (!account) return null;
const displayName = account.display_name || account.username;
2022-03-21 11:09:01 -07:00
return (
<Column label={intl.formatMessage(messages.settings)} transparent withHeader={false}>
<Card variant='rounded'>
<CardHeader>
<CardTitle title={intl.formatMessage(messages.profile)} />
</CardHeader>
<CardBody>
<List>
<ListItem label={intl.formatMessage(messages.editProfile)} onClick={navigateToEditProfile}>
<span>{displayName}</span>
</ListItem>
</List>
</CardBody>
{features.security || features.sessions && (
<>
<CardHeader>
<CardTitle title={intl.formatMessage(messages.security)} />
</CardHeader>
<CardBody>
<List>
{features.security && (
<>
<ListItem label={intl.formatMessage(messages.changeEmail)} onClick={navigateToChangeEmail} />
<ListItem label={intl.formatMessage(messages.changePassword)} onClick={navigateToChangePassword} />
<ListItem label={intl.formatMessage(messages.configureMfa)} onClick={navigateToMfa}>
{isMfaEnabled ?
intl.formatMessage(messages.mfaEnabled) :
intl.formatMessage(messages.mfaDisabled)}
</ListItem>
</>
)}
{features.sessions && (
<ListItem label={intl.formatMessage(messages.sessions)} onClick={navigateToSessions} />
)}
</List>
</CardBody>
</>
)}
2022-03-21 11:09:01 -07:00
2022-05-01 14:21:43 -07:00
<CardHeader>
2022-03-21 11:09:01 -07:00
<CardTitle title={intl.formatMessage(messages.preferences)} />
</CardHeader>
<CardBody>
<Preferences />
</CardBody>
{(features.security || features.accountAliases) && (
<>
<CardHeader>
<CardTitle title={intl.formatMessage(messages.other)} />
</CardHeader>
<CardBody>
<List>
{features.security && (
<ListItem label={intl.formatMessage(messages.deleteAccount)} onClick={navigateToDeleteAccount} />
)}
{features.federating && (features.accountMoving ? (
<ListItem label={intl.formatMessage(messages.accountMigration)} onClick={navigateToMoveAccount} />
) : features.accountAliases && (
<ListItem label={intl.formatMessage(messages.accountAliases)} onClick={navigateToAliases} />
))}
</List>
</CardBody>
</>
)}
2022-03-21 11:09:01 -07:00
</Card>
</Column>
);
};
2022-03-22 05:42:26 -07:00
export default Settings;