Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F33279951
D10352.1768682014.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D10352.1768682014.diff
View Options
diff --git a/web/grpc/identity-service-client-wrapper.js b/web/grpc/identity-service-client-wrapper.js
--- a/web/grpc/identity-service-client-wrapper.js
+++ b/web/grpc/identity-service-client-wrapper.js
@@ -61,11 +61,15 @@
);
}
- async deleteUser(
+ deleteUser: (
userID: string,
deviceID: string,
accessToken: string,
- ): Promise<void> {
+ ) => Promise<void> = async (
+ userID: string,
+ deviceID: string,
+ accessToken: string,
+ ): Promise<void> => {
if (!this.authClient) {
const authLayer: IdentityServiceAuthLayer = {
userID,
@@ -80,7 +84,7 @@
} else {
throw new Error('Identity service client is not initialized');
}
- }
+ };
}
export { IdentityServiceClientWrapper };
diff --git a/web/settings/account-delete-modal.react.js b/web/settings/account-delete-modal.react.js
--- a/web/settings/account-delete-modal.react.js
+++ b/web/settings/account-delete-modal.react.js
@@ -5,61 +5,130 @@
import {
useDeleteKeyserverAccount,
deleteKeyserverAccountActionTypes,
+ useDeleteIdentityAccount,
+ deleteIdentityAccountActionTypes,
} from 'lib/actions/user-actions.js';
import { useModalContext } from 'lib/components/modal-provider.react.js';
import SWMansionIcon from 'lib/components/SWMansionIcon.react.js';
import { preRequestUserStateSelector } from 'lib/selectors/account-selectors.js';
import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
import { useDispatchActionPromise } from 'lib/utils/action-utils.js';
+import { usingCommServicesAccessToken } from 'lib/utils/services-utils.js';
import css from './account-delete-modal.css';
import Button, { buttonThemes } from '../components/button.react.js';
+import { IdentityServiceClientWrapper } from '../grpc/identity-service-client-wrapper.js';
import Modal from '../modals/modal.react.js';
import { useSelector } from '../redux/redux-utils.js';
-const deleteAccountLoadingStatusSelector = createLoadingStatusSelector(
+const deleteKeyserverAccountLoadingStatusSelector = createLoadingStatusSelector(
deleteKeyserverAccountActionTypes,
);
+const deleteIdentityAccountLoadingStatusSelector = createLoadingStatusSelector(
+ deleteIdentityAccountActionTypes,
+);
const AccountDeleteModal: React.ComponentType<{}> = React.memo<{}>(
function AccountDeleteModal(): React.Node {
const preRequestUserState = useSelector(preRequestUserStateSelector);
- const inputDisabled = useSelector(
- state => deleteAccountLoadingStatusSelector(state) === 'loading',
+ const isDeleteKeyserverAccountLoading = useSelector(
+ state => deleteKeyserverAccountLoadingStatusSelector(state) === 'loading',
+ );
+ const isDeleteIdentityAccountLoading = useSelector(
+ state => deleteIdentityAccountLoadingStatusSelector(state) === 'loading',
);
- const callDeleteAccount = useDeleteKeyserverAccount();
+ const inputDisabled =
+ isDeleteKeyserverAccountLoading || isDeleteIdentityAccountLoading;
+
+ const deviceID = useSelector(
+ state => state.cryptoStore?.primaryIdentityKeys.ed25519,
+ );
+
+ const identityServiceClientWrapperRef =
+ React.useRef<?IdentityServiceClientWrapper>(null);
+ if (identityServiceClientWrapperRef.current === null) {
+ identityServiceClientWrapperRef.current =
+ new IdentityServiceClientWrapper();
+ }
+ const identityServiceClient =
+ identityServiceClientWrapperRef.current ||
+ new IdentityServiceClientWrapper();
+ const callDeleteIdentityAccount = useDeleteIdentityAccount(
+ identityServiceClient,
+ deviceID,
+ );
+ const callDeleteKeyserverAccount = useDeleteKeyserverAccount();
+
const dispatchActionPromise = useDispatchActionPromise();
const { popModal } = useModalContext();
- const [errorMessage, setErrorMessage] = React.useState('');
+ const [keyserverErrorMessage, setKeyserverErrorMessage] =
+ React.useState('');
+ const [identityErrorMessage, setIdentityErrorMessage] = React.useState('');
- let errorMsg;
- if (errorMessage) {
- errorMsg = <div className={css.form_error}>{errorMessage}</div>;
+ const keyserverError = keyserverErrorMessage ? (
+ <p>{keyserverErrorMessage}</p>
+ ) : null;
+ const identityError = identityErrorMessage ? (
+ <p>{identityErrorMessage}</p>
+ ) : null;
+ let combinedErrorMessages;
+ if (keyserverError || identityError) {
+ combinedErrorMessages = (
+ <div className={css.form_error}>
+ {keyserverError}
+ {identityError}
+ </div>
+ );
}
- const deleteAction = React.useCallback(async () => {
+ const deleteKeyserverAction = React.useCallback(async () => {
try {
- setErrorMessage('');
- const response = await callDeleteAccount(preRequestUserState);
+ setKeyserverErrorMessage('');
+ const response = await callDeleteKeyserverAccount(preRequestUserState);
+ // This check ensures that we don't call `popModal()` twice
+ if (!usingCommServicesAccessToken) {
+ popModal();
+ }
+ return response;
+ } catch (e) {
+ setKeyserverErrorMessage(
+ 'unknown error deleting account from keyserver',
+ );
+ throw e;
+ }
+ }, [callDeleteKeyserverAccount, preRequestUserState, popModal]);
+
+ const deleteIdentityAction = React.useCallback(async () => {
+ try {
+ setIdentityErrorMessage('');
+ const response = await callDeleteIdentityAccount();
popModal();
return response;
} catch (e) {
- setErrorMessage('unknown error');
+ setIdentityErrorMessage(
+ 'unknown error deleting account from identity service',
+ );
throw e;
}
- }, [callDeleteAccount, preRequestUserState, popModal]);
+ }, [callDeleteIdentityAccount, popModal]);
const onDelete = React.useCallback(
(event: SyntheticEvent<HTMLButtonElement>) => {
event.preventDefault();
void dispatchActionPromise(
deleteKeyserverAccountActionTypes,
- deleteAction(),
+ deleteKeyserverAction(),
);
+ if (usingCommServicesAccessToken) {
+ void dispatchActionPromise(
+ deleteIdentityAccountActionTypes,
+ deleteIdentityAction(),
+ );
+ }
},
- [dispatchActionPromise, deleteAction],
+ [dispatchActionPromise, deleteKeyserverAction, deleteIdentityAction],
);
return (
@@ -81,7 +150,7 @@
>
Delete Account
</Button>
- {errorMsg}
+ {combinedErrorMessages}
</div>
</form>
</div>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 17, 8:33 PM (7 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5948834
Default Alt Text
D10352.1768682014.diff (6 KB)
Attached To
Mode
D10352: [web] dispatch deleteIdentityAction
Attached
Detach File
Event Timeline
Log In to Comment