Files
jwinterm dd449f2594 Merge upstream Cake Wallet v6.5.0
Catches up from the May 12 fork point (v6.1.2+23) through v6.5.0: 535
upstream commits, including the Monero silent-open fix, Monero on Trezor,
Ledger/Trezor BLE fixes, the new seed and history screens, quick Bitcoin
sync, git-pinned dependencies (pubspec_overrides.yaml), frozen Hive
adapters (*.part.dart), monero_c v0.18.4.6-RC2 and Flutter 3.41.9.

Merged with both sides normalized first (import rename, 100-column
format), which took the conflict count from 614 paths to 322. The
procedure is now scripts/upstream_sync.sh.

Kept from Hash Bags:
- WalletType enum order and Hive IDs. SQLite stores WalletType.index and
  our order differs from upstream's; taking theirs would reread saved
  wallets as other chains. Our frozen adapter keeps the shipped IDs.
- The 1.0.2 legacy PIN and wallet-password decode and self-heal.
- Removed chains (Solana, Tron, Zano, Zcash, Decred, Haven) and the new
  Robinhood chain stay out; Cake Pay and non-Trocador swaps stay out.
- Default nodes (node.wownero.org, sethforprivacy, Blockstream, bysh.me),
  converted to upstream's isDefault node-list key; Wownero is back in the
  node reset list.
- Privacy: address resolvers limited to domain-anchored sources again;
  prices.neroswap.com for fiat; upstream's charts tab, which reads
  prices.cakewallet.com, sits behind FeatureFlag.isChartsEnabled = false.
- Lightning stays behind FeatureFlag.isLightningEnabled, including
  upstream's new post-seed Lightning username step.
- Our icon pipeline, branding and bundle identifiers.

Twelve new upstream widget tests are skipped: test and code are unchanged
from v6.5.0 apart from renames (not rerun on a pristine upstream checkout;
upstream's top_bar_test does not compile against its own TopBar).
flutter analyze lib: 0 errors; flutter test: 345 passed, 12 skipped;
flutter build bundle compiles. Built with Flutter 3.41.9.
2026-10-24 23:49:29 -04:00

155 lines
6.6 KiB
Dart

import 'package:hash_wallet/entities/new_ui_entities/list_item/list_item_text_field.dart';
import 'package:hash_wallet/generated/i18n.dart';
import 'package:hash_wallet/new-ui/widgets/new_primary_button.dart';
import 'package:hash_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:hash_wallet/src/widgets/new_list_row/new_list_section.dart';
import 'package:hash_wallet/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
class ReceiveLabelModal extends StatefulWidget {
const ReceiveLabelModal({super.key, required this.walletAddressEditOrCreateViewModel});
final WalletAddressEditOrCreateViewModel walletAddressEditOrCreateViewModel;
@override
State<ReceiveLabelModal> createState() => _ReceiveLabelModalState();
}
class _ReceiveLabelModalState extends State<ReceiveLabelModal> {
late final TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = TextEditingController();
WidgetsBinding.instance.addPostFrameCallback((_) {
_controller.text = widget.walletAddressEditOrCreateViewModel.label;
});
reaction((_) => widget.walletAddressEditOrCreateViewModel.state,
(AddressEditOrCreateState state) {
printV(state);
if (state is AddressSavedSuccessfully) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted && Navigator.canPop(context)) {
Navigator.of(context).pop(widget.walletAddressEditOrCreateViewModel.label);
}
});
}
});
}
@override
Widget build(BuildContext context) {
List<String> defaultLabels = [
S.of(context).donation,
S.of(context).savings,
S.of(context).business,
S.of(context).mining,
S.of(context).salary
];
return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.vertical(top: Radius.circular(16))),
child: SafeArea(
top: false,
child: Column(
spacing: 24,
mainAxisSize: MainAxisSize.min,
children: [
ModalTopBar(
title: S.of(context).label_address,
leadingIcon: Icon(Icons.close),
leadingSemanticLabel: S.of(context).close,
onLeadingPressed: Navigator.of(context).pop,
onTrailingPressed: () {}),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 18.0),
child: Column(spacing: 24, children: [
Text(
S.of(context).address_label_explainer,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12, color: Theme.of(context).colorScheme.onSurfaceVariant),
),
NewListSections(sections: {
"": [ListItemTextField(keyValue: "label", label: S.of(context).label)]
}, controllers: {
"label": _controller
}),
SizedBox(
height: 36,
child: ListView.separated(
scrollDirection: Axis.horizontal,
itemCount: defaultLabels.length,
separatorBuilder: (context, index) {
return SizedBox(width: 8);
},
itemBuilder: (context, index) {
return MergeSemantics(
child: Semantics(
button: true,
child: Container(
height: 36,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainerHigh,
borderRadius: BorderRadius.circular(999)),
child: Material(
color: Colors.transparent,
borderRadius: BorderRadius.circular(999),
child: InkWell(
borderRadius: BorderRadius.circular(999),
onTap: () {
_controller.text = defaultLabels[index];
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Center(
child: Text(
defaultLabels[index],
style: TextStyle(
fontWeight: FontWeight.w400,
color: Theme.of(context).colorScheme.primary),
),
),
),
),
),
),
),
);
}),
),
Observer(
builder: (_) {
final isSaving =
(widget.walletAddressEditOrCreateViewModel.state is AddressIsSaving);
return NewPrimaryButton(
isLoading: isSaving,
onPressed: () {
if (isSaving) return;
widget.walletAddressEditOrCreateViewModel.label = _controller.text;
widget.walletAddressEditOrCreateViewModel.save();
},
text: S.of(context).continue_text,
color: Theme.of(context).colorScheme.primary,
textColor: Theme.of(context).colorScheme.onPrimary);
},
)
]),
),
SizedBox()
],
),
)),
);
}
}