0.0.9
This commit is contained in:
		
							parent
							
								
									f4b05dbccf
								
							
						
					
					
						commit
						abcbf96d08
					
				
							
								
								
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@ -1,3 +1,14 @@
 | 
			
		||||
## 0.0.9
 | 
			
		||||
 | 
			
		||||
- Drastically improved usability and performance with flutter web and canvaskit renderer, especially on mobile
 | 
			
		||||
- Using streams to more accurately call `widget.onValidCardDetails` when the card details are valid and completed
 | 
			
		||||
- Added `cursorColor` customization
 | 
			
		||||
- Reworked widget life cycle so that hot reloads work as expected (resizing, focus, etc.).
 | 
			
		||||
 | 
			
		||||
## 0.0.8
 | 
			
		||||
 | 
			
		||||
- Updated dart sdk constraints again... oops (>=3.0.0)
 | 
			
		||||
 | 
			
		||||
## 0.0.7
 | 
			
		||||
 | 
			
		||||
- Changed pubspec versioning to allow lower SDK constraints (>=2.12.0)
 | 
			
		||||
 | 
			
		||||
@ -45,10 +45,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: collection
 | 
			
		||||
      sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
 | 
			
		||||
      sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.17.2"
 | 
			
		||||
    version: "1.18.0"
 | 
			
		||||
  cupertino_icons:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
@ -135,10 +135,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: meta
 | 
			
		||||
      sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
 | 
			
		||||
      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.9.1"
 | 
			
		||||
    version: "1.10.0"
 | 
			
		||||
  path:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@ -180,18 +180,18 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: stack_trace
 | 
			
		||||
      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
 | 
			
		||||
      sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.11.0"
 | 
			
		||||
    version: "1.11.1"
 | 
			
		||||
  stream_channel:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: stream_channel
 | 
			
		||||
      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
 | 
			
		||||
      sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.1.1"
 | 
			
		||||
    version: "2.1.2"
 | 
			
		||||
  string_scanner:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@ -206,7 +206,7 @@ packages:
 | 
			
		||||
      path: ".."
 | 
			
		||||
      relative: true
 | 
			
		||||
    source: path
 | 
			
		||||
    version: "0.0.7"
 | 
			
		||||
    version: "0.0.9"
 | 
			
		||||
  term_glyph:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@ -219,10 +219,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: test_api
 | 
			
		||||
      sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
 | 
			
		||||
      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.6.0"
 | 
			
		||||
    version: "0.6.1"
 | 
			
		||||
  typed_data:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@ -267,10 +267,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: web
 | 
			
		||||
      sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
 | 
			
		||||
      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.1.4-beta"
 | 
			
		||||
    version: "0.3.0"
 | 
			
		||||
  xml:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@ -280,5 +280,5 @@ packages:
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.3.0"
 | 
			
		||||
sdks:
 | 
			
		||||
  dart: ">=3.1.0-185.0.dev <4.0.0"
 | 
			
		||||
  dart: ">=3.2.0-194.0.dev <4.0.0"
 | 
			
		||||
  flutter: ">=3.7.0-0"
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,5 @@
 | 
			
		||||
import 'dart:async';
 | 
			
		||||
 | 
			
		||||
import 'package:flutter/foundation.dart';
 | 
			
		||||
 | 
			
		||||
/// Class encapsulating the card's data
 | 
			
		||||
@ -18,11 +20,7 @@ class CardDetails {
 | 
			
		||||
  /// Sets every field to null, a default
 | 
			
		||||
  /// `CardDetails` when nothing has been entered.
 | 
			
		||||
  factory CardDetails.blank() {
 | 
			
		||||
    return CardDetails(
 | 
			
		||||
        cardNumber: null,
 | 
			
		||||
        securityCode: null,
 | 
			
		||||
        expirationString: null,
 | 
			
		||||
        postalCode: null);
 | 
			
		||||
    return CardDetails(cardNumber: null, securityCode: null, expirationString: null, postalCode: null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Returns the CardNumber as a `String` with the spaces removed.
 | 
			
		||||
@ -39,6 +37,7 @@ class CardDetails {
 | 
			
		||||
  CardDetailsValidState _validState = CardDetailsValidState.blank;
 | 
			
		||||
  int _lastCheckHash = 0;
 | 
			
		||||
  CardProvider? provider;
 | 
			
		||||
  StreamController<CardDetails> onCompleteController = StreamController();
 | 
			
		||||
 | 
			
		||||
  set overrideValidState(CardDetailsValidState state) => _validState = state;
 | 
			
		||||
 | 
			
		||||
@ -51,13 +50,11 @@ class CardDetails {
 | 
			
		||||
  String get expMonth => isComplete ? expirationString!.split('/').first : '';
 | 
			
		||||
  String get expYear => isComplete ? expirationString!.split('/').last : '';
 | 
			
		||||
 | 
			
		||||
  // TODO rename to be more clear
 | 
			
		||||
  /// Returns true if `_cardNumber` is null, or
 | 
			
		||||
  /// if the _cardNumber matches the detected `provider`'s
 | 
			
		||||
  /// card lenght, defaulting to 16.
 | 
			
		||||
  bool get cardNumberFilled => _cardNumber == null
 | 
			
		||||
      ? false
 | 
			
		||||
      : (provider?.cardLength ?? 16) == _cardNumber!.replaceAll(' ', '').length;
 | 
			
		||||
  bool get cardNumberFilled =>
 | 
			
		||||
      _cardNumber == null ? false : (provider?.cardLength ?? 16) == _cardNumber!.replaceAll(' ', '').length;
 | 
			
		||||
 | 
			
		||||
  /// Returns true if all details are complete and valid
 | 
			
		||||
  /// otherwise, return false.
 | 
			
		||||
@ -66,6 +63,14 @@ class CardDetails {
 | 
			
		||||
    return _complete;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Detects if the card is complete, then broadcasts
 | 
			
		||||
  /// card details to `onCompleteController`
 | 
			
		||||
  void broadcastStatus() {
 | 
			
		||||
    if (isComplete) {
 | 
			
		||||
      onCompleteController.add(this);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// The maximum length of the INN (identifier)
 | 
			
		||||
  /// of a card provider.
 | 
			
		||||
  int get maxINNLength => 4;
 | 
			
		||||
@ -82,12 +87,9 @@ class CardDetails {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      _lastCheckHash = currentHash;
 | 
			
		||||
      if (_cardNumber == null &&
 | 
			
		||||
          expirationString == null &&
 | 
			
		||||
          securityCode == null &&
 | 
			
		||||
          postalCode == null) {
 | 
			
		||||
      _complete = false;
 | 
			
		||||
      _lastCheckHash = currentHash;
 | 
			
		||||
      if (_cardNumber == null && expirationString == null && securityCode == null && postalCode == null) {
 | 
			
		||||
        _validState = CardDetailsValidState.blank;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
@ -99,63 +101,50 @@ class CardDetails {
 | 
			
		||||
          )
 | 
			
		||||
          .toList();
 | 
			
		||||
      if (!_luhnAlgorithmCheck(nums)) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.invalidCard;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (_cardNumber == null || !cardNumberFilled) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.missingCard;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (expirationString == null) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.missingDate;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      final expSplits = expirationString!.split('/');
 | 
			
		||||
      if (expSplits.length != 2 || expSplits.last == '') {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.missingDate;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      final month = int.parse(
 | 
			
		||||
          expSplits.first[0] == '0' ? expSplits.first[1] : expSplits.first);
 | 
			
		||||
      final month = int.parse(expSplits.first[0] == '0' ? expSplits.first[1] : expSplits.first);
 | 
			
		||||
      if (month < 1 || month > 12) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.invalidMonth;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      final year = 2000 + int.parse(expSplits.last);
 | 
			
		||||
      final date = DateTime(year, month);
 | 
			
		||||
      if (date.isBefore(DateTime.now())) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.dateTooEarly;
 | 
			
		||||
        return;
 | 
			
		||||
      } else if (date
 | 
			
		||||
          .isAfter(DateTime.now().add(const Duration(days: 365 * 50)))) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
      } else if (date.isAfter(DateTime.now().add(const Duration(days: 365 * 50)))) {
 | 
			
		||||
        _validState = CardDetailsValidState.dateTooLate;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      expirationDate = date;
 | 
			
		||||
      if (securityCode == null) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.missingCVC;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (provider != null && securityCode!.length != provider!.cvcLength) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.invalidCVC;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (postalCode == null) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.missingZip;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (!RegExp(r'^\d{5}(-\d{4})?$').hasMatch(postalCode!)) {
 | 
			
		||||
        _complete = false;
 | 
			
		||||
        _validState = CardDetailsValidState.invalidZip;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
@ -292,11 +281,7 @@ class CardProvider {
 | 
			
		||||
  int cvcLength;
 | 
			
		||||
 | 
			
		||||
  CardProvider(
 | 
			
		||||
      {required this.id,
 | 
			
		||||
      required this.cardLength,
 | 
			
		||||
      required this.cvcLength,
 | 
			
		||||
      this.innValidNums,
 | 
			
		||||
      this.innValidRanges}) {
 | 
			
		||||
      {required this.id, required this.cardLength, required this.cvcLength, this.innValidNums, this.innValidRanges}) {
 | 
			
		||||
    // Must provide one or the other
 | 
			
		||||
    assert(innValidNums != null || innValidRanges != null);
 | 
			
		||||
    // Do not provide empty list of valid nums
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
name: stripe_native_card_field
 | 
			
		||||
description: A native flutter implementation of the elegant Stripe Card Field.
 | 
			
		||||
version: 0.0.7
 | 
			
		||||
version: 0.0.9
 | 
			
		||||
repository: https://git.fosscat.com/n8r/stripe_native_card_field
 | 
			
		||||
 | 
			
		||||
environment:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user