From dcd3735693869006e3a7e725334e486f10c04892 Mon Sep 17 00:00:00 2001 From: Braxton Ward Date: Fri, 5 Sep 2025 09:05:40 -0600 Subject: [PATCH] feat: add support for operation in task --- .../AtomicTransactFlutterPlugin.kt | 9 +++--- example/lib/main.dart | 20 +++--------- lib/src/config.dart | 32 +++++++++++++------ lib/src/types.dart | 31 ++++++++++++------ pubspec.yaml | 2 +- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/android/src/main/kotlin/atomic/financial/atomic_transact_flutter/AtomicTransactFlutterPlugin.kt b/android/src/main/kotlin/atomic/financial/atomic_transact_flutter/AtomicTransactFlutterPlugin.kt index ce99d3b..16fa68a 100644 --- a/android/src/main/kotlin/atomic/financial/atomic_transact_flutter/AtomicTransactFlutterPlugin.kt +++ b/android/src/main/kotlin/atomic/financial/atomic_transact_flutter/AtomicTransactFlutterPlugin.kt @@ -179,10 +179,11 @@ class AtomicTransactFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAwa val result = mutableListOf() value?.forEach { - result.add(Config.Task( - product = Config.Product.valueOf((it["product"] as String).uppercase()), - distribution = configDistributionFromMap(it["distribution"] as? Map ))) - } + result.add(Config.Task( + product = (it["product"] as? String)?.let { Config.Product.valueOf(it.uppercase()) }, + operation = (it["operation"] as? String)?.let { Config.Product.valueOf(it.uppercase()) }, + distribution = configDistributionFromMap(it["distribution"] as? Map ))) + } return result } diff --git a/example/lib/main.dart b/example/lib/main.dart index 95eaaaf..5742a12 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -13,26 +13,16 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - late AtomicConfig _config; - late AtomicTheme _theme; - - @override - void initState() { - super.initState(); - - _theme = AtomicTheme(dark: true); - _config = AtomicConfig( + void _onButtonPressed() { + final AtomicConfig config = AtomicConfig( scope: 'user-link', publicToken: '', tasks: [AtomicTask(product: AtomicProductType.deposit)], - theme: _theme, + theme: AtomicTheme(dark: true), ); - print("config: ${_config.toJson()}"); - } - void _onButtonPressed() { Atomic.transact( - config: _config, + config: config, environment: TransactEnvironment.production, presentationStyleIOS: AtomicPresentationStyleIOS.formSheet, onInteraction: (AtomicTransactInteraction interaction) { @@ -81,7 +71,7 @@ class _MyAppState extends State { id: '', environment: TransactEnvironment.custom( 'http://localhost:4545', 'http://localhost:3003'), - theme: _theme, + theme: AtomicTheme(dark: true), presentationStyleIOS: AtomicPresentationStyleIOS.formSheet, onLaunch: () { print("onLaunch"); diff --git a/lib/src/config.dart b/lib/src/config.dart index 5e6c03a..ea265f2 100644 --- a/lib/src/config.dart +++ b/lib/src/config.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:io' show Platform; import 'types.dart'; @@ -145,7 +147,11 @@ class AtomicExperiments { /// Defines configuration for the tasks you wish to execute as part of the task workflow. class AtomicTask { /// One of deposit, verify, switch, or present. - final AtomicProductType product; + @Deprecated('Use operation instead') + final AtomicProductType? product; + + /// One of deposit, verify, switch, present, or tax. + final AtomicOperationType? operation; /// The action to take on completion of the task. Can be either "continue" or "finish." To execute the next task, use "continue." To finish the task workflow and not execute any of the subsequent tasks, use "finish." /// Default value: "continue" @@ -159,17 +165,25 @@ class AtomicTask { final AtomicDistribution? distribution; AtomicTask({ - required this.product, + @Deprecated('Use operation instead') this.product, + this.operation, this.onComplete = "continue", this.onFail = "continue", this.distribution, - }); + }) : assert(operation != null || product != null, + 'Either operation or product must be provided'); /// Returns a JSON object representation. Map toJson() { + String? operationValue; + if (operation != null) { + operationValue = operation!.operationName; + } else if (product != null) { + operationValue = product!.productName; + } + return { - 'product': - product == AtomicProductType.switchPayment ? 'switch' : product.name, + 'operation': operationValue, 'onComplete': onComplete, 'onFail': onFail, 'distribution': distribution?.toJson(), @@ -295,12 +309,12 @@ class TransactEnvironment { final String apiPath; /// Production environment - static const TransactEnvironment production = - TransactEnvironment._('https://transact.atomicfi.com', 'https://api.atomicfi.com'); + static const TransactEnvironment production = TransactEnvironment._( + 'https://transact.atomicfi.com', 'https://api.atomicfi.com'); /// Sandbox environment - static const TransactEnvironment sandbox = - TransactEnvironment._('https://transact.atomicfi.com', 'https://sandbox-api.atomicfi.com'); + static const TransactEnvironment sandbox = TransactEnvironment._( + 'https://transact.atomicfi.com', 'https://sandbox-api.atomicfi.com'); /// Custom environment with specified path static TransactEnvironment custom(String transactPath, String apiPath) => diff --git a/lib/src/types.dart b/lib/src/types.dart index c280b45..7c28988 100644 --- a/lib/src/types.dart +++ b/lib/src/types.dart @@ -4,17 +4,15 @@ import '../src/events.dart'; /// The product to initiate enum AtomicProductType { - /// Update the destination bank account of paychecks - deposit, + deposit('deposit'), + verify('verify'), + switchPayment('switch'), + present('present'), + tax('tax'); - /// Verify a user's income and employment status - verify, + final String productName; - /// Switch a user's payment method - switchPayment, - - /// Subscription management - present, + const AtomicProductType(this.productName); } /// Type of distribution @@ -111,7 +109,20 @@ typedef AtomicTaskStatusUpdateHandler = void Function( enum AtomicPresentationStyleIOS { /// Full screen presentation style fullScreen, - + /// Form sheet presentation style (default) formSheet, } + +/// The operation type to initiate +enum AtomicOperationType { + deposit('deposit'), + verify('verify'), + switchPayment('switch'), + present('present'), + tax('tax'); + + final String operationName; + + const AtomicOperationType(this.operationName); +} diff --git a/pubspec.yaml b/pubspec.yaml index 7681431..3b4d67c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 3.13.4 repository: https://github.com/atomicfi/atomic-transact-flutter environment: - sdk: ">=2.15.1 <4.0.0" + sdk: ">=2.17.0 <4.0.0" flutter: ">=2.5.0" dependencies: