2023-09-23 22:19:53 -04:00
|
|
|
import 'package:awesome_extensions/awesome_extensions.dart';
|
2023-07-24 09:31:51 -04:00
|
|
|
import 'package:blurry_modal_progress_hud/blurry_modal_progress_hud.dart';
|
2023-07-26 14:20:29 -04:00
|
|
|
import 'package:flutter/material.dart';
|
2023-07-24 09:31:51 -04:00
|
|
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
2023-08-04 01:00:38 -04:00
|
|
|
import 'package:flutter_translate/flutter_translate.dart';
|
2023-08-02 21:09:28 -04:00
|
|
|
import 'package:motion_toast/motion_toast.dart';
|
2023-07-28 20:36:05 -04:00
|
|
|
import 'package:quickalert/quickalert.dart';
|
2023-07-23 23:13:21 -04:00
|
|
|
|
2023-08-02 21:09:28 -04:00
|
|
|
import 'theme_service.dart';
|
|
|
|
|
2023-07-23 23:13:21 -04:00
|
|
|
extension BorderExt on Widget {
|
2023-07-26 15:58:38 -04:00
|
|
|
DecoratedBox debugBorder() => DecoratedBox(
|
|
|
|
decoration: BoxDecoration(border: Border.all(color: Colors.redAccent)),
|
|
|
|
child: this);
|
2023-07-23 23:13:21 -04:00
|
|
|
}
|
2023-07-24 09:31:51 -04:00
|
|
|
|
|
|
|
extension ModalProgressExt on Widget {
|
2023-08-02 21:09:28 -04:00
|
|
|
BlurryModalProgressHUD withModalHUD(BuildContext context, bool isLoading) {
|
|
|
|
final theme = Theme.of(context);
|
|
|
|
final scale = theme.extension<ScaleScheme>()!;
|
|
|
|
|
|
|
|
return BlurryModalProgressHUD(
|
|
|
|
inAsyncCall: isLoading,
|
|
|
|
blurEffectIntensity: 4,
|
|
|
|
progressIndicator: buildProgressIndicator(context),
|
|
|
|
color: scale.tertiaryScale.appBackground.withAlpha(64),
|
|
|
|
child: this);
|
|
|
|
}
|
2023-07-24 09:31:51 -04:00
|
|
|
}
|
2023-07-28 20:36:05 -04:00
|
|
|
|
2023-08-02 21:09:28 -04:00
|
|
|
Widget buildProgressIndicator(BuildContext context) {
|
|
|
|
final theme = Theme.of(context);
|
|
|
|
final scale = theme.extension<ScaleScheme>()!;
|
|
|
|
return SpinKitFoldingCube(
|
|
|
|
color: scale.tertiaryScale.background,
|
|
|
|
size: 80,
|
|
|
|
);
|
|
|
|
}
|
2023-07-28 20:36:05 -04:00
|
|
|
|
|
|
|
Widget waitingPage(BuildContext context) => ColoredBox(
|
|
|
|
color: Theme.of(context).scaffoldBackgroundColor,
|
|
|
|
child: Center(child: buildProgressIndicator(context)));
|
|
|
|
|
|
|
|
Future<void> showErrorModal(
|
|
|
|
BuildContext context, String title, String text) async {
|
|
|
|
await QuickAlert.show(
|
|
|
|
context: context,
|
|
|
|
type: QuickAlertType.error,
|
|
|
|
title: title,
|
|
|
|
text: text,
|
|
|
|
//backgroundColor: Colors.black,
|
|
|
|
//titleColor: Colors.white,
|
|
|
|
//textColor: Colors.white,
|
|
|
|
);
|
|
|
|
}
|
2023-08-02 21:09:28 -04:00
|
|
|
|
|
|
|
void showErrorToast(BuildContext context, String message) {
|
|
|
|
MotionToast.error(
|
2023-08-04 01:00:38 -04:00
|
|
|
title: Text(translate('toast.error')),
|
|
|
|
description: Text(message),
|
|
|
|
).show(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
void showInfoToast(BuildContext context, String message) {
|
|
|
|
MotionToast.info(
|
|
|
|
title: Text(translate('toast.info')),
|
2023-08-02 21:09:28 -04:00
|
|
|
description: Text(message),
|
|
|
|
).show(context);
|
|
|
|
}
|
2023-09-23 22:19:53 -04:00
|
|
|
|
|
|
|
Widget styledTitleContainer(
|
|
|
|
{required BuildContext context,
|
|
|
|
required String title,
|
|
|
|
required Widget child}) {
|
|
|
|
final theme = Theme.of(context);
|
|
|
|
final scale = theme.extension<ScaleScheme>()!;
|
|
|
|
final textTheme = theme.textTheme;
|
|
|
|
|
2023-09-24 15:30:54 -04:00
|
|
|
return DecoratedBox(
|
2023-09-23 22:19:53 -04:00
|
|
|
decoration: ShapeDecoration(
|
2023-09-24 15:30:54 -04:00
|
|
|
color: scale.primaryScale.border,
|
2023-09-23 22:19:53 -04:00
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(16),
|
|
|
|
)),
|
|
|
|
child: Column(children: [
|
|
|
|
Text(
|
|
|
|
title,
|
|
|
|
style: textTheme.titleMedium!
|
|
|
|
.copyWith(color: scale.primaryScale.subtleText),
|
2023-09-24 15:30:54 -04:00
|
|
|
).paddingLTRB(8, 8, 8, 8),
|
2023-09-23 22:19:53 -04:00
|
|
|
DecoratedBox(
|
|
|
|
decoration: ShapeDecoration(
|
|
|
|
color: scale.primaryScale.subtleBackground,
|
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(16),
|
|
|
|
)),
|
|
|
|
child: child)
|
|
|
|
.paddingAll(4)
|
|
|
|
.expanded()
|
|
|
|
]));
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<T?> showStyledDialog<T>(
|
|
|
|
{required BuildContext context,
|
|
|
|
required String title,
|
|
|
|
required Widget child}) async {
|
|
|
|
final theme = Theme.of(context);
|
|
|
|
final scale = theme.extension<ScaleScheme>()!;
|
|
|
|
final textTheme = theme.textTheme;
|
|
|
|
|
|
|
|
return showDialog<T>(
|
|
|
|
context: context,
|
|
|
|
builder: (context) => AlertDialog(
|
|
|
|
elevation: 0,
|
|
|
|
shape: const RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.all(Radius.circular(16)),
|
|
|
|
),
|
|
|
|
contentPadding: const EdgeInsets.all(4),
|
|
|
|
backgroundColor: scale.primaryScale.border,
|
|
|
|
title: Text(
|
|
|
|
title,
|
|
|
|
style: textTheme.titleMedium,
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
),
|
|
|
|
titlePadding: const EdgeInsets.fromLTRB(4, 4, 4, 4),
|
|
|
|
content: DecoratedBox(
|
|
|
|
decoration: ShapeDecoration(
|
|
|
|
color: scale.primaryScale.border,
|
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(16))),
|
|
|
|
child: DecoratedBox(
|
|
|
|
decoration: ShapeDecoration(
|
2023-09-24 15:30:54 -04:00
|
|
|
color: scale.primaryScale.appBackground,
|
2023-09-23 22:19:53 -04:00
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(12))),
|
|
|
|
child: child.paddingAll(0)))));
|
|
|
|
}
|