diff --git a/assets/i18n/en.i18n.yaml b/assets/i18n/en.i18n.yaml index 95b32f60..79466349 100644 --- a/assets/i18n/en.i18n.yaml +++ b/assets/i18n/en.i18n.yaml @@ -204,6 +204,8 @@ wallet_home_screen: fake_balance_input_placeholder: "Please set the total fake balance (in BTC units)" fake_balance_input_description: "If you have multiple wallets, each wallet's balance will be calculated automatically." fake_balance_input_exceeds_error: "You can set up to 21 million BTC" + hide_fiat_price: "Hide Fiat Balance" + hide_fiat_price_on_home: "Fiat balance will not be displayed on the home screen." category: total_balance: "Total\nBalance" wallet_list: "Wallet\nList" diff --git a/assets/i18n/jp.i18n.yaml b/assets/i18n/jp.i18n.yaml index d55f199c..02e23d30 100644 --- a/assets/i18n/jp.i18n.yaml +++ b/assets/i18n/jp.i18n.yaml @@ -198,6 +198,8 @@ wallet_home_screen: fake_balance_input_placeholder: "偽の総残高を設定してください(BTC単位)" fake_balance_input_description: "複数のウォレットがある場合、各ウォレットの残高は自動的に計算されます。" fake_balance_input_exceeds_error: "最大2100万BTCまで設定できます。" + hide_fiat_price: "フィアット残高を非表示" + hide_fiat_price_on_home: "ホーム画面にフィアット残高を表示しません。" category: total_balance: "残高合計" wallet_list: "ウォレット\n一覧" diff --git a/assets/i18n/kr.i18n.yaml b/assets/i18n/kr.i18n.yaml index 4783c393..14e3b42a 100644 --- a/assets/i18n/kr.i18n.yaml +++ b/assets/i18n/kr.i18n.yaml @@ -204,6 +204,8 @@ wallet_home_screen: fake_balance_input_placeholder: "총 가짜 잔액을 설정해 주세요.(BTC 단위)" fake_balance_input_description: "여러 지갑이 있을 경우, 각 지갑의 잔액은 자동으로 계산돼요." fake_balance_input_exceeds_error: "최대 2100만 BTC까지 설정할 수 있어요" + hide_fiat_price: "법정화폐 잔액 숨기기" + hide_fiat_price_on_home: "홈 화면에 법정화폐 잔액을 표시하지 않아요." category: total_balance: "잔액 합계" wallet_list: "지갑 목록" diff --git a/lib/constants/shared_pref_keys.dart b/lib/constants/shared_pref_keys.dart index f8beca2d..034cc617 100644 --- a/lib/constants/shared_pref_keys.dart +++ b/lib/constants/shared_pref_keys.dart @@ -19,6 +19,7 @@ class SharedPrefKeys { static const String kIsReceivingTooltipDisabled = "IS_RECEIVING_TOOLTIP_DISABLED"; static const String kIsChangeTooltipDisabled = "IS_CHANGE_TOOLTIP_DISABLED"; static const String kIsBalanceHidden = "IS_BALANCE_HIDDEN"; + static const String kIsFiatBalanceHidden = "IS_FIAT_BALANCE_HIDDEN"; static const String kHideTermsShortcut = "IS_OPEN_TERMS_SCREEN"; static const String kNextIdField = 'nextId'; static const String kUtxoSortOrder = 'UTXO_SORT_ORDER'; @@ -32,8 +33,7 @@ class SharedPrefKeys { static const String kAnalysisPeriod = "ANALYSIS_PERIOD"; // 분석 위젯에 사용되는 조회 기간 static const String kAnalysisPeriodStart = "ANALYSIS_PERIOD_START"; // 분석 위젯에 사용되는 조회 기간 시작 날짜 static const String kAnalysisPeriodEnd = "ANALYSIS_PERIOD_END"; // 분석 위젯에 사용되는 조회 기간 종료 날짜 - static const String kSelectedTransactionTypeIndices = - "SELECTED_TRANSACTION_TYPE_INDICES"; // 분석 위젯에 사용되는 거래 유형 + static const String kSelectedTransactionTypeIndices = "SELECTED_TRANSACTION_TYPE_INDICES"; // 분석 위젯에 사용되는 거래 유형 /// 리뷰 요청 관련 static const String kHaveSent = 'HAVE_SENT'; diff --git a/lib/providers/preference_provider.dart b/lib/providers/preference_provider.dart index 729ba031..7cb72f80 100644 --- a/lib/providers/preference_provider.dart +++ b/lib/providers/preference_provider.dart @@ -31,6 +31,9 @@ class PreferenceProvider extends ChangeNotifier { late bool _isFakeBalanceActive; bool get isFakeBalanceActive => _isFakeBalanceActive; + late bool _isFiatBalanceHidden; + bool get isFiatBalanceHidden => _isFiatBalanceHidden; + /// 가짜 잔액 총량 late int? _fakeBalanceTotalBtc; int? get fakeBalanceTotalAmount => _fakeBalanceTotalBtc; @@ -98,6 +101,7 @@ class PreferenceProvider extends ChangeNotifier { PreferenceProvider(this._walletPreferencesRepository) { _fakeBalanceTotalBtc = _sharedPrefs.getIntOrNull(SharedPrefKeys.kFakeBalanceTotal); + _isFiatBalanceHidden = _sharedPrefs.getBool(SharedPrefKeys.kIsFiatBalanceHidden); _isFakeBalanceActive = _fakeBalanceTotalBtc != null; _isBalanceHidden = _sharedPrefs.getBool(SharedPrefKeys.kIsBalanceHidden); _isBtcUnit = @@ -207,6 +211,14 @@ class PreferenceProvider extends ChangeNotifier { notifyListeners(); } + /// 홈 화면 법정화폐 잔액 숨기기 + Future changeIsFiatBalanceHidden(bool isOn) async { + _isFiatBalanceHidden = isOn; + await _sharedPrefs.setBool(SharedPrefKeys.kIsFiatBalanceHidden, isOn); + + notifyListeners(); + } + /// 가짜 잔액 활성화 상태 변경 Future toggleFakeBalanceActivation(bool isActive) async { _isFakeBalanceActive = isActive; diff --git a/lib/providers/view_model/home/wallet_home_edit_view_model.dart b/lib/providers/view_model/home/wallet_home_edit_view_model.dart index 93d71f66..392c53cc 100644 --- a/lib/providers/view_model/home/wallet_home_edit_view_model.dart +++ b/lib/providers/view_model/home/wallet_home_edit_view_model.dart @@ -11,6 +11,7 @@ class WalletHomeEditViewModel extends ChangeNotifier { WalletProvider _walletProvider; late final PreferenceProvider _preferenceProvider; late bool _isBalanceHidden; + late bool _isFiatBalanceHidden; late bool _isFakeBalanceActive; late int minimumSatoshi; @@ -27,6 +28,7 @@ class WalletHomeEditViewModel extends ChangeNotifier { // temp datas late List _tempHomeFeatures; late bool _tempIsBalanceHidden; + late bool _tempIsFiatBalanceHidden; late bool _tempIsFakeBalanceActive; late double? _tempFakeBalanceTotalBtc; late int? _tempFakeBalanceTotalAmount; @@ -37,6 +39,7 @@ class WalletHomeEditViewModel extends ChangeNotifier { // .map((key, balance) => MapEntry(key, AnimatedBalanceData(balance.total, balance.total))); minimumSatoshi = _walletProvider.walletItemList.length; _isBalanceHidden = _preferenceProvider.isBalanceHidden; + _isFiatBalanceHidden = _preferenceProvider.isFiatBalanceHidden; _isFakeBalanceActive = _preferenceProvider.isFakeBalanceActive; _fakeBalanceTotalAmount = _preferenceProvider.fakeBalanceTotalAmount; _fakeBalanceMap = _preferenceProvider.getFakeBalanceMap(); @@ -68,12 +71,14 @@ class WalletHomeEditViewModel extends ChangeNotifier { ) .toList(); _tempIsBalanceHidden = isBalanceHidden; + _tempIsFiatBalanceHidden = isFiatBalanceHidden; _tempIsFakeBalanceActive = isFakeBalanceActive; _tempFakeBalanceTotalBtc = fakeBalanceTotalBtc; _tempFakeBalanceTotalAmount = fakeBalanceTotalAmount; } bool get isBalanceHidden => _isBalanceHidden; + bool get isFiatBalanceHidden => _isFiatBalanceHidden; bool get isFakeBalanceActive => _isFakeBalanceActive; int? get fakeBalanceTotalAmount => _fakeBalanceTotalAmount; double? get fakeBalanceTotalBtc => _fakeBalanceTotalBtc; @@ -85,6 +90,7 @@ class WalletHomeEditViewModel extends ChangeNotifier { List get tempHomeFeatures => _tempHomeFeatures; bool get tempIsBalanceHidden => _tempIsBalanceHidden; + bool get tempIsFiatBalanceHidden => _tempIsFiatBalanceHidden; bool get tempIsFakeBalanceActive => _tempIsFakeBalanceActive; double? get tempFakeBalanceTotalBtc => _tempFakeBalanceTotalBtc; int? get tempFakeBalanceTotalAmount => _tempFakeBalanceTotalAmount; @@ -105,6 +111,11 @@ class WalletHomeEditViewModel extends ChangeNotifier { _setFakeBalanceTotalAmount(_preferenceProvider.fakeBalanceTotalAmount); _setFakeBlanceMap(_preferenceProvider.getFakeBalanceMap()); } + + /// 잔액 숨기기 변동 체크 + if (_isFiatBalanceHidden != _preferenceProvider.isFiatBalanceHidden) { + setIsFiatBalanceHidden(_preferenceProvider.isFiatBalanceHidden); + } notifyListeners(); } @@ -124,6 +135,17 @@ class WalletHomeEditViewModel extends ChangeNotifier { notifyListeners(); } + void setIsFiatBalanceHidden(bool value) { + _preferenceProvider.changeIsFiatBalanceHidden(value); + _isFiatBalanceHidden = value; + notifyListeners(); + } + + void setTempIsFiatBalanceHidden(bool value) { + _tempIsFiatBalanceHidden = value; + notifyListeners(); + } + void clearFakeBlanceTotalAmount() { _preferenceProvider.clearFakeBalanceTotalAmount(); _preferenceProvider.toggleFakeBalanceActivation(false); @@ -190,6 +212,7 @@ class WalletHomeEditViewModel extends ChangeNotifier { Future onComplete() async { setIsBalanceHidden(_tempIsBalanceHidden); + setIsFiatBalanceHidden(_tempIsFiatBalanceHidden); _setHomeFeatureEnabled(); await _setFakeBalance(); } diff --git a/lib/providers/view_model/home/wallet_home_view_model.dart b/lib/providers/view_model/home/wallet_home_view_model.dart index 91247d7a..141b8b15 100644 --- a/lib/providers/view_model/home/wallet_home_view_model.dart +++ b/lib/providers/view_model/home/wallet_home_view_model.dart @@ -37,6 +37,7 @@ class WalletHomeViewModel extends ChangeNotifier { late final PreferenceProvider _preferenceProvider; late bool _isTermsShortcutVisible; late bool _isBalanceHidden; + late bool _isFiatBalanceHidden; late final bool _isReviewScreenVisible; late final ConnectivityProvider _connectivityProvider; late bool? _isNetworkOn; @@ -114,6 +115,7 @@ class WalletHomeViewModel extends ChangeNotifier { _nodeProvider.addListener(_onNodeProviderChanged); _isBalanceHidden = _preferenceProvider.isBalanceHidden; + _isFiatBalanceHidden = _preferenceProvider.isFiatBalanceHidden; _fakeBalanceTotalAmount = _preferenceProvider.fakeBalanceTotalAmount; _fakeBalanceMap = _preferenceProvider.getFakeBalanceMap(); _excludedFromTotalBalanceWalletIds = _preferenceProvider.excludedFromTotalBalanceWalletIds; @@ -128,6 +130,7 @@ class WalletHomeViewModel extends ChangeNotifier { bool get isEmptyFavoriteWallet => _isEmptyFavoriteWallet; bool get isBalanceHidden => _isBalanceHidden; + bool get isFiatBalanceHidden => _isFiatBalanceHidden; bool get isReviewScreenVisible => _isReviewScreenVisible; bool get isTermsShortcutVisible => _isTermsShortcutVisible; bool get shouldShowLoadingIndicator => !_isFirstLoaded && _nodeSyncState == NodeSyncState.syncing; @@ -262,6 +265,11 @@ class WalletHomeViewModel extends ChangeNotifier { setIsBalanceHidden(_preferenceProvider.isBalanceHidden); } + /// 법정화폐잔액숨기기 변동 체크 + if (_isFiatBalanceHidden != _preferenceProvider.isFiatBalanceHidden) { + setIsFiatBalanceHidden(_preferenceProvider.isFiatBalanceHidden); + } + /// 가짜 잔액 총량 변동 체크 (on/off 판별) if (_fakeBalanceTotalAmount != _preferenceProvider.fakeBalanceTotalAmount) { _setFakeBlancTotalAmount(_preferenceProvider.fakeBalanceTotalAmount); @@ -308,6 +316,12 @@ class WalletHomeViewModel extends ChangeNotifier { notifyListeners(); } + void setIsFiatBalanceHidden(bool value) { + _preferenceProvider.changeIsFiatBalanceHidden(value); + _isFiatBalanceHidden = value; + notifyListeners(); + } + void _setFakeBlancTotalAmount(int? value) { _fakeBalanceTotalAmount = value; notifyListeners(); diff --git a/lib/screens/home/wallet_home_edit_bottom_sheet.dart b/lib/screens/home/wallet_home_edit_bottom_sheet.dart index bfbfe66b..97c41953 100644 --- a/lib/screens/home/wallet_home_edit_bottom_sheet.dart +++ b/lib/screens/home/wallet_home_edit_bottom_sheet.dart @@ -6,7 +6,6 @@ import 'package:coconut_wallet/providers/view_model/home/wallet_home_edit_view_m import 'package:coconut_wallet/providers/wallet_provider.dart'; import 'package:coconut_wallet/utils/balance_format_util.dart'; import 'package:coconut_wallet/widgets/button/fixed_bottom_button.dart'; -import 'package:coconut_wallet/widgets/button/multi_button.dart'; import 'package:coconut_wallet/widgets/button/shrink_animation_button.dart'; import 'package:coconut_wallet/widgets/button/single_button.dart'; import 'package:flutter/cupertino.dart'; @@ -249,7 +248,7 @@ class _WalletHomeEditBottomSheetState extends State w title: t.wallet_home_screen.edit.fake_balance.fake_balance_display, subtitle: t.wallet_home_screen.edit.fake_balance.fake_balance_input_description, subtitleStyle: CoconutTypography.body3_12.setColor(CoconutColors.gray400), - customPadding: const EdgeInsets.fromLTRB(20, 10, 20, 16), + customPadding: const EdgeInsets.fromLTRB(20, 10, 20, 10), betweenGap: 16, onPressed: () async { if (_textFieldFocusNode.hasFocus) { @@ -274,6 +273,32 @@ class _WalletHomeEditBottomSheetState extends State w ), ), _buildDelayedFakeBalanceInput(), + SingleButton( + isVerticalSubtitle: true, + title: t.wallet_home_screen.edit.hide_fiat_price, + subtitle: t.wallet_home_screen.edit.hide_fiat_price_on_home, + subtitleStyle: CoconutTypography.body3_12.setColor(CoconutColors.gray400), + customPadding: const EdgeInsets.fromLTRB(20, 10, 20, 16), + onPressed: () async { + if (_textFieldFocusNode.hasFocus) { + FocusScope.of(context).unfocus(); + return; + } + viewModel.setTempIsFiatBalanceHidden(!viewModel.tempIsFiatBalanceHidden); + }, + betweenGap: 16, + backgroundColor: CoconutColors.black, + rightElement: CoconutSwitch( + isOn: viewModel.tempIsFiatBalanceHidden, + scale: 0.7, + activeColor: CoconutColors.gray100, + trackColor: CoconutColors.gray600, + thumbColor: CoconutColors.gray800, + onChanged: (value) { + viewModel.setTempIsFiatBalanceHidden(value); + }, + ), + ), ], ); }, @@ -354,6 +379,7 @@ class _WalletHomeEditBottomSheetState extends State w final isToggleChanged = _viewModel.tempIsFakeBalanceActive != _viewModel.isFakeBalanceActive || // 가짜잔액표시 변동 _viewModel.tempIsBalanceHidden != _viewModel.isBalanceHidden || // 잔액숨기기 변동 + _viewModel.tempIsFiatBalanceHidden != _viewModel.isFiatBalanceHidden || // 법정화폐잔액숨기기 변동 !_viewModel.tempHomeFeatures.every((tempFeature) { // 홈 화면 기능 변동 final original = _viewModel.homeFeatures.firstWhere( @@ -574,7 +600,7 @@ class _WalletHomeEditBottomSheetState extends State w } return AnimatedCrossFade( duration: const Duration(milliseconds: 300), - firstChild: const SizedBox(height: 6), + firstChild: const SizedBox(height: 0), secondChild: Column( children: [ Container( diff --git a/lib/screens/home/wallet_home_screen.dart b/lib/screens/home/wallet_home_screen.dart index be989301..691e76b9 100644 --- a/lib/screens/home/wallet_home_screen.dart +++ b/lib/screens/home/wallet_home_screen.dart @@ -122,7 +122,7 @@ class _WalletHomeScreenState extends State with TickerProvider Tuple7< List, List, - bool, + Tuple2, bool, Map, Tuple2>, @@ -133,7 +133,7 @@ class _WalletHomeScreenState extends State with TickerProvider (_, vm) => Tuple7( vm.walletItemList, vm.favoriteWallets, - vm.isBalanceHidden, + Tuple2(vm.isBalanceHidden, vm.isBalanceHidden), vm.shouldShowLoadingIndicator, vm.walletBalanceMap, Tuple2(vm.fakeBalanceTotalAmount, vm.fakeBalanceMap), @@ -144,7 +144,7 @@ class _WalletHomeScreenState extends State with TickerProvider final walletItem = data.item1; final favoriteWallets = data.item2; - final isBalanceHidden = data.item3; + final balnaceVisibilityData = data.item3; final shouldShowLoadingIndicator = data.item4; final walletBalanceMap = data.item5; final fakeBalanceData = data.item6; @@ -176,7 +176,8 @@ class _WalletHomeScreenState extends State with TickerProvider CupertinoSliverRefreshControl(onRefresh: viewModel.onRefresh), _buildLoadingIndicator(viewModel), _buildHeader( - isBalanceHidden, + balnaceVisibilityData.item1, + balnaceVisibilityData.item2, fakeBalanceData.item1, shouldShowLoadingIndicator, walletItem.isEmpty, @@ -208,7 +209,7 @@ class _WalletHomeScreenState extends State with TickerProvider walletItem, favoriteWallets, walletBalanceMap, - isBalanceHidden, + balnaceVisibilityData.item1, (id) => viewModel.getFakeBalance(id), ), if (homeFeatures.isNotEmpty) ...[ @@ -386,6 +387,7 @@ class _WalletHomeScreenState extends State with TickerProvider Widget _buildHeader( bool isBalanceHidden, + bool isFiatBalanceHidden, int? fakeBalanceTotalAmount, bool shouldShowLoadingIndicator, bool isWalletListEmpty, @@ -442,9 +444,13 @@ class _WalletHomeScreenState extends State with TickerProvider child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Selector>( - selector: (_, viewModel) => viewModel.excludedFromTotalBalanceWalletIds, - builder: (context, excludedIds, child) { + Selector, bool>>( + selector: + (_, viewModel) => + Tuple2(viewModel.excludedFromTotalBalanceWalletIds, viewModel.isFiatBalanceHidden), + builder: (context, data, child) { + final excludedIds = data.item1; + final isFiatBalanceHidden = data.item2; final balance = _viewModel.fakeBalanceTotalAmount != null ? _viewModel.fakeBalanceMap.entries @@ -456,9 +462,15 @@ class _WalletHomeScreenState extends State with TickerProvider (entry) => !excludedIds.contains(entry.key), ), ).values.map((e) => e.current).fold(0, (current, element) => current + element); - return FiatPrice( - satoshiAmount: balance, - textStyle: CoconutTypography.body3_12_Number.setColor(CoconutColors.gray350), + return Visibility( + maintainSize: true, + maintainAnimation: true, + maintainState: true, + visible: !isFiatBalanceHidden, + child: FiatPrice( + satoshiAmount: balance, + textStyle: CoconutTypography.body3_12_Number.setColor(CoconutColors.gray350), + ), ); }, ),