Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions assets/new-ui/archived.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/new-ui/hide.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/new-ui/restore.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 26 additions & 1 deletion cw_core/lib/balance_card_style_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class BalanceCardStyleSettings {
final int accountIndex;
final int gradientIndex;
final bool useSpecialDesign;
final bool hidden;
final String backgroundImagePath;
final int cardOrder;

Expand All @@ -15,6 +16,7 @@ class BalanceCardStyleSettings {
required this.accountIndex,
required this.gradientIndex,
required this.useSpecialDesign,
required this.hidden,
required this.backgroundImagePath,
required this.cardOrder});

Expand All @@ -25,6 +27,7 @@ class BalanceCardStyleSettings {
"walletInfoId": walletInfoId,
"accountIndex": accountIndex,
"gradientIndex": gradientIndex,
"hidden": hidden ? 1 : 0,
"useSpecialDesign": useSpecialDesign ? 1 : 0,
"backgroundImagePath": backgroundImagePath,
"cardOrder": cardOrder,
Expand All @@ -36,20 +39,42 @@ class BalanceCardStyleSettings {
return BalanceCardStyleSettings(
walletInfoId: json["walletInfoId"] as int,
accountIndex: json["accountIndex"] as int,
hidden: json["hidden"] == 1,
gradientIndex: json["gradientIndex"] as int,
useSpecialDesign: json["useSpecialDesign"] == 1,
backgroundImagePath: json["backgroundImagePath"] as String? ?? "",
cardOrder: json["cardOrder"] as int? ?? -1,
);
}

BalanceCardStyleSettings copyWith({
int? walletInfoId,
int? accountIndex,
int? gradientIndex,
bool? useSpecialDesign,
bool? hidden,
String? backgroundImagePath,
int? cardOrder,
}) {
return BalanceCardStyleSettings(
walletInfoId: walletInfoId ?? this.walletInfoId,
accountIndex: accountIndex ?? this.accountIndex,
gradientIndex: gradientIndex ?? this.gradientIndex,
useSpecialDesign: useSpecialDesign ?? this.useSpecialDesign,
hidden: hidden ?? this.hidden,
backgroundImagePath: backgroundImagePath ?? this.backgroundImagePath,
cardOrder: cardOrder ?? this.cardOrder,
);
}

static BalanceCardStyleSettings fromCardDesign(
int walletInfoId, int accountIndex, int cardOrder, CardDesign design) {
int walletInfoId, int accountIndex, int cardOrder, CardDesign design, {bool hidden = false}) {
return BalanceCardStyleSettings(
walletInfoId: walletInfoId,
accountIndex: accountIndex,
gradientIndex: CardDesign.allGradients.indexOf(design.gradient),
useSpecialDesign: design.backgroundType == CardDesignBackgroundTypes.svgFull,
hidden: hidden,
backgroundImagePath:
design.backgroundType == CardDesignBackgroundTypes.image ? design.imagePath : "",
cardOrder: cardOrder,
Expand Down
7 changes: 6 additions & 1 deletion cw_core/lib/db/sqlite.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Future<void> initDb({String? pathOverride}) async {
}
}
await db?.close();
db = await openDatabase(dbFile.path, version: 3,
db = await openDatabase(dbFile.path, version: 4,
onUpgrade: (Database db, int oldVersion, int newVersion) async {
printV("migrating: $oldVersion, $newVersion");
if (oldVersion <= 1) {
Expand Down Expand Up @@ -81,6 +81,11 @@ CREATE TABLE IF NOT EXISTS BalanceCardStyleSettings (
definition: 'INTEGER DEFAULT 0',
);
}
if(oldVersion <= 3) {
_addColumnIfNotExists(db,
table: "BalanceCardStyleSettings", column: "hidden", definition: "BOOLEAN DEFAULT FALSE");
}

},
onCreate: (Database db, int version) async {
await db.execute(
Expand Down
132 changes: 87 additions & 45 deletions lib/new-ui/pages/account_customizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/new-ui/pages/card_customizer.dart';
import 'package:cake_wallet/new-ui/pages/hidden_accounts.dart';
import 'package:cake_wallet/new-ui/viewmodels/card_customizer/card_customizer_bloc.dart';
import 'package:cake_wallet/new-ui/widgets/coins_page/cards/balance_card.dart';
import 'package:cake_wallet/new-ui/widgets/modal_grab_handle.dart';
import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
import 'package:cake_wallet/new-ui/widgets/new_primary_button.dart';
import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
Expand All @@ -16,9 +18,9 @@ import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dar
import 'package:cake_wallet/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart';
import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart';
import 'package:cw_core/balance_card_style_settings.dart';
import 'package:cw_core/card_design.dart';
import 'package:cw_core/generate_name.dart';
import 'package:cw_core/sync_status.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
Expand Down Expand Up @@ -59,23 +61,21 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
loadCards();
final activeId = monero!.getCurrentAccount(widget.dashboardViewModel.wallet).id;
for (int i = 0; i < _items.length-1; i++) {
if(_items[i].accountListItem.id == activeId) {
final lastIndex = _items.length - 1;
final temp = _items[i];
_items[i] = _items[lastIndex];
_items[lastIndex] = temp;
saveCardOrder();
widget.dashboardViewModel.loadCardDesigns();
break;
loadCards().then((_){
final activeId = monero!.getCurrentAccount(widget.dashboardViewModel.wallet).id;
for (int i = 0; i < _items.length-1; i++) {
if(_items[i].accountListItem.id == activeId) {
final lastIndex = _items.length - 1;
final temp = _items[i];
_items[i] = _items[lastIndex];
_items[lastIndex] = temp;
saveCardOrder();
widget.dashboardViewModel.loadCardDesigns();
break;
}
}
}

});
});


}

@override
Expand All @@ -84,35 +84,51 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
super.dispose();
}

void loadCards() {
_items.clear();
Future<void> loadCards() async {
final List<AccountCustomizerListItem> newItems = [];

final accounts = widget.accountListViewModel.accounts;
for (int i = 0; i < accounts.length; i++) {
final index = widget.dashboardViewModel.cardOrder[i];
final styleSettings = await BalanceCardStyleSettings.getAll(widget.dashboardViewModel.wallet.walletInfo.internalId);
final sortedOrderKeys = widget.dashboardViewModel.cardOrder.keys.toList()..sort();
for (final key in sortedOrderKeys) {
final index = widget.dashboardViewModel.cardOrder[key];

if(index == null || index >= accounts.length) {
if(index == null) {
continue;
}

if(index >= accounts.length) {
// db order broken.
reset();
break;
}

_items.add(AccountCustomizerListItem(
final account = accounts.firstWhere((item)=>item.id==index);
final setting = styleSettings.firstWhere((item)=>item.accountIndex == index);

if(setting.hidden) {
continue;
}

newItems.add(AccountCustomizerListItem(
card: BalanceCard(
accountName: accounts[index].label,
accountIndex: accounts[index].id,
balance: accounts[index].balance ?? "0.00",
accountBalance: accounts[index].balance ?? "0.00",
accountName: account.label,
accountIndex: account.id,
balance: account.balance ?? "0.00",
accountBalance: account.balance ?? "0.00",
designSwitchDuration: Duration.zero,
assetName: widget.accountListViewModel.currency.title,
onCustomizeTapped: (i == accounts.length - 1) ? _openCardCustomizer : null,
selected: i == accounts.length - 1,
onCustomizeTapped: (key == accounts.length - 1) ? _openCardCustomizer : null,
selected: key == accounts.length - 1,
width: cardWidth,
design: widget.dashboardViewModel.cardDesigns[index],
design: CardDesign.fromStyleSettings(setting, widget.dashboardViewModel.wallet.currency),
),
order: index,
accountListItem: accounts[index]));
accountListItem: account));

}
_items.clear();
_items.addAll(newItems);
setState(() {});
}

Expand All @@ -130,8 +146,20 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
title: S.of(context).wallet_accounts,
leadingIcon: Icon(Icons.close),
onLeadingPressed: Navigator.of(context).maybePop,
trailingIcon: Icon(Icons.refresh),
onTrailingPressed: showResetDialog,
// trailingIcon: Icon(Icons.refresh),
// onTrailingPressed: showResetDialog,
trailingWidget: Row(spacing:8,children: [
ModernButton(icon: Icon(Icons.refresh), onPressed: showResetDialog, size: 36),
ModernButton.svg(svgPath: "assets/new-ui/archived.svg", size: 36, onPressed: ()async{
await Navigator.of(context).push(CupertinoPageRoute(
builder: (context) => Material(
child: HiddenAccountsPage(
accountListViewModel: widget.accountListViewModel,
dashboardViewModel: widget.dashboardViewModel),
)));
await loadCards();
}, iconSize: 18,)
],),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 24.0),
Expand Down Expand Up @@ -265,7 +293,7 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
});
if (res != null && res is bool && res == true) {
await widget.dashboardViewModel.loadCardDesigns();
loadCards();
await loadCards();
await saveCardOrder();
}
}
Expand All @@ -274,8 +302,11 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
if (!_checkReadyToManage()) {
return;
}

widget.accountListViewModel.select(_items[_items.length-1].accountListItem);

final bloc = getIt.get<CardCustomizerBloc>(param1: false);


Navigator.of(context).push(CupertinoPageRoute(
builder: (context) {
Expand All @@ -290,11 +321,13 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
),
);
},
)).then((_) async {
bloc.add(DesignSaved());
)).then((result) async {
final hideRequested = result != null && result is bool && result;
bloc.add(hideRequested ? AccountHidden() : DesignSaved());
await bloc.stream.firstWhere((item) => item is CardCustomizerSaved);
if(hideRequested) await reset(unhide: false);
await widget.dashboardViewModel.loadCardDesigns();
loadCards();
await loadCards();
});
}

Expand Down Expand Up @@ -332,15 +365,16 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
}

Future<void> saveCardOrder() async {
for (int i = 0; i < _items.length; i++) {
final idx = _items.indexWhere((element) => element.accountListItem.id == i);
printV("$i: $idx");
final visualOrder = _items.reversed.toList();

for (int i = 0; i < visualOrder.length; i++) {
final item = visualOrder[i];

await BalanceCardStyleSettings.fromCardDesign(
widget.dashboardViewModel.wallet.walletInfo.internalId,
item.accountListItem.id,
i,
idx,
_items[idx].card.design)
item.card.design)
.insert();
}
}
Expand All @@ -360,15 +394,20 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
actionRightButton: Navigator.of(context).pop);
});
if(res != null && res is bool && res) {
reset();
reset(close: true);
}
}

Future<void> reset() async {
Future<void> reset({bool close = false, bool unhide = true}) async {
_items.clear();

final accounts = widget.accountListViewModel.accounts;
for (int i = 0; i < widget.accountListViewModel.accounts.length; i++) {
final styleSettings = await BalanceCardStyleSettings.get(
widget.dashboardViewModel.wallet.walletInfo.internalId, accounts[i].id);
if(!unhide && (styleSettings?.hidden??false)) {
continue;
}

_items.add(AccountCustomizerListItem(
card: BalanceCard(
Expand All @@ -380,14 +419,17 @@ class _AccountCustomizerState extends State<AccountCustomizer> {
selected: true,
designSwitchDuration: Duration(milliseconds: 200),
width: cardWidth,
design: widget.dashboardViewModel.cardDesigns[i],
design: CardDesign.fromStyleSettings(
styleSettings,
widget.dashboardViewModel.wallet.currency),
),
order: i,
accountListItem: accounts[i]));
}

saveCardOrder();
setState(() {});
if(close)Navigator.of(context).maybePop();
else setState(() {});
}
}

Expand Down
5 changes: 3 additions & 2 deletions lib/new-ui/pages/card_customizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:cake_wallet/new-ui/widgets/coins_page/cards/balance_card.dart';
import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';

class CardCustomizer extends StatefulWidget {
const CardCustomizer({super.key, required this.cryptoTitle, required this.cryptoName});
Expand Down Expand Up @@ -69,9 +70,9 @@ class _CardCustomizerState extends State<CardCustomizer> {
ModalTopBar(
title: editEnabled ? S.of(context).edit_account : S.of(context).edit_card,
leadingIcon: Icon(Icons.close),
// trailingIcon: editEnabled ? Icon(Icons.delete_forever) : null,
trailingIcon: editEnabled ? SvgPicture.asset("assets/new-ui/hide.svg",colorFilter: ColorFilter.mode(Theme.of(context).colorScheme.primary,BlendMode.srcIn),) : null,
onLeadingPressed: () => Navigator.of(context).maybePop(),
// onTrailingPressed: () {},
onTrailingPressed: () => Navigator.of(context).maybePop(true),
),
if (editEnabled)
Padding(
Expand Down
Loading
Loading