From 32b383afa9b1cdc30ea49c41c540ea7f4eadba55 Mon Sep 17 00:00:00 2001 From: Vusumuzi Khoza Date: Tue, 25 Nov 2025 20:06:33 +0200 Subject: [PATCH] completed first web iteration --- .metadata | 25 +- Dockerfile | 71 + android/app/src/main/AndroidManifest.xml | 2 +- android/app/src/main/res/values/strings.xml | 2 +- assets/.env | 5 +- assets/favicon.png | Bin 0 -> 87276 bytes assets/velocity-animation.gif | Bin 0 -> 122532 bytes assets/velocity.png | Bin 0 -> 23794 bytes devtools_options.yaml | 5 + ios/Runner/Info.plist | 4 +- lib/interop.dart | 7 + lib/main.dart | 77 +- lib/models/responsive_policy.dart | 5 + lib/navbar.dart | 209 ++ lib/screens/confirm/confirm_controller.dart | 10 +- lib/screens/confirm/confirm_screen.dart | 478 ++--- lib/screens/gateway/gateway_controller.dart | 9 +- lib/screens/gateway/gateway_screen.dart | 125 +- lib/screens/gateway/gateway_web_screen.dart | 259 +++ lib/screens/history/history_controller.dart | 2 +- lib/screens/history/history_screen.dart | 189 +- lib/screens/home/home_controller.dart | 42 +- lib/screens/home/home_screen.dart | 1014 ++++----- .../integration/integration_controller.dart | 12 +- .../integration/integration_screen.dart | 89 +- lib/screens/onboarding/complete_screen.dart | 102 +- .../onboarding/landing/landing_screen.dart | 138 +- .../onboarding/login/login_screen.dart | 218 +- .../onboarding/phone/phone_screen.dart | 164 +- .../onboarding/register/register_screen.dart | 344 ++-- .../onboarding/verify/verify_screen.dart | 294 ++- lib/screens/pay/pay_controller.dart | 2 +- lib/screens/pay/pay_screen.dart | 219 +- lib/screens/poll/poll_screen.dart | 126 ++ lib/screens/receipt/receipt_screen.dart | 1813 +++++++++-------- lib/screens/recipient/recipients_screen.dart | 173 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 52 +- pubspec.yaml | 6 +- web/favicon.png | Bin 917 -> 87276 bytes web/index.html | 22 +- 41 files changed, 3703 insertions(+), 2613 deletions(-) create mode 100644 Dockerfile create mode 100644 assets/favicon.png create mode 100644 assets/velocity-animation.gif create mode 100644 assets/velocity.png create mode 100644 devtools_options.yaml create mode 100644 lib/interop.dart create mode 100644 lib/models/responsive_policy.dart create mode 100644 lib/navbar.dart create mode 100644 lib/screens/gateway/gateway_web_screen.dart create mode 100644 lib/screens/poll/poll_screen.dart diff --git a/.metadata b/.metadata index e8f7bf9..5722f85 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "ea121f8859e4b13e47a8f845e4586164519588bc" + revision: "9f455d2486bcb28cad87b062475f42edc959f636" channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc - - platform: android - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc - - platform: ios - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc - - platform: linux - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc - - platform: macos - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc + create_revision: 9f455d2486bcb28cad87b062475f42edc959f636 + base_revision: 9f455d2486bcb28cad87b062475f42edc959f636 - platform: web - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc - - platform: windows - create_revision: ea121f8859e4b13e47a8f845e4586164519588bc - base_revision: ea121f8859e4b13e47a8f845e4586164519588bc + create_revision: 9f455d2486bcb28cad87b062475f42edc959f636 + base_revision: 9f455d2486bcb28cad87b062475f42edc959f636 # User provided section diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c17ed31 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,71 @@ +# syntax=docker/dockerfile:1.6 + +############################################### +# Build stage: compile Flutter web artifacts. # +############################################### +FROM ubuntu:22.04 AS build + +ENV DEBIAN_FRONTEND=noninteractive \ + FLUTTER_CHANNEL=stable \ + FLUTTER_VERSION=3.24.3 \ + FLUTTER_HOME=/opt/flutter + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + unzip \ + xz-utils \ + zip \ + libglu1-mesa && \ + rm -rf /var/lib/apt/lists/* + +RUN curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/${FLUTTER_CHANNEL}/linux/flutter_linux_${FLUTTER_VERSION}-${FLUTTER_CHANNEL}.tar.xz" \ + | tar -xJ -C /opt && \ + ln -s ${FLUTTER_HOME} /usr/local/flutter + +ENV PATH="${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin:${PATH}" + +RUN flutter config --enable-web && \ + flutter doctor -v + +WORKDIR /app + +COPY pubspec.yaml pubspec.lock ./ +RUN flutter pub get + +COPY . . +RUN flutter build web --release + +########################################## +# Runtime stage: serve assets via nginx. # +########################################## +FROM ubuntu:22.04 AS runner + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y --no-install-recommends nginx && \ + rm -rf /var/lib/apt/lists/* + +# Remove default site definition to avoid duplicate configs. +RUN rm -f /etc/nginx/sites-enabled/default + +# Provide a minimal nginx site config for the Flutter web assets. +RUN printf 'server {\n\ + listen 80 default_server;\n\ + listen [::]:80 default_server;\n\ + root /var/www/html;\n\ + index index.html;\n\ + location / {\n\ + try_files $uri $uri/ /index.html;\n\ + }\n\ +}\n' > /etc/nginx/conf.d/flutter.conf + +COPY --from=build /app/build/web /var/www/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5a558c1..50096c7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 8e478ad..b4cbe58 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - Peak + Velocity \ No newline at end of file diff --git a/assets/.env b/assets/.env index 6f89a20..7645daa 100644 --- a/assets/.env +++ b/assets/.env @@ -1,10 +1,11 @@ BASE_URL=https://peakapi.qantra.co.zw/api ; BASE_URL=http://192.168.100.26:6950/api -; BASE_URL=http://10.69.5.204:6950/api +; BASE_URL=http://173.212.247.232:6950/api ; BASE_URL=http://192.168.1.164:6950/api ; BASE_URL=http://192.168.120.160:6950/api ; BASE_URL=http://10.10.2.92:6950/api ; BASE_URL=http://172.20.5.105:6950/api ; BASE_URL=http://10.10.3.92:6950/api CLIENTID=77433712483-ng7pntvcpf6tnjccriuqm8dbna8vvp3b.apps.googleusercontent.com -SIMULATE_PAYMENT_SUCCESS=false \ No newline at end of file +SIMULATE_PAYMENT_SUCCESS=false +; SIMULATE_PAYMENT_SUCCESS=true diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..721aa6eef625f785809bb8b5d2c3c0cb74180134 GIT binary patch literal 87276 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
    EQ@Z7EqB#Puy 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⁢u-J+cm{?51JB-n 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

    k-+cbTe$Dx8UXD-#_Q_zeQ>+w8!}!Mxo15ZO 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 MI%`>c)b*GD1NDcB9smFU literal 0 HcmV?d00001 diff --git a/assets/velocity-animation.gif b/assets/velocity-animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca82573cc13b53121f2ab09d2b1474a5078416e5 GIT binary patch literal 122532 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 literal 0 HcmV?d00001 diff --git a/assets/velocity.png b/assets/velocity.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3a7ca51846ca66a4f1efde4716bb2829f6c42c GIT binary patch literal 23794 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 K>1~$Vss8}?RBn3! literal 0 HcmV?d00001 diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..b042345 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,5 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: + - provider: true + - shared_preferences: true \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index c73d391..717c9ba 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Peak + Velocity CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - Peak + Velocity CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/interop.dart b/lib/interop.dart new file mode 100644 index 0000000..7dd7770 --- /dev/null +++ b/lib/interop.dart @@ -0,0 +1,7 @@ +import 'dart:js_interop'; + +@JS('configure') +external void configure(String sessionID); + +@JS('showEmbeddedPage') +external void showEmbeddedPage(); diff --git a/lib/main.dart b/lib/main.dart index d37a350..e089fb2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/navbar.dart'; import 'package:qpay/screens/confirm/confirm_screen.dart'; import 'package:qpay/screens/gateway/gateway_screen.dart'; import 'package:qpay/screens/integration/integration_screen.dart'; @@ -13,9 +14,11 @@ import 'package:qpay/screens/onboarding/phone/phone_screen.dart'; import 'package:qpay/screens/onboarding/register/register_screen.dart'; import 'package:qpay/screens/onboarding/verify/verify_screen.dart'; import 'package:qpay/screens/pay/pay_screen.dart'; +import 'package:qpay/screens/poll/poll_screen.dart'; import 'package:qpay/screens/receipt/receipt_screen.dart'; import 'package:qpay/screens/recipient/recipients_screen.dart'; import 'package:qpay/screens/transaction_controller.dart'; +import 'screens/gateway/gateway_web_screen.dart'; import 'screens/home/home_screen.dart'; import 'screens/history/history_screen.dart'; import 'screens/profile_screen.dart'; @@ -66,7 +69,7 @@ class _MyAppState extends State { Widget build(BuildContext context) { if (_showSplash) { return MaterialApp( - title: 'Peak', + title: 'Velocity', theme: AppTheme.lightTheme, themeMode: ThemeMode.light, home: SplashScreen(onSplashComplete: _onSplashComplete), @@ -75,7 +78,7 @@ class _MyAppState extends State { } return MaterialApp.router( - title: 'Peak', + title: 'Velocity', theme: AppTheme.lightTheme, themeMode: ThemeMode.light, // Force light mode regardless of OS setting debugShowCheckedModeBanner: false, @@ -112,6 +115,14 @@ class _MyAppState extends State { path: '/gateway', builder: (context, state) => const GatewayScreen(), ), + GoRoute( + path: '/gateway-web', + builder: (context, state) => const GatewayWebScreen(), + ), + GoRoute( + path: '/poll', + builder: (context, state) => const PollScreen(), + ), GoRoute( path: '/receipt', builder: (context, state) => const ReceiptScreen(), @@ -167,65 +178,3 @@ class _MyAppState extends State { ); } } - -class ScaffoldWithNavBar extends StatelessWidget { - const ScaffoldWithNavBar({super.key, required this.child}); - - final Widget child; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: child, - bottomNavigationBar: NavigationBar( - onDestinationSelected: (index) { - switch (index) { - case 0: - context.go('/home'); - break; - // case 1: - // context.go('/recipients'); - // break; - case 1: - context.go('/history'); - break; - // case 2: - // context.go('/profile'); - // break; - } - }, - selectedIndex: _calculateSelectedIndex(context), - destinations: const [ - NavigationDestination( - icon: Icon(Icons.home_outlined), - selectedIcon: Icon(Icons.home), - label: 'Home', - ), - // NavigationDestination( - // icon: Icon(Icons.contacts_outlined), - // selectedIcon: Icon(Icons.contacts), - // label: 'Recipients', - // ), - NavigationDestination( - icon: Icon(Icons.history_outlined), - selectedIcon: Icon(Icons.history), - label: 'History', - ), - // NavigationDestination( - // icon: Icon(Icons.person_outline), - // selectedIcon: Icon(Icons.person), - // label: 'Profile', - // ), - ], - ), - ); - } - - int _calculateSelectedIndex(BuildContext context) { - final String location = GoRouterState.of(context).uri.path; - // if (location.startsWith('/recipients')) return 1; - if (location.startsWith('/history')) return 1; - // if (location.startsWith('/profile')) return 2; - return 0; - } -} diff --git a/lib/models/responsive_policy.dart b/lib/models/responsive_policy.dart new file mode 100644 index 0000000..5ea284d --- /dev/null +++ b/lib/models/responsive_policy.dart @@ -0,0 +1,5 @@ +class ResponsivePolicy { + static const int sm = 400; + static const int md = 600; + static const int lg = 950; +} \ No newline at end of file diff --git a/lib/navbar.dart b/lib/navbar.dart new file mode 100644 index 0000000..2f13235 --- /dev/null +++ b/lib/navbar.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'models/responsive_policy.dart'; + +class ScaffoldWithNavBar extends StatefulWidget { + const ScaffoldWithNavBar({super.key, required this.child}); + + final Widget child; + + @override + State createState() => _ScaffoldWithNavBarState(); +} + +class _ScaffoldWithNavBarState extends State { + bool _isLoggedIn = false; + late String initials; + + @override + void initState() { + super.initState(); + init(); + } + + Future init() async { + var prefs = await SharedPreferences.getInstance(); + + if (prefs.getString("token") != null) { + setState(() { + _isLoggedIn = true; + initials = prefs.getString("initials")!; + }); + } + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth > ResponsivePolicy.md) { + return Scaffold( + body: SafeArea( + child: Row( + children: [ + NavigationRail( + extended: true, + leading: Padding( + padding: const EdgeInsets.only(top: 20.0, bottom: 10), + child: Image( + image: AssetImage('assets/velocity.png'), + width: 150 + ), + ), + trailing: _buildLogin(context), + labelType: NavigationRailLabelType.none, + indicatorColor: Theme.of( + context, + ).colorScheme.primary.withAlpha(30), + onDestinationSelected: (index) { + _handleTap(index, context); + }, + selectedIndex: _calculateSelectedIndex(context), + destinations: _buildNavigationRailDestinations(), + ), + VerticalDivider( + thickness: 1, + width: 1, + color: Theme.of(context).colorScheme.primary.withAlpha(30), + ), + Expanded(child: widget.child), + ], + ), + ), + ); + } + return Scaffold( + body: widget.child, + bottomNavigationBar: NavigationBar( + indicatorColor: Theme.of(context).colorScheme.primary.withAlpha(30), + onDestinationSelected: (index) { + _handleTap(index, context); + }, + selectedIndex: _calculateSelectedIndex(context), + destinations: _buildNavigationDestinations(), + ), + ); + }, + ); + } + + List _buildNavigationRailDestinations() { + List destinations = []; + for (var destination in _buildDestinationData()) { + destinations.add( + NavigationRailDestination( + icon: destination["icon"] as Widget, + selectedIcon: destination["selectedIcon"] as Widget, + label: Text(destination["label"], style: TextStyle(fontSize: 16)), + ), + ); + } + return destinations; + } + + List _buildNavigationDestinations() { + List destinations = []; + for (var destination in _buildDestinationData()) { + destinations.add( + NavigationDestination( + icon: destination["icon"] as Widget, + selectedIcon: destination["selectedIcon"] as Widget, + label: destination["label"] as String, + ), + ); + } + return destinations; + } + + List> _buildDestinationData() { + return [ + { + "icon": Icon(Icons.home_outlined), + "selectedIcon": Icon(Icons.home), + "label": 'Home', + }, + { + "icon": Icon(Icons.history_outlined), + "selectedIcon": Icon(Icons.history), + "label": 'History', + }, + ]; + } + + Widget _buildLogin(BuildContext context) { + if(_isLoggedIn) { + return SizedBox(); + } + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Column( + children: [ + Container( + width: 220, + decoration: BoxDecoration( + border: Border.all(color: Colors.black87.withAlpha(20)), + borderRadius: BorderRadius.circular(12), + ), + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 10, + children: [ + Text( + 'Register or Login for more features', + style: TextStyle(fontSize: 16), + ), + InkWell( + onTap: () { + context.push('/onboarding/landing'); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(12), + ), + child: Text('Get Started', style: TextStyle(fontSize: 14)), + ), + ), + ], + ), + ), + SizedBox(height: 10), + ], + ), + ); + } + + void _handleTap(int index, BuildContext context) { + switch (index) { + case 0: + context.go('/home'); + break; + // case 1: + // context.go('/recipients'); + // break; + case 1: + context.go('/history'); + break; + // case 2: + // context.go('/profile'); + // break; + } + } + + int _calculateSelectedIndex(BuildContext context) { + final String location = GoRouterState.of(context).uri.path; + // if (location.startsWith('/recipients')) return 1; + if (location.startsWith('/history')) return 1; + // if (location.startsWith('/profile')) return 2; + return 0; + } +} diff --git a/lib/screens/confirm/confirm_controller.dart b/lib/screens/confirm/confirm_controller.dart index d5db3af..c579f7d 100644 --- a/lib/screens/confirm/confirm_controller.dart +++ b/lib/screens/confirm/confirm_controller.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:go_router/go_router.dart'; @@ -81,10 +82,13 @@ class ConfirmController extends ChangeNotifier { transactionController.updateReceiptData(response); - if (transactionController.model.selectedPaymentProcessor.authType == - "WEB") { + if (transactionController.model.selectedPaymentProcessor.authType == "WEB") { if (context.mounted) { - context.push('/gateway'); + if(kIsWeb){ + context.push('/gateway-web'); + }else { + context.push('/gateway'); + } } } else { await pollTransaction(transactionController.model.receiptData?['id']); diff --git a/lib/screens/confirm/confirm_screen.dart b/lib/screens/confirm/confirm_screen.dart index d38469f..125bf5a 100644 --- a/lib/screens/confirm/confirm_screen.dart +++ b/lib/screens/confirm/confirm_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/confirm/confirm_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -88,255 +89,266 @@ class _ConfirmScreenState extends State position: _slideAnimation, child: Form( key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - padding: EdgeInsets.all(15), - decoration: BoxDecoration( - border: Border.all( - color: Theme.of( - context, - ).colorScheme.primary.withOpacity(0.3), - ), - borderRadius: BorderRadius.circular(10), - ), - - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - width: 1.0, - color: - Theme.of(context).colorScheme.primary, + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse(constraints.maxWidth > ResponsivePolicy.md ? + ResponsivePolicy.md.toString() : + constraints.maxWidth.toString()), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + border: Border.all( + color: Theme.of( + context, + ).colorScheme.primary.withOpacity(0.3), ), + borderRadius: BorderRadius.circular(10), ), - ), - padding: EdgeInsets.only( - bottom: 4.0, - ), // Adjust spacing - child: Text( - "PROVIDER DETAILS", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - ), - ...controller - .transactionController - .model - .confirmationData["additionalData"] - .map((data) { - return Column( - children: [ - const SizedBox(height: 10), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 1.0, + color: + Theme.of(context).colorScheme.primary, + ), + ), + ), + padding: EdgeInsets.only( + bottom: 4.0, + ), // Adjust spacing + child: Text( + "PROVIDER DETAILS", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ...controller + .transactionController + .model + .confirmationData["additionalData"] + .map((data) { + return Column( + children: [ + const SizedBox(height: 10), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + data["name"] ?? "", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + data["value"] ?? "", + style: TextStyle(fontSize: 16), + ), + ], + ), + ], + ); + }) + .toList(), + const SizedBox(height: 30), + Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 1.0, + color: + Theme.of(context).colorScheme.primary, + ), + ), + ), + padding: EdgeInsets.only( + bottom: 4.0, + ), // Adjust spacing + child: Text( + "TRANSACTIONS DETAILS", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Amount", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + controller + .transactionController + .model + .confirmationData["amount"] + .toString(), + style: TextStyle(fontSize: 16), + ), + ], + ), + const SizedBox(height: 10), + if (controller + .transactionController + .model + .confirmationData["charge"] != + 0) + Column( children: [ - Text( - data["name"] ?? "", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - data["value"] ?? "", - style: TextStyle(fontSize: 16), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Our Charge", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + controller + .transactionController + .model + .confirmationData["charge"] + .toString(), + style: TextStyle(fontSize: 16), + ), + ], ), + const SizedBox(height: 10), ], ), - ], - ); - }) - .toList(), - const SizedBox(height: 30), - Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - width: 1.0, - color: - Theme.of(context).colorScheme.primary, - ), - ), - ), - padding: EdgeInsets.only( - bottom: 4.0, - ), // Adjust spacing - child: Text( - "TRANSACTIONS DETAILS", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - "Amount", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - controller - .transactionController - .model - .confirmationData["amount"] - .toString(), - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 10), - if (controller - .transactionController - .model - .confirmationData["charge"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - "Our Charge", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - controller + if (controller .transactionController .model - .confirmationData["charge"] - .toString(), - style: TextStyle(fontSize: 16), + .confirmationData["gatewayCharge"] != + 0) + Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Gateway Charge", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + controller + .transactionController + .model + .confirmationData["gatewayCharge"] + .toString(), + style: TextStyle(fontSize: 16), + ), + ], + ), + const SizedBox(height: 10), + ], ), - ], - ), - const SizedBox(height: 10), - ], - ), - if (controller - .transactionController - .model - .confirmationData["gatewayCharge"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - "Gateway Charge", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - controller + if (controller .transactionController .model - .confirmationData["gatewayCharge"] - .toString(), - style: TextStyle(fontSize: 16), + .confirmationData["tax"] != + 0) + Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Tax", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + controller + .transactionController + .model + .confirmationData["tax"] + .toString(), + style: TextStyle(fontSize: 16), + ), + ], + ), + const SizedBox(height: 10), + ], ), - ], - ), - const SizedBox(height: 10), - ], - ), - if (controller - .transactionController - .model - .confirmationData["tax"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - "Tax", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Total Amount", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), ), + Text( + controller + .transactionController + .model + .confirmationData["totalAmount"] + .toString(), + style: TextStyle(fontSize: 16), + ), + ], + ), + const SizedBox(height: 5), + Text( + "NB: Your payment provider may charge additional fees.", + style: TextStyle( + fontSize: 11, + color: Colors.red, ), - Text( - controller - .transactionController - .model - .confirmationData["tax"] - .toString(), - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 10), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - "Total Amount", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), + ), + ], ), - Text( - controller - .transactionController - .model - .confirmationData["totalAmount"] - .toString(), - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 5), - Text( - "NB: Your payment provider may charge additional fees.", - style: TextStyle( - fontSize: 11, - color: Colors.red, ), - ), - ], - ), - ), - const SizedBox(height: 20), - _buildPaymentProcessorButton(), - const SizedBox(height: 20), - Center( - child: OutlinedButton( - child: Text('Cancel'), - onPressed: () { - context.go('/'); - }, - ), - ), - ], + const SizedBox(height: 20), + _buildPaymentProcessorButton(), + const SizedBox(height: 20), + Center( + child: OutlinedButton( + child: Text('Cancel'), + onPressed: () { + context.go('/'); + }, + ), + ), + ], + ), + ); + } + ), ), ), ), diff --git a/lib/screens/gateway/gateway_controller.dart b/lib/screens/gateway/gateway_controller.dart index 666aff6..0298a85 100644 --- a/lib/screens/gateway/gateway_controller.dart +++ b/lib/screens/gateway/gateway_controller.dart @@ -76,15 +76,22 @@ class GatewayController extends ChangeNotifier { } Future pollTransaction(String uid) async { + // only poll for 5 minutes + int max = 30; while (!model.isCancelled) { + max++; // Check cancellation flag instead of true // Wait 5 seconds before the next poll - await Future.delayed(const Duration(seconds: 5)); + await Future.delayed(const Duration(seconds: 10)); // Check again after delay in case it was cancelled during the delay if (model.isCancelled) break; await poll(uid); + + if(max > 30) { + model.isCancelled = true; + } } } diff --git a/lib/screens/gateway/gateway_screen.dart b/lib/screens/gateway/gateway_screen.dart index bfc8e78..5fda0f2 100644 --- a/lib/screens/gateway/gateway_screen.dart +++ b/lib/screens/gateway/gateway_screen.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:go_router/go_router.dart'; @@ -17,6 +15,7 @@ class _GatewayScreenState extends State { late WebViewController _webViewController; late GatewayController controller; late String url; + String? sessionID; bool integrationStarted = false; @@ -24,63 +23,71 @@ class _GatewayScreenState extends State { void initState() { super.initState(); controller = GatewayController(context); + // https://na.gateway.mastercard.com/checkout/pay/SESSION0002220827459I8059951J88?checkoutVersion=1.0.0 + url = controller.transactionController.model.receiptData?['targetUrl']; - _initWebView(url); + + _initWebView(); + } + + void _initWebView() async { + _webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) { + controller.startLoading(); + }, + onPageFinished: (String url) { + controller.finishLoading(); + }, + onHttpError: (HttpResponseError error) {}, + onWebResourceError: (WebResourceError error) {}, + onUrlChange: (UrlChange url) async { + print("URL Changed to ${url.url!}"); + + _navigateWhenDone(url.url!); + }, + ), + ) + ..loadRequest(Uri.parse(url)); bool simulate = bool.parse(dotenv.env['SIMULATE_PAYMENT_SUCCESS']!); - if(simulate) { - sleep(Duration(seconds: 10)); + if (simulate) { + await Future.delayed(Duration(seconds: 10)); String targetUrl = url.replaceAll("/pay/", "/receipt/"); _webViewController.loadRequest(Uri.parse(targetUrl)); } } - void _initWebView(String url) { - _webViewController = - WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate( - onProgress: (int progress) { - // Update loading bar. - }, - onPageStarted: (String url) { - controller.startLoading(); - }, - onPageFinished: (String url) { - controller.finishLoading(); - }, - onHttpError: (HttpResponseError error) {}, - onWebResourceError: (WebResourceError error) {}, - onUrlChange: (UrlChange url) async { - print("URL Changed to ${url.url!}"); + void _navigateWhenDone(String url) { + if (url.contains("/checkout/receipt/")) { + if (integrationStarted) { + return; + } - if(url.url!.contains("/checkout/receipt/")){ - if(integrationStarted) { - return; - } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "Payment was successful, please wait while we process your order.", + ), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.black87, + duration: const Duration(seconds: 10), + ), + ); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text("Payment was successful, please wait while we process your order."), - behavior: SnackBarBehavior.floating, - backgroundColor: Colors.black87, - duration: const Duration(seconds: 10), - ), - ); + setState(() { + integrationStarted = true; + }); - setState(() { - integrationStarted = true; - }); - - WidgetsBinding.instance.addPostFrameCallback((_) { - context.go('/integration'); - }); - } - } - ), - ) - ..loadRequest(Uri.parse(url)); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go('/integration'); + }); + } } @override @@ -94,15 +101,14 @@ class _GatewayScreenState extends State { return Scaffold( appBar: AppBar( title: const Text('Complete your payment'), - leading: - context.canPop() - ? IconButton( - onPressed: () { - context.pop(); - }, - icon: const Icon(Icons.arrow_back), - ) - : SizedBox.shrink(), + leading: context.canPop() + ? IconButton( + onPressed: () { + context.pop(); + }, + icon: const Icon(Icons.arrow_back), + ) + : SizedBox.shrink(), ), body: ListenableBuilder( listenable: controller, @@ -112,9 +118,12 @@ class _GatewayScreenState extends State { context.go('/integration'); }); } + return controller.model.isLoading ? const Center(child: CircularProgressIndicator(strokeWidth: 5)) - : WebViewWidget(controller: _webViewController); + : SizedBox.expand( + child: WebViewWidget(controller: _webViewController), + ); }, ), ); diff --git a/lib/screens/gateway/gateway_web_screen.dart b/lib/screens/gateway/gateway_web_screen.dart new file mode 100644 index 0000000..37cf157 --- /dev/null +++ b/lib/screens/gateway/gateway_web_screen.dart @@ -0,0 +1,259 @@ +import 'dart:js_interop'; + +import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:go_router/go_router.dart'; +import 'package:qpay/interop.dart'; +import 'package:qpay/models/responsive_policy.dart'; +import 'package:qpay/screens/gateway/gateway_controller.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:web/web.dart' as web; + +class GatewayWebScreen extends StatefulWidget { + const GatewayWebScreen({super.key}); + + @override + State createState() => _GatewayWebScreenState(); +} + +class _GatewayWebScreenState extends State { + late WebViewController _webViewController; + late GatewayController controller; + late String url; + String? sessionID; + + bool integrationStarted = false; + + @override + void initState() { + super.initState(); + controller = GatewayController(context); + + url = controller.transactionController.model.receiptData?['targetUrl']; + } + + // A function to set up the ResizeObserver + void setupAttachmentObserver(web.Element element) { + final observer = web.ResizeObserver( + (JSArray entries, JSAny observer) { + // The element has been laid out (and thus attached to the DOM) + onElementAttached(element); + + // Disconnect the observer once the action is done + (observer as web.ResizeObserver).disconnect(); + }.toJS, + ); + + observer.observe(element); + } + + // Called after `element` is attached to the DOM. + void onElementAttached(web.Element element) { + // Your code to execute after the element is in the DOM goes here. + print('Element with ID ${element.id} is attached to the DOM.'); + // You can now safely query the DOM or call JavaScript functions that rely + // on the element being present. + + Future.delayed(const Duration(milliseconds: 50), () { + initIframeView(); + }); + } + + void initIframeView() async { + final uri = Uri.parse(url); + // 2. The pathSegments property returns a list of the parts of the path. + // For "checkout/pay/SESSION...", the segments are ["checkout", "pay", "SESSION..."]. + final pathSegments = uri.pathSegments; + // 3. Check if there are any segments and return the last one, + // which is the session ID in this URL structure. + if (pathSegments.isNotEmpty) { + sessionID = pathSegments.last; + + configure(sessionID!); + } + showEmbeddedPage(); + + Future.delayed(const Duration(seconds: 10), () async { + web.HTMLIFrameElement element = fetchIframeFromDom( + "hc-comms-layer-iframe", + )!; + print(element); + element.onload = (JSAny event) { + // This is called every time a new page loads in the iframe + print(event); + + try { + final newLocation = element.contentWindow?.location.href; + print('Iframe navigated to: $newLocation'); + // Perform actions based on the new URL + + _navigateWhenDone(newLocation!); + } catch (e) { + // Handle potential (though unlikely for same-origin) security errors + print('Could not access iframe location: $e'); + } + }.toJS; + + bool simulate = bool.parse(dotenv.env['SIMULATE_PAYMENT_SUCCESS']!); + if (simulate) { + await Future.delayed(Duration(milliseconds: 100)); + _navigateWhenDone("/checkout/receipt/"); + } + }); + } + + web.HTMLIFrameElement? fetchIframeFromDom(String id) { + final element = web.window.document.querySelector('#$id'); + if (element is web.HTMLIFrameElement) { + print('Found iframe in DOM: ${element.id}'); + print(element.toString()); + return element; + } + + print('Could not find iframe with id: $id in the DOM.'); + return null; + } + + void _navigateWhenDone(String url) { + if (url.contains("/checkout/receipt/")) { + if (integrationStarted) { + return; + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "Payment was successful, please wait while we process your order.", + ), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.black87, + duration: const Duration(seconds: 10), + ), + ); + + setState(() { + integrationStarted = true; + }); + + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go('/integration'); + }); + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Complete your payment'), + leading: context.canPop() + ? IconButton( + onPressed: () { + context.pop(); + }, + icon: const Icon(Icons.arrow_back), + ) + : SizedBox.shrink(), + ), + body: ListenableBuilder( + listenable: controller, + builder: (context, child) { + if (controller.model.status == 'SUCCESS') { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go('/integration'); + }); + } + + return LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: Center( + child: SizedBox( + width: ResponsivePolicy.md.toDouble(), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.black87.withAlpha(20), + ), + borderRadius: BorderRadius.circular(12), + ), + padding: EdgeInsets.symmetric( + vertical: 10, + horizontal: 20, + ), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Once done on this page, check transaction status', + style: TextStyle(fontSize: 16), + ), + InkWell( + onTap: () { + context.push('/poll'); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .primary + .withValues(alpha: 0.15), + borderRadius: BorderRadius.circular( + 12, + ), + ), + child: Text( + 'Check status', + style: TextStyle(fontSize: 12), + ), + ), + ), + ], + ), + ), + SizedBox(height: 10,), + SizedBox( + width: double.infinity, + height: constraints.maxHeight + 200, + child: HtmlElementView.fromTagName( + tagName: 'div', + onElementCreated: (element) { + final divElement = + element as web.HTMLDivElement; + divElement.id = "embed-target"; + setupAttachmentObserver(element); + }, + ), + ), + ], + ), + ), + ), + ), + ); + }, + ); + }, + ), + ); + } +} diff --git a/lib/screens/history/history_controller.dart b/lib/screens/history/history_controller.dart index 97b13a2..5a663fb 100644 --- a/lib/screens/history/history_controller.dart +++ b/lib/screens/history/history_controller.dart @@ -92,7 +92,7 @@ class HistoryController extends ChangeNotifier { "debitPhone": "", "debitAccount": "", "debitCurrency": "USD", - "debitRef": "peak", + "debitRef": "Velocity", "creditPhone": "", "creditAccount": "07088597534", "billClientId": "powertel_zesa", diff --git a/lib/screens/history/history_screen.dart b/lib/screens/history/history_screen.dart index 3e1e980..956e214 100644 --- a/lib/screens/history/history_screen.dart +++ b/lib/screens/history/history_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -23,7 +24,6 @@ class _HistoryScreenState extends State final TextEditingController _searchController = TextEditingController(); final Map _queryParams = {}; - final List> _alignListAnimations = []; final int _pageSize = 8; @override @@ -38,21 +38,9 @@ class _HistoryScreenState extends State ); _controller = AnimationController( - duration: const Duration(milliseconds: 600), + duration: const Duration(milliseconds: 3000), vsync: this, )..forward(); - - List tranListIndices = [0, 1]; - for (int i = 0; i < tranListIndices.length; i++) { - _alignListAnimations.add( - Tween(begin: Offset(0, -0.25), end: Offset.zero).animate( - CurvedAnimation( - parent: _controller, - curve: Interval(0.075 * i, 1.0, curve: Curves.easeOut), - ), - ), - ); - } } void setupData() async { @@ -90,56 +78,78 @@ class _HistoryScreenState extends State builder: (context, child) { return Container( padding: const EdgeInsets.all(16), - child: Column( - children: [ - _buildSearchField(controller), - if (controller.model.transactions.isEmpty) - Column( - children: [ - SizedBox(height: 30), - Text( - 'No transactions yet. Make a payment to see your recent activity.', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - ], - ), - if (controller.model.transactions.isNotEmpty) - Column( - children: [ - ListView( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - children: [ - ...controller.model.transactions.map( - (e) => _buildTransactionItem(e, context), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse( + constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toString() + : constraints.maxWidth.toString(), + ), + child: Column( + children: [ + _buildSearchField(controller), + SizedBox(height: 10), + if (controller.model.transactions.isEmpty) + Column( + children: [ + SizedBox(height: 30), + Text( + 'No transactions yet. Make a payment to see your recent activity.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + ), + ], ), - ], - ), - SizedBox(height: 10), - if (controller.model.pageableModel != null && - controller.model.pageableModel!.number < - controller.model.pageableModel!.totalPages) - OutlinedButton( - child: Text('Load more'), - onPressed: () { - controller.getTransactions({ - 'userId': prefs.getString("userId")!, - 'page': - (controller - .model - .pageableModel! - .number + - 1) - .toString(), - 'size': _pageSize.toString(), - 'sort': 'createdAt,desc', - }); - }, - ), - ], - ), - ], + if (controller.model.transactions.isNotEmpty) + Column( + children: [ + ListView( + shrinkWrap: true, + physics: + const NeverScrollableScrollPhysics(), + children: [ + ...controller.model.transactions.map( + (e) => + _buildTransactionItem(e, context), + ), + ], + ), + SizedBox(height: 10), + if (controller.model.pageableModel != + null && + controller.model.pageableModel!.number < + controller + .model + .pageableModel! + .totalPages) + OutlinedButton( + child: Text('Load more'), + onPressed: () { + controller.getTransactions({ + 'userId': prefs.getString( + "userId", + )!, + 'page': + (controller + .model + .pageableModel! + .number + + 1) + .toString(), + 'size': _pageSize.toString(), + 'sort': 'createdAt,desc', + }); + }, + ), + ], + ), + ], + ), + ); + }, + ), ), ); }, @@ -191,20 +201,19 @@ class _HistoryScreenState extends State ).colorScheme.primary.withOpacity(0.2), ), ), - suffixIcon: - _searchController.text.isNotEmpty - ? IconButton( - onPressed: () { - _searchController.clear(); - _queryParams.clear(); - controller.getTransactions({ - 'userId': prefs.getString("userId")!, - }); - }, - icon: Icon(Icons.clear), - color: Theme.of(context).colorScheme.primary, - ) - : null, + suffixIcon: _searchController.text.isNotEmpty + ? IconButton( + onPressed: () { + _searchController.clear(); + _queryParams.clear(); + controller.getTransactions({ + 'userId': prefs.getString("userId")!, + }); + }, + icon: Icon(Icons.clear), + color: Theme.of(context).colorScheme.primary, + ) + : null, ), onChanged: (value) { // controller.updateCreditAccount(value); @@ -227,8 +236,17 @@ class _HistoryScreenState extends State } Widget _buildTransactionItem(Map e, BuildContext context) { + int index = controller.model.transactions.indexOf(e); + Animation animation = + Tween(begin: Offset(0, -0.25), end: Offset.zero).animate( + CurvedAnimation( + parent: _controller, + curve: Interval(0.175 * index, 1.0, curve: Curves.easeIn), + ), + ); + return SlideTransition( - position: _alignListAnimations[0], + position: animation, child: Skeletonizer( enabled: controller.model.isLoading, child: InkWell( @@ -260,18 +278,17 @@ class _HistoryScreenState extends State ), SizedBox(width: 10), Icon( - e['status'] == 'SUCCESS' + e['integrationStatus'] == 'SUCCESS' ? Icons.check_circle - : e['status'] == 'PENDING' + : e['integrationStatus'] == 'PENDING' ? Icons.pending : Icons.cancel, size: 16, - color: - e['status'] == 'SUCCESS' - ? Colors.green - : e['status'] == 'PENDING' - ? Colors.orange - : Colors.red, + color: e['integrationStatus'] == 'SUCCESS' + ? Colors.green + : e['integrationStatus'] == 'PENDING' + ? Colors.orange + : Colors.red, ), ], ), diff --git a/lib/screens/home/home_controller.dart b/lib/screens/home/home_controller.dart index 4e92413..96d3159 100644 --- a/lib/screens/home/home_controller.dart +++ b/lib/screens/home/home_controller.dart @@ -104,6 +104,9 @@ class HomeController extends ChangeNotifier { Future getProviders() async { try { + model.filterableProviders = getFakeProviders(); + model.transactions = getFakeTransactions(); + model.isLoading = true; notifyListeners(); @@ -138,6 +141,7 @@ class HomeController extends ChangeNotifier { Future getTransactions(String userId) async { model.isLoading = true; + // model.transactions = getFakeTransactions(); notifyListeners(); try { @@ -147,8 +151,9 @@ class HomeController extends ChangeNotifier { PageableModel pageableModel = PageableModel.fromJson(response); - model.transactions = - pageableModel.content.map((e) => e as Map).toList(); + model.transactions = pageableModel.content + .map((e) => e as Map) + .toList(); } catch (e) { logger.e(e); _showErrorSnackBar( @@ -165,8 +170,6 @@ class HomeController extends ChangeNotifier { Future getCategories() async { // activate skeletonizer model.categories = getFakeCategoryData(); - model.transactions = getFakeTransactions(); - // model.filterableProviders = getFakeProviders(); model.isLoading = true; notifyListeners(); @@ -200,10 +203,9 @@ class HomeController extends ChangeNotifier { model.selectedCategory = category; - model.filterableProviders = - model.providers - .where((element) => element.category == category.label) - .toList(); + model.filterableProviders = model.providers + .where((element) => element.category == category.label) + .toList(); notifyListeners(); } @@ -224,7 +226,7 @@ class HomeController extends ChangeNotifier { "debitPhone": "", "debitAccount": "", "debitCurrency": "USD", - "debitRef": "peak", + "debitRef": "Velocity", "creditPhone": "", "creditAccount": "07088597534", "billClientId": "powertel_zesa", @@ -242,21 +244,21 @@ class HomeController extends ChangeNotifier { List getFakeProviders() { return [ BillProvider( - clientId: '1', - name: 'ZESA', - description: 'Pay your electricity bills easily', + clientId: 'econet_airtime', + name: 'Econet Airtime', + description: 'Econet Airtime', requiresAccount: false, - requiresAmount: false, + requiresAmount: true, requiresAmountFromMerchant: false, - requiresPhone: false, - requiresReversal: false, + requiresPhone: true, + requiresReversal: true, additionalDataString: '', - processorType: '', - uid: '', + processorType: 'AIRTIME', + uid: '78f1f497-c9eb-401c-b22c-884756e68e40', image: 'econet.png', - label: '', - category: '', - accountFieldName: '', + label: 'ECONET', + category: 'ECONET', + accountFieldName: 'Phone Number', ), ]; } diff --git a/lib/screens/home/home_screen.dart b/lib/screens/home/home_screen.dart index db4642b..9f28f66 100644 --- a/lib/screens/home/home_screen.dart +++ b/lib/screens/home/home_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:timeago/timeago.dart' as timeago; import 'package:qpay/screens/home/home_controller.dart'; import 'package:qpay/screens/transaction_controller.dart'; @@ -19,7 +20,6 @@ class HomeScreen extends StatefulWidget { class _HomeScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; - late Animation _alignAnimation; late TransactionController transactionController; late SharedPreferences prefs; late HomeController homeController; @@ -29,35 +29,15 @@ class _HomeScreenState extends State bool _isLoggedIn = false; String _selectedFilter = 'All'; - final List> _animations = []; - final List> _alignListAnimations = []; - @override void initState() { super.initState(); _controller = AnimationController( - duration: const Duration(milliseconds: 600), + duration: const Duration(milliseconds: 3000), vsync: this, )..forward(); - List tranListIndices = [0, 1]; - for (int i = 0; i < tranListIndices.length; i++) { - _alignListAnimations.add( - Tween(begin: Offset(0, -0.25), end: Offset.zero).animate( - CurvedAnimation( - parent: _controller, - curve: Interval(0.075 * i, 1.0, curve: Curves.easeOut), - ), - ), - ); - } - - _alignAnimation = Tween( - begin: Alignment.centerLeft, - end: Alignment.center, - ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut)); - setupDataAndTransitions(); } @@ -77,21 +57,6 @@ class _HomeScreenState extends State await homeController.getCategories(); await homeController.getProviders(); - List buttonIndices = List.generate( - homeController.model.providers.length, - (index) => index, - ); - for (int i = 0; i < buttonIndices.length; i++) { - _animations.add( - Tween(begin: Offset(-0.15, 0), end: Offset.zero).animate( - CurvedAnimation( - parent: _controller, - curve: Interval(0.055 * i, 1.0, curve: Curves.easeOut), - ), - ), - ); - } - prefs = await SharedPreferences.getInstance(); if (prefs.getString("token") != null) { @@ -101,7 +66,7 @@ class _HomeScreenState extends State }); } - if(prefs.getString("userId") == null) { + if (prefs.getString("userId") == null) { prefs.setString("userId", Uuid().v4()); } @@ -147,347 +112,227 @@ class _HomeScreenState extends State @override Widget build(BuildContext context) { - return Scaffold( - body: SafeArea( - child: RefreshIndicator( - onRefresh: () async { - await homeController.getTransactions(prefs.getString("userId")!); - }, - child: CustomScrollView( - slivers: [ - SliverAppBar( - stretch: true, - stretchTriggerOffset: 100.0, - expandedHeight: 50.0, - surfaceTintColor: Colors.transparent, - floating: true, - title: Image(image: AssetImage('assets/peak.png'), width: 85), - leading: _isLoggedIn ? Container( - padding: const EdgeInsets.only(left: 10.0), - child: IconButton( - icon: Container( - width: 52, - height: 52, - decoration: BoxDecoration( - border: Border.all(color: Colors.black87.withAlpha(20)), - shape: BoxShape.circle, - gradient: LinearGradient( - colors: [ - Theme.of( - context, - ).colorScheme.primary.withValues(alpha: 0.1), - Theme.of( - context, - ).colorScheme.tertiary.withValues(alpha: 0.05), - ], - stops: const [0.3, 0.7], - begin: Alignment.topRight, - end: Alignment.bottomLeft, - ), + return LayoutBuilder( + builder: (context, constraints) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 30), + child: Center( + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: (constraints.maxWidth > ResponsivePolicy.lg) + ? ResponsivePolicy.lg.toDouble() + : constraints.maxWidth, // Set the maximum width here + ), + child: Scaffold( + appBar: AppBar( + title: (constraints.maxWidth < ResponsivePolicy.md) + ? Image( + image: AssetImage('assets/velocity.png'), + width: 150, + ) : SizedBox(), + actions: [ + _isLoggedIn + ? Container( + padding: const EdgeInsets.only(left: 10.0), + child: IconButton( + icon: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + border: Border.all( + color: Colors.black87.withAlpha(20), + ), + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [ + Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.1), + Theme.of(context).colorScheme.tertiary + .withValues(alpha: 0.05), + ], + stops: const [0.3, 0.7], + begin: Alignment.topRight, + end: Alignment.bottomLeft, + ), + ), + child: Center( + child: Text( + initials, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + onPressed: () {}, + ), + ) + : SizedBox(), + if (_isLoggedIn) + IconButton( + icon: const Icon(Icons.turn_slight_right_sharp), + onPressed: () { + showDialog( + context: context, + builder: (BuildContext dialogContext) { + return AlertDialog( + title: const Text('Confirm Logout'), + content: const Text( + 'Are you sure you want to log out?', + ), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of( + dialogContext, + ).pop(); // Dismiss the dialog + }, + ), + TextButton( + child: const Text('Logout'), + onPressed: () { + Navigator.of( + dialogContext, + ).pop(); // Dismiss the dialog + prefs.remove("token"); + setState(() { + _isLoggedIn = false; + }); + // It's generally not recommended to call initState directly. + // Consider moving the logic from initState that needs to be rerun + // into a separate method and call that method here. + // For example, if you have a method like _reloadData(), call it here. + // _reloadData(); + setupDataAndTransitions(); // Or specific parts of it if not all is needed + }, + ), + ], + ); + }, + ); + }, ), - child: Center( - child: Text( - initials, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - ), + ], + ), + body: Padding( + padding: const EdgeInsets.only(top: 20.0), + child: SafeArea( + child: RefreshIndicator( + onRefresh: () async { + await homeController.getTransactions( + prefs.getString("userId")!, + ); + }, + child: ListenableBuilder( + listenable: homeController, + builder: (context, child) { + if (constraints.maxWidth > ResponsivePolicy.md) { + return GridView.count( + crossAxisCount: 2, + crossAxisSpacing: 50, + mainAxisSpacing: 50, + shrinkWrap: true, + + children: [_buildProviders(), _buildTransactions()], + ); + } else { + return SingleChildScrollView( + child: Column( + children: [ + _buildProviders(), + SizedBox(height: 10), + _buildTransactions(), + ], + ), + ); + } + }, + ), + ), + ), + ), + ), + ), + ), + ); + }, + ); + } + + Widget _buildLogin() { + return Column( + children: [ + Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.black87.withAlpha(20)), + borderRadius: BorderRadius.circular(12), + ), + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Text( + 'Register or Login for more', + style: TextStyle(fontSize: 16), + ), + InkWell( + onTap: () { + _showFeaturesPopup(context); + }, + borderRadius: BorderRadius.circular(5), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 5, vertical: 2), + child: Text( + 'features', + style: TextStyle( + fontSize: 16, + decoration: TextDecoration.underline, + decorationColor: Theme.of( + context, + ).colorScheme.primary, + color: Theme.of(context).colorScheme.primary, ), ), ), - onPressed: () {}, - ), - ) : SizedBox(), - actions: [ - if(_isLoggedIn) - IconButton( - icon: const Icon(Icons.turn_slight_right_sharp), - onPressed: () { - showDialog( - context: context, - builder: (BuildContext dialogContext) { - return AlertDialog( - title: const Text('Confirm Logout'), - content: const Text('Are you sure you want to log out?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(dialogContext).pop(); // Dismiss the dialog - }, - ), - TextButton( - child: const Text('Logout'), - onPressed: () { - Navigator.of(dialogContext).pop(); // Dismiss the dialog - prefs.remove("token"); - setState(() { - _isLoggedIn = false; - }); - // It's generally not recommended to call initState directly. - // Consider moving the logic from initState that needs to be rerun - // into a separate method and call that method here. - // For example, if you have a method like _reloadData(), call it here. - // _reloadData(); - setupDataAndTransitions(); // Or specific parts of it if not all is needed - }, - ), - ], - ); - }, - ); - }, ), ], ), - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.all(20.0), - child: ListenableBuilder( - listenable: homeController, - builder: (context, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!_isLoggedIn) _buildLogin(homeController), - // if (_isLoggedIn) _buildAccounts(homeController), - _buildFilterChips(homeController), - SizedBox(height: 10), - Column( - children: [ - ...homeController.model.filterableProviders.map( - (e) => _buildProviderItem(e, context), - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Text( - 'Recent Activity', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - const SizedBox(height: 5), - if (homeController.model.transactions.isEmpty) - Column( - children: [ - SizedBox(height: 30), - Center( - child: Text( - 'No transactions yet. Make a payment to see your recent activity.', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - ), - ], - ), - if (homeController.model.transactions.isNotEmpty) - Column( - children: [ - ListView( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - children: [ - ...homeController.model.transactions.map( - (e) => _buildTransactionItem(e, context), - ), - ], - ), - SizedBox(height: 10), - if (homeController.model.transactions.length > - 2) - OutlinedButton( - child: Text('View All'), - onPressed: () { - context.go('/history'); - }, - ), - ], - ), - ], - ); - }, + InkWell( + onTap: () { + context.push('/onboarding/landing'); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(12), ), + child: Text('Get Started', style: TextStyle(fontSize: 12)), ), ), ], ), ), - ), - ); - } - - Widget _buildLogin(HomeController controller) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Text( - 'Register or Login for more', - style: TextStyle(fontSize: 16), - ), - InkWell( - onTap: () { - _showFeaturesPopup(context); - }, - borderRadius: BorderRadius.circular(5), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 5, vertical: 2), - child: Text( - 'features', - style: TextStyle( - fontSize: 16, - decoration: TextDecoration.underline, - decorationColor: Theme.of(context).colorScheme.primary, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - ), - ], - ), - InkWell( - onTap: () { - context.push('/onboarding/landing'); - }, - borderRadius: BorderRadius.circular(12), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Theme.of( - context, - ).colorScheme.primary.withValues(alpha: 0.15), - borderRadius: BorderRadius.circular(12), - ), - child: Text('Get Started', style: TextStyle(fontSize: 12)), - ), - ), - ], - ), SizedBox(height: 10), - Divider( - color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.2), - ), ], ); } - Widget _buildAccounts(HomeController controller) { + Widget _buildAccounts() { return Column( children: [ Row( children: [ - ...controller.model.accounts.map( - (e) => Row( - children: [ - Skeletonizer( - enabled: controller.model.isLoading, - child: SlideTransition( - position: _alignListAnimations[0], - child: InkWell( - borderRadius: BorderRadius.circular(12), - onTap: () { - // context.push("/wallet"); - }, - child: Container( - width: 170, - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 12, - ), - decoration: BoxDecoration( - border: Border.all( - color: Colors.black87.withAlpha(20), - ), - borderRadius: BorderRadius.circular(12), - gradient: LinearGradient( - colors: [ - Theme.of( - context, - ).colorScheme.primary.withValues(alpha: 0.1), - Theme.of( - context, - ).colorScheme.tertiary.withValues(alpha: 0.05), - ], - stops: const [0.3, 0.7], - begin: Alignment.topRight, - end: Alignment.bottomLeft, - ), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image.asset('assets/${e.image}', width: 20), - SizedBox(width: 10), - Text( - e.currency, - style: TextStyle( - fontSize: 22, - color: Colors.black, - fontWeight: FontWeight.w100, - ), - ), - SizedBox(width: 5), - Expanded( - child: Text( - e.balance, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22, - color: Colors.black, - overflow: TextOverflow.ellipsis, - ), - ), - ), - ], - ), - SizedBox(height: 5), - InkWell( - onTap: () { - // context.push("/withdraw"); - }, - borderRadius: BorderRadius.circular(12), - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12, - vertical: 6, - ), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary - .withValues(alpha: 0.15), - borderRadius: BorderRadius.circular(12), - ), - child: Text( - 'Add Money', - style: TextStyle(fontSize: 12), - ), - ), - ), - ], - ), - ), - ), - ), - ), - SizedBox(width: 10), - ], - ), - ), + ...homeController.model.accounts.map((e) => _buildAccountItem(e)), ], ), SizedBox(height: 10), @@ -495,9 +340,177 @@ class _HomeScreenState extends State ); } + Widget _buildAccountItem(Account e) { + int index = homeController.model.accounts.indexOf(e); + Animation animation = + Tween(begin: Offset(0, -0.20), end: Offset.zero).animate( + CurvedAnimation( + parent: _controller, + curve: Interval(0.40 * index.toDouble(), 1.0, curve: Curves.easeIn), + ), + ); + return Row( + children: [ + Skeletonizer( + enabled: homeController.model.isLoading, + child: SlideTransition( + position: animation, + child: InkWell( + borderRadius: BorderRadius.circular(12), + onTap: () { + // context.push("/wallet"); + }, + child: Container( + width: 170, + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 12, + ), + decoration: BoxDecoration( + border: Border.all(color: Colors.black87.withAlpha(20)), + borderRadius: BorderRadius.circular(12), + gradient: LinearGradient( + colors: [ + Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.1), + Theme.of( + context, + ).colorScheme.tertiary.withValues(alpha: 0.05), + ], + stops: const [0.3, 0.7], + begin: Alignment.topRight, + end: Alignment.bottomLeft, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset('assets/${e.image}', width: 20), + SizedBox(width: 10), + Text( + e.currency, + style: TextStyle( + fontSize: 22, + color: Colors.black, + fontWeight: FontWeight.w100, + ), + ), + SizedBox(width: 5), + Expanded( + child: Text( + e.balance, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22, + color: Colors.black, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ], + ), + SizedBox(height: 5), + InkWell( + onTap: () { + // context.push("/withdraw"); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + 'Add Money', + style: TextStyle(fontSize: 12), + ), + ), + ), + ], + ), + ), + ), + ), + ), + SizedBox(width: 10), + ], + ); + } + + Widget _buildTransactions() { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Recent Activity', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ], + ), + const SizedBox(height: 5), + if (homeController.model.transactions.isEmpty) + Column( + children: [ + SizedBox(height: 30), + Center( + child: Text( + 'No transactions yet. Make a payment to see your recent activity.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + ), + ), + ], + ), + if (homeController.model.transactions.isNotEmpty) + Column( + children: [ + ListView( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + children: [ + ...homeController.model.transactions.map( + (e) => _buildTransactionItem(e, context), + ), + ], + ), + SizedBox(height: 10), + if (homeController.model.transactions.length > 2) + OutlinedButton( + child: Text('View All'), + onPressed: () { + context.go('/history'); + }, + ), + ], + ), + ], + ); + } + Widget _buildTransactionItem(Map e, BuildContext context) { + int index = homeController.model.transactions.indexOf(e); + Animation animation = + Tween(begin: Offset(0, -0.25), end: Offset.zero).animate( + CurvedAnimation( + parent: _controller, + curve: Interval(0.175 * index, 1.0, curve: Curves.easeIn), + ), + ); return SlideTransition( - position: _alignListAnimations[0], + position: animation, child: Skeletonizer( enabled: homeController.model.isLoading, child: InkWell( @@ -535,12 +548,11 @@ class _HomeScreenState extends State ? Icons.pending : Icons.cancel, size: 16, - color: - e['integrationStatus'] == 'SUCCESS' - ? Colors.green - : e['integrationStatus'] == 'PENDING' - ? Colors.orange - : Colors.red, + color: e['integrationStatus'] == 'SUCCESS' + ? Colors.green + : e['integrationStatus'] == 'PENDING' + ? Colors.orange + : Colors.red, ), ], ), @@ -569,13 +581,35 @@ class _HomeScreenState extends State ); } + Widget _buildProviders() { + return Column( + children: [ + if (!_isLoggedIn) _buildLogin(), + SizedBox(height: 10), + // if (_isLoggedIn) _buildAccounts(homeController), + // _buildFilterChips(homeController), + ...homeController.model.filterableProviders.map( + (e) => _buildProviderItem(e, context), + ), + ], + ); + } + Column _buildProviderItem(BillProvider e, BuildContext context) { + int index = homeController.model.filterableProviders.indexOf(e); + Animation animation = + Tween(begin: Offset(0, -0.20), end: Offset.zero).animate( + CurvedAnimation( + parent: _controller, + curve: Interval(0.40 * index.toDouble(), 1.0, curve: Curves.easeIn), + ), + ); return Column( children: [ Skeletonizer( enabled: homeController.model.isLoading, child: SlideTransition( - position: _animations[homeController.model.providers.indexOf(e)], + position: animation, child: Container( decoration: getBoxDecoration(e.clientId), child: InkWell( @@ -676,12 +710,9 @@ class _HomeScreenState extends State selectedColor: Theme.of(context).colorScheme.primary.withOpacity(0.2), checkmarkColor: Theme.of(context).colorScheme.primary, labelStyle: TextStyle( - color: - isSelected - ? Theme.of( - context, - ).colorScheme.secondary.withValues(alpha: 0.7) - : Theme.of(context).colorScheme.onSurface, + color: isSelected + ? Theme.of(context).colorScheme.secondary.withValues(alpha: 0.7) + : Theme.of(context).colorScheme.onSurface, ), ), ), @@ -698,135 +729,142 @@ class _HomeScreenState extends State ), elevation: 0, backgroundColor: Colors.transparent, - child: Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - blurRadius: 20, - offset: const Offset(0, 10), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // Header with icon and title - Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Theme.of( - context, - ).colorScheme.primary.withValues(alpha: 0.1), - shape: BoxShape.circle, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: 600), + child: Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 10), ), - child: Image(image: AssetImage("assets/peak.png"), width: 45), - ), - const SizedBox(height: 16), - Text( - 'Unlock Additional Features', - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.onSurface, + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Header with icon and title + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Image( + image: AssetImage("assets/favicon.png"), + width: 45, + ), ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 8), - Text( - 'Register or login to access these great features', - style: TextStyle( - fontSize: 14, - color: Theme.of( - context, - ).colorScheme.onSurface.withOpacity(0.7), + const SizedBox(height: 16), + Text( + 'Unlock Additional Features', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onSurface, + ), + textAlign: TextAlign.center, ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 24), + const SizedBox(height: 8), + Text( + 'Register or login to access these great features', + style: TextStyle( + fontSize: 14, + color: Theme.of( + context, + ).colorScheme.onSurface.withOpacity(0.7), + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 24), - // Features list - _buildFeatureItem( - Icons.account_balance_wallet, - 'Dual Currency Wallets', - 'USD and ZWG wallets for prepayments that can be utilized later', - ), - const SizedBox(height: 16), - _buildFeatureItem( - Icons.history, - 'Transaction History', - 'All transactions are saved for reference from any device', - ), - const SizedBox(height: 16), - _buildFeatureItem( - Icons.people, - 'Recipient Management', - 'Save and manage recipient details for future use', - ), - const SizedBox(height: 16), - _buildFeatureItem( - Icons.schedule, - 'Smart Payments', - 'Schedule payments and split bills with friends', - ), + // Features list + _buildFeatureItem( + Icons.account_balance_wallet, + 'Dual Currency Wallets', + 'USD and ZWG wallets for prepayments that can be utilized later', + ), + const SizedBox(height: 16), + _buildFeatureItem( + Icons.history, + 'Transaction History', + 'All transactions are saved for reference from any device', + ), + const SizedBox(height: 16), + _buildFeatureItem( + Icons.people, + 'Recipient Management', + 'Save and manage recipient details for future use', + ), + const SizedBox(height: 16), + _buildFeatureItem( + Icons.schedule, + 'Smart Payments', + 'Schedule payments and split bills with friends', + ), - const SizedBox(height: 24), + const SizedBox(height: 24), - // Action buttons - Row( - children: [ - Expanded( - child: TextButton( - onPressed: () => Navigator.of(context).pop(), - style: TextButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 12), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + // Action buttons + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Navigator.of(context).pop(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: Text( + 'Maybe Later', + style: TextStyle( + color: Theme.of( + context, + ).colorScheme.onSurface.withOpacity(0.6), + fontSize: 16, + ), ), ), - child: Text( - 'Maybe Later', - style: TextStyle( - color: Theme.of( + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + context.push('/onboarding/landing'); + }, + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 12), + backgroundColor: Theme.of( context, - ).colorScheme.onSurface.withOpacity(0.6), - fontSize: 16, + ).colorScheme.primary, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: Text( + 'Get Started', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), ), ), ), - ), - const SizedBox(width: 12), - Expanded( - child: ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - context.push('/onboarding/landing'); - }, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 12), - backgroundColor: - Theme.of(context).colorScheme.primary, - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - ), - child: Text( - 'Get Started', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ], - ), - ], + ], + ), + ], + ), ), ), ); diff --git a/lib/screens/integration/integration_controller.dart b/lib/screens/integration/integration_controller.dart index beea518..def9934 100644 --- a/lib/screens/integration/integration_controller.dart +++ b/lib/screens/integration/integration_controller.dart @@ -63,12 +63,14 @@ class IntegrationController extends ChangeNotifier { model.status = response['status']; transactionController.updateReceiptData(response); - gatewayController.poll(transactionController.model.confirmationData['id']); - } else { - model.status = response['status']; - model.errorMessage = response['errorMessage']; - _showErrorSnackBar(response['errorMessage']); + await gatewayController.poll(transactionController.model.confirmationData['id']); } + + // regardless of poll result we proceed to receipt + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go('/receipt'); + }); + model.isLoading = false; notifyListeners(); diff --git a/lib/screens/integration/integration_screen.dart b/lib/screens/integration/integration_screen.dart index 9e0a8b2..f59bc1f 100644 --- a/lib/screens/integration/integration_screen.dart +++ b/lib/screens/integration/integration_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -68,49 +69,55 @@ class _IntegrationScreenState extends State { return Container( padding: EdgeInsets.all(50), child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse(constraints.maxWidth > ResponsivePolicy.md ? + ResponsivePolicy.md.toString() : + constraints.maxWidth.toString()), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), - Column( - children: [ - Text( - 'We\'ve successfully collected your funds. We are now ' - 'updating your billing account. This won\'t take long', - style: TextStyle(fontSize: 20), - textAlign: TextAlign.center, - ), - Image.asset('assets/peak-animation.gif', width: 150), - SizedBox( - width: 50, - child: LinearProgressIndicator(), - ), - SizedBox(height: 50), - if(controller.model.status == 'FAILED') - Column( - children: [ - Text( - 'We failed to update your billing account', - style: TextStyle(fontSize: 20), - textAlign: TextAlign.center, - ), - SizedBox(height: 20,), - Skeletonizer( - enabled: controller.model.isLoading, - child: OutlinedButton( - child: Text('Retry'), - onPressed: () { - controller.doIntegration(); - }, + Column( + children: [ + Text( + 'We\'ve successfully collected your funds. We are now ' + 'updating your billing account. This won\'t take long', + style: TextStyle(fontSize: 20), + textAlign: TextAlign.center, ), - ), - ], - ), - ], - ), - ], + SizedBox(height: 50,), + Image.asset('assets/velocity-animation.gif', width: 150), + SizedBox(height: 50), + if(controller.model.status == 'FAILED') + Column( + children: [ + Text( + 'We failed to update your billing account', + style: TextStyle(fontSize: 20), + textAlign: TextAlign.center, + ), + SizedBox(height: 20,), + Skeletonizer( + enabled: controller.model.isLoading, + child: OutlinedButton( + child: Text('Retry'), + onPressed: () { + controller.doIntegration(); + }, + ), + ), + ], + ), + ], + ), + ], + ), + ); + } ), ), ); diff --git a/lib/screens/onboarding/complete_screen.dart b/lib/screens/onboarding/complete_screen.dart index 2fe67c4..2daff6e 100644 --- a/lib/screens/onboarding/complete_screen.dart +++ b/lib/screens/onboarding/complete_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/login/login_controller.dart'; class CompleteScreen extends StatefulWidget { @@ -16,56 +17,61 @@ class _CompleteScreenState extends State { body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(25), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Registration Complete', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - SizedBox(height: 5), - Text( - 'Thank you for registering with Peak payments', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - Image.asset('assets/landing.png', width: 300), - Text( - 'Tap Login to get started', - style: TextStyle(fontSize: 18), - ), - SizedBox(height: 10), - ], - ), - ), - ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () { - context.go('/onboarding/login'); - }, - child: Text('Go to Login', style: TextStyle(fontSize: 16)), - ), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + Text( + 'Registration Complete', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + SizedBox(height: 5), + Text( + 'Thank you for registering with Velocity payments', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + Image.asset('assets/landing.png', width: 300), + Text( + 'Tap Login to get started', + style: TextStyle(fontSize: 18), + ), + SizedBox(height: 30), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + context.go('/onboarding/login'); + }, + child: Text('Go to Login', style: TextStyle(fontSize: 16)), + ), + ), + ], + ), + ), + SizedBox(height: 5), + ], ), - ], - ), + ); + } ), - SizedBox(height: 5), - ], + ), ), ), ); diff --git a/lib/screens/onboarding/landing/landing_screen.dart b/lib/screens/onboarding/landing/landing_screen.dart index eaf6586..fe7c4b6 100644 --- a/lib/screens/onboarding/landing/landing_screen.dart +++ b/lib/screens/onboarding/landing/landing_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/login/login_controller.dart'; class LandingScreen extends StatefulWidget { @@ -16,73 +17,82 @@ class _LandingScreenState extends State { body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(25), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Welcome to Peak', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - SizedBox(height: 5), - Text( - 'The fastest way to pay for local goods and services', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - Image.asset('assets/landing.png', width: 300), - Image.asset('assets/peak.png', width: 100), - SizedBox(height: 5), - Text( - 'Register or login to get started', - style: TextStyle(fontSize: 16), - ), - SizedBox(height: 10), - ], - ), - ), - ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () { - context.go('/onboarding/register'); - }, - child: Text('Register', style: TextStyle(fontSize: 16)), - ), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + Text( + 'Welcome to Velocity', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + SizedBox(height: 5), + Text( + 'The fastest way to pay for local goods and services', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + Image.asset('assets/landing.png', width: 300), + Image.asset('assets/velocity.png', width: 150), + SizedBox(height: 5), + Text( + 'Register or login to get started', + style: TextStyle(fontSize: 16), + ), + SizedBox(height: 50), + Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + context.go('/onboarding/register'); + }, + child: Text('Register', style: TextStyle(fontSize: 16)), + ), + ), + SizedBox(width: 16), + Expanded( + child: OutlinedButton( + onPressed: () { + context.go('/onboarding/login'); + }, + child: Text('Login', style: TextStyle(fontSize: 16)), + ), + ), + ], + ), + ), + SizedBox(height: 10), + TextButton( + onPressed: () { + context.go('/'); + }, + child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), + ), + ], + ) + ], ), - SizedBox(width: 16), - Expanded( - child: TextButton( - onPressed: () { - context.go('/onboarding/login'); - }, - child: Text('Login', style: TextStyle(fontSize: 16)), - ), - ), - ], - ), - ), - SizedBox(height: 5), - TextButton( - onPressed: () { - context.go('/'); + ); }, - child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), ), - ], + ), ), ), ); diff --git a/lib/screens/onboarding/login/login_screen.dart b/lib/screens/onboarding/login/login_screen.dart index ff87c5f..8d64b3a 100644 --- a/lib/screens/onboarding/login/login_screen.dart +++ b/lib/screens/onboarding/login/login_screen.dart @@ -1,12 +1,16 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:go_router/go_router.dart'; import 'package:google_sign_in/google_sign_in.dart'; +import 'package:google_sign_in_web/web_only.dart' as web; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/login/login_controller.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:skeletonizer/skeletonizer.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @@ -17,6 +21,8 @@ class LoginScreen extends StatefulWidget { class _LoginScreenState extends State { late SharedPreferences prefs; + late GoogleSignIn googleSignIn; + final _formKey = GlobalKey(); bool _loading = false; @@ -30,22 +36,23 @@ class _LoginScreenState extends State { void initState() { super.initState(); _loginController = LoginController(context); + + googleSignIn = GoogleSignIn.instance; + if(kIsWeb){ + googleSignIn.initialize(); + googleSignIn.authenticationEvents + .listen(_handleAuthenticationEvent) + .onError(_handleAuthenticationError); + + }else { + unawaited(googleSignIn.initialize(serverClientId: dotenv.env['CLIENTID'])); + } + } Future signInWithGoogle() async { - final GoogleSignIn googleSignIn = GoogleSignIn.instance; - - unawaited(googleSignIn.initialize(serverClientId: dotenv.env['CLIENTID'])); - if (GoogleSignIn.instance.supportsAuthenticate()){ - unawaited(GoogleSignIn.instance.authenticate().then((value) async { - print(value); - - saveUser(value); - await _loginController.login(value.email, value.id); - context.go('/'); - googleSignIn.authenticationEvents .listen(_handleAuthenticationEvent) .onError(_handleAuthenticationError); @@ -85,6 +92,12 @@ class _LoginScreenState extends State { ?.authorizationClient .authorizationForScopes(scopes); // #enddocregion CheckAuthorization + + print(user); + saveUser(user as GoogleSignInAccount); + + await _loginController.login(user.email, user.id); + context.go('/'); } Future _handleAuthenticationError(Object e) async { @@ -105,100 +118,117 @@ class _LoginScreenState extends State { padding: const EdgeInsets.all(25), child: Form( key: _formKey, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Login', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - SizedBox(height: 5), - Text( - 'Welcome back to Peak', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - SizedBox(height: 40), - Image.asset('assets/password.png', width: 300), - Text( - 'Tap on your preferred social media platform to get started', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - // Username Field - SizedBox(height: 20), - // Forgot Password Link - // Divider with "or" text - Row( - children: [ - Expanded(child: Divider(color: Colors.grey.shade300)), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Text( - 'choose from the options below to continue', - style: TextStyle( - color: Colors.grey.shade600, - fontSize: 14, - ), - textAlign: TextAlign.center, - ), - ), - Expanded(child: Divider(color: Colors.grey.shade300)), - ], - ), - SizedBox(height: 30), - // Social Login Buttons - Row( - children: [ - Expanded( - child: OutlinedButton.icon( - onPressed: () async { - await signInWithGoogle(); - - }, - icon: Image.asset( - 'assets/google.png', - width: 20, - height: 20, - ), - label: Text('Google', style: TextStyle(fontSize: 16)), - style: OutlinedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 16), - side: BorderSide(color: Colors.grey.shade300), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + Text( + 'Login', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, ), ), - ), + SizedBox(height: 5), + Text( + 'Welcome back to Velocity', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + SizedBox(height: 30), + Image.asset('assets/password.png', width: 300), + Text( + 'Tap on your preferred social media platform to get started', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + // Username Field + SizedBox(height: 20), + // Forgot Password Link + // Divider with "or" text + Row( + children: [ + Expanded(child: Divider(color: Colors.grey.shade300)), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Text( + 'choose from the options below to continue', + style: TextStyle( + color: Colors.grey.shade600, + fontSize: 14, + ), + textAlign: TextAlign.center, + ), + ), + Expanded(child: Divider(color: Colors.grey.shade300)), + ], + ), + SizedBox(height: 30), + // Social Login Buttons + if(GoogleSignIn.instance.supportsAuthenticate()) + _buildGoogleButton() + else ...[ + if (kIsWeb) + web.renderButton() + ], + SizedBox(height: 40), + TextButton( + onPressed: () { + context.go('/'); + }, + child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), + ), + ], ), - ], - ), - SizedBox(height: 40), - ], + ); + } + ), ), ), ), ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - SizedBox(height: 5), - TextButton( + ); + } + + Widget _buildGoogleButton(){ + return Skeletonizer( + enabled: _loading, + child: Row( + children: [ + Expanded( + child: OutlinedButton.icon( onPressed: () { - context.go('/'); + signInWithGoogle(); }, - child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), + icon: Image.asset( + 'assets/google.png', + width: 20, + height: 20, + ), + label: Text('Google', style: TextStyle(fontSize: 16)), + style: OutlinedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 16), + side: BorderSide(color: Colors.grey.shade300), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), ), - ], - ), + ), + SizedBox(width: 16), + ], ), ); } + } diff --git a/lib/screens/onboarding/phone/phone_screen.dart b/lib/screens/onboarding/phone/phone_screen.dart index 1835815..1a0c253 100644 --- a/lib/screens/onboarding/phone/phone_screen.dart +++ b/lib/screens/onboarding/phone/phone_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/phone/phone_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -82,89 +83,94 @@ class _PhoneScreenState extends State { padding: const EdgeInsets.all(25.0), child: Form( key: _formKey, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Verify Your Device', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme - .of(context) - .colorScheme - .primary, - ), - textAlign: TextAlign.center, - ), - SizedBox(height: 10), - Text( - 'We will send you a verification code to this number', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - Image.asset('assets/phone.png', width: 300), - SizedBox(height: 20), - _buildPhoneField(), - SizedBox(height: 30), - ], - ), - ), - ), - ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Skeletonizer( - enabled: phoneController.model.isLoading, - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () async { - if (_formKey.currentState!.validate()) { - String fullPhoneNumber = - selectedCountryCode + _phoneController.text; - - phoneController.updatePhone(fullPhoneNumber); - await phoneController.register(); - if(phoneController.model.status != 'failed') { - context.go('/onboarding/verify'); - } - } - }, - child: Text('Send Code', style: TextStyle(fontSize: 16)), - ), - ), - SizedBox(width: 16), - Expanded( - child: TextButton( - onPressed: () { - context.go('/onboarding/login'); - }, - child: Text( - 'Go to Login', - style: TextStyle(fontSize: 16), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + Text( + 'Verify Your Device', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme + .of(context) + .colorScheme + .primary, + ), + textAlign: TextAlign.center, ), - ), + SizedBox(height: 10), + Text( + 'We will send you a verification code to this number', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + Image.asset('assets/phone.png', width: 300), + SizedBox(height: 20), + _buildPhoneField(), + SizedBox(height: 30), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Skeletonizer( + enabled: phoneController.model.isLoading, + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () async { + if (_formKey.currentState!.validate()) { + String fullPhoneNumber = + selectedCountryCode + _phoneController.text; + + phoneController.updatePhone(fullPhoneNumber); + await phoneController.register(); + if(phoneController.model.status != 'failed') { + context.go('/onboarding/verify'); + } + } + }, + child: Text('Send Code', style: TextStyle(fontSize: 16)), + ), + ), + SizedBox(width: 16), + Expanded( + child: OutlinedButton( + onPressed: () { + context.go('/onboarding/login'); + }, + child: Text( + 'Go to Login', + style: TextStyle(fontSize: 16), + ), + ), + ), + ], + ), + ), + ), + SizedBox(height: 10), + TextButton( + onPressed: () { + context.go('/'); + }, + child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), + ), + ], ), - ], - ), + ); + } ), ), - SizedBox(height: 5), - TextButton( - onPressed: () { - context.go('/'); - }, - child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), - ), - ], + ), ), ), ); diff --git a/lib/screens/onboarding/register/register_screen.dart b/lib/screens/onboarding/register/register_screen.dart index b9e5b2b..7bc6f54 100644 --- a/lib/screens/onboarding/register/register_screen.dart +++ b/lib/screens/onboarding/register/register_screen.dart @@ -1,10 +1,13 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:go_router/go_router.dart'; import 'package:google_sign_in/google_sign_in.dart'; +import 'package:google_sign_in_web/web_only.dart' as web; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/onboarding_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -17,6 +20,7 @@ class RegisterScreen extends StatefulWidget { class _RegisterScreenState extends State { late OnboardingController onboardingController; + late GoogleSignIn googleSignIn; bool _loading = false; @@ -32,17 +36,22 @@ class _RegisterScreenState extends State { listen: false, ); // onboardingController.resetState(); + + googleSignIn = GoogleSignIn.instance; + if(kIsWeb){ + googleSignIn.initialize(); + googleSignIn.authenticationEvents + .listen(_handleAuthenticationEvent) + .onError(_handleAuthenticationError); + + }else { + unawaited(googleSignIn.initialize(serverClientId: dotenv.env['CLIENTID'])); + } } void signInWithGoogle() { - final GoogleSignIn googleSignIn = GoogleSignIn.instance; - - unawaited(googleSignIn.initialize(serverClientId: dotenv.env['CLIENTID'])); - if (GoogleSignIn.instance.supportsAuthenticate()){ unawaited(GoogleSignIn.instance.authenticate().then((value) { - print(value); - onboardingController.updateGoogleUser(value); googleSignIn.authenticationEvents .listen(_handleAuthenticationEvent) .onError(_handleAuthenticationError); @@ -51,9 +60,7 @@ class _RegisterScreenState extends State { } } - Future _handleAuthenticationEvent( - GoogleSignInAuthenticationEvent event, - ) async { + Future _handleAuthenticationEvent(GoogleSignInAuthenticationEvent event) async { // #docregion CheckAuthorization final GoogleSignInAccount? user = // ... // #enddocregion CheckAuthorization @@ -68,6 +75,9 @@ class _RegisterScreenState extends State { ?.authorizationClient .authorizationForScopes(scopes); // #enddocregion CheckAuthorization + print(user); + onboardingController.updateGoogleUser(user as GoogleSignInAccount); + } Future _handleAuthenticationError(Object e) async { @@ -83,170 +93,184 @@ class _RegisterScreenState extends State { body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(25), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Registration', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - SizedBox(height: 5), - Text( - "Let's start by getting some of your details online to get you started", - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - Image.asset('assets/social.png', width: 300), - SizedBox(height: 20), - - // Social Login Buttons - if(onboardingController.model.googleUser == null) - Column( - children: [ - Row( + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Expanded(child: Divider(color: Colors.grey.shade300)), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Text( - 'Choose from the options below to continue', - style: TextStyle( - color: Colors.grey.shade600, - fontSize: 14, - ), - textAlign: TextAlign.center, + SizedBox(height: 75), + Text( + 'Registration', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, ), ), - Expanded(child: Divider(color: Colors.grey.shade300)), - ], - ), - SizedBox(height: 20), - Skeletonizer( - enabled: _loading, - child: Row( - children: [ - Expanded( - child: OutlinedButton.icon( - onPressed: () { - signInWithGoogle(); - }, - icon: Image.asset( - 'assets/google.png', - width: 20, - height: 20, - ), - label: Text('Google', style: TextStyle(fontSize: 16)), - style: OutlinedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 16), - side: BorderSide(color: Colors.grey.shade300), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + SizedBox(height: 5), + Text( + "Let's start by getting some of your online details to get you started", + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + Image.asset('assets/social.png', width: 300), + SizedBox(height: 20), + + // Social Login Buttons + if(onboardingController.model.googleUser == null) + Column( + children: [ + Row( + children: [ + Expanded(child: Divider(color: Colors.grey.shade300)), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Text( + 'Choose from the options below to continue', + style: TextStyle( + color: Colors.grey.shade600, + fontSize: 14, + ), + textAlign: TextAlign.center, + ), + ), + Expanded(child: Divider(color: Colors.grey.shade300)), + ], + ), + SizedBox(height: 20), + if(GoogleSignIn.instance.supportsAuthenticate()) + _buildGoogleButton() + else ...[ + if (kIsWeb) + web.renderButton() + ], + ], + ), + if(onboardingController.model.googleUser != null) + Column( + children: [ + SizedBox( + width: 100, + child: Divider( + color: Colors.grey.shade300, + thickness: 1, ), ), - ), + SizedBox(height: 20,), + Text( + "Welcome, ${onboardingController.model.googleUser?.displayName}", + style: TextStyle(fontSize: 25), + textAlign: TextAlign.center, + ), + SizedBox(height: 10,), + Text("Tap Proceed to continue", style: TextStyle(fontSize: 18),) + ], + ), + SizedBox(height: 50), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + if (onboardingController.model.googleUser == null) { + showDialog( + context: context, + builder: (BuildContext dialogContext) { + return AlertDialog( + title: const Text('Sign-In Required'), + content: const Text( + "Please sign in with one of the social media platforms to proceed."), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(dialogContext).pop(); // Close the dialog + }, + ), + ], + ); + }, + ); + } else { + context.go('/onboarding/phone'); + } + }, + child: Text('Proceed', style: TextStyle(fontSize: 16)), + ), + ), + SizedBox(width: 16), + Expanded( + child: OutlinedButton( + onPressed: () { + context.go('/onboarding/login'); + }, + child: Text( + 'Go to Login', + style: TextStyle(fontSize: 16), + ), + ), + ), + ], ), - SizedBox(width: 16), - ], - ), - ), - ], - ), - if(onboardingController.model.googleUser != null) - Column( - children: [ - SizedBox( - width: 100, - child: Divider( - color: Colors.grey.shade300, - thickness: 1, ), - ), - SizedBox(height: 20,), - Text( - "Welcome, ${onboardingController.model.googleUser?.displayName}", - style: TextStyle(fontSize: 25), - textAlign: TextAlign.center, - ), - SizedBox(height: 10,), - Text("Tap Proceed to continue", style: TextStyle(fontSize: 18),) - ], - ), - SizedBox(height: 40), + SizedBox(height: 10), + TextButton( + onPressed: () { + context.go('/'); + }, + child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), + ), - ], + ], + ), + ); + } + ), ), ), ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () { - if (onboardingController.model.googleUser == null) { - showDialog( - context: context, - builder: (BuildContext dialogContext) { - return AlertDialog( - title: const Text('Sign-In Required'), - content: const Text( - "Please sign in with one of the social media platforms to proceed."), - actions: [ - TextButton( - child: const Text('OK'), - onPressed: () { - Navigator.of(dialogContext).pop(); // Close the dialog - }, - ), - ], - ); - }, - ); - } else { - context.go('/onboarding/phone'); - } - }, - child: Text('Proceed', style: TextStyle(fontSize: 16)), - ), - ), - SizedBox(width: 16), - Expanded( - child: TextButton( - onPressed: () { - context.go('/onboarding/login'); - }, - child: Text( - 'Go to Login', - style: TextStyle(fontSize: 16), - ), - ), - ), - ], - ), - ), - SizedBox(height: 5), - TextButton( - onPressed: () { - context.go('/'); - }, - child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), - ), - ], - ), - ), ); } ); } + + Widget _buildGoogleButton(){ + return Skeletonizer( + enabled: _loading, + child: Row( + children: [ + Expanded( + child: OutlinedButton.icon( + onPressed: () { + signInWithGoogle(); + }, + icon: Image.asset( + 'assets/google.png', + width: 20, + height: 20, + ), + label: Text('Google', style: TextStyle(fontSize: 16)), + style: OutlinedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 16), + side: BorderSide(color: Colors.grey.shade300), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + ), + ), + SizedBox(width: 16), + ], + ), + ); + } } diff --git a/lib/screens/onboarding/verify/verify_screen.dart b/lib/screens/onboarding/verify/verify_screen.dart index a86e61d..8dc37bc 100644 --- a/lib/screens/onboarding/verify/verify_screen.dart +++ b/lib/screens/onboarding/verify/verify_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/onboarding/verify/verify_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -59,169 +60,162 @@ class _VerifyScreenState extends State { body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(25), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: 75), - Text( - 'Verify Your Account', - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - SizedBox(height: 5), - Text( - 'Enter the 6-digit code sent to your phone/email', - style: TextStyle(fontSize: 18), - textAlign: TextAlign.center, - ), - Image.asset('assets/verify.png', width: 300), - // Verification Code Input - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: List.generate( - 6, - (index) => SizedBox( - width: 50, - child: TextFormField( - controller: _codeControllers[index], - focusNode: _focusNodes[index], - textAlign: TextAlign.center, - keyboardType: TextInputType.number, - maxLength: 1, - decoration: InputDecoration( - counterText: '', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: Colors.grey.shade300), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.maxWidth > ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth; + return SizedBox( + width: maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + Text( + 'Verify Your Account', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide( - color: Theme.of(context).colorScheme.primary, - width: 2, + ), + SizedBox(height: 5), + Text( + 'Enter the 6-digit code sent to your phone/email', + style: TextStyle(fontSize: 18), + textAlign: TextAlign.center, + ), + Image.asset('assets/verify.png', width: 300), + // Verification Code Input + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: List.generate( + 6, + (index) => SizedBox( + width: 50, + child: TextFormField( + controller: _codeControllers[index], + focusNode: _focusNodes[index], + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + maxLength: 1, + decoration: InputDecoration( + counterText: '', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.grey.shade300), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 2, + ), + ), + contentPadding: EdgeInsets.symmetric(vertical: 16), + ), + onChanged: (value) => _onCodeChanged(value, index), + ), ), ), - contentPadding: EdgeInsets.symmetric(vertical: 16), ), - onChanged: (value) => _onCodeChanged(value, index), - ), - ), - ), - ), - SizedBox(height: 5), - if(errorMessage != null) - Text(errorMessage ?? '', style: TextStyle(color: Colors.red)), - SizedBox(height: 30), - // Resend Code Section - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Didn't receive the code? ", - style: TextStyle(color: Colors.grey.shade600, fontSize: 16), - ), - TextButton( - onPressed: () { - verifyController.resendOtp(); - }, - child: Text( - 'Resend Code', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 16, - fontWeight: FontWeight.w600, + SizedBox(height: 5), + if(errorMessage != null) + Text(errorMessage ?? '', style: TextStyle(color: Colors.red)), + SizedBox(height: 30), + // Resend Code Section + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Didn't receive the code? ", + style: TextStyle(color: Colors.grey.shade600, fontSize: 16), + ), + TextButton( + onPressed: () { + verifyController.resendOtp(); + }, + child: Text( + 'Resend Code', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), + ], ), - ), - ), - ], - ), - // SizedBox(height: 20), - // // Timer for resend (optional) - // Text( - // 'Resend available in 2:30', - // style: TextStyle(color: Colors.grey.shade500, fontSize: 14), - // ), - SizedBox(height: 40), - ], - ), - ), - ), - bottomNavigationBar: SizedBox( - height: 130, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25), - child: Skeletonizer( - enabled: verifyController.model.isLoading, - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: () async { - showErrorMessage(null); - String code = ''; - for (var controller in _codeControllers) { - code += controller.text; - } + // SizedBox(height: 20), + // // Timer for resend (optional) + // Text( + // 'Resend available in 2:30', + // style: TextStyle(color: Colors.grey.shade500, fontSize: 14), + // ), + SizedBox(height: 40), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25), + child: Skeletonizer( + enabled: verifyController.model.isLoading, + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () async { + showErrorMessage(null); + String code = ''; + for (var controller in _codeControllers) { + code += controller.text; + } - if(code.length != 6) { - showErrorMessage('Invalid code'); - return; - } - verifyController.updateCode(code); - await verifyController.verifyOtp(); - if(verifyController.model.status == 'done') { - context.go('/onboarding/complete'); - } - }, - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 16), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + if(code.length != 6) { + showErrorMessage('Invalid code'); + return; + } + verifyController.updateCode(code); + await verifyController.verifyOtp(); + if(verifyController.model.status == 'done') { + context.go('/onboarding/complete'); + } + }, + child: Text( + 'Verify Code', + style: TextStyle(fontSize: 16), + ), + ), + ), + SizedBox(width: 16), + Expanded( + child: OutlinedButton( + onPressed: () { + context.go('/onboarding/login'); + }, + child: Text( + 'Back to Login', + style: TextStyle(fontSize: 16), + ), + ), + ), + ], ), ), - child: Text( - 'Verify Code', - style: TextStyle(fontSize: 16), - ), ), - ), - SizedBox(width: 16), - Expanded( - child: OutlinedButton( + SizedBox(height: 10), + TextButton( onPressed: () { - context.go('/onboarding/login'); + context.go('/'); }, - style: OutlinedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 16), - side: BorderSide(color: Colors.grey.shade300), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - ), - child: Text( - 'Back to Login', - style: TextStyle(fontSize: 16), - ), + child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), ), - ), - ], - ), - ), + + ], + ), + ); + } ), - SizedBox(height: 20), - TextButton( - onPressed: () { - context.go('/'); - }, - child: Text('Continue as guest?', style: TextStyle(fontSize: 14)), - ), - ], + ), ), ), ); diff --git a/lib/screens/pay/pay_controller.dart b/lib/screens/pay/pay_controller.dart index 8df6e12..ccee845 100644 --- a/lib/screens/pay/pay_controller.dart +++ b/lib/screens/pay/pay_controller.dart @@ -95,7 +95,7 @@ class PayController extends ChangeNotifier { transactionController.model.formData.copyWith( type: "CONFIRM", billClientId: model.selectedProvider?.clientId ?? '', - debitRef: 'peak', + debitRef: 'Velocity', debitCurrency: 'USD', creditAccount: transactionController.model.formData.creditAccount, creditPhone: transactionController.model.formData.creditPhone, diff --git a/lib/screens/pay/pay_screen.dart b/lib/screens/pay/pay_screen.dart index 0eb1caa..dbc720e 100644 --- a/lib/screens/pay/pay_screen.dart +++ b/lib/screens/pay/pay_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/pay/pay_controller.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -178,105 +179,127 @@ class _PayScreenState extends State with TickerProviderStateMixin { position: _slideAnimation, child: Form( key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "TRANSACTIONS DETAILS", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "Provider", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - controller.model.selectedProvider?.name ?? "", - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - controller - .model - .selectedProvider - ?.accountFieldName ?? - "", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - Text( - transactionController - .model - .formData - .creditAccount, - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 10), - Divider(color: Theme.of(context).colorScheme.primary), - InkWell( - customBorder: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - onTap: () { - setState(() { - showAdditionalRecipientDetails = - !showAdditionalRecipientDetails; - }); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IconButton( - onPressed: () {}, - icon: Icon( - showAdditionalRecipientDetails - ? Icons.arrow_drop_up - : Icons.arrow_drop_down, + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse(constraints.maxWidth > ResponsivePolicy.md ? + ResponsivePolicy.md.toString() : + constraints.maxWidth.toString()), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.black87.withAlpha(20)), + borderRadius: BorderRadius.circular(12), + ), + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "TRANSACTIONS DETAILS", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Provider", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + controller.model.selectedProvider?.name ?? "", + style: TextStyle(fontSize: 16), + ), + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + controller + .model + .selectedProvider + ?.accountFieldName ?? + "", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + transactionController + .model + .formData + .creditAccount, + style: TextStyle(fontSize: 16), + ), + ], + ), + ], + ), ), - color: Theme.of(context).colorScheme.primary, - ), - Text( - showAdditionalRecipientDetails - ? "Hide additional recipient details" - : "Show additional recipient details", - style: TextStyle(fontSize: 16), - ), - ], - ), - ), - if (showAdditionalRecipientDetails) - _buildAdditionalRecipientDetails(), - const SizedBox(height: 7), - if (controller.model.products.isNotEmpty) - _buildBillProductSelector(controller), - const SizedBox(height: 7), - _buildPhoneField(), - const SizedBox(height: 7), - _buildAmountField(), - const SizedBox(height: 20), - // _buildPayButton(controller), - ...controller.model.paymentProcessors.map( - (e) => _buildPaymentProcessorItem(e, context), - ), - ], + SizedBox(height: 20), + InkWell( + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + onTap: () { + setState(() { + showAdditionalRecipientDetails = + !showAdditionalRecipientDetails; + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + onPressed: () {}, + icon: Icon( + showAdditionalRecipientDetails + ? Icons.arrow_drop_up + : Icons.arrow_drop_down, + ), + color: Theme.of(context).colorScheme.primary, + ), + Text( + showAdditionalRecipientDetails + ? "Hide additional recipient details" + : "Show additional recipient details", + style: TextStyle(fontSize: 16), + ), + ], + ), + ), + if (showAdditionalRecipientDetails) + _buildAdditionalRecipientDetails(), + const SizedBox(height: 7), + if (controller.model.products.isNotEmpty) + _buildBillProductSelector(controller), + const SizedBox(height: 7), + _buildPhoneField(), + const SizedBox(height: 7), + _buildAmountField(), + const SizedBox(height: 20), + // _buildPayButton(controller), + ...controller.model.paymentProcessors.map( + (e) => _buildPaymentProcessorItem(e, context), + ), + ], + ), + ); + } + ), ), ), ), diff --git a/lib/screens/poll/poll_screen.dart b/lib/screens/poll/poll_screen.dart new file mode 100644 index 0000000..9774aad --- /dev/null +++ b/lib/screens/poll/poll_screen.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; +import 'package:qpay/screens/gateway/gateway_controller.dart'; +import 'package:qpay/screens/transaction_controller.dart'; +import 'package:skeletonizer/skeletonizer.dart'; + +class PollScreen extends StatefulWidget { + const PollScreen({super.key}); + + @override + State createState() => _PollScreenState(); +} + +class _PollScreenState extends State { + late GatewayController controller; + late TransactionController transactionController; + + bool integrating = false; + + @override + void initState() { + super.initState(); + controller = GatewayController(context); + transactionController = Provider.of( + context, + listen: false, + ); + + controller.pollTransaction(transactionController.model.confirmationData['id']); + } + + void _showErrorSnackBar(String? message) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message.toString()), + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.deepOrange, + ), + ); + }); + } + + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Completing your transaction'), + ), + body: ListenableBuilder( + listenable: controller, + builder: (context, child) { + if (controller.model.status == 'SUCCESS') { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go('/integration'); + }); + } + + return Container( + padding: EdgeInsets.all(50), + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse(constraints.maxWidth > ResponsivePolicy.md ? + ResponsivePolicy.md.toString() : + constraints.maxWidth.toString()), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 75), + + Column( + children: [ + Text( + 'We\'re checking with our gateway if your transaction was successful. This won\'t take long', + style: TextStyle(fontSize: 20), + textAlign: TextAlign.center, + ), + SizedBox(height: 50,), + Image.asset('assets/velocity-animation.gif', width: 150), + SizedBox(height: 50), + if(controller.model.status == 'FAILED') + Column( + children: [ + Text( + 'We failed to check your transaction status', + style: TextStyle(fontSize: 20), + textAlign: TextAlign.center, + ), + SizedBox(height: 20,), + Skeletonizer( + enabled: controller.model.isLoading, + child: OutlinedButton( + child: Text('Retry'), + onPressed: () { + controller.pollTransaction(transactionController.model.confirmationData['id']); + }, + ), + ), + ], + ), + ], + ), + ], + ), + ); + } + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/screens/receipt/receipt_screen.dart b/lib/screens/receipt/receipt_screen.dart index 6e55997..6b303a5 100644 --- a/lib/screens/receipt/receipt_screen.dart +++ b/lib/screens/receipt/receipt_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/gateway/gateway_controller.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:go_router/go_router.dart'; @@ -59,15 +60,13 @@ class _ReceiptScreenState extends State ), ); - _slideAnimation = Tween( - begin: const Offset(0, 0.1), - end: Offset.zero, - ).animate( - CurvedAnimation( - parent: _controller, - curve: const Interval(0.0, 0.5, curve: Curves.easeOut), - ), - ); + _slideAnimation = + Tween(begin: const Offset(0, 0.1), end: Offset.zero).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval(0.0, 0.5, curve: Curves.easeOut), + ), + ); _controller.forward(); } @@ -87,9 +86,13 @@ class _ReceiptScreenState extends State _retry() async { receiptController.setLoading(true); - await receiptController.doIntegration(receiptController.model.receiptData?["id"]); - if(receiptController.model.status == "SUCCESS"){ - receiptController.getReceiptData(transactionController.model.receiptData?["id"]); + await receiptController.doIntegration( + receiptController.model.receiptData?["id"], + ); + if (receiptController.model.status == "SUCCESS") { + receiptController.getReceiptData( + receiptController.model.receiptData?["id"], + ); } receiptController.setLoading(false); } @@ -97,9 +100,11 @@ class _ReceiptScreenState extends State _check() async { receiptController.setLoading(true); await gatewayController.poll(receiptController.model.receiptData?["id"]); - if(gatewayController.model.status == "SUCCESS"){ - receiptController.getReceiptData(transactionController.model.receiptData?["id"]); - if(transactionController.model.receiptData?["pollingStatus"]) { + if (gatewayController.model.status == "SUCCESS") { + receiptController.getReceiptData( + transactionController.model.receiptData?["id"], + ); + if (transactionController.model.receiptData?["pollingStatus"]) { receiptController.setLoading(false); return; // no need to proceed if we've already polled successfully } @@ -131,15 +136,14 @@ class _ReceiptScreenState extends State expandedHeight: 50.0, surfaceTintColor: Colors.transparent, floating: true, - leading: - context.canPop() - ? IconButton( - onPressed: () { - context.pop(); - }, - icon: const Icon(Icons.arrow_back), - ) - : SizedBox.shrink(), + leading: context.canPop() + ? IconButton( + onPressed: () { + context.pop(); + }, + icon: const Icon(Icons.arrow_back), + ) + : SizedBox.shrink(), title: Text( "Payment Result", style: TextStyle(color: Colors.black87), @@ -158,180 +162,266 @@ class _ReceiptScreenState extends State position: _slideAnimation, child: Form( key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Skeletonizer( - enabled: receiptController.model.isLoading, - child: Container( - padding: EdgeInsets.all(20), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Theme.of(context).colorScheme.primary - .withOpacity(0.1), - Theme.of(context).colorScheme.tertiary - .withOpacity(0.05), - Theme.of(context).colorScheme.tertiary - .withOpacity(0.15), - ], - stops: [0.0, 0.5, 1.0], - ), - border: Border.all( - color: Theme.of( - context, - ).colorScheme.primary.withOpacity(0.3), - ), - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: Theme.of(context) - .colorScheme - .primary - .withOpacity(0.1), - blurRadius: 10, - spreadRadius: 1, - offset: Offset(0, 2), - ), - ], - ), + child: LayoutBuilder( + builder: (context, constraints) { + return Center( + child: SizedBox( + width: + constraints.maxWidth > + ResponsivePolicy.md + ? ResponsivePolicy.md.toDouble() + : constraints.maxWidth, child: Column( - crossAxisAlignment: - CrossAxisAlignment.center, children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Icon( - transactionController - .model - .receiptData?["integrationStatus"] == - 'SUCCESS' - ? Icons.check_circle - : transactionController - .model - .receiptData?["integrationStatus"] == - 'PENDING' - ? Icons.pending - : Icons.cancel, - size: 18, - color: - transactionController - .model - .receiptData?["integrationStatus"] == - 'SUCCESS' - ? Colors.green - : transactionController - .model - .receiptData?["integrationStatus"] == - 'PENDING' - ? Colors.orange - : Colors.red, - ), - SizedBox(width: 5), - Text( - receiptController - .model - .receiptData?["debitCurrency"] ?? - "", - style: TextStyle( - fontSize: 26, - fontWeight: FontWeight.bold, + Skeletonizer( + enabled: + receiptController.model.isLoading, + child: Container( + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Theme.of(context) + .colorScheme + .primary + .withOpacity(0.1), + Theme.of(context) + .colorScheme + .tertiary + .withOpacity(0.05), + Theme.of(context) + .colorScheme + .tertiary + .withOpacity(0.15), + ], + stops: [0.0, 0.5, 1.0], ), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary + .withOpacity(0.3), + ), + borderRadius: + BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Theme.of(context) + .colorScheme + .primary + .withOpacity(0.1), + blurRadius: 10, + spreadRadius: 1, + offset: Offset(0, 2), + ), + ], ), - SizedBox(width: 5), - Text( - receiptController - .model - .receiptData?["amount"] - .toStringAsFixed(2) ?? - "", - style: TextStyle(fontSize: 26), - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - SizedBox(height: 5), - Text( - receiptController - .model - .receiptData?["billName"] ?? - "", - style: TextStyle(fontSize: 16), - ), - Text( - receiptController - .model - .receiptData?["createdAt"] != null ? - DateFormat.yMMMd().add_jm().format(DateTime.parse( - receiptController - .model - .receiptData?["createdAt"])) : "", - style: TextStyle(fontSize: 15), - ), - ], - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Column( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Container( - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all( - color: Theme.of(context) - .colorScheme - .primary - .withOpacity(0.3), - width: 1, + Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Icon( + transactionController + .model + .receiptData?["integrationStatus"] == + 'SUCCESS' + ? Icons.check_circle + : transactionController + .model + .receiptData?["integrationStatus"] == + 'PENDING' + ? Icons.pending + : Icons.cancel, + size: 18, + color: + transactionController + .model + .receiptData?["integrationStatus"] == + 'SUCCESS' + ? Colors.green + : transactionController + .model + .receiptData?["integrationStatus"] == + 'PENDING' + ? Colors.orange + : Colors.red, ), - ), - child: + SizedBox(width: 5), + Text( receiptController .model - .isLoading - ? Center( - child: SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator( - strokeWidth: - 2.5, - valueColor: AlwaysStoppedAnimation< - Color - >( + .receiptData?["debitCurrency"] ?? + "", + style: TextStyle( + fontSize: 26, + fontWeight: + FontWeight.bold, + ), + ), + SizedBox(width: 5), + Text( + receiptController + .model + .receiptData?["amount"] + .toStringAsFixed( + 2, + ) ?? + "", + style: TextStyle( + fontSize: 26, + ), + ), + ], + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + SizedBox(height: 5), + Text( + receiptController + .model + .receiptData?["billName"] ?? + "", + style: TextStyle( + fontSize: 16, + ), + ), + Text( + receiptController + .model + .receiptData?["createdAt"] != + null + ? DateFormat.yMMMd() + .add_jm() + .format( + DateTime.parse( + receiptController + .model + .receiptData?["createdAt"], + ), + ) + : "", + style: TextStyle( + fontSize: 15, + ), + ), + ], + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Column( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + shape: + BoxShape.circle, + color: Colors.white, + border: Border.all( + color: Theme.of( context, ) .colorScheme - .primary, - ), - ), + .primary + .withOpacity( + 0.3, + ), + width: 1, ), - ) - : IconButton( - onPressed: () { + ), + child: receiptController - .repeatTransaction( - context, - ); + .model + .isLoading + ? Center( + child: SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + strokeWidth: + 2.5, + valueColor: + AlwaysStoppedAnimation< + Color + >( + Theme.of( + context, + ).colorScheme.primary, + ), + ), + ), + ) + : IconButton( + onPressed: () { + receiptController + .repeatTransaction( + context, + ); + }, + icon: Icon( + Icons + .repeat, + color: Theme.of( + context, + ).colorScheme.primary, + size: 24, + ), + ), + ), + SizedBox(height: 8), + Text( + "Repeat", + style: TextStyle( + fontSize: 14, + fontWeight: + FontWeight.w500, + ), + ), + ], + ), + Column( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + shape: + BoxShape.circle, + color: Colors.white, + border: Border.all( + color: + Theme.of( + context, + ) + .colorScheme + .primary + .withOpacity( + 0.3, + ), + width: 1, + ), + ), + child: IconButton( + onPressed: () { + _captureImage(); }, icon: Icon( - Icons.repeat, + Icons.share, color: Theme.of( context, @@ -341,449 +431,603 @@ class _ReceiptScreenState extends State size: 24, ), ), - ), - SizedBox(height: 8), - Text( - "Repeat", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - Column( - children: [ - Container( - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all( - color: Theme.of(context) - .colorScheme - .primary - .withOpacity(0.3), - width: 1, - ), - ), - child: IconButton( - onPressed: () { - _captureImage(); - }, - icon: Icon( - Icons.share, - color: - Theme.of( - context, - ).colorScheme.primary, - size: 24, - ), - ), - ), - SizedBox(height: 8), - Text( - "Share", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - if(receiptController.model.receiptData?["integrationStatus"] != "SUCCESS" && - receiptController.model.receiptData?["paymentStatus"] == "SUCCESS") - Column( - children: [ - Container( - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all( - color: Theme.of(context) - .colorScheme - .primary - .withOpacity(0.3), - width: 1, - ), - ), - child: IconButton( - onPressed: () { - _retry(); - }, - icon: Icon( - Icons.redo, - color: - Theme.of( - context, - ).colorScheme.primary, - size: 24, - ), - ), - ), - SizedBox(height: 8), - Text( - "Retry", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - if(receiptController.model.receiptData?["pollingStatus"] != "SUCCESS") - Column( - children: [ - Container( - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.white, - border: Border.all( - color: Theme.of(context) - .colorScheme - .primary - .withOpacity(0.3), - width: 1, - ), - ), - child: IconButton( - onPressed: () { - _check(); - }, - icon: Icon( - Icons.price_check, - color: - Theme.of( - context, - ).colorScheme.primary, - size: 24, - ), - ), - ), - SizedBox(height: 8), - Text( - "Check status", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - ], - ), - ], - ), - ), - ), - SizedBox(height: 20), - Column( - children: [ - Container( - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(12), - ), - child: TabBar( - controller: _tabController, - indicator: BoxDecoration( - borderRadius: BorderRadius.circular( - 8, - ), - color: - Theme.of( - context, - ).colorScheme.primary, - ), - indicatorPadding: EdgeInsets.all(5), - indicatorSize: TabBarIndicatorSize.tab, - labelColor: Colors.white, - unselectedLabelColor: Colors.grey[600], - dividerColor: Colors.transparent, - tabs: [ - Tab( - child: Text( - "Provider Details", - style: TextStyle( - fontWeight: FontWeight.bold, - ), - ), - ), - Tab( - child: Text( - "Transaction Details", - style: TextStyle( - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - ), - SizedBox( - height: - MediaQuery.of(context).size.height * - 0.5, - child: TabBarView( - controller: _tabController, - children: [ - Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - children: [ - - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Status", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, ), - ), - Text( - transactionController - .model - .receiptData?["integrationStatus"] ?? - "", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - ), - if(transactionController - .model - .receiptData?["errorMessage"] != null && - transactionController.model.receiptData?["errorMessage"] != "") - Column( - children: [ - const SizedBox(height: 10), - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Message", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Expanded( - child: Text( - transactionController - .model - .receiptData?["errorMessage"] ?? - "", - style: TextStyle( - fontSize: 16, - ), - textAlign: TextAlign.end, - softWrap: true, - ), - ), - ], - ), - ), - ], - ), - if(receiptController.model.receiptData?["integrationStatus"] != "SUCCESS" && - receiptController.model.receiptData?["paymentStatus"] == "SUCCESS") - Column( - children: [ - const SizedBox(height: 10), - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Additional action", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Expanded( - child: Text("Billing account update failed, please tap on Retry to try again", - style: TextStyle( - fontSize: 16, - color: Theme.of( - context, - ).colorScheme.primary, - ), - textAlign: TextAlign.end, - softWrap: true, - - ), - ), - ], - ), - ), - ], - ), - SizedBox(height: 10,), - - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Debit Reference", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Text( - transactionController - .model - .receiptData?["debitRef"] ?? - "", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - ), - const SizedBox(height: 10), - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "From", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Text( - receiptController - .model - .receiptData?["debitPhone"] ?? - "", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - ), - const SizedBox(height: 10), - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "To", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Text( - receiptController - .model - .receiptData?["creditAccount"] ?? - "", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - ), - const SizedBox(height: 10), - Divider( - color: Colors.grey[300], - thickness: 1, - ), - const SizedBox(height: 10), - if (receiptController - .model - .receiptData?["additionalData"] == - null) - Skeletonizer( - enabled: - receiptController - .model - .isLoading, - child: Column( - children: [ - SizedBox(height: 20), - Center( - child: Text( - "No details found", + SizedBox(height: 8), + Text( + "Share", + style: TextStyle( + fontSize: 14, + fontWeight: + FontWeight.w500, ), ), ], ), + if (receiptController + .model + .receiptData?["integrationStatus"] != + "SUCCESS" && + receiptController + .model + .receiptData?["paymentStatus"] == + "SUCCESS") + Column( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + shape: BoxShape + .circle, + color: + Colors.white, + border: Border.all( + color: + Theme.of( + context, + ) + .colorScheme + .primary + .withOpacity( + 0.3, + ), + width: 1, + ), + ), + child: IconButton( + onPressed: () { + _retry(); + }, + icon: Icon( + Icons.redo, + color: Theme.of( + context, + ).colorScheme.primary, + size: 24, + ), + ), + ), + SizedBox(height: 8), + Text( + "Retry", + style: TextStyle( + fontSize: 14, + fontWeight: + FontWeight + .w500, + ), + ), + ], + ), + if (receiptController + .model + .receiptData?["pollingStatus"] != + "SUCCESS") + Column( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + shape: BoxShape + .circle, + color: + Colors.white, + border: Border.all( + color: + Theme.of( + context, + ) + .colorScheme + .primary + .withOpacity( + 0.3, + ), + width: 1, + ), + ), + child: IconButton( + onPressed: () { + _check(); + }, + icon: Icon( + Icons + .price_check, + color: Theme.of( + context, + ).colorScheme.primary, + size: 24, + ), + ), + ), + SizedBox(height: 8), + Text( + "Check status", + style: TextStyle( + fontSize: 14, + fontWeight: + FontWeight + .w500, + ), + ), + ], + ), + ], + ), + ], + ), + ), + ), + SizedBox(height: 20), + Column( + children: [ + Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: + BorderRadius.circular(12), + ), + child: TabBar( + controller: _tabController, + indicator: BoxDecoration( + borderRadius: + BorderRadius.circular(8), + color: Theme.of( + context, + ).colorScheme.primary, + ), + indicatorPadding: + EdgeInsets.all(5), + indicatorSize: + TabBarIndicatorSize.tab, + labelColor: Colors.white, + unselectedLabelColor: + Colors.grey[600], + dividerColor: + Colors.transparent, + tabs: [ + Tab( + child: Text( + "Provider Details", + style: TextStyle( + fontWeight: + FontWeight.bold, + ), + ), ), - if (receiptController - .model - .receiptData?["additionalData"] != - null) - ...receiptController - .model - .receiptData?["additionalData"] - .map((data) { - return Skeletonizer( - enabled: receiptController + Tab( + child: Text( + "Transaction Details", + style: TextStyle( + fontWeight: + FontWeight.bold, + ), + ), + ), + ], + ), + ), + SizedBox( + height: + MediaQuery.of( + context, + ).size.height * + 0.5, + child: TabBarView( + controller: _tabController, + children: [ + Padding( + padding: + const EdgeInsets.all( + 10.0, + ), + child: Column( + children: [ + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Status", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["integrationStatus"] ?? + "", + style: + TextStyle( + fontSize: + 16, + ), + ), + ], + ), + ), + if (transactionController + .model + .receiptData?["errorMessage"] != + null && + transactionController + .model + .receiptData?["errorMessage"] != + "") + Column( + children: [ + const SizedBox( + height: 10, + ), + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Message", + style: TextStyle( + fontSize: + 16, + fontWeight: + FontWeight.bold, + ), + ), + Expanded( + child: Text( + transactionController.model.receiptData?["errorMessage"] ?? + "", + style: TextStyle( + fontSize: + 16, + ), + textAlign: + TextAlign.end, + softWrap: + true, + ), + ), + ], + ), + ), + ], + ), + if (receiptController + .model + .receiptData?["integrationStatus"] != + "SUCCESS" && + receiptController + .model + .receiptData?["paymentStatus"] == + "SUCCESS") + Column( + children: [ + const SizedBox( + height: 10, + ), + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Additional action", + style: TextStyle( + fontSize: + 16, + fontWeight: + FontWeight.bold, + ), + ), + Expanded( + child: Text( + "Billing account update failed, please tap on Retry to try again", + style: TextStyle( + fontSize: + 16, + color: Theme.of( + context, + ).colorScheme.primary, + ), + textAlign: + TextAlign.end, + softWrap: + true, + ), + ), + ], + ), + ), + ], + ), + SizedBox(height: 10), + + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Debit Reference", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["debitRef"] ?? + "", + style: + TextStyle( + fontSize: + 16, + ), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "From", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + receiptController + .model + .receiptData?["debitPhone"] ?? + "", + style: + TextStyle( + fontSize: + 16, + ), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + Skeletonizer( + enabled: + receiptController .model .isLoading, - child: Column( + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "To", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + receiptController + .model + .receiptData?["creditAccount"] ?? + "", + style: + TextStyle( + fontSize: + 16, + ), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Processor", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + receiptController + .model + .receiptData?["paymentProcessorName"] ?? + "", + style: + TextStyle( + fontSize: + 16, + ), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + Divider( + color: + Colors.grey[300], + thickness: 1, + ), + const SizedBox( + height: 10, + ), + if (receiptController + .model + .receiptData?["additionalData"] == + null) + Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Column( + children: [ + SizedBox( + height: 20, + ), + Center( + child: Text( + "No details found", + ), + ), + ], + ), + ), + if (receiptController + .model + .receiptData?["additionalData"] != + null) + ...receiptController.model.receiptData?["additionalData"].map< + Widget + >((data) { + return Skeletonizer( + enabled: + receiptController + .model + .isLoading, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + data["name"] ?? + "", + style: TextStyle( + fontSize: + 16, + fontWeight: + FontWeight.bold, + ), + ), + Text( + data["value"] ?? + "", + style: TextStyle( + fontSize: + 16, + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + ], + ), + ); + }).toList(), + ], + ), + ), + Padding( + padding: + const EdgeInsets.all( + 10.0, + ), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Amount", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["amount"] + .toStringAsFixed( + 2, + ) ?? + "0.00", + style: TextStyle( + fontSize: 16, + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + if (transactionController + .model + .receiptData?["charge"] != + 0) + Column( children: [ Row( mainAxisAlignment: @@ -791,8 +1035,7 @@ class _ReceiptScreenState extends State .spaceBetween, children: [ Text( - data["name"] ?? - "", + "Our Charge", style: TextStyle( fontSize: 16, @@ -802,13 +1045,17 @@ class _ReceiptScreenState extends State ), ), Text( - data["value"] ?? - "", - style: - TextStyle( - fontSize: - 16, - ), + transactionController + .model + .receiptData?["charge"] + .toStringAsFixed( + 2, + ) ?? + "0.00", + style: TextStyle( + fontSize: + 16, + ), ), ], ), @@ -817,198 +1064,132 @@ class _ReceiptScreenState extends State ), ], ), - ); - }) - .toList(), - ], + if (transactionController + .model + .receiptData?["gatewayCharge"] != + 0) + Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Gateway Charge", + style: TextStyle( + fontSize: + 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["gatewayCharge"] + .toStringAsFixed( + 2, + ) ?? + "0.00", + style: TextStyle( + fontSize: + 16, + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + ], + ), + if (transactionController + .model + .receiptData?["tax"] != + 0) + Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Tax", + style: TextStyle( + fontSize: + 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["tax"] + .toStringAsFixed( + 2, + ) ?? + "0.00", + style: TextStyle( + fontSize: + 16, + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + "Total Amount", + style: TextStyle( + fontSize: 16, + fontWeight: + FontWeight + .bold, + ), + ), + Text( + transactionController + .model + .receiptData?["totalAmount"] + .toStringAsFixed( + 2, + ) ?? + "0.00", + style: TextStyle( + fontSize: 16, + ), + ), + ], + ), + const SizedBox( + height: 20, + ), + ], + ), + ), + ], + ), ), - ), - Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Amount", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Text( - transactionController - .model - .receiptData?["amount"] - .toStringAsFixed( - 2, - ) ?? - "0.00", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - const SizedBox(height: 10), - if (transactionController - .model - .receiptData?["charge"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Our Charge", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight - .bold, - ), - ), - Text( - transactionController - .model - .receiptData?["charge"] - .toStringAsFixed( - 2, - ) ?? - "0.00", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - ), - if (transactionController - .model - .receiptData?["gatewayCharge"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Gateway Charge", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight - .bold, - ), - ), - Text( - transactionController - .model - .receiptData?["gatewayCharge"] - .toStringAsFixed( - 2, - ) ?? - "0.00", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - ), - if (transactionController - .model - .receiptData?["tax"] != - 0) - Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Tax", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight - .bold, - ), - ), - Text( - transactionController - .model - .receiptData?["tax"] - .toStringAsFixed( - 2, - ) ?? - "0.00", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Text( - "Total Amount", - style: TextStyle( - fontSize: 16, - fontWeight: - FontWeight.bold, - ), - ), - Text( - transactionController - .model - .receiptData?["totalAmount"] - .toStringAsFixed( - 2, - ) ?? - "0.00", - style: TextStyle( - fontSize: 16, - ), - ), - ], - ), - const SizedBox(height: 20), - ], - ), - ), - ], - ), + ], + ), + ], ), - ], - ), - ], + ), + ); + }, ), ), ), diff --git a/lib/screens/recipient/recipients_screen.dart b/lib/screens/recipient/recipients_screen.dart index c06167d..9db87a2 100644 --- a/lib/screens/recipient/recipients_screen.dart +++ b/lib/screens/recipient/recipients_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:qpay/models/responsive_policy.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:qpay/screens/recipient/recipients_controller.dart'; @@ -83,81 +84,107 @@ class _RecipientsScreenState extends State return SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "TRANSACTIONS DETAILS", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Provider", style: TextStyle(fontSize: 16)), - Text( - controller.model.selectedProvider?.name ?? "", - style: TextStyle(fontSize: 16), - ), - ], - ), - const SizedBox(height: 20), - Divider(color: Theme.of(context).colorScheme.primary), - const SizedBox(height: 20), - _buildAccountField(controller), - const SizedBox(height: 20), - controller.model.creditAccount != null && - controller.model.creditAccount!.isNotEmpty - ? SlideTransition( - position: _alignListAnimations[0], - child: ElevatedButton( - onPressed: () { - String phone = ''; - if (!transactionController - .model - .selectedProvider! - .requiresAccount) { - phone = _accountController.text; - } - transactionController.model.formData = - transactionController.model.formData.copyWith( - creditAccount: _accountController.text, - creditPhone: phone, - ); - context.push("/make-payment"); - }, - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.primary, - foregroundColor: - Theme.of(context).colorScheme.onPrimary, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "Use as new recipient", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, + child: Center( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: double.parse(constraints.maxWidth > ResponsivePolicy.md ? + ResponsivePolicy.md.toString() : + constraints.maxWidth.toString()), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.black87.withAlpha(20)), + borderRadius: BorderRadius.circular(12), + ), + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "TRANSACTIONS DETAILS", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), - ), - SizedBox(width: 5), - Icon(Icons.arrow_forward_ios, size: 12), - ], + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Provider", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + )), + Text( + controller.model.selectedProvider?.name ?? "", + style: TextStyle(fontSize: 16), + ), + ], + ), + ], + ), ), - ), - ) - : SizedBox(), - const SizedBox(height: 20), - Text( - "Recent Recipients", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 10), - _buildRecipientItems(controller), - ], + const SizedBox(height: 20), + _buildAccountField(controller), + const SizedBox(height: 20), + controller.model.creditAccount != null && + controller.model.creditAccount!.isNotEmpty + ? SlideTransition( + position: _alignListAnimations[0], + child: ElevatedButton( + onPressed: () { + String phone = ''; + if (!transactionController + .model + .selectedProvider! + .requiresAccount) { + phone = _accountController.text; + } + transactionController.model.formData = + transactionController.model.formData.copyWith( + creditAccount: _accountController.text, + creditPhone: phone, + ); + context.push("/make-payment"); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Use as new recipient", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 5), + Icon(Icons.arrow_forward_ios, size: 12), + ], + ), + ), + ) + : SizedBox(), + const SizedBox(height: 20), + Text( + "Recent Recipients", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + _buildRecipientItems(controller), + ], + ), + ); + } + ), ), ), ); diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9005b53..2a85495 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,6 +10,7 @@ import google_sign_in_ios import path_provider_foundation import share_plus import shared_preferences_foundation +import url_launcher_macos import webview_flutter_wkwebview func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -18,5 +19,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index bcecaf4..a32c08e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -153,6 +153,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -377,7 +385,7 @@ packages: source: hosted version: "3.1.0" google_sign_in_web: - dependency: transitive + dependency: "direct main" description: name: google_sign_in_web sha256: "2fc1f941e6443b2d6984f4056a727a3eaeab15d8ee99ba7125d79029be75a1da" @@ -392,6 +400,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + html: + dependency: "direct main" + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" http: dependency: transitive description: @@ -861,6 +877,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.dev" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" + source: hosted + version: "6.3.6" url_launcher_linux: dependency: transitive description: @@ -869,6 +909,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -950,7 +998,7 @@ packages: source: hosted version: "1.1.4" web: - dependency: transitive + dependency: "direct main" description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" diff --git a/pubspec.yaml b/pubspec.yaml index 003afcf..264b554 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: qpay -description: "Peak payments solutions" +description: "Velocity payments solutions" # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev @@ -55,6 +55,10 @@ dependencies: gif_view: ^0.4.0 google_sign_in: ^7.1.1 firebase_core: ^4.1.0 + url_launcher: ^6.3.2 + html: ^0.15.6 + web: ^1.1.1 + google_sign_in_web: ^1.1.0 dev_dependencies: flutter_test: diff --git a/web/favicon.png b/web/favicon.png index 8aaa46ac1ae21512746f852a42ba87e4165dfdd1..721aa6eef625f785809bb8b5d2c3c0cb74180134 100644 GIT binary patch literal 87276 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

      EQ@Z7EqB#Puy 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⁢u-J+cm{?51JB-n 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

      k-+cbTe$Dx8UXD-#_Q_zeQ>+w8!}!Mxo15ZO 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 MI%`>c)b*GD1NDcB9smFU literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM diff --git a/web/index.html b/web/index.html index d1bc15b..61823fe 100644 --- a/web/index.html +++ b/web/index.html @@ -20,6 +20,7 @@ + @@ -30,8 +31,27 @@ - qpay + Velocity + + + + + +