MIF_E31222379_MOBILE/lib/widget/showmodal.dart

148 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:rijig_mobile/core/router.dart';
import 'package:rijig_mobile/core/utils/guide.dart';
enum ModalVariant { textVersion, imageVersion }
class CustomModalDialog extends StatelessWidget {
final ModalVariant variant;
final String title;
final String content;
final String? imageAsset;
final int buttonCount;
final Widget? button1;
final Widget? button2;
// Parameter boolean untuk mengontrol tampilan close icon
final bool showCloseIcon;
const CustomModalDialog({
super.key,
required this.variant,
required this.title,
required this.content,
this.imageAsset,
this.buttonCount = 0,
this.button1,
this.button2,
this.showCloseIcon = true, // Default true untuk backward compatibility
});
static void show({
required BuildContext context,
required ModalVariant variant,
required String title,
required String content,
String? imageAsset,
int buttonCount = 0,
Widget? button1,
Widget? button2,
bool showCloseIcon = true, // Parameter baru di static method
}) {
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: 'Dismiss',
barrierColor: Colors.black54,
transitionDuration: const Duration(milliseconds: 190),
pageBuilder: (_, __, ___) => const SizedBox.shrink(),
transitionBuilder: (_, animation, __, child) {
return Transform.scale(
scale: animation.value,
child: Opacity(
opacity: animation.value,
child: Center(
child: Dialog(
backgroundColor: Colors.transparent,
insetPadding: const EdgeInsets.symmetric(
horizontal: 24,
vertical: 24,
),
child: CustomModalDialog(
variant: variant,
title: title,
content: content,
imageAsset: imageAsset,
buttonCount: buttonCount,
button1: button1,
button2: button2,
showCloseIcon: showCloseIcon, // Pass parameter ke constructor
),
),
),
),
);
},
);
}
@override
Widget build(BuildContext context) {
final modalContent = Container(
padding: PaddingCustom().paddingHorizontalVertical(20, 24),
margin: const EdgeInsets.only(top: 30),
decoration: BoxDecoration(
color: whiteColor,
borderRadius: BorderRadius.circular(24),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (variant == ModalVariant.imageVersion && imageAsset != null)
Padding(
padding: PaddingCustom().paddingOnly(bottom: 20),
child: Image.asset(
imageAsset!,
width: MediaQuery.of(context).size.width * 0.6,
fit: BoxFit.contain,
),
),
Align(
alignment: Alignment.centerLeft,
child: Text(title, style: Tulisan.subheading(fontsize: 19)),
),
Gap(8),
Align(
alignment: Alignment.centerLeft,
child: Text(content, style: Tulisan.customText(fontsize: 14)),
),
Gap(24),
if (buttonCount == 1 && button1 != null) button1!,
if (buttonCount == 2 && button1 != null && button2 != null)
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded(child: button2!),
Gap(16),
Expanded(child: button1!),
],
),
],
),
);
return Stack(
clipBehavior: Clip.none,
children: [
modalContent,
// Kondisional untuk menampilkan close icon
if (showCloseIcon)
Positioned(
top: -15,
right: 5,
child: GestureDetector(
onTap: () => router.pop(),
child: CircleAvatar(
radius: 18,
backgroundColor: whiteColor,
child: Icon(Icons.close, color: blackNavyColor),
),
),
),
],
);
}
}