Houshan-Basa/lib/ui/widgets/components/snackbar/snackbar_manager.dart

137 lines
4.1 KiB
Dart

// ignore_for_file: use_build_context_synchronously
import 'package:another_flushbar/flushbar.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:hoshan/core/routes/route_generator.dart';
import 'package:hoshan/data/snackbar_messages_model.dart';
import 'package:hoshan/ui/theme/colors.dart';
import 'package:hoshan/ui/theme/responsive.dart';
import 'package:hoshan/ui/theme/text.dart';
List<SnackbarMessagesModel> snackBarMessages = [];
enum SnackBarStatus { info, success, error }
class SnackBarManager {
BuildContext context;
String? id;
SnackBarManager(this.context, {this.id});
show(
{required final String message,
final SnackBarStatus? status,
Color? backgroundColor,
Color? borderColor,
final Widget? btns,
final bool isTop = true}) {
if (snackBarMessages.any(
(element) => element.id == id,
)) {
return;
}
switch (status) {
case SnackBarStatus.success:
borderColor = AppColors.green[50];
backgroundColor = AppColors.green.defaultShade;
break;
case SnackBarStatus.error:
borderColor = AppColors.red[50];
backgroundColor = AppColors.red.defaultShade;
break;
case SnackBarStatus.info:
borderColor = AppColors.primaryColor[50];
backgroundColor = AppColors.primaryColor.defaultShade;
break;
default:
borderColor = borderColor ?? Theme.of(context).colorScheme.onSurface;
backgroundColor =
backgroundColor ?? Theme.of(context).colorScheme.surface;
}
final flush = Flushbar(
textDirection: TextDirection.rtl,
backgroundColor: backgroundColor,
borderColor: borderColor,
messageText: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (btns != null) btns,
Expanded(
child: Text(
message,
style: AppTextStyles.body4.copyWith(
color: status == null
? Theme.of(context).colorScheme.onSurface
: Colors.white),
textDirection: TextDirection.rtl,
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
),
],
),
flushbarPosition: isTop ? FlushbarPosition.TOP : FlushbarPosition.BOTTOM,
flushbarStyle: FlushbarStyle.FLOATING,
dismissDirection: FlushbarDismissDirection.HORIZONTAL,
isDismissible: true,
animationDuration: const Duration(milliseconds: 300),
margin: const EdgeInsets.all(16),
borderRadius: BorderRadius.circular(16),
maxWidth: Responsive(context).isDesktop()
? 800
: Responsive(context).isTablet()
? 400
: null,
duration: const Duration(seconds: 3),
onStatusChanged: (status) {
if (status == FlushbarStatus.DISMISSED) {
snackBarMessages.removeWhere(
(element) => element.id == id,
);
}
},
)..show(context);
if (id != null) {
snackBarMessages.add(SnackbarMessagesModel(id: id!, flushbar: flush));
}
}
showCompleteProfileAlert({bool isTop = true}) {
show(
isTop: isTop,
status: SnackBarStatus.info,
message: 'ابتدا باید پروفایل خود را تکمیل کنید',
btns: GestureDetector(
onTap: () {
if (id != null) {
dismiss(id!);
}
context.go(Routes.editProfile);
},
child: Text(
'ویرایش پروفایل',
style: AppTextStyles.body6.copyWith(
color: AppColors.red.defaultShade, fontWeight: FontWeight.bold),
),
));
}
static dismiss(String id) {
final message = snackBarMessages.firstWhere(
(element) => element.id == id,
);
message.flushbar.dismiss();
snackBarMessages.removeWhere(
(element) => element.id == id,
);
}
static dismissAll() {
for (final message in snackBarMessages) {
message.flushbar.dismiss();
}
snackBarMessages.clear();
}
}