Skip to content

Commit

Permalink
[Flask] Snaps install UX (#6561)
Browse files Browse the repository at this point in the history
  • Loading branch information
owencraston authored Jun 15, 2023
1 parent ff739b5 commit b219eb0
Show file tree
Hide file tree
Showing 33 changed files with 1,409 additions and 332 deletions.
23 changes: 12 additions & 11 deletions app/components/Nav/Main/RootRPCMethodsUI.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import { BN } from 'ethereumjs-util';
import Logger from '../../../util/Logger';
import Approve from '../../Views/ApproveView/Approve';
import WatchAssetRequest from '../../UI/WatchAssetRequest';
import { InstallSnapApproval } from '../../UI/InstallSnapApproval';
import AccountApproval from '../../UI/AccountApproval';
import TransactionTypes from '../../../core/TransactionTypes';
import AddCustomNetwork from '../../UI/AddCustomNetwork';
Expand All @@ -58,6 +57,7 @@ import {
selectProviderType,
} from '../../../selectors/networkController';
import { createAccountConnectNavDetails } from '../../Views/AccountConnect';
import { InstallSnapApprovalFlow } from '../../UI/InstallSnapApprovalFlow';

const hstInterface = new ethers.utils.Interface(abi);

Expand Down Expand Up @@ -86,6 +86,8 @@ const RootRPCMethodsUI = (props) => {

const [signMessageParams, setSignMessageParams] = useState(undefined);

const [installSnap, setInstallSnap] = useState(false);

const setTransactionObject = props.setTransactionObject;
const setEtherTransaction = props.setEtherTransaction;

Expand Down Expand Up @@ -668,26 +670,25 @@ const RootRPCMethodsUI = (props) => {

const onInstallSnapConfirm = () => {
acceptPendingApproval(hostToApprove.id, hostToApprove.requestData);
};

const onInstallSnapFinished = () => {
setShowPendingApproval(false);
setInstallSnap(false);
};

const onInstallSnapReject = () => {
// eslint-disable-next-line no-console
console.log(
'onInstallSnapReject',
hostToApprove.id,
hostToApprove.requestData,
);
rejectPendingApproval(hostToApprove.id, hostToApprove.requestData);
setShowPendingApproval(false);
setInstallSnap(false);
};

/**
* Render the modal that asks the user to approve/reject connections to a dapp using the MetaMask SDK.
*/
const renderInstallSnapApprovalModal = () => (
<Modal
isVisible={showPendingApproval?.type === ApprovalTypes.INSTALL_SNAP}
isVisible={installSnap}
animationIn="slideInUp"
animationOut="slideOutDown"
style={styles.bottomModal}
Expand All @@ -699,9 +700,10 @@ const RootRPCMethodsUI = (props) => {
onBackdropPress={onInstallSnapReject}
swipeDirection={'down'}
>
<InstallSnapApproval
<InstallSnapApprovalFlow
onCancel={onInstallSnapReject}
onConfirm={onInstallSnapConfirm}
onFinish={onInstallSnapFinished}
requestData={hostToApprove}
/>
</Modal>
Expand Down Expand Up @@ -734,13 +736,12 @@ const RootRPCMethodsUI = (props) => {

switch (request.type) {
case ApprovalTypes.INSTALL_SNAP:
// eslint-disable-next-line no-console
console.log({ requestData, id: request.id });
setHostToApprove({ requestData, id: request.id });
showPendingApprovalModal({
type: ApprovalTypes.INSTALL_SNAP,
origin: request.origin,
});
setInstallSnap(true);
break;
case ApprovalTypes.UPDATE_SNAP:
// eslint-disable-next-line no-console
Expand Down
92 changes: 0 additions & 92 deletions app/components/UI/InstallSnapApproval/InstallSnapApproval.tsx

This file was deleted.

6 changes: 0 additions & 6 deletions app/components/UI/InstallSnapApproval/index.ts

This file was deleted.

79 changes: 0 additions & 79 deletions app/components/UI/InstallSnapApproval/styles.ts

This file was deleted.

9 changes: 0 additions & 9 deletions app/components/UI/InstallSnapApproval/types.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import React, { useCallback, useState } from 'react';
import {
InstallSnapApprovalArgs,
SnapInstallState,
} from './InstallSnapApprovalFlow.types';
import { InstallSnapConnectionRequest } from './components/InstallSnapConnectionRequest';
import { View } from 'react-native';
import { InstallSnapPermissionsRequest } from './components/InstallSnapPermissionsRequest';
import { InstallSnapSuccess } from './components/InstallSnapSuccess';
import { InstallSnapError } from './components/InstallSnapError';
import { SNAP_INSTALL_FLOW } from '../../../constants/test-ids';
import Logger from '../../../util/Logger';

const InstallSnapApprovalFlow = ({
requestData,
onConfirm,
onFinish,
onCancel,
}: InstallSnapApprovalArgs) => {
const [installState, setInstallState] = useState<SnapInstallState>(
SnapInstallState.Confirm,
);

const [installError, setInstallError] = useState<Error | undefined>(
undefined,
);

const onConfirmNext = useCallback(() => {
setInstallState(SnapInstallState.AcceptPermissions);
}, []);

const onPermissionsConfirm = useCallback(() => {
try {
onConfirm();
} catch (error) {
Logger.error(
error as Error,
`${SNAP_INSTALL_FLOW} Failed to install snap`,
);
setInstallError(error as Error);
setInstallState(SnapInstallState.SnapInstallError);
}
setInstallState(SnapInstallState.SnapInstalled);
}, [onConfirm]);

const onSnapInstalled = useCallback(() => {
onFinish();
}, [onFinish]);

const renderInstallStep = useCallback(() => {
switch (installState) {
case SnapInstallState.Confirm:
return (
<InstallSnapConnectionRequest
requestData={requestData.requestData}
onConfirm={onConfirmNext}
onCancel={onCancel}
/>
);
case SnapInstallState.AcceptPermissions:
return (
<InstallSnapPermissionsRequest
requestData={requestData.requestData}
onConfirm={onPermissionsConfirm}
onCancel={onCancel}
/>
);
case SnapInstallState.SnapInstalled:
return (
<InstallSnapSuccess
requestData={requestData.requestData}
onConfirm={onSnapInstalled}
onCancel={onCancel}
/>
);
case SnapInstallState.SnapInstallError:
return (
<InstallSnapError
requestData={requestData.requestData}
onConfirm={onSnapInstalled}
onCancel={onCancel}
error={installError}
/>
);
}
}, [
installError,
installState,
onCancel,
onConfirmNext,
onPermissionsConfirm,
onSnapInstalled,
requestData,
]);

return <View testID={SNAP_INSTALL_FLOW}>{renderInstallStep()}</View>;
};

export default InstallSnapApprovalFlow;
Loading

0 comments on commit b219eb0

Please sign in to comment.