Skip to content

Commit 47d172c

Browse files
committed
feat: add option to hide exchange features for restricted regions
1 parent 719d536 commit 47d172c

21 files changed

Lines changed: 450 additions & 253 deletions

lib/core/settings/data/settings_datasource.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,10 @@ class SettingsDatasource {
7777
(f) => f(id: const Value(1), themeMode: Value(themeMode.name)),
7878
);
7979
}
80+
81+
Future<void> setHideExchangeFeatures(bool hide) async {
82+
await _sqlite.managers.settings.update(
83+
(f) => f(id: const Value(1), hideExchangeFeatures: Value(hide)),
84+
);
85+
}
8086
}

lib/core/settings/data/settings_model.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class SettingsModel {
1313
final bool useTorProxy;
1414
final int torProxyPort;
1515
final AppThemeMode themeMode;
16+
final bool hideExchangeFeatures;
1617

1718
const SettingsModel({
1819
required this.id,
@@ -26,6 +27,7 @@ class SettingsModel {
2627
required this.useTorProxy,
2728
required this.torProxyPort,
2829
required this.themeMode,
30+
required this.hideExchangeFeatures,
2931
});
3032

3133
SettingsRow toSqlite() {
@@ -41,6 +43,7 @@ class SettingsModel {
4143
useTorProxy: useTorProxy,
4244
torProxyPort: torProxyPort,
4345
themeMode: themeMode.name,
46+
hideExchangeFeatures: hideExchangeFeatures,
4447
);
4548
}
4649

@@ -57,6 +60,7 @@ class SettingsModel {
5760
useTorProxy: row.useTorProxy,
5861
torProxyPort: row.torProxyPort,
5962
themeMode: AppThemeMode.fromName(row.themeMode),
63+
hideExchangeFeatures: row.hideExchangeFeatures,
6064
);
6165
}
6266
}

lib/core/settings/data/settings_repository.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SettingsRepository implements domain.SettingsRepository {
3535
required bool useTorProxy,
3636
required int torProxyPort,
3737
AppThemeMode themeMode = AppThemeMode.system,
38+
required bool hideExchangeFeatures,
3839
}) async {
3940
await _settingsDatasource.store(
4041
SettingsModel(
@@ -49,6 +50,7 @@ class SettingsRepository implements domain.SettingsRepository {
4950
useTorProxy: useTorProxy,
5051
torProxyPort: torProxyPort,
5152
themeMode: themeMode,
53+
hideExchangeFeatures: hideExchangeFeatures,
5254
),
5355
);
5456
}
@@ -68,6 +70,7 @@ class SettingsRepository implements domain.SettingsRepository {
6870
useTorProxy: s.useTorProxy,
6971
torProxyPort: s.torProxyPort,
7072
themeMode: s.themeMode,
73+
hideExchangeFeatures: s.hideExchangeFeatures,
7174
);
7275
}
7376

@@ -121,4 +124,9 @@ class SettingsRepository implements domain.SettingsRepository {
121124
Future<void> setThemeMode(AppThemeMode themeMode) async {
122125
await _settingsDatasource.setThemeMode(themeMode);
123126
}
127+
128+
@override
129+
Future<void> setHideExchangeFeatures(bool hide) async {
130+
await _settingsDatasource.setHideExchangeFeatures(hide);
131+
}
124132
}

lib/core/settings/domain/repositories/settings_repository.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ abstract class SettingsRepository {
2020
required bool useTorProxy,
2121
required int torProxyPort,
2222
AppThemeMode themeMode = AppThemeMode.system,
23+
required bool hideExchangeFeatures,
2324
});
2425

2526
Future<SettingsEntity> fetch();
@@ -43,4 +44,6 @@ abstract class SettingsRepository {
4344
Future<void> setTorProxyPort(int port);
4445

4546
Future<void> setThemeMode(AppThemeMode themeMode);
47+
48+
Future<void> setHideExchangeFeatures(bool hide);
4649
}

lib/core/settings/domain/settings_entity.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ abstract class SettingsEntity with _$SettingsEntity {
9292
@Default(false) bool useTorProxy,
9393
@Default(9050) int torProxyPort,
9494
@Default(AppThemeMode.system) AppThemeMode themeMode,
95+
bool? hideExchangeFeatures,
9596
}) = _SettingsEntity;
9697
const SettingsEntity._();
9798
}

lib/core/storage/database_seeds.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class DatabaseSeeds {
2222
useTorProxy: false,
2323
torProxyPort: 9050,
2424
themeMode: 'system',
25+
hideExchangeFeatures: false,
2526
),
2627
);
2728
}

lib/core/storage/tables/settings_table.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ class Settings extends Table {
1414
BoolColumn get useTorProxy => boolean().withDefault(const Constant(false))();
1515
IntColumn get torProxyPort => integer().withDefault(const Constant(9050))();
1616
TextColumn get themeMode => text().withDefault(const Constant('system'))();
17+
BoolColumn get hideExchangeFeatures =>
18+
boolean().withDefault(const Constant(false))();
1719
}

lib/core/widgets/cards/action_card.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,30 @@ class _ActionRow extends StatelessWidget {
5050

5151
@override
5252
Widget build(BuildContext context) {
53+
final hideExchangeFeatures =
54+
context.watch<SettingsCubit>().state.hideExchangeFeatures ?? false;
55+
56+
// If exchange features are hidden, only show Transfer button
57+
if (hideExchangeFeatures) {
58+
return Material(
59+
elevation: 2,
60+
color: Colors.transparent,
61+
child: SizedBox(
62+
height: 80,
63+
child: _ActionButton(
64+
icon: Assets.icons.swap.path,
65+
label: 'Transfer',
66+
onPressed: () {
67+
context.pushNamed(SwapRoute.swap.name);
68+
},
69+
position: _ButtonPosition.first,
70+
disabled: false,
71+
),
72+
),
73+
);
74+
}
75+
76+
// Default view with all buttons
5377
return Material(
5478
elevation: 2,
5579
shadowColor: context.appColors.onSurface.withValues(alpha: 0.5),

lib/features/ark/ui/ark_wallet_detail_page.dart

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import 'package:bb_mobile/features/ark/router.dart';
66
import 'package:bb_mobile/features/ark/ui/ark_balance_detail_widget.dart';
77
import 'package:bb_mobile/features/ark/ui/settle_bottom_sheet.dart';
88
import 'package:bb_mobile/features/ark/ui/transaction_history_widget.dart';
9+
import 'package:bb_mobile/features/settings/presentation/bloc/settings_cubit.dart';
10+
import 'package:bb_mobile/features/swap/ui/swap_router.dart';
911
import 'package:bb_mobile/features/wallet/ui/wallet_router.dart';
1012
import 'package:flutter/cupertino.dart';
1113
import 'package:flutter/material.dart';
@@ -20,6 +22,8 @@ class ArkWalletDetailPage extends StatelessWidget {
2022
Widget build(BuildContext context) {
2123
final cubit = context.read<ArkCubit>();
2224
final state = context.watch<ArkCubit>().state;
25+
final hideExchangeFeatures =
26+
context.watch<SettingsCubit>().state.hideExchangeFeatures ?? false;
2327

2428
return Scaffold(
2529
appBar: AppBar(
@@ -97,13 +101,13 @@ class ArkWalletDetailPage extends StatelessWidget {
97101
);
98102
},
99103
),
100-
const Padding(
104+
Padding(
101105
padding: EdgeInsets.only(
102106
left: 13.0,
103107
right: 13.0,
104-
bottom: 40.0,
108+
bottom: hideExchangeFeatures ? 40.0 : 16.0,
105109
),
106-
child: ArkWalletBottomButtons(),
110+
child: const ArkWalletBottomButtons(),
107111
),
108112
],
109113
),
@@ -122,6 +126,18 @@ class ArkWalletBottomButtons extends StatelessWidget {
122126
Widget build(BuildContext context) {
123127
return Row(
124128
children: [
129+
BBButton.small(
130+
iconData: Icons.swap_vert,
131+
label: '',
132+
onPressed: () {
133+
context.pushNamed(SwapRoute.swap.name);
134+
},
135+
bgColor: context.colour.secondary,
136+
textColor: context.colour.onPrimary,
137+
width: 56,
138+
height: 56,
139+
),
140+
const Gap(8),
125141
Expanded(
126142
child: BBButton.big(
127143
iconData: Icons.arrow_downward,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'package:bb_mobile/core/settings/data/settings_repository.dart';
2+
3+
class SetHideExchangeFeaturesUsecase {
4+
final SettingsRepository _settingsRepository;
5+
6+
SetHideExchangeFeaturesUsecase({
7+
required SettingsRepository settingsRepository,
8+
}) : _settingsRepository = settingsRepository;
9+
10+
Future<void> execute(bool hide) async {
11+
await _settingsRepository.setHideExchangeFeatures(hide);
12+
}
13+
}

0 commit comments

Comments
 (0)