Skip to content

Commit b13a30e

Browse files
Lucasrenanvalentindanielmain
authored
[DDW-861] Implement new token picker (#2787)
Co-authored-by: Renan Ferreira <renan.ferreira@iohk.io> Co-authored-by: Daniel Main <daniel.main.cernhoff@icloud.com>
1 parent e77e37f commit b13a30e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+2304
-894
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
### Features
66

7+
- Implemented new token picker ([PR 2787](https://github.com/input-output-hk/daedalus/pull/2787))
8+
9+
## 4.8.0-FC1
10+
711
- Added dynamic RTS flags setting ([PR 2758](https://github.com/input-output-hk/daedalus/pull/2758/files))
812
- Updated messages about Cardano node sync on the initial screen ([PR 2827](https://github.com/input-output-hk/daedalus/pull/2827)) ([PR 2831](https://github.com/input-output-hk/daedalus/pull/2831))
913

source/renderer/app/api/api.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ import { cardanoFaultInjectionChannel } from '../ipc/cardano.ipc';
9494
import patchAdaApi from './utils/patchAdaApi';
9595
import { getLegacyWalletId, utcStringToDate } from './utils';
9696
import { logger } from '../utils/logging';
97+
import { hexToString } from '../utils/strings';
9798
import {
9899
unscrambleMnemonics,
99100
scrambleMnemonics,
@@ -2739,6 +2740,7 @@ const _createWalletFromServerData = action(
27392740
uniqueId,
27402741
policyId,
27412742
assetName,
2743+
assetNameASCII: hexToString(assetName),
27422744
quantity: new BigNumber(quantity.toString()),
27432745
};
27442746
}),
@@ -2749,6 +2751,7 @@ const _createWalletFromServerData = action(
27492751
uniqueId,
27502752
policyId,
27512753
assetName,
2754+
assetNameASCII: hexToString(assetName),
27522755
quantity: new BigNumber(quantity.toString()),
27532756
};
27542757
}),

source/renderer/app/api/assets/types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export type ApiTokens = Array<ApiToken>;
5151
export type Token = {
5252
policyId: string,
5353
assetName: string,
54+
assetNameASCII?: string,
5455
quantity: BigNumber,
5556
address?: ?string,
5657
uniqueId: string,
Lines changed: 3 additions & 0 deletions
Loading

source/renderer/app/assets/images/search.inline.svg

Lines changed: 2 additions & 2 deletions
Loading

source/renderer/app/components/assets/Asset.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export default class Asset extends Component<Props, State> {
173173
const {
174174
asset,
175175
metadataNameChars,
176-
small,
176+
small = true,
177177
fullFingerprint,
178178
hasWarning,
179179
hasError,
@@ -182,9 +182,9 @@ export default class Asset extends Component<Props, State> {
182182
const { name } = metadata || {};
183183
const contentStyles = classnames([
184184
styles.pill,
185-
small ? styles.small : null,
186185
hasError ? styles.error : null,
187186
]);
187+
const [startCharAmount, endCharAmoout] = small ? [9, 4] : [12, 12];
188188
let warningPopOverMessage;
189189
if (hasWarning) {
190190
warningPopOverMessage =
@@ -195,7 +195,9 @@ export default class Asset extends Component<Props, State> {
195195
return (
196196
<div className={contentStyles}>
197197
<div className={styles.fingerprint}>
198-
{fullFingerprint ? fingerprint : ellipsis(fingerprint || '', 9, 4)}
198+
{fullFingerprint
199+
? fingerprint
200+
: ellipsis(fingerprint || '', startCharAmount, endCharAmoout)}
199201
</div>
200202
{name && (
201203
<div className={styles.metadataName}>
@@ -223,15 +225,13 @@ export default class Asset extends Component<Props, State> {
223225
asset,
224226
onCopyAssetParam,
225227
assetSettingsDialogWasOpened,
226-
anyAssetWasHovered,
227228
} = this.props;
228229
const pillContent = this.renderPillContent();
229230
const popOverContent = (
230231
<AssetContent
231232
asset={asset}
232233
onCopyAssetParam={onCopyAssetParam}
233234
assetSettingsDialogWasOpened={assetSettingsDialogWasOpened}
234-
anyAssetWasHovered={anyAssetWasHovered}
235235
className={styles.popOverContent}
236236
highlightFingerprint
237237
/>

source/renderer/app/components/assets/AssetContent.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
margin-left: 10px;
3131
max-height: 48px;
3232
overflow-y: auto;
33-
width: calc(100% - 140px);
33+
width: calc(100% - 100px);
3434

3535
&:not(:first-of-type) {
3636
margin-top: 10px;

source/renderer/app/components/assets/AssetSettingsDialog.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ export default class AssetSettingsDialog extends Component<Props, State> {
166166
<Dialog
167167
className={styles.component}
168168
title={intl.formatMessage(messages.title)}
169-
subtitle={<Asset asset={asset} className={styles.assetToken} />}
169+
subtitle={
170+
<Asset asset={asset} small={false} className={styles.assetToken} />
171+
}
170172
actions={actions}
171173
closeOnOverlayClick
172174
onClose={onCancel}

source/renderer/app/components/staking/stake-pools/StakePoolsSearch.scss

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212

1313
.searchIcon {
1414
bottom: 12.5px;
15+
color: var(--theme-staking-stake-pools-search-icon-color);
1516
left: 20px;
17+
opacity: 0.3;
1618
position: absolute;
1719
z-index: 1;
1820

1921
svg {
2022
width: 15px;
21-
g > g {
22-
fill: var(--theme-staking-stake-pools-search-icon-color);
23-
}
2423
}
2524
}
2625

source/renderer/app/components/wallet/WalletSendForm.js

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import Asset from '../../domains/Asset';
3838
import type { HwDeviceStatus } from '../../domains/Wallet';
3939
import type { AssetToken, ApiTokens } from '../../api/assets/types';
4040
import { DiscreetWalletAmount } from '../../features/discreet-mode';
41+
import WalletTokenPicker from './tokens/wallet-token-picker/WalletTokenPicker';
4142

4243
messages.fieldIsRequired = globalMessages.fieldIsRequired;
4344

@@ -62,6 +63,8 @@ type Props = {
6263
onUnsetActiveAsset: Function,
6364
onExternalLinkClick: Function,
6465
isAddressFromSameWallet: boolean,
66+
tokenFavorites: { [key: string]: boolean },
67+
walletName: string,
6568
};
6669

6770
type State = {
@@ -81,11 +84,11 @@ type State = {
8184
feeCalculationRequestQue: number,
8285
transactionFee: BigNumber,
8386
transactionFeeError: ?string | ?Node,
84-
showRemoveAssetButton: { [uniqueId: string]: boolean },
8587
selectedAssetUniqueIds: Array<string>,
8688
isResetButtonDisabled: boolean,
8789
isReceiverAddressValid: boolean,
8890
isTransactionFeeCalculated: boolean,
91+
isTokenPickerOpen: boolean,
8992
};
9093

9194
@observer
@@ -100,11 +103,11 @@ export default class WalletSendForm extends Component<Props, State> {
100103
feeCalculationRequestQue: 0,
101104
transactionFee: new BigNumber(0),
102105
transactionFeeError: null,
103-
showRemoveAssetButton: {},
104106
selectedAssetUniqueIds: [],
105107
isResetButtonDisabled: true,
106108
isReceiverAddressValid: false,
107109
isTransactionFeeCalculated: false,
110+
isTokenPickerOpen: false,
108111
};
109112

110113
// We need to track the fee calculation state in order to disable
@@ -226,7 +229,6 @@ export default class WalletSendForm extends Component<Props, State> {
226229

227230
this.setState({
228231
minimumAda: new BigNumber(0),
229-
showRemoveAssetButton: {},
230232
isResetButtonDisabled: true,
231233
});
232234
};
@@ -535,22 +537,6 @@ export default class WalletSendForm extends Component<Props, State> {
535537
}
536538
}
537539

538-
showRemoveAssetButton = (uniqueId: string) => {
539-
const { showRemoveAssetButton } = this.state;
540-
showRemoveAssetButton[uniqueId] = true;
541-
this.setState({
542-
showRemoveAssetButton,
543-
});
544-
};
545-
546-
hideRemoveAssetButton = (uniqueId: string) => {
547-
const { showRemoveAssetButton } = this.state;
548-
showRemoveAssetButton[uniqueId] = false;
549-
this.setState({
550-
showRemoveAssetButton,
551-
});
552-
};
553-
554540
addAssetRow = (uniqueId: string) => {
555541
this.addAssetFields(uniqueId);
556542
this.updateFormFields(false, uniqueId);
@@ -686,7 +672,6 @@ export default class WalletSendForm extends Component<Props, State> {
686672
adaAmount: adaAmountField,
687673
receiver: receiverField,
688674
assetFields,
689-
assetsDropdown,
690675
} = formFields.receiver;
691676

692677
const assetsSeparatorBasicHeight = 140;
@@ -836,22 +821,12 @@ export default class WalletSendForm extends Component<Props, State> {
836821
uniqueId={uniqueId}
837822
index={index}
838823
getAssetByUniqueId={this.getAssetByUniqueId}
839-
availableAssets={this.availableAssets}
840824
assetFields={assetFields}
841-
assetsDropdown={assetsDropdown}
842825
addFocusableField={this.addFocusableField}
843-
removeAssetButtonVisible={
844-
this.state.showRemoveAssetButton
845-
}
846-
showRemoveAssetButton={this.showRemoveAssetButton}
847-
hideRemoveAssetButton={this.hideRemoveAssetButton}
848826
currentNumberFormat={this.getCurrentNumberFormat()}
849827
removeAssetRow={this.removeAssetRow}
850828
handleSubmitOnEnter={this.handleSubmitOnEnter}
851829
clearAssetFieldValue={this.clearAssetFieldValue}
852-
onChangeAsset={(newUniqueId) =>
853-
this.onChangeAsset(uniqueId, newUniqueId)
854-
}
855830
autoFocus={this._isAutoFocusEnabled}
856831
/>
857832
)
@@ -862,7 +837,7 @@ export default class WalletSendForm extends Component<Props, State> {
862837
label={intl.formatMessage(messages.addAssetButtonLabel)}
863838
disabled={!this.hasAvailableAssets}
864839
onClick={() => {
865-
this.addAssetRow(this.availableAssets[0].uniqueId);
840+
this.setState({ isTokenPickerOpen: true });
866841
}}
867842
/>
868843
</div>
@@ -881,14 +856,19 @@ export default class WalletSendForm extends Component<Props, State> {
881856
transactionFeeError,
882857
isResetButtonDisabled,
883858
isTransactionFeeCalculated,
859+
isTokenPickerOpen,
860+
selectedAssetUniqueIds,
884861
} = this.state;
885862
const {
863+
assets,
886864
currencyMaxFractionalDigits,
887865
hwDeviceStatus,
888866
isHardwareWallet,
889867
isDialogOpen,
890868
isRestoreActive,
891869
onExternalLinkClick,
870+
tokenFavorites,
871+
walletName,
892872
} = this.props;
893873

894874
const receiverField = form.$('receiver');
@@ -981,6 +961,22 @@ export default class WalletSendForm extends Component<Props, State> {
981961
formattedTotalAmount={total.toFormat(currencyMaxFractionalDigits)}
982962
/>
983963
) : null}
964+
965+
{isTokenPickerOpen && (
966+
<WalletTokenPicker
967+
assets={assets}
968+
previouslyCheckedIds={selectedAssetUniqueIds}
969+
tokenFavorites={tokenFavorites}
970+
walletName={walletName}
971+
onCancel={() => {
972+
this.setState({ isTokenPickerOpen: false });
973+
}}
974+
onAdd={(checked) => {
975+
this.setState({ isTokenPickerOpen: false });
976+
checked.forEach(this.addAssetRow);
977+
}}
978+
/>
979+
)}
984980
</div>
985981
);
986982
}

0 commit comments

Comments
 (0)