mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 12:09:43 +00:00
4e2e5e708c
* feat: Implement creating new BIP39 wallet with same seed used for other owned BIP39 wallets * feat: Use same seed for BIP39 Wallets * Update pre_existing_seeds_page.dart * Feat: BIP39 Same seed wallet creation using the Common Parent Wallet Strategy * feat: Finalize implementing preexisting seeds * feat: Implement shared bip39 wallet seed for Bitcoin wallet type * feat: Implement shared bip39 wallet seed for Litecoin wallet type * feat: Implement shared bip39 wallet seed for BitcoinCash wallet type * feat: Implement shared bip39 wallet seed for Nano wallet type, although disabled entry for now * fix: Remove non bip39 seed wallet type from listing * feat: Implement grouped and single wallets lists in wallets listing page and implement editing and saving group names * fix: Issue where the ontap always references the leadwallet, also make shared seed wallets section header only display when the multi wallet groups list is not empty * fix: Add translation and adjust the way the groups display * feat: Activate bip39 as an option for creating Nano wallet types * fix: Handle edgecase with creating new wallet with group address, handle case where only bip39 derivation type is allowed with child wallets, activate nano wallet type for shared seed * chore: Modify the UI to fit adjustment made on figma * fix: Disposed box triggering error in hive and causing wallet list view to display error * fix: Switch wallet groups title in wallets list page and also fix issue with renaming groups * Update lib/reactions/bip39_wallet_utils.dart [skip ci] Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com> * Update lib/router.dart [skip ci] Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com> * fix: Review fixes: Combine New Wallet Page Type arguments into a single model * fix: Review fixes: Add failure guard when fetching mnemonic for selected wallet in pre-existing wallets page * fix: Review fixes - Add loading indicator when mnemonic is being selected for wallet * fix: Review fixes - Modify variable name to avoid clashes * fix: Review fixes - Access WalletManager through dependency injection instead of service location * fix: Review fixes - Add testnet to convertWalletInfoToWalletlistItem function, and adjust according where used * fix: Review fixes - Add walletPassword to nano, tron and wownero wallets and confirm it is properly handled as it should be * fix: Remove leadWallet, modify filtering flow to reflect this and not depend on leadWallet, and adjust privacy settings * fix: Review Fixes - Modify restore flow to reflect current nature of bip39 as default for majority of wallet types * fix: QA Fixes - Modify preexisting page to display wallet group names if set, and display them in incremental order if not set * fix: Add wallet group description page and rename pre-existingseeds page to wallet group display page * fix: Product Fix - Rename pre-existing seeds file name to wallet group display filename * fix: Product fix - Separate multiwallets groups from single wallets and display separately * fix - Product Fix - Add empty state for wallet group listing when creating a new wallet, adjust CTAs across buttons relating to the flow also --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
110 lines
3.5 KiB
Dart
110 lines
3.5 KiB
Dart
import 'package:cake_wallet/entities/wallet_group.dart';
|
|
import 'package:cw_core/wallet_info.dart';
|
|
import 'package:hive/hive.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
class WalletManager {
|
|
WalletManager(
|
|
this._walletInfoSource,
|
|
this._sharedPreferences,
|
|
);
|
|
|
|
final Box<WalletInfo> _walletInfoSource;
|
|
final SharedPreferences _sharedPreferences;
|
|
|
|
final List<WalletGroup> walletGroups = [];
|
|
|
|
/// Categorize wallets into groups based on their parentAddress.
|
|
///
|
|
/// Update the lead wallet for each group and clean up empty groups
|
|
/// i.e remove group if there's no lead wallet (i.e, no wallets left)
|
|
void updateWalletGroups() {
|
|
walletGroups.clear();
|
|
|
|
for (var walletInfo in _walletInfoSource.values) {
|
|
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
|
|
group.wallets.add(walletInfo);
|
|
}
|
|
|
|
walletGroups.removeWhere((group) => group.wallets.isEmpty);
|
|
|
|
_loadCustomGroupNames();
|
|
}
|
|
|
|
/// Function to determine the correct parentAddress for a wallet.
|
|
///
|
|
/// If it's a parent wallet (parentAddress is null),
|
|
/// use its own address as parentAddress.
|
|
String _resolveParentAddress(WalletInfo walletInfo) {
|
|
return walletInfo.parentAddress ?? walletInfo.address;
|
|
}
|
|
|
|
/// Check if a group with the parentAddress already exists,
|
|
/// If no group exists, create a new one.
|
|
///
|
|
WalletGroup _getOrCreateGroup(String parentAddress) {
|
|
return walletGroups.firstWhere(
|
|
(group) => group.parentAddress == parentAddress,
|
|
orElse: () {
|
|
final newGroup = WalletGroup(parentAddress);
|
|
walletGroups.add(newGroup);
|
|
return newGroup;
|
|
},
|
|
);
|
|
}
|
|
|
|
/// Add a new wallet and update lead wallet after adding.
|
|
void addWallet(WalletInfo walletInfo) {
|
|
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
|
|
group.wallets.add(walletInfo);
|
|
}
|
|
|
|
/// Removes a wallet from a group i.e when it's deleted.
|
|
///
|
|
/// Update lead wallet after removing,
|
|
/// Remove the group if it's empty (i.e., no lead wallet).
|
|
void removeWallet(WalletInfo walletInfo) {
|
|
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
|
|
group.wallets.remove(walletInfo);
|
|
|
|
if (group.wallets.isEmpty) {
|
|
walletGroups.remove(group);
|
|
}
|
|
}
|
|
|
|
/// Returns all the child wallets within a group.
|
|
///
|
|
/// If the group is not found, returns an empty group with no wallets.
|
|
List<WalletInfo> getWalletsInGroup(String parentAddress) {
|
|
return walletGroups
|
|
.firstWhere(
|
|
(group) => group.parentAddress == parentAddress,
|
|
orElse: () => WalletGroup(parentAddress),
|
|
)
|
|
.wallets;
|
|
}
|
|
|
|
/// Iterate through all groups and load their custom names from storage
|
|
void _loadCustomGroupNames() {
|
|
for (var group in walletGroups) {
|
|
final groupName = _sharedPreferences.getString('wallet_group_name_${group.parentAddress}');
|
|
if (groupName != null && group.wallets.length > 1) {
|
|
group.groupName = groupName; // Restore custom name
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Save custom name for a group
|
|
void _saveCustomGroupName(String parentAddress, String name) {
|
|
_sharedPreferences.setString('wallet_group_name_$parentAddress', name);
|
|
}
|
|
|
|
// Set custom group name and persist it
|
|
void setGroupName(String parentAddress, String name) {
|
|
if (parentAddress.isEmpty || name.isEmpty) return;
|
|
|
|
final group = walletGroups.firstWhere((group) => group.parentAddress == parentAddress);
|
|
group.setCustomName(name);
|
|
_saveCustomGroupName(parentAddress, name); // Persist the custom name
|
|
}
|
|
}
|