148 lines
4.3 KiB
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),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
} |