From 9bc43470e1a615cd75d2c267fbfdeeadcb1d14c0 Mon Sep 17 00:00:00 2001 From: Restioson Date: Thu, 22 Jun 2023 17:01:16 +0200 Subject: [PATCH] Add confetti (from tick) after order is filled successfully --- .../trade/order_submission_status_dialog.dart | 69 +++++++++++++++---- mobile/pubspec.lock | 8 +++ mobile/pubspec.yaml | 1 + 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/mobile/lib/features/trade/order_submission_status_dialog.dart b/mobile/lib/features/trade/order_submission_status_dialog.dart index e54a61aff..c6dd4ae63 100644 --- a/mobile/lib/features/trade/order_submission_status_dialog.dart +++ b/mobile/lib/features/trade/order_submission_status_dialog.dart @@ -1,3 +1,4 @@ +import 'package:confetti/confetti.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -9,7 +10,7 @@ enum OrderSubmissionStatusDialogType { failedSubmit } -class OrderSubmissionStatusDialog extends StatelessWidget { +class OrderSubmissionStatusDialog extends StatefulWidget { final String title; final OrderSubmissionStatusDialogType type; final Widget content; @@ -26,24 +27,47 @@ class OrderSubmissionStatusDialog extends StatelessWidget { this.insetPadding = const EdgeInsets.all(50), this.navigateToRoute = ""}); + @override + State createState() => _OrderSubmissionStatusDialog(); +} + +class _OrderSubmissionStatusDialog extends State { + late final ConfettiController _confettiController; + + @override + void initState() { + super.initState(); + _confettiController = ConfettiController(duration: const Duration(seconds: 3)); + } + + @override + void dispose() { + _confettiController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - bool isPending = type == OrderSubmissionStatusDialogType.successfulSubmit || - type == OrderSubmissionStatusDialogType.pendingSubmit; + bool isPending = widget.type == OrderSubmissionStatusDialogType.successfulSubmit || + widget.type == OrderSubmissionStatusDialogType.pendingSubmit; + + WidgetsBinding.instance.addPostFrameCallback((_) { + _confettiController.play(); + }); Widget closeButton = ElevatedButton( onPressed: () { GoRouter.of(context).pop(); - if (navigateToRoute.isNotEmpty) { - GoRouter.of(context).go(navigateToRoute); + if (widget.navigateToRoute.isNotEmpty) { + GoRouter.of(context).go(widget.navigateToRoute); } }, - child: Text(buttonText)); + child: Text(widget.buttonText)); AlertDialog dialog = AlertDialog( icon: (() { - switch (type) { + switch (widget.type) { case OrderSubmissionStatusDialogType.pendingSubmit: case OrderSubmissionStatusDialogType.successfulSubmit: return const Center( @@ -55,14 +79,29 @@ class OrderSubmissionStatusDialog extends StatelessWidget { color: Colors.red, ); case OrderSubmissionStatusDialogType.filled: - return const Icon( - Icons.check_circle, - color: Colors.green, - ); + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.check_circle, + color: Colors.green, + ), + ConfettiWidget( + confettiController: _confettiController, + blastDirectionality: BlastDirectionality.explosive, + maxBlastForce: 10, // set a lower max blast force + minBlastForce: 9, // set a lower min blast force + emissionFrequency: 0.00001, + numberOfParticles: 20, // a lot of particles at once + gravity: 0.2, + shouldLoop: false, + ), + ]); } })(), - title: Text("$title ${(() { - switch (type) { + title: Text("${widget.title} ${(() { + switch (widget.type) { case OrderSubmissionStatusDialogType.pendingSubmit: case OrderSubmissionStatusDialogType.successfulSubmit: return "Pending"; @@ -73,9 +112,9 @@ class OrderSubmissionStatusDialog extends StatelessWidget { return "Failure"; } })()}"), - content: content, + content: widget.content, actions: isPending ? null : [closeButton], - insetPadding: insetPadding, + insetPadding: widget.insetPadding, ); // If pending, prevent use of back button diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 94cf4a789..10d2074f1 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -185,6 +185,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + confetti: + dependency: "direct main" + description: + name: confetti + sha256: "979aafde2428c53947892c95eb244466c109c129b7eee9011f0a66caaca52267" + url: "https://pub.dev" + source: hosted + version: "0.7.0" convert: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index bff6cf1c9..75634d4f2 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -31,6 +31,7 @@ dependencies: shared_preferences: ^2.1.2 package_info_plus: ^4.0.2 uuid: ^3.0.7 + confetti: ^0.7.0 dev_dependencies: flutter_launcher_icons: ^0.13.1 flutter_test: