From d6d4a83d09773f9a4a7cc0d7f53bf24ddd9193da Mon Sep 17 00:00:00 2001 From: Shareef Dweikat Date: Fri, 22 Jul 2022 18:47:33 +0200 Subject: [PATCH] Error screens (#136) --- assets/fonts/Courier/CourierPrime-Regular.ttf | Bin 0 -> 68304 bytes lib/constants/app_constants.dart | 10 +- lib/constants/asset_path.dart | 2 +- lib/views/desktop/receive/receive.dart | 13 ++- lib/views/desktop/send/send.dart | 13 ++- lib/views/desktop/send/widgets/DTErrorUI.dart | 92 +++++++++++++++-- lib/views/mobile/receive/receive.dart | 2 +- lib/views/mobile/send/send.dart | 4 +- lib/views/mobile/widgets/ErrorUI.dart | 94 ++++++++++++++---- lib/views/widgets/Heading.dart | 6 +- lib/widgets/ExpandableTextBox.dart | 46 +++++++++ pubspec.lock | 32 ++++-- pubspec.yaml | 6 ++ 13 files changed, 263 insertions(+), 57 deletions(-) create mode 100644 assets/fonts/Courier/CourierPrime-Regular.ttf create mode 100644 lib/widgets/ExpandableTextBox.dart diff --git a/assets/fonts/Courier/CourierPrime-Regular.ttf b/assets/fonts/Courier/CourierPrime-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4af1ff54c5e2f54238a0e2013cb9a37e3130e4ca GIT binary patch literal 68304 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 Z=czZ#XSL_ndX=wQX5;$?^ZRsr{|5yaS;qhX literal 0 HcmV?d00001 diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index cfd05aa1..36a1cd57 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -43,6 +43,8 @@ const String FILE_SENT = 'File sent'; const String SECONDS = 'Seconds'; const String MINUTES = 'Minutes'; const String MINUTE = 'Minute'; +const String SEE_DETAILS = 'See details'; +const String UNKNOWN_ERROR = 'Unknown error'; const String X = 'X'; const String THREE_DOTS = '...'; const String WAITING_FOR_RECEIVER = @@ -147,12 +149,12 @@ const String ANDROID_DOWNLOADS_FOLDER_PATH = '/storage/emulated/0/Download'; const String WINDOW_TITLE = "Destiny"; -const String ERR_WRONG_CODE_RECEIVER = """Oops..\n -If you’re sure this is the right code: Either the sender is no longer connected, or the code was already used.\n +const String ERR_WRONG_CODE_RECEIVER = """Oops.. +If you’re sure this is the right code: Either the sender is no longer connected, or the code was already used. Please ask the sender for a new code and for them to stay connected until you get the file."""; -const String ERR_WRONG_CODE_SENDER = """Oops..\n -The receiver has entered the wrong code.\n +const String ERR_WRONG_CODE_SENDER = """Oops.. +The receiver has entered the wrong code. Please try sending the file again"""; const String ERR_INTERRUPTION_CANCELLATION_RECEIVER = diff --git a/lib/constants/asset_path.dart b/lib/constants/asset_path.dart index c785c90e..e991ab00 100644 --- a/lib/constants/asset_path.dart +++ b/lib/constants/asset_path.dart @@ -6,7 +6,7 @@ const String MONTSERRAT_SEMI_BOLD = 'MontserratSemiBold'; const String MONTSERRAT_EXTRA_BOLD = 'MontserratExtraBold'; const String MONTSERRAT_MEDIUM = 'MontserratMedium'; const String MONTSERRAT_LIGHT_ITALIC = 'MontserratLightItalic'; - +const String COURIER = 'Courier'; //images const String LOGO = 'assets/images/logo.png'; const String DEVICE_TO_DEVICE_IMG = 'assets/images/Device2Device.png'; diff --git a/lib/views/desktop/receive/receive.dart b/lib/views/desktop/receive/receive.dart index c14a852d..8492f215 100644 --- a/lib/views/desktop/receive/receive.dart +++ b/lib/views/desktop/receive/receive.dart @@ -86,7 +86,9 @@ class ReceiveScreen extends StatelessWidget { Widget receiveError() { return Consumer(builder: (context, state, _) { return DTErrorUI( - text: state.errorMessage ?? "Unknown error", + errorTitle: state.errorTitle, + error: '', + errorMessage: state.errorMessage ?? UNKNOWN_ERROR, onPressed: () { state.reset(); }, @@ -115,8 +117,9 @@ class ReceiveScreen extends StatelessWidget { Widget transferCancelled() { return Consumer(builder: (context, state, _) { return DTErrorUI( - text: ERR_INTERRUPTION_CANCELLATION_RECEIVER, - subText: 'Please try again.', + errorTitle: ERR_INTERRUPTION_CANCELLATION_RECEIVER, + error: state.error != null ? state.error : '', + errorMessage: state.errorMessage ?? UNKNOWN_ERROR, onPressed: () { state.reset(); }, @@ -127,7 +130,9 @@ class ReceiveScreen extends StatelessWidget { Widget transferRejected() { return Consumer(builder: (context, state, _) { return DTErrorUI( - text: 'The transfer was cancelled by the receiver.', + errorTitle: 'The transfer was cancelled by the receiver.', + error: state.error != null ? state.error : '', + errorMessage: state.errorMessage, onPressed: () { state.reset(); }, diff --git a/lib/views/desktop/send/send.dart b/lib/views/desktop/send/send.dart index ca94491a..ee6b1279 100644 --- a/lib/views/desktop/send/send.dart +++ b/lib/views/desktop/send/send.dart @@ -80,7 +80,9 @@ class SendScreen extends StatelessWidget { return Consumer(builder: (context, state, _) { return DTErrorUI( paddingTop: 80.0.h, - text: state.errorMessage ?? "Unknown error", + errorTitle: 'Please try again.', + error: state.error != null ? state.error?.error : '', + errorMessage: state.errorMessage ?? UNKNOWN_ERROR, showBoxDecoration: true, onPressed: () { state.reset(); @@ -94,8 +96,9 @@ class SendScreen extends StatelessWidget { return DTErrorUI( paddingTop: 80.0.h, showBoxDecoration: true, - text: ERR_INTERRUPTION_CANCELLATION_SENDER, - subText: 'Please try again.', + errorTitle: 'Please try again.', + error: state.error != null ? state.error?.error : '', + errorMessage: state.errorMessage, onPressed: () { state.reset(); }, @@ -108,7 +111,9 @@ class SendScreen extends StatelessWidget { return DTErrorUI( paddingTop: 80.0.h, showBoxDecoration: true, - text: 'The transfer was cancelled by the receiver.', + errorTitle: 'The transfer was cancelled by the receiver.', + error: state.error != null ? state.error?.error : '', + errorMessage: state.errorMessage, onPressed: () { state.reset(); }, diff --git a/lib/views/desktop/send/widgets/DTErrorUI.dart b/lib/views/desktop/send/widgets/DTErrorUI.dart index 57bb32d6..9467876c 100644 --- a/lib/views/desktop/send/widgets/DTErrorUI.dart +++ b/lib/views/desktop/send/widgets/DTErrorUI.dart @@ -2,23 +2,29 @@ import 'package:dart_wormhole_gui/config/theme/colors.dart'; import 'package:dart_wormhole_gui/views/desktop/widgets/DTButtonWithBackground.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import '../../../shared/util.dart'; +import '../../../../constants/app_constants.dart'; +import '../../../../constants/asset_path.dart'; +import '../../../../widgets/ExpandableTextBox.dart'; +import '../../../widgets/Heading.dart'; void doNothing() { print("Doing nothing with error UI button"); } class DTErrorUI extends StatelessWidget { - final String text; - final String subText; + final String? errorTitle; + final String? error; + final String? errorMessage; + final String buttonTitle; final double paddingTop; final void Function() onPressed; final bool? showBoxDecoration; DTErrorUI( - {this.text = '', - this.subText = '', + {this.errorTitle = '', + this.error = '', + this.errorMessage = '', this.showBoxDecoration = false, this.onPressed = doNothing, this.buttonTitle = '', @@ -37,15 +43,30 @@ class DTErrorUI extends StatelessWidget { : null, padding: EdgeInsets.only(left: 8.0.w, right: 8.0.w, top: paddingTop), child: Column(children: [ - ...convertErrorMessageIntoParagraphs(text, - Theme.of(context).textTheme.headline1, TextAlign.center, context), - Text( - subText, - style: Theme.of(context).textTheme.headline1, + Heading( + title: errorTitle, textAlign: TextAlign.center, + textStyle: TextStyle( + fontFamily: MONTSERRAT_MEDIUM, + fontSize: Theme.of(context).textTheme.headline1?.fontSize, + color: Theme.of(context).textTheme.headline1?.color), + ), + Heading( + marginTop: 20, + title: error, + isVisible: error != '', + textAlign: TextAlign.center, + textStyle: TextStyle( + fontSize: 20.0.sp, + fontFamily: Theme.of(context).textTheme.headline1?.fontFamily, + color: Theme.of(context).textTheme.headline1?.color, + )), + ExtensiveDesktopErrorExpandable( + error: this.error, + errorMessage: this.errorMessage, ), SizedBox( - height: 100.0.h, + height: this.error != '' ? 100.0.h : 16.0.h, ), DTButtonWithBackground( onPressed: onPressed, @@ -56,3 +77,52 @@ class DTErrorUI extends StatelessWidget { ])); } } + +class ExtensiveDesktopErrorExpandable extends StatelessWidget { + final String? error; + final String? errorMessage; + ExtensiveDesktopErrorExpandable({ + Key? key, + required this.error, + required this.errorMessage, + }) : super(key: key); + @override + Widget build(BuildContext context) { + if (error == '') + return Column( + children: [ + SizedBox( + height: 30.0.h, + ), + Heading( + title: SEE_DETAILS, + textStyle: TextStyle( + color: Theme.of(context).primaryColor, + fontSize: Theme.of(context).textTheme.subtitle1?.fontSize, + fontFamily: COURIER, + ), + ), + SizedBox(height: 4.0), + Row( + children: [ + Expanded(flex: 1, child: Container()), + Expanded( + flex: 10, + child: Container( + padding: EdgeInsets.fromLTRB(16.0, 0, 16.0, 0), + child: ExpandableTextBox( + showBorders: true, + errorMessage: errorMessage, + height: MediaQuery.of(context).size.height - 530.0.h, + fontSize: 17.0, + ), + )), + Expanded(flex: 1, child: Container()), + ], + ) + ], + ); + + return Container(); + } +} diff --git a/lib/views/mobile/receive/receive.dart b/lib/views/mobile/receive/receive.dart index e5fd3340..e5840651 100644 --- a/lib/views/mobile/receive/receive.dart +++ b/lib/views/mobile/receive/receive.dart @@ -83,7 +83,7 @@ class ReceiveScreen extends StatelessWidget { return Consumer(builder: (context, state, _) { return ErrorUI( errorTitle: state.errorTitle, - errorMessage: state.errorMessage ?? "Unknown error", + errorMessage: state.errorMessage ?? UNKNOWN_ERROR, error: state.error, actionText: "Receive a file", onPressed: () { diff --git a/lib/views/mobile/send/send.dart b/lib/views/mobile/send/send.dart index 6bfb5ec6..538e37af 100644 --- a/lib/views/mobile/send/send.dart +++ b/lib/views/mobile/send/send.dart @@ -59,8 +59,8 @@ class SendScreen extends StatelessWidget { return Consumer(builder: (context, state, _) { return ErrorUI( errorTitle: state.errorTitle, - errorMessage: state.errorMessage ?? "Unknown error", - error: state.error.toString(), + errorMessage: state.errorMessage ?? UNKNOWN_ERROR, + error: state.error != null ? state.error?.error : '', actionText: "Send a file", onPressed: () { state.reset(); diff --git a/lib/views/mobile/widgets/ErrorUI.dart b/lib/views/mobile/widgets/ErrorUI.dart index c7f6fedc..80a6a08e 100644 --- a/lib/views/mobile/widgets/ErrorUI.dart +++ b/lib/views/mobile/widgets/ErrorUI.dart @@ -1,7 +1,9 @@ +import 'package:dart_wormhole_gui/views/widgets/Heading.dart'; +import 'package:dart_wormhole_gui/widgets/ExpandableTextBox.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../../../constants/app_constants.dart'; import '../../../constants/asset_path.dart'; -import '../../shared/util.dart'; import 'buttons/ButtonWithBackground.dart'; class ErrorUI extends StatelessWidget { @@ -12,8 +14,8 @@ class ErrorUI extends StatelessWidget { final void Function() onPressed; ErrorUI( - {this.errorTitle, - this.error, + {this.errorTitle = "", + this.error = "", this.errorMessage, this.actionText = "", required this.onPressed, @@ -21,24 +23,76 @@ class ErrorUI extends StatelessWidget { : super(key: key); @override Widget build(BuildContext context) { - return Column(children: [ - ...convertErrorMessageIntoParagraphs( - errorMessage, - TextStyle( - fontSize: Theme.of(context).textTheme.headline6?.fontSize, - fontFamily: MONTSERRAT_LIGHT, - color: Theme.of(context).colorScheme.secondary, + return Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Column( + children: [ + Heading( + title: errorTitle ?? errorTitle.toString(), + textAlign: TextAlign.left, + textStyle: Theme.of(context).textTheme.subtitle1, ), - TextAlign.left, - context), - ButtonWithBackground( - width: 200.0.w, - height: 60.0.h, - title: actionText, - handleClicked: () { - onPressed(); - }, - fontSize: 18.0.sp), + Heading( + marginTop: 20, + title: error ?? error.toString(), + textAlign: TextAlign.center, + isVisible: error != '', + textStyle: TextStyle( + fontSize: 14.0.sp, + fontFamily: Theme.of(context).textTheme.subtitle2?.fontFamily, + color: Theme.of(context).textTheme.subtitle2?.color, + )), + SizedBox(height: 10.0), + ExtensiveMobileErrorExpandable( + error: this.error, + errorMessage: this.errorMessage, + ), + ], + ), + Container( + margin: EdgeInsets.only(bottom: 70.0.h), + child: ButtonWithBackground( + width: 200.0.w, + height: 60.0.h, + title: actionText, + handleClicked: () { + onPressed(); + }, + fontSize: 18.0.sp), + ) ]); } } + +class ExtensiveMobileErrorExpandable extends StatelessWidget { + final String? error; + final String? errorMessage; + ExtensiveMobileErrorExpandable({ + Key? key, + required this.error, + required this.errorMessage, + }) : super(key: key); + @override + Widget build(BuildContext context) { + if (error == '') + return Column( + children: [ + Heading( + title: SEE_DETAILS, + textStyle: TextStyle( + color: Theme.of(context).primaryColor, + fontSize: Theme.of(context).textTheme.subtitle1?.fontSize, + fontFamily: MONTSERRAT_THIN, + ), + ), + SizedBox(height: 4.0), + ExpandableTextBox( + showBorders: false, + errorMessage: errorMessage, + fontSize: 12.0, + ) + ], + ); + + return Container(); + } +} diff --git a/lib/views/widgets/Heading.dart b/lib/views/widgets/Heading.dart index 969c8e73..1d47cce0 100644 --- a/lib/views/widgets/Heading.dart +++ b/lib/views/widgets/Heading.dart @@ -7,6 +7,7 @@ class Heading extends StatelessWidget { final TextAlign textAlign; final double marginTop; final TextStyle? textStyle; + final bool? isVisible; Heading( {Key? key, this.title, @@ -14,10 +15,12 @@ class Heading extends StatelessWidget { this.path = '', this.textAlign = TextAlign.center, this.marginTop = 0, - this.textStyle}) + this.textStyle, + this.isVisible = true}) : super(key: key); @override Widget build(BuildContext context) { + if (isVisible == false) return Container(); if (subTitle == null) return Container( width: double.infinity, @@ -36,7 +39,6 @@ class Heading extends StatelessWidget { ], ), )); - return Row( children: [ Container( diff --git a/lib/widgets/ExpandableTextBox.dart b/lib/widgets/ExpandableTextBox.dart new file mode 100644 index 00000000..54e5b093 --- /dev/null +++ b/lib/widgets/ExpandableTextBox.dart @@ -0,0 +1,46 @@ +import 'package:dart_wormhole_gui/views/widgets/Heading.dart'; +import 'package:expand_widget/expand_widget.dart'; +import 'package:flutter/material.dart'; +import '../constants/asset_path.dart'; + +class ExpandableTextBox extends StatelessWidget { + final String? error; + final String? errorMessage; + final bool? showBorders; + final double? height; + final double? fontSize; + + ExpandableTextBox({ + Key? key, + this.error = '', + this.errorMessage = '', + this.showBorders = false, + this.height, + this.fontSize, + }) : super(key: key); + @override + Widget build(BuildContext context) { + return ExpandChild( + showBorders: showBorders, + expandedBGColor: Color(0xff1A1C2E), + arrowColor: Theme.of(context).primaryColor, + arrowSize: 40.0, + child: Container( + padding: EdgeInsets.all(16.0), + child: Container( + height: height, + child: SingleChildScrollView( + child: Column( + children: [ + Heading( + title: errorMessage ?? errorMessage.toString(), + textStyle: TextStyle( + color: Theme.of(context).textTheme.headline1?.color, + fontSize: fontSize, + fontFamily: COURIER, + ), + textAlign: TextAlign.left), + ], + ))))); + } +} diff --git a/pubspec.lock b/pubspec.lock index 44e8bb0b..a8224216 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -34,10 +34,10 @@ packages: description: path: "." ref: HEAD - resolved-ref: "6b1822cd01510f8a12e22376e2bdf49b31b8c8bd" + resolved-ref: "9dda94bfdbffe6fa0efc4453c075659ac2e3ac7f" url: "https://github.com/Ephenodrom/Dart-Basic-Utils" source: git - version: "4.2.2" + version: "4.3.0" boolean_selector: dependency: transitive description: @@ -121,7 +121,7 @@ packages: name: dart_console url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.1" dart_wormhole_william: dependency: "direct main" description: @@ -185,6 +185,15 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0+2" + expand_widget: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "0345379dd6d8cd89563074b0c9df47d93b53c5aa" + url: "https://github.com/shareef-dweikat/expand_widget" + source: git + version: "2.1.0" fake_async: dependency: transitive description: @@ -236,7 +245,7 @@ packages: name: flutter_plugin_android_lifecycle url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.7" flutter_screenutil: dependency: "direct main" description: @@ -299,12 +308,19 @@ packages: description: flutter source: sdk version: "0.0.0" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" intro_slider: dependency: "direct main" description: path: "." ref: HEAD - resolved-ref: "483ee6aaea66e5993c22e28c3110a033a2f07299" + resolved-ref: "23a25d41fcb13f4971ceedef88e6755631d00cb2" url: "https://github.com/shareef-dweikat/flutter-intro-slider" source: git version: "3.0.2" @@ -321,7 +337,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.5.0" + version: "4.6.0" logging: dependency: transitive description: @@ -419,7 +435,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.15" + version: "2.0.16" path_provider_ios: dependency: transitive description: @@ -696,7 +712,7 @@ packages: description: path: "plugins/window_size" ref: HEAD - resolved-ref: "5c51870ced62a00e809ba4b81a846a052d241c9f" + resolved-ref: "12decbe0f592e14e03223f6f2c0c7e0e2dbd70a1" url: "https://github.com/google/flutter-desktop-embedding.git" source: git version: "0.1.0" diff --git a/pubspec.yaml b/pubspec.yaml index dcad2d25..c32e569b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,9 @@ dependencies: intro_slider: git: url: https://github.com/shareef-dweikat/flutter-intro-slider + expand_widget: + git: + url: https://github.com/shareef-dweikat/expand_widget flutter: sdk: flutter @@ -107,6 +110,9 @@ flutter: - family: Lato fonts: - asset: assets/fonts/Lato/Lato-Regular.ttf + - family: Courier + fonts: + - asset: assets/fonts/Courier/CourierPrime-Regular.ttf # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class.