From c8d8547fb7071ac0ec13e18097dc32047b8194ef Mon Sep 17 00:00:00 2001 From: Diekoloreoluwa Mayowa Akinsete Date: Mon, 4 Sep 2023 23:52:27 +0100 Subject: [PATCH 1/3] Added verve brand --- icons/verve.png | Bin 0 -> 7722 bytes lib/credit_card_widget.dart | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 icons/verve.png diff --git a/icons/verve.png b/icons/verve.png new file mode 100644 index 0000000000000000000000000000000000000000..426aa8dd4e257065808526d9ed9af751fe8692ce GIT binary patch literal 7722 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 CardTypeIconAsset = { CardType.discover: 'icons/discover.png', CardType.elo: 'icons/elo.png', CardType.hipercard: 'icons/hipercard.png', + CardType.verve: 'icons/verve.png', }; class CreditCardWidget extends StatefulWidget { @@ -753,6 +754,12 @@ class _CreditCardWidgetState extends State isAmex = true; break; + case CardType.verve: + icon = Image.asset(CardTypeIconAsset[ccType]!, + height: 48, width: 48, package: 'flutter_credit_card'); + isAmex = false; + break; + default: icon = Container( height: 48, @@ -903,4 +910,5 @@ enum CardType { discover, elo, hipercard, + verve } From c7498069dc8086141c8d5997ef364d393d07b595 Mon Sep 17 00:00:00 2001 From: Diekoloreoluwa Mayowa Akinsete Date: Mon, 2 Oct 2023 16:32:26 +0100 Subject: [PATCH 2/3] Verve Card - Added Card Number Pattern for verve cards. --- lib/credit_card_form.dart | 4 ++-- lib/credit_card_widget.dart | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/credit_card_form.dart b/lib/credit_card_form.dart index f2da606..ba8e380 100644 --- a/lib/credit_card_form.dart +++ b/lib/credit_card_form.dart @@ -180,7 +180,7 @@ class _CreditCardFormState extends State { late CreditCardModel creditCardModel; final MaskedTextController _cardNumberController = - MaskedTextController(mask: '0000 0000 0000 0000'); + MaskedTextController(mask: '0000 0000 0000 0000 000'); final TextEditingController _expiryDateController = MaskedTextController(mask: '00/00'); final TextEditingController _cardHolderNameController = @@ -281,7 +281,7 @@ class _CreditCardFormState extends State { validator: widget.cardNumberValidator ?? (String? value) { // Validate less that 13 digits +3 white spaces - if (value!.isEmpty || value.length < 16) { + if (value!.isEmpty || value.length < 19) { return widget.numberValidationMessage; } return null; diff --git a/lib/credit_card_widget.dart b/lib/credit_card_widget.dart index 4243e2a..b4581f5 100644 --- a/lib/credit_card_widget.dart +++ b/lib/credit_card_widget.dart @@ -405,7 +405,7 @@ class _CreditCardWidgetState extends State child: Padding( padding: const EdgeInsets.only(left: 16), child: Text( - widget.cardNumber.isEmpty ? 'XXXX XXXX XXXX XXXX' : number, + widget.cardNumber.isEmpty ? 'XXXX XXXX XXXX XXXX XXX' : number, style: widget.textStyle ?? defaultTextStyle, ), ), @@ -649,6 +649,9 @@ class _CreditCardWidgetState extends State CardType.hipercard: >{ ['606282'], }, + CardType.verve: >{ + ['5061'], + } }; /// This function determines the Credit Card type based on the cardPatterns @@ -755,8 +758,12 @@ class _CreditCardWidgetState extends State break; case CardType.verve: - icon = Image.asset(CardTypeIconAsset[ccType]!, - height: 48, width: 48, package: 'flutter_credit_card'); + icon = Image.asset( + CardTypeIconAsset[ccType]!, + height: 48, + width: 48, + package: 'flutter_credit_card', + ); isAmex = false; break; From cd6ea0c04126b28397dc59b794e36762b418b16b Mon Sep 17 00:00:00 2001 From: Diekoloreoluwa Mayowa Akinsete Date: Mon, 2 Oct 2023 16:33:55 +0100 Subject: [PATCH 3/3] Update credit_card_widget.dart --- lib/credit_card_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/credit_card_widget.dart b/lib/credit_card_widget.dart index b4581f5..ad63218 100644 --- a/lib/credit_card_widget.dart +++ b/lib/credit_card_widget.dart @@ -405,7 +405,7 @@ class _CreditCardWidgetState extends State child: Padding( padding: const EdgeInsets.only(left: 16), child: Text( - widget.cardNumber.isEmpty ? 'XXXX XXXX XXXX XXXX XXX' : number, + widget.cardNumber.isEmpty ? 'XXXX XXXX XXXX XXXX' : number, style: widget.textStyle ?? defaultTextStyle, ), ),