Skip to content
Closed
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
15 changes: 10 additions & 5 deletions mobile-app/lib/l10n/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -668,22 +668,27 @@ abstract class AppLocalizations {
/// **'This signer is already in the list.'**
String get multisigCreateDuplicateSigner;

/// Error when signer address is invalid
///
/// In en, this message translates to:
/// **'Enter a valid signer address.'**
/// Error when signer address is invalid
///
/// In en, this message translates to:
/// **'Enter a valid signer address.'**
String get multisigCreateInvalidSigner;

/// Threshold slider section label on create multisig
/// Error when trying to add a multisig account as a signer
///
/// In en, this message translates to:
/// **'THRESHOLD'**
String get multisigCreateThresholdLabel;
/// **'Multisig accounts cannot be used as signers'**
String get multisigCreateCannotUseMultisig;

/// Threshold slider value label
/// Threshold slider section label on create multisig
///
/// In en, this message translates to:
/// **'{count} of {total}'**
/// **'THRESHOLD'**
String get multisigCreateThresholdLabel;
String multisigCreateThresholdValue(int count, int total);

/// What a Keystone creator is signing, shown on the Keystone sign and verify screens
Expand Down
3 changes: 3 additions & 0 deletions mobile-app/lib/l10n/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get multisigCreateInvalidSigner => 'Enter a valid signer address.';

@override
String get multisigCreateCannotUseMultisig => 'Multisig accounts cannot be used as signers';

@override
String get multisigCreateThresholdLabel => 'THRESHOLD';

Expand Down
3 changes: 3 additions & 0 deletions mobile-app/lib/l10n/app_localizations_id.dart
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get multisigCreateInvalidSigner => 'Masukkan alamat penandatangan yang valid.';

@override
String get multisigCreateCannotUseMultisig => 'Akun multisig tidak dapat digunakan sebagai penandatangan';

@override
String get multisigCreateThresholdLabel => 'AMBANG BATAS';

Expand Down
41 changes: 36 additions & 5 deletions mobile-app/lib/v2/screens/multisig/add_multisig_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class _AddMultisigScreenState extends ConsumerState<AddMultisigScreen> {
late int _threshold;
bool _isLoading = false;
bool _isPredictingAddress = false;
bool _isAddingSigner = false;
String? _predictedAddress;
BigInt? _resolvedNonce;
String? _signerFieldError;
Expand Down Expand Up @@ -93,7 +94,8 @@ class _AddMultisigScreenState extends ConsumerState<AddMultisigScreen> {
});
}

void _addSigner() {
Future<void> _addSigner() async {
if (_isAddingSigner) return;
final l10n = ref.read(l10nProvider);
final substrate = ref.read(substrateServiceProvider);
final address = _signerAddressController.text.trim();
Expand All @@ -107,10 +109,35 @@ class _AddMultisigScreenState extends ConsumerState<AddMultisigScreen> {
return;
}

setState(() => _isAddingSigner = true);

try {
final isMultisig = await ref.read(multisigServiceProvider).isMultisigIndexed(address);
if (isMultisig) {
if (!mounted) return;
setState(() {
_signerFieldError = l10n.multisigCreateCannotUseMultisig;
_isAddingSigner = false;
});
return;
}
} catch (e) {
quantusPrint('[AddMultisigScreen] isMultisigIndexed error: $e');
if (!mounted) return;
setState(() {
// Fallback to invalid signer if the network check fails
_signerFieldError = l10n.multisigCreateInvalidSigner;
_isAddingSigner = false;
});
return;
}

if (!mounted) return;
setState(() {
_additionalSigners = [..._additionalSigners, address];
_signerAddressController.clear();
_signerFieldError = null;
_isAddingSigner = false;
_threshold = MultisigService.defaultThreshold(_allSigners.length);
});
_refreshPredictedAddress();
Expand Down Expand Up @@ -302,6 +329,7 @@ class _AddMultisigScreenState extends ConsumerState<AddMultisigScreen> {
additionalSigners: _additionalSigners,
signerAddressController: _signerAddressController,
signerFieldError: _signerFieldError,
isAddingSigner: _isAddingSigner,
onAddSigner: _addSigner,
onRemoveSigner: _removeSigner,
),
Expand Down Expand Up @@ -337,6 +365,7 @@ class _SignersSection extends StatelessWidget {
required this.additionalSigners,
required this.signerAddressController,
required this.signerFieldError,
required this.isAddingSigner,
required this.onAddSigner,
required this.onRemoveSigner,
});
Expand All @@ -346,12 +375,13 @@ class _SignersSection extends StatelessWidget {
final List<String> additionalSigners;
final TextEditingController signerAddressController;
final String? signerFieldError;
final VoidCallback onAddSigner;
final bool isAddingSigner;
final Future<void> Function() onAddSigner;
final ValueChanged<String> onRemoveSigner;

bool get _canAddSigner {
final address = signerAddressController.text.trim();
return address.isNotEmpty;
return address.isNotEmpty && !isAddingSigner;
}

@override
Expand Down Expand Up @@ -392,7 +422,8 @@ class _SignersSection extends StatelessWidget {
label: l10n.multisigCreateAddSignerButton,
variant: ButtonVariant.staged,
isDisabled: !_canAddSigner,
onTap: onAddSigner,
isLoading: isAddingSigner,
onTap: () => onAddSigner(),
width: null,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
),
Expand Down Expand Up @@ -437,4 +468,4 @@ class _PredictedAddressSection extends StatelessWidget {
),
);
}
}
}
Loading