Rocket.Chat.ReactNative/app/views/ProfileView/components/DeleteAccountActionSheetCon.../index.tsx

110 lines
3.8 KiB
TypeScript
Raw Normal View History

import { sha256 } from 'js-sha256';
import React from 'react';
import { Keyboard, Text } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { useDispatch } from 'react-redux';
import { deleteAccount } from '../../../../actions/login';
import { useActionSheet } from '../../../../containers/ActionSheet';
import ActionSheetContentWithInputAndSubmit from '../../../../containers/ActionSheet/ActionSheetContentWithInputAndSubmit';
import i18n from '../../../../i18n';
import { showErrorAlert } from '../../../../lib/methods/helpers';
import { events, logEvent } from '../../../../lib/methods/helpers/log';
import { deleteOwnAccount } from '../../../../lib/services/restApi';
import { useTheme } from '../../../../theme';
import { getTranslations } from './getTranslations';
import sharedStyles from '../../../Styles';
export function DeleteAccountActionSheetContent(): React.ReactElement {
const { hideActionSheet, showActionSheet } = useActionSheet();
const dispatch = useDispatch();
const insets = useSafeAreaInsets();
const { colors } = useTheme();
const handleDeleteAccount = async (password: string) => {
Keyboard.dismiss();
try {
await deleteOwnAccount(sha256(password));
hideActionSheet();
} catch (error: any) {
hideActionSheet();
if (error.data.errorType === 'user-last-owner') {
const { shouldChangeOwner, shouldBeRemoved } = error.data.details;
const { changeOwnerRooms, removedRooms } = getTranslations({ shouldChangeOwner, shouldBeRemoved });
setTimeout(() => {
showActionSheet({
children: (
<ConfirmDeleteAccountActionSheetContent
changeOwnerRooms={changeOwnerRooms}
removedRooms={removedRooms}
password={sha256(password)}
/>
),
headerHeight: 225 + insets.bottom
});
}, 250); // timeout for hide effect
} else if (error.data.errorType === 'error-invalid-password') {
logEvent(events.DELETE_OWN_ACCOUNT_F);
showErrorAlert(i18n.t('error-invalid-password'));
} else {
logEvent(events.DELETE_OWN_ACCOUNT_F);
showErrorAlert(i18n.t(error.data.details));
}
return;
}
dispatch(deleteAccount());
};
return (
<ActionSheetContentWithInputAndSubmit
title={i18n.t('Are_you_sure_you_want_to_delete_your_account')}
description={i18n.t('For_your_security_you_must_enter_your_current_password_to_continue')}
onCancel={hideActionSheet}
onSubmit={password => handleDeleteAccount(password)}
placeholder={i18n.t('Password')}
testID='room-info-edit-view-name'
iconName='warning'
confirmTitle={i18n.t('Delete_Account')}
confirmBackgroundColor={colors.dangerColor}
/>
);
}
const AlertText = ({ text = '' }) => {
const { colors } = useTheme();
return <Text style={{ fontSize: 14, ...sharedStyles.textRegular, marginBottom: 10, color: colors.dangerColor }}>{text}</Text>;
};
function ConfirmDeleteAccountActionSheetContent({ changeOwnerRooms = '', removedRooms = '', password = '' }) {
const { hideActionSheet } = useActionSheet();
const dispatch = useDispatch();
const { colors } = useTheme();
const handleDeleteAccount = async () => {
hideActionSheet();
await deleteOwnAccount(password, true);
dispatch(deleteAccount());
};
return (
<ActionSheetContentWithInputAndSubmit
title={i18n.t('Are_you_sure_question_mark')}
iconName='warning'
description={i18n.t('Deleting_a_user_will_delete_all_messages')}
onCancel={hideActionSheet}
onSubmit={handleDeleteAccount}
placeholder={i18n.t('Password')}
testID='room-info-edit-view-name'
confirmTitle={i18n.t('Delete_Account_confirm')}
confirmBackgroundColor={colors.dangerColor}
showInput={false}
customText={
<>
{!!changeOwnerRooms && <AlertText text={changeOwnerRooms} />}
{!!removedRooms && <AlertText text={removedRooms} />}
</>
}
/>
);
}