Skip to content

Commit

Permalink
[DDW-178] No Wallets and Errors handling
Browse files Browse the repository at this point in the history
  • Loading branch information
thedanheller committed Jul 3, 2020
1 parent b0adbc7 commit 558acd8
Show file tree
Hide file tree
Showing 14 changed files with 255 additions and 52 deletions.
52 changes: 41 additions & 11 deletions source/renderer/app/api/api.js
Expand Up @@ -77,6 +77,7 @@ import { getStakePools } from './staking/requests/getStakePools';
import { getDelegationFee } from './staking/requests/getDelegationFee';
import { joinStakePool } from './staking/requests/joinStakePool';
import { quitStakePool } from './staking/requests/quitStakePool';
import { submitRedeemItnRewards } from './staking/requests/submitRedeemItnRewards';

// Utility functions
import {
Expand Down Expand Up @@ -178,6 +179,9 @@ import type {
AdaApiStakePools,
AdaApiStakePool,
QuitStakePoolRequest,
SubmitRedeemItnRewardsRequest,
SubmitRedeemItnRewardsResponse,
SubmitRedeemItnRewardsApiResponse,
} from './staking/types';
import type { StakePoolProps } from '../domains/StakePool';
import type { FaultInjectionIpcRequest } from '../../../common/types/cardano-node.types';
Expand Down Expand Up @@ -1350,17 +1354,30 @@ export default class AdaApi {
}
};

// @REDEEM TODO:
// eslint-disable-next-line
submitRedeemItnRewards = async (request: any): Promise<any> => {
const rewardsTotal = new BigNumber(1000);
const transactionFees = new BigNumber(1000);
const finalTotal = new BigNumber(1000);
return {
rewardsTotal,
transactionFees,
finalTotal,
};
submitRedeemItnRewards = async (
request: SubmitRedeemItnRewardsRequest
): Promise<SubmitRedeemItnRewardsApiResponse> => {
const { walletId, recoveryPhrase } = request;
try {
if (
recoveryPhrase.join('') ===
'joy,dentist,general,raccoon,cart,pelican,morning,tube,hour,glue,mesh,assault,liquid,vocal,ridge' ||
recoveryPhrase.join('') === 'error'
) {
throw new Error('-');
}
const response: SubmitRedeemItnRewardsResponse = await submitRedeemItnRewards(
{
walletId,
recoveryPhrase,
}
);
logger.error('AdaApi::submitRedeemItnRewards success', { response });
return _createRedeemItnRewardsFromServerData(response);
} catch (error) {
logger.error('AdaApi::submitRedeemItnRewards error', { error });
throw new ApiError(error);
}
};

exportWalletToFile = async (
Expand Down Expand Up @@ -1948,3 +1965,16 @@ const _createStakePoolFromServerData = action(
});
}
);

const _createRedeemItnRewardsFromServerData = action(
'AdaApi::_createRedeemItnRewardsFromServerData',
({
rewardsTotal,
transactionFees,
finalTotal,
}: SubmitRedeemItnRewardsResponse) => ({
rewardsTotal: new BigNumber(rewardsTotal),
transactionFees: new BigNumber(transactionFees),
finalTotal: new BigNumber(finalTotal),
})
);
22 changes: 22 additions & 0 deletions source/renderer/app/api/staking/requests/submitRedeemItnRewards.js
@@ -0,0 +1,22 @@
// @flow
// @REDEEM TODO:
/* eslint-disable */
import type { RequestConfig } from '../../common/types';
import type {
SubmitRedeemItnRewardsRequest,
SubmitRedeemItnRewardsResponse,
} from '../types';

const rewardsTotal = 1000;
const transactionFees = 1000;
const finalTotal = 1000;

export const submitRedeemItnRewards = ({
walletId,
recoveryPhrase,
}: SubmitRedeemItnRewardsRequest): Promise<SubmitRedeemItnRewardsResponse> =>
Promise.resolve({
rewardsTotal,
transactionFees,
finalTotal,
});
17 changes: 17 additions & 0 deletions source/renderer/app/api/staking/types.js
Expand Up @@ -88,3 +88,20 @@ export type QuitStakePoolRequest = {
walletId: string,
passphrase: string,
};

export type SubmitRedeemItnRewardsRequest = {
walletId: string,
recoveryPhrase: Array<string>,
};

export type SubmitRedeemItnRewardsResponse = {
rewardsTotal: number,
transactionFees: number,
finalTotal: number,
};

export type SubmitRedeemItnRewardsApiResponse = {
rewardsTotal: BigNumber,
transactionFees: BigNumber,
finalTotal: BigNumber,
};
@@ -0,0 +1,67 @@
// @flow
import React, { Component } from 'react';
import { observer } from 'mobx-react';
import { defineMessages, intlShape } from 'react-intl';
import SVGInline from 'react-svg-inline';
import DialogCloseButton from '../../widgets/DialogCloseButton';
import Dialog from '../../widgets/Dialog';
import styles from './Step3FailureDialog.scss';
import redeemDialogOverride from './RedeemDialogOverride.scss';
import sadWalletImage from '../../../assets/images/sad-wallet.inline.svg';

const messages = defineMessages({
description: {
id: 'staking.redeemItnRewards.noWallets.description',
defaultMessage:
'!!!Redemption of Incentivized Testnet rewards is not available as you currently do not have any Shelley-compatible wallets.',
description: 'description for Redeem Incentivized Testnet - Step 3',
},
addWalletButtonLabel: {
id: 'staking.redeemItnRewards.noWallets.addWalletButtonLabel',
defaultMessage: '!!!Add wallet',
description:
'addWalletButtonLabel for Redeem Incentivized Testnet - Step 3',
},
});

type Props = {
onClose: Function,
onAddWallet: Function,
};

@observer
export default class NoWalletsDialog extends Component<Props> {
static contextTypes = {
intl: intlShape.isRequired,
};

render() {
const { intl } = this.context;
const { onClose, onAddWallet } = this.props;
return (
<>
<DialogCloseButton
className={redeemDialogOverride.closeButton}
onClose={onClose}
/>
<Dialog
actions={[
{
primary: true,
label: intl.formatMessage(messages.addWalletButtonLabel),
onClick: onAddWallet,
},
]}
onClose={onClose}
customThemeOverrides={redeemDialogOverride}
closeOnOverlayClick={false}
>
<SVGInline svg={sadWalletImage} className={styles.sadWalletImage} />
<div className={styles.description}>
{intl.formatMessage(messages.description)}
</div>
</Dialog>
</>
);
}
}
@@ -0,0 +1,42 @@
.sadWalletImage {
display: block;
margin-bottom: 30px;
text-align: center;
svg {
height: 71px;
stroke: var(--theme-delegation-steps-success-tada-color);
path {
stroke: var(--theme-delegation-steps-success-tada-color);
}
g {
ellipse {
&:nth-child(7),
&:nth-child(8),
&:nth-child(9) {
stroke: var(--theme-delegation-steps-success-tada-color);
}

&:nth-child(11),
&:nth-child(12),
&:nth-child(13),
&:nth-child(14),
&:nth-child(15),
&:nth-child(16) {
fill: var(--theme-delegation-steps-success-tada-color);
}
}
}
}
}
.description {
color: rgba(255, 255, 255, 0.7);
font-family: var(--font-regular);
font-size: 16px;
line-height: 1.38;
margin-bottom: 30px;
text-align: center;
b {
color: #ffffff;
font-family: var(--font-semibold);
}
}
Expand Up @@ -110,7 +110,7 @@ const messages = defineMessages({
});

type Props = {
error?: ?Error,
error?: ?LocalizableError,
isSubmitting: boolean,
mnemonicValidator: Function,
onClose: Function,
Expand Down Expand Up @@ -196,24 +196,7 @@ export default class Step1ConfigurationDialog extends Component<Props> {
onSuccess: form => {
const { onContinue } = this.props;
// @REDEEM TODO:
// const { recoveryPhrase } = form.values();
const recoveryPhrase = [
'joy',
'dentist',
'general',
'raccoon',
'cart',
'pelican',
'morning',
'tube',
'hour',
'glue',
'mesh',
'assault',
'liquid',
'vocal',
'ridge',
];
const { recoveryPhrase } = form.values();
onContinue({
recoveryPhrase,
});
Expand All @@ -240,10 +223,9 @@ export default class Step1ConfigurationDialog extends Component<Props> {
get canSubmit() {
// @REDEEM TODO:
const { isSubmitting, wallet } = this.props;
return !isSubmitting && wallet !== null;

return !isSubmitting && wallet && !wallet.amount.isZero();
// return true;
// const { isSubmitting, isWalletValid } = this.props;
// const { isSubmitting } = this.props;
// const { form } = this;
// const { checked: checkboxAcceptance1isChecked } = form.$(
// 'checkboxAcceptance1'
Expand All @@ -253,7 +235,7 @@ export default class Step1ConfigurationDialog extends Component<Props> {
// );
// return (
// !isSubmitting &&
// isWalletValid &&
// wallet && !wallet.amount.isZero()
// checkboxAcceptance1isChecked &&
// checkboxAcceptance2isChecked &&
// !this.walletsDropdownError &&
Expand Down Expand Up @@ -281,9 +263,13 @@ export default class Step1ConfigurationDialog extends Component<Props> {
const checkboxAcceptance2Field = form.$('checkboxAcceptance2');
const walletId = get(wallet, 'id', null);

if (error) {
console.log('error', error);
console.log('typeof error', typeof error);
}

const buttonClasses = classnames([
'primary',
// styles.buttonContinue,
isSubmitting ? styles.isSubmitting : null,
]);

Expand Down Expand Up @@ -367,7 +353,7 @@ export default class Step1ConfigurationDialog extends Component<Props> {
error={checkboxAcceptance2Field.error}
/>
{error && (
<p className={styles.error}>{/* intl.formatMessage(error) */}</p>
<p className={styles.error}>{intl.formatMessage(error)}</p>
)}
</div>
</Dialog>
Expand Down
@@ -1,3 +1,4 @@
@import '../../../themes/mixins/error-message';
.component {
.description {
color: rgba(255, 255, 255, 0.7);
Expand Down Expand Up @@ -28,3 +29,8 @@
}
}
}
.error {
@include error-message;
margin-bottom: 1rem;
text-align: center;
}
Expand Up @@ -110,16 +110,17 @@ export default class Step2ConfirmationDialog extends Component<Props> {
messages.spendingPasswordPlaceholder
),
value: '',
validators: [
({ field }) => {
return [
isValidSpendingPassword(field.value),
this.context.intl.formatMessage(
globalMessages.invalidSpendingPassword
),
];
},
],
// @REDEEM TODO:
// validators: [
// ({ field }) => {
// return [
// isValidSpendingPassword(field.value),
// this.context.intl.formatMessage(
// globalMessages.invalidSpendingPassword
// ),
// ];
// },
// ],
},
},
},
Expand Down
Expand Up @@ -34,6 +34,7 @@
font-size: 16px;
line-height: 1.38;
margin-bottom: 30px;
text-align: center;
b {
color: #ffffff;
font-family: var(--font-semibold);
Expand Down
Expand Up @@ -4,6 +4,7 @@ import { observer, inject } from 'mobx-react';
import ConfigurationContainer from './dialogs/redeem-itn-rewards/Step1ConfigurationContainer';
import ConfirmationContainer from './dialogs/redeem-itn-rewards/Step2ConfirmationContainer';
import ResultContainer from './dialogs/redeem-itn-rewards/Step3ResultContainer';
import NoWalletsContainer from './dialogs/redeem-itn-rewards/NoWalletsContainer';
import type { InjectedProps } from '../../types/injectedPropsType';

type Props = InjectedProps;
Expand All @@ -22,9 +23,12 @@ export default class RedeemItnRewardsContainer extends Component<Props> {
}
render() {
const { stores, actions } = this.props;
const { allWallets } = stores.wallets;
const { redeemStep } = stores.staking;
const { onRedeemStart, closeRedeemDialog } = actions.staking;
if (!redeemStep) return null;
if (!allWallets.length)
return <NoWalletsContainer onClose={closeRedeemDialog.trigger} />;
const CurrentContainer = this.containers[redeemStep];
return (
<Fragment>
Expand Down

0 comments on commit 558acd8

Please sign in to comment.