diff --git a/README.md b/README.md index bf6e4f4..609037d 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,17 @@ - -

-

+

# Flutterwave Flutter SDK (Standard) The Flutter library helps you create seamless payment experiences in your dart mobile app. By connecting to our modal, you can start collecting payment in no time. - Available features include: - Collections: Card, Account, Mobile money, Bank Transfers, USSD, Barter. - Recurring payments: Tokenization and Subscriptions. - Split payments - ## Table of Contents 1. [Requirements](#requirements) @@ -25,19 +21,16 @@ Available features include: 5. [Contribution guidelines](#contribution-guidelines) 6. [License](#license) - ## Requirements 1. Flutterwave for business [API Keys](https://developer.flutterwave.com/docs/integration-guides/authentication) 2. Supported Flutter version >= 1.17.0 - ## Installation 1. Add the dependency to your project. In your `pubspec.yaml` file add: `flutterwave_standard: 1.0.7` 2. Run `flutter pub get` - ## Usage ### Initializing a Flutterwave instance @@ -58,33 +51,40 @@ To create an instance, you should call the Flutterwave constructor. This constru It returns an instance of Flutterwave which we then call the async method `.charge()` on. -_ +\_ - handlePaymentInitialization() async { + handlePaymentInitialization() async { final Customer customer = Customer( name: "Flutterwave Developer", - phoneNumber: "1234566677777", - email: "customer@customer.com" - ); + phoneNumber: "1234566677777", + email: "customer@customer.com" + ); final Flutterwave flutterwave = Flutterwave( - context: context, publicKey: "Public Key-here", - currency: "currency-here", - redirectUrl: "add-your-redirect-url-here", - txRef: "add-your-unique-reference-here", - amount: "3000", - customer: customer, - paymentOptions: "ussd, card, barter, payattitude", + context: context, + publicKey: "YOUR-PUBLIC-KEY", + currency: "currency-here", + redirectUrl: "add-your-redirect-url-here", + txRef: "add-your-unique-reference-here", + amount: "3000", + /// ADDING A SUB ACCOUNT LOOKS LIKE THIS + subAccounts: [ + SubAccount( + id: "2333EDEd_", + transactionChargeType: TransactionChargeType.percentage, + transactionCharge: 0.5, + ), + ], + customer: customer, + paymentOptionsList: [PaymentOption.card, PaymentOption.payattitude, PaymentOption.barter, PaymentOption.banktransfer, PaymentOption.ussd], customization: Customization(title: "My Payment"), - isTestMode: true ); - } + isTestMode: true); + } ### Handling the response Calling the `.charge()` method returns a `Future` of `ChargeResponse` which we await for the actual response as seen above. - - - final ChargeResponse response = await flutterwave.charge(); + final ChargeResponse response = await flutterwave.charge(); Call the verify transaction [endpoint](https://developer.flutterwave.com/docs/verifications/transaction) with the `transactionID` returned in `response.transactionId` or the `txRef` you provided to verify transaction before offering value to customer @@ -103,7 +103,7 @@ You can also follow us [@FlutterwaveEng](https://twitter.com/FlutterwaveEng) and ## Contribution guidelines -Read more about our community contribution guidelines [here](https://www.notion.so/flutterwavego/Community-contribution-guide-ca1d8a876ba04d45ab4b663c758ae42a). +Read more about our community contribution guidelines [here](#contribution-guidelines). ## License @@ -119,7 +119,8 @@ Copyright (c) Flutterwave Inc. - [fluttertoast](https://pub.dev/packages/fluttertoast) -## Flutterwave API References + +## Flutterwave API References - [Flutterwave API Doc](https://developer.flutterwave.com/docs) - [Flutterwave Inline Payment Doc](https://developer.flutterwave.com/docs/flutterwave-inline) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index ee6e033..26bfc7f 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -8,7 +8,7 @@ if (localPropertiesFile.exists()) { def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") + throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') @@ -27,7 +27,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { // compileSdkVersion flutter.compileSdkVersion - compileSdkVersion 32 + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { diff --git a/example/lib/main.dart b/example/lib/main.dart index 8a946c7..311b90f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutterwave_standard/flutterwave.dart'; +import 'package:flutterwave_standard/models/subaccount.dart'; +import 'package:flutterwave_standard/utils/enums/payment_option.dart'; +import 'package:flutterwave_standard/utils/enums/transaction_charge_type.dart'; import 'package:uuid/uuid.dart'; void main() { @@ -182,8 +185,17 @@ class _MyHomePageState extends State { redirectUrl: 'https://facebook.com', txRef: Uuid().v1(), amount: this.amountController.text.toString().trim(), + + /// ADDING A SUB ACCOUNT LOOKS LIKE THIS + subAccounts: [ + SubAccount( + id: "2333EDEd_", + transactionChargeType: TransactionChargeType.percentage, + transactionCharge: 0.5, + ), + ], customer: customer, - paymentOptions: "card, payattitude, barter, bank transfer, ussd", + paymentOptionsList: [PaymentOption.card, PaymentOption.payattitude, PaymentOption.barter, PaymentOption.banktransfer, PaymentOption.ussd], customization: Customization(title: "Test Payment"), isTestMode: this.isTestMode); final ChargeResponse response = await flutterwave.charge(); diff --git a/example/pubspec.lock b/example/pubspec.lock index 37f22cd..5405721 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,147 +5,168 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "4826f97faae3af9761f26c52e56b2aa5ffd18d2c1721d984ad85137721c25f43" + url: "https://pub.dev" source: hosted version: "31.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "7337610c3f9cd13e6b7c6bb0f410644091cf63c9a1436e73352a70f3286abb03" + url: "https://pub.dev" source: hosted version: "2.8.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 + url: "https://pub.dev" source: hosted version: "2.3.1" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted version: "2.3.1" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted version: "8.4.3" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c" + url: "https://pub.dev" source: hosted version: "0.3.5" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "1be13198012c1d5bc042dc40ad1d7f16cbd522350984c0c1abf471d6d7e305c6" + url: "https://pub.dev" source: hosted version: "3.1.0" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: cf75650c66c0316274e21d7c43d3dea246273af5955bd94e8184837cd577575c + url: "https://pub.dev" source: hosted version: "3.0.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: a937da4c006989739ceb4d10e3bd6cce64ca85d0fe287fc5b2b9f6ee757dcee6 + url: "https://pub.dev" source: hosted version: "0.1.3" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "6e8086e1d3c2f6bc15056ee248c4ddc48c2bc71287c0961bf801a08633ed4333" + url: "https://pub.dev" source: hosted version: "2.2.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "04be3e934c52e082558cc9ee21f42f5c1cd7a1262f4c63cd0357c08d5bba81ec" + url: "https://pub.dev" source: hosted version: "1.0.1" flutter: @@ -157,7 +178,8 @@ packages: dependency: transitive description: name: flutter_inappwebview - url: "https://pub.dartlang.org" + sha256: f73505c792cf083d5566e1a94002311be497d984b5607f25be36d685cf6361cf + url: "https://pub.dev" source: hosted version: "5.7.2+3" flutter_test: @@ -174,7 +196,8 @@ packages: dependency: transitive description: name: fluttertoast - url: "https://pub.dartlang.org" + sha256: b3ae793108ad2a7e8f2fea91ca5bb2ba7ef03621c4d9ed7a92fe3391da64c000 + url: "https://pub.dev" source: hosted version: "8.0.8" flutterwave_standard: @@ -188,105 +211,120 @@ packages: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted version: "2.1.1" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: b6f1f143a71e1fe1b34670f1acd6f13960ade2557c96b87e127e0cf661969791 + url: "https://pub.dev" source: hosted version: "0.13.3" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + url: "https://pub.dev" source: hosted version: "4.0.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: c0bbfe94d46aedf9b8b3e695cf3bd48c8e14b35e3b2c639e0aa7755d589ba946 + url: "https://pub.dev" source: hosted version: "1.1.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" mockito: dependency: "direct dev" description: name: mockito - url: "https://pub.dartlang.org" + sha256: "6668f23c57bbf3857437c1683e8e0bef7e1077537593293e1fc8d1099fcc1981" + url: "https://pub.dev" source: hosted version: "5.0.15" modal_bottom_sheet: dependency: transitive description: name: modal_bottom_sheet - url: "https://pub.dartlang.org" + sha256: ef533916a2c3089571c32bd34e410faca77a6849a3f28f748e0794525c5658a0 + url: "https://pub.dev" source: hosted version: "2.1.2" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.2" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" source: hosted version: "1.11.1" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted version: "2.1.3" sky_engine: @@ -298,114 +336,130 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "00f8b6b586f724a8c769c96f1d517511a41661c0aede644544d8d86a1ab11142" + url: "https://pub.dev" source: hosted version: "1.2.2" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.16" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + url: "https://pub.dev" source: hosted version: "1.3.0" uuid: dependency: "direct main" description: name: uuid - url: "https://pub.dartlang.org" + sha256: "0ea20bfc625477e17f08a92d112272a071609b275ce4ca10ad853e1426ca3758" + url: "https://pub.dev" source: hosted version: "3.0.4" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted version: "1.0.2" webview_flutter: dependency: transitive description: name: webview_flutter - url: "https://pub.dartlang.org" + sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" + url: "https://pub.dev" source: hosted version: "3.0.4" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - url: "https://pub.dartlang.org" + sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" + url: "https://pub.dev" source: hosted version: "2.10.4" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - url: "https://pub.dartlang.org" + sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" + url: "https://pub.dev" source: hosted version: "1.9.5" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - url: "https://pub.dartlang.org" + sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 + url: "https://pub.dev" source: hosted version: "2.9.5" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.18.0 <3.0.0" flutter: ">=3.0.0" diff --git a/lib/core/flutterwave.dart b/lib/core/flutterwave.dart index 1480a32..3b349b1 100644 --- a/lib/core/flutterwave.dart +++ b/lib/core/flutterwave.dart @@ -1,16 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:flutterwave_standard/models/requests/customer.dart'; -import 'package:flutterwave_standard/models/requests/customizations.dart'; -import 'package:flutterwave_standard/models/requests/standard_request.dart'; -import 'package:flutterwave_standard/models/responses/charge_response.dart'; -import 'package:flutterwave_standard/models/responses/standard_response.dart'; -import 'package:flutterwave_standard/models/subaccount.dart'; -import 'package:flutterwave_standard/utils.dart'; -import 'package:flutterwave_standard/view/flutterwave_style.dart'; -import 'package:flutterwave_standard/view/standard_widget.dart'; -import 'package:flutterwave_standard/view/view_utils.dart'; import 'package:http/http.dart'; +import '../models/requests/customer.dart'; +import '../models/requests/customizations.dart'; +import '../models/requests/standard_request.dart'; +import '../models/responses/charge_response.dart'; +import '../models/responses/standard_response.dart'; +import '../models/subaccount.dart'; +import '../utils/enums/payment_option.dart'; +import '../view/flutterwave_style.dart'; +import '../view/standard_widget.dart'; +import '../view/view_utils.dart'; + class Flutterwave { BuildContext context; String txRef; @@ -19,7 +20,9 @@ class Flutterwave { Customer customer; bool isTestMode; String publicKey; - String paymentOptions; + @Deprecated('Use paymentOptionsList instead') + String? paymentOptions; + List? paymentOptionsList; String redirectUrl; String currency; String? paymentPlanId; @@ -34,7 +37,7 @@ class Flutterwave { required this.txRef, required this.amount, required this.customer, - required this.paymentOptions, + this.paymentOptions, required this.customization, required this.redirectUrl, required this.isTestMode, @@ -42,15 +45,28 @@ class Flutterwave { this.paymentPlanId, this.subAccounts, this.meta, - this.style}); + this.style, + this.paymentOptionsList}) { + assert(paymentOptions != null || paymentOptionsList != null, + 'Either paymentOptions or paymentOptionsList must be non-null.'); + assert(paymentOptions == null || paymentOptionsList == null, + 'paymentOptions and paymentOptionsList cannot both be non-null.'); + } /// Starts a transaction by calling the Standard service - Future charge() async { + Future charge() async { + var listPaymentOptions = paymentOptionsList; + String paymentOptionNames = ''; + if (listPaymentOptions != null) { + paymentOptionNames = listPaymentOptions + .map((option) => option.toString().split('.').last) + .join(', '); + } final request = StandardRequest( txRef: txRef, amount: amount, customer: customer, - paymentOptions: paymentOptions, + paymentOptions: paymentOptions ?? paymentOptionNames, customization: customization, isTestMode: isTestMode, redirectUrl: redirectUrl, @@ -86,16 +102,16 @@ class Flutterwave { } final response = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => StandardPaymentWidget( - webUrl: standardResponse!.data!.link!, - ), + context, + MaterialPageRoute( + builder: (context) => StandardPaymentWidget( + webUrl: standardResponse!.data!.link!, ), - ); + ), + ); if (response != null) return response!; - return ChargeResponse(txRef: request.txRef, status: "cancelled", success: false); - } - + return ChargeResponse( + txRef: request.txRef, status: "cancelled", success: false); + } } diff --git a/lib/models/subaccount.dart b/lib/models/subaccount.dart index ea29fad..8117af9 100644 --- a/lib/models/subaccount.dart +++ b/lib/models/subaccount.dart @@ -1,24 +1,82 @@ +import '../utils/enums/transaction_charge_type.dart'; class SubAccount { + /// [id] of the Account you want to payout. String id; + + /// Inputting [transactionSplitRatio] here will override whatever value you input in the Dashboard for this Account. + /// If you want to use the value that was set in the dashboard, do not input anything here. int? transactionSplitRatio; - String? transactionChargeType; + + /// Inputting [transactionChargeType] here will override whatever value you input in the Dashboard for this Account. + /// If you want to use the value that was set in the dashboard, do not input anything here. + TransactionChargeType? transactionChargeType; + + /// Inputting [transactionPercentage] here will override whatever value you input in the Dashboard for this Account. + /// If you want to use the value that was set in the dashboard, do not input anything here. + @Deprecated('User transactionCharge instead.') double? transactionPercentage; - SubAccount({ - required this.id, - this.transactionSplitRatio, - this.transactionChargeType, - this.transactionPercentage - }); + /// [transactionCharge] covers all mode of payment It is no longer restricted to percentage. + /// Whether it is a percentage or an exact amount figure, in [double]. + /// Inputting [transactionCharge] here will override whatever value you input in the Dashboard for this Account. + /// If you want to use the value that was set in the dashboard, do not input anything here. + /// For example: + /// + /// ``` + /// transaction_charge_type: TransactionChargeType.flatSubaccount, + /// transaction_charge: 4200, + /// ``` + /// OR + /// ``` + /// transaction_charge_type: TransactionChargeType.percentage, + /// transaction_charge: 0.2, // which is 20% of the total amount + /// ``` + /// OR + /// ``` + /// transaction_charge_type: TransactionChargeType.flat, + /// transaction_charge: 400, + /// ``` + double? transactionCharge; + + SubAccount( + {required this.id, + this.transactionSplitRatio, + this.transactionChargeType, + this.transactionCharge, + this.transactionPercentage}); /// Converts this instance to json Map toJson() { - return { - "id": this.id, - "transaction_split_ratio": this.transactionSplitRatio, - "transaction_charge_type": this.transactionChargeType, - "transaction_charge": this.transactionPercentage - }; + switch (transactionChargeType) { + case TransactionChargeType.percentage: + return { + "id": id, + "transaction_split_ratio": this.transactionSplitRatio, + "transaction_charge_type": 'percentage', + "transaction_charge": this.transactionCharge ?? this.transactionPercentage, + }; + case TransactionChargeType.flat: + return { + "id": id, + "transaction_split_ratio": this.transactionSplitRatio, + "transaction_charge_type": 'flat', + "transaction_charge": this.transactionCharge ?? this.transactionPercentage, + }; + case TransactionChargeType.flatSubaccount: + return { + "id": id, + "transaction_split_ratio": this.transactionSplitRatio, + "transaction_charge_type": 'flat_subaccount', + "transaction_charge": this.transactionCharge ?? this.transactionPercentage, + }; + default: + return { + "id": id, + "transaction_split_ratio": null, + "transaction_charge_type": null, + "transaction_charge": null, + }; + } } } diff --git a/lib/utils/enums/payment_option.dart b/lib/utils/enums/payment_option.dart new file mode 100644 index 0000000..5175f1d --- /dev/null +++ b/lib/utils/enums/payment_option.dart @@ -0,0 +1,16 @@ +enum PaymentOption { + card, + account, + banktransfer, + mpesa, + mobilemoneyghana, + mobilemoneyfranco, + mobilemoneyuganda, + mobilemoneyrwanda, + mobilemoneyzambia, + barter, + nqr, + ussd, + credit, + payattitude +} diff --git a/lib/utils/enums/transaction_charge_type.dart b/lib/utils/enums/transaction_charge_type.dart new file mode 100644 index 0000000..90bef41 --- /dev/null +++ b/lib/utils/enums/transaction_charge_type.dart @@ -0,0 +1,6 @@ +/// TRANSACTION CHARGE TYPE ARE TWO TYPES: +/// PERCENTAGE: [percentage] +/// FLAT SUB ACCOUNT: [flat_subaccount] +/// FLAT: [flat] +/// Find more information here https://developer.flutterwave.com/docs/collecting-payments/split-payments +enum TransactionChargeType {percentage, flat, flatSubaccount } \ No newline at end of file diff --git a/lib/view/standard_widget.dart b/lib/view/standard_widget.dart index c733656..c01fafe 100644 --- a/lib/view/standard_widget.dart +++ b/lib/view/standard_widget.dart @@ -1,23 +1,22 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; -import 'package:flutterwave_standard/core/TransactionCallBack.dart'; -import 'package:flutterwave_standard/models/responses/charge_response.dart'; +import '../core/TransactionCallBack.dart'; +import '../models/responses/charge_response.dart'; import 'flutterwave_in_app_browser.dart'; class StandardPaymentWidget extends StatefulWidget { - final String webUrl; - StandardPaymentWidget({ required this.webUrl }); + StandardPaymentWidget({required this.webUrl}); @override - _StandardPaymentWidgetAppState createState() => new _StandardPaymentWidgetAppState(); + _StandardPaymentWidgetAppState createState() => + new _StandardPaymentWidgetAppState(); } -class _StandardPaymentWidgetAppState extends State implements TransactionCallBack { - +class _StandardPaymentWidgetAppState extends State + implements TransactionCallBack { var options = InAppBrowserClassOptions( crossPlatform: InAppBrowserOptions(hideUrlBar: true), inAppWebViewGroupOptions: InAppWebViewGroupOptions( @@ -29,7 +28,9 @@ class _StandardPaymentWidgetAppState extends State implem void initState() { super.initState(); final browser = FlutterwaveInAppBrowser(callBack: this); - browser.openUrlRequest(urlRequest: URLRequest(url: Uri.parse(widget.webUrl)), options: options); + browser.openUrlRequest( + urlRequest: URLRequest(url: Uri.parse(widget.webUrl)), + options: options); } @override @@ -44,5 +45,4 @@ class _StandardPaymentWidgetAppState extends State implem backgroundColor: Colors.white, ); } - -} \ No newline at end of file +} diff --git a/lib/view/view_utils.dart b/lib/view/view_utils.dart index 4d852fe..b1e2a4e 100644 --- a/lib/view/view_utils.dart +++ b/lib/view/view_utils.dart @@ -29,11 +29,6 @@ class FlutterwaveViewUtils { "$amount. Do you wish to continue? ", textAlign: TextAlign.center, style: textStyle, - // style: TextStyle( - // color: Colors.black, - // fontSize: 18, - // letterSpacing: 1.2, - // ), ), ), actions: [ diff --git a/pubspec.lock b/pubspec.lock index 290e073..90b58c8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,140 +5,160 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "09d49759685f577cd71ec1fcf773afa3377e23d3a9137154a1a1d28dd5aaabd8" + url: "https://pub.dev" source: hosted version: "25.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "21b3e7ffb8505789ecea7794480060b8e66dfa287dfa8923ff3735aadeb9cf29" + url: "https://pub.dev" source: hosted version: "2.2.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "3d82ff8620ec576fd38f6cec0df45a7c088b8704eb1c63d4c336392e5efca6ca" + url: "https://pub.dev" source: hosted version: "2.2.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: ad0a562140603cf3dd77f0bdd068ffc11588661e3de7ba53c803e72382a1b3a2 + url: "https://pub.dev" source: hosted version: "2.1.0" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: ce70206f4116029cec77802dd5b5987e32c30ab491af6e3e49410b7457ebfc64 + url: "https://pub.dev" source: hosted version: "8.1.2" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: cd9cfe046f8b4d87f45abce8f14ec315a4eaedcf92a211e83fa080faf9ec7c1c + url: "https://pub.dev" source: hosted version: "0.3.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: bdb1ab29be158c4784d7f9b7b693745a0719c5899e31c01112782bb1cb871e80 + url: "https://pub.dev" source: hosted version: "4.1.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: f08428ad63615f96a27e34221c65e1a451439b5f26030f78d790f461c686d65d + url: "https://pub.dev" source: hosted version: "3.0.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: cf75650c66c0316274e21d7c43d3dea246273af5955bd94e8184837cd577575c + url: "https://pub.dev" source: hosted version: "3.0.1" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "4237f3f70a6b544cb31c9e90488ea7e61e1e50d72fe83ec34e8b2833698f7201" + url: "https://pub.dev" source: hosted version: "2.1.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: b69516f2c26a5bcac4eee2e32512e1a5205ab312b3536c1c1227b2b942b5f9ad + url: "https://pub.dev" source: hosted version: "6.1.2" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "6a2ef17156f4dc49684f9d99aaf4a93aba8ac49f5eac861755f5730ddf6e2e4e" + url: "https://pub.dev" source: hosted version: "1.0.0" flutter: @@ -150,7 +170,8 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - url: "https://pub.dartlang.org" + sha256: f73505c792cf083d5566e1a94002311be497d984b5607f25be36d685cf6361cf + url: "https://pub.dev" source: hosted version: "5.7.2+3" flutter_test: @@ -167,112 +188,128 @@ packages: dependency: "direct main" description: name: fluttertoast - url: "https://pub.dartlang.org" + sha256: b3ae793108ad2a7e8f2fea91ca5bb2ba7ef03621c4d9ed7a92fe3391da64c000 + url: "https://pub.dev" source: hosted version: "8.0.8" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: dda85ce2aefce16f7e75586acbcb1e8320bf176f69fd94082e31945d6de67f3e + url: "https://pub.dev" source: hosted version: "2.0.1" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: b6f1f143a71e1fe1b34670f1acd6f13960ade2557c96b87e127e0cf661969791 + url: "https://pub.dev" source: hosted version: "0.13.3" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + url: "https://pub.dev" source: hosted version: "4.0.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "0520a4826042a8a5d09ddd4755623a50d37ee536d79a70452aff8c8ad7bb6c27" + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" mockito: dependency: "direct dev" description: name: mockito - url: "https://pub.dartlang.org" + sha256: "6668f23c57bbf3857437c1683e8e0bef7e1077537593293e1fc8d1099fcc1981" + url: "https://pub.dev" source: hosted version: "5.0.15" modal_bottom_sheet: dependency: "direct main" description: name: modal_bottom_sheet - url: "https://pub.dartlang.org" + sha256: fc7c6b5848b837122dc1db913545ef673d74222090cad63a2840507e3d483235 + url: "https://pub.dev" source: hosted version: "2.1.0" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "20e7154d701fedaeb219dad732815ecb66677667871127998a9a6581c2aba4ba" + url: "https://pub.dev" source: hosted version: "2.0.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.2" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" source: hosted version: "1.11.1" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757" + url: "https://pub.dev" source: hosted version: "2.1.2" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "59ed538734419e81f7fc18c98249ae72c3c7188bdd9dceff2840585227f79843" + url: "https://pub.dev" source: hosted version: "2.0.0" sky_engine: @@ -284,107 +321,122 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: ffb7124eb6752de71e87a122cc50a8a191044add69fd990d76958bc38ee552fd + url: "https://pub.dev" source: hosted version: "1.0.3" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.16" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + url: "https://pub.dev" source: hosted version: "1.3.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "68173f2fa67d241323a4123be7ed4e43424c54befa5505d71c8ad4b7baf8f71d" + url: "https://pub.dev" source: hosted version: "1.0.0" webview_flutter: dependency: "direct main" description: name: webview_flutter - url: "https://pub.dartlang.org" + sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" + url: "https://pub.dev" source: hosted version: "3.0.4" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - url: "https://pub.dartlang.org" + sha256: "71003f78c3c1be4a652ce91c64846a2de3c097a182133a7f003807f2d4d31f47" + url: "https://pub.dev" source: hosted version: "2.8.14" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - url: "https://pub.dartlang.org" + sha256: "60828a1ae6a1ac779895768b5567aea1157e1b0b58660ce67c6da30ae56694ec" + url: "https://pub.dev" source: hosted version: "1.9.1" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - url: "https://pub.dartlang.org" + sha256: "5285e2a22199aaddf67b01114893c47a718dd2d989d78453dc0174d7386f88f6" + url: "https://pub.dev" source: hosted version: "2.8.1" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "3cee79b1715110341012d27756d9bae38e650588acd38d3f3c610822e1337ace" + url: "https://pub.dev" source: hosted version: "3.1.0" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.18.0 <3.0.0" flutter: ">=3.0.0"