Ads and Appointment Module Progress
parent
b766157d7f
commit
d412383aad
@ -1,302 +0,0 @@
|
||||
import 'package:collection/collection.dart' show IterableExtension;
|
||||
import 'package:country_code_picker/country_code_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CustomCountryCodePicker extends StatefulWidget {
|
||||
final bool isTextNeeded;
|
||||
final ValueChanged<CountryCode>? onChanged;
|
||||
final ValueChanged<CountryCode?>? onInit;
|
||||
final String? initialSelection;
|
||||
final List<String> favorite;
|
||||
final TextStyle? textStyle;
|
||||
final EdgeInsetsGeometry padding;
|
||||
final bool showCountryOnly;
|
||||
final InputDecoration searchDecoration;
|
||||
final TextStyle? searchStyle;
|
||||
final TextStyle? dialogTextStyle;
|
||||
final WidgetBuilder? emptySearchBuilder;
|
||||
final Function(CountryCode?)? builder;
|
||||
final bool enabled;
|
||||
final TextOverflow textOverflow;
|
||||
final Icon closeIcon;
|
||||
|
||||
/// Barrier color of ModalBottomSheet
|
||||
final Color? barrierColor;
|
||||
|
||||
/// Background color of ModalBottomSheet
|
||||
final Color? backgroundColor;
|
||||
|
||||
/// BoxDecoration for dialog
|
||||
final BoxDecoration? boxDecoration;
|
||||
|
||||
/// the size of the selection dialog
|
||||
final Size? dialogSize;
|
||||
|
||||
/// Background color of selection dialog
|
||||
final Color? dialogBackgroundColor;
|
||||
|
||||
/// used to customize the country list
|
||||
final List<String>? countryFilter;
|
||||
|
||||
/// shows the name of the country instead of the dialcode
|
||||
final bool showOnlyCountryWhenClosed;
|
||||
|
||||
/// aligns the flag and the Text left
|
||||
///
|
||||
/// additionally this option also fills the available space of the widget.
|
||||
/// this is especially useful in combination with [showOnlyCountryWhenClosed],
|
||||
/// because longer country names are displayed in one line
|
||||
final bool alignLeft;
|
||||
|
||||
/// shows the flag
|
||||
final bool showFlag;
|
||||
|
||||
final bool hideMainText;
|
||||
|
||||
final bool? showFlagMain;
|
||||
|
||||
final bool? showFlagDialog;
|
||||
|
||||
/// Width of the flag images
|
||||
final double flagWidth;
|
||||
|
||||
/// Use this property to change the order of the options
|
||||
final Comparator<CountryCode>? comparator;
|
||||
|
||||
/// Set to true if you want to hide the search part
|
||||
final bool hideSearch;
|
||||
|
||||
/// Set to true if you want to show drop down button
|
||||
final bool showDropDownButton;
|
||||
|
||||
/// [BoxDecoration] for the flag image
|
||||
final Decoration? flagDecoration;
|
||||
|
||||
/// An optional argument for injecting a list of countries
|
||||
/// with customized codes.
|
||||
final List<Map<String, String>> countryList;
|
||||
|
||||
const CustomCountryCodePicker({
|
||||
this.isTextNeeded = true,
|
||||
this.onChanged,
|
||||
this.onInit,
|
||||
this.initialSelection,
|
||||
this.favorite = const [],
|
||||
this.textStyle,
|
||||
this.padding = const EdgeInsets.all(8.0),
|
||||
this.showCountryOnly = false,
|
||||
this.searchDecoration = const InputDecoration(),
|
||||
this.searchStyle,
|
||||
this.dialogTextStyle,
|
||||
this.emptySearchBuilder,
|
||||
this.showOnlyCountryWhenClosed = false,
|
||||
this.alignLeft = false,
|
||||
this.showFlag = true,
|
||||
this.showFlagDialog,
|
||||
this.hideMainText = false,
|
||||
this.showFlagMain,
|
||||
this.flagDecoration,
|
||||
this.builder,
|
||||
this.flagWidth = 32.0,
|
||||
this.enabled = true,
|
||||
this.textOverflow = TextOverflow.ellipsis,
|
||||
this.barrierColor,
|
||||
this.backgroundColor,
|
||||
this.boxDecoration,
|
||||
this.comparator,
|
||||
this.countryFilter,
|
||||
this.hideSearch = false,
|
||||
this.showDropDownButton = false,
|
||||
this.dialogSize,
|
||||
this.dialogBackgroundColor,
|
||||
this.closeIcon = const Icon(Icons.close),
|
||||
this.countryList = codes,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
// ignore: no_logic_in_create_state
|
||||
State<StatefulWidget> createState() {
|
||||
List<Map<String, String>> jsonList = countryList;
|
||||
|
||||
List<CountryCode> elements = jsonList.map((json) => CountryCode.fromJson(json)).toList();
|
||||
|
||||
if (comparator != null) {
|
||||
elements.sort(comparator);
|
||||
}
|
||||
|
||||
if (countryFilter != null && countryFilter!.isNotEmpty) {
|
||||
final uppercaseCustomList = countryFilter!.map((criteria) => criteria.toUpperCase()).toList();
|
||||
elements = elements.where((criteria) => uppercaseCustomList.contains(criteria.code) || uppercaseCustomList.contains(criteria.name) || uppercaseCustomList.contains(criteria.dialCode)).toList();
|
||||
}
|
||||
|
||||
return CustomCountryCodePickerState(elements);
|
||||
}
|
||||
}
|
||||
|
||||
class CustomCountryCodePickerState extends State<CustomCountryCodePicker> {
|
||||
CountryCode? selectedItem;
|
||||
List<CountryCode> elements = [];
|
||||
List<CountryCode> favoriteElements = [];
|
||||
|
||||
CustomCountryCodePickerState(this.elements);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Widget internalWidget;
|
||||
if (widget.builder != null) {
|
||||
internalWidget = InkWell(
|
||||
onTap: showCountryCodePickerDialog,
|
||||
child: widget.builder!(selectedItem),
|
||||
);
|
||||
} else {
|
||||
internalWidget = TextButton(
|
||||
onPressed: widget.enabled ? showCountryCodePickerDialog : null,
|
||||
child: Padding(
|
||||
padding: widget.padding,
|
||||
child: Flex(
|
||||
direction: Axis.horizontal,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
if (widget.showFlagMain != null ? widget.showFlagMain! : widget.showFlag)
|
||||
Flexible(
|
||||
flex: widget.alignLeft ? 0 : 1,
|
||||
fit: widget.alignLeft ? FlexFit.tight : FlexFit.loose,
|
||||
child: Container(
|
||||
clipBehavior: widget.flagDecoration == null ? Clip.none : Clip.hardEdge,
|
||||
decoration: widget.flagDecoration,
|
||||
margin: widget.alignLeft ? const EdgeInsets.only(right: 16.0, left: 8.0) : const EdgeInsets.only(right: 16.0),
|
||||
child: Image.asset(
|
||||
selectedItem!.flagUri!,
|
||||
package: 'country_code_picker',
|
||||
width: widget.flagWidth,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (!widget.hideMainText)
|
||||
Flexible(
|
||||
fit: widget.alignLeft ? FlexFit.tight : FlexFit.loose,
|
||||
child: Text(
|
||||
widget.showOnlyCountryWhenClosed ? selectedItem!.toCountryStringOnly() : selectedItem.toString(),
|
||||
style: widget.textStyle ?? Theme.of(context).textTheme.labelLarge,
|
||||
overflow: widget.textOverflow,
|
||||
),
|
||||
),
|
||||
if (widget.showDropDownButton)
|
||||
Flexible(
|
||||
flex: widget.alignLeft ? 0 : 1,
|
||||
fit: widget.alignLeft ? FlexFit.tight : FlexFit.loose,
|
||||
child: Padding(
|
||||
padding: widget.alignLeft ? const EdgeInsets.only(right: 16.0, left: 8.0) : const EdgeInsets.only(right: 16.0),
|
||||
child: Icon(
|
||||
Icons.arrow_drop_down,
|
||||
color: Colors.grey,
|
||||
size: widget.flagWidth,
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return internalWidget;
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
|
||||
elements = elements.map((element) => element.localize(context)).toList();
|
||||
_onInit(selectedItem);
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(CustomCountryCodePicker oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
|
||||
if (oldWidget.initialSelection != widget.initialSelection) {
|
||||
if (widget.initialSelection != null) {
|
||||
selectedItem = elements.firstWhere(
|
||||
(criteria) =>
|
||||
(criteria.code!.toUpperCase() == widget.initialSelection!.toUpperCase()) ||
|
||||
(criteria.dialCode == widget.initialSelection) ||
|
||||
(criteria.name!.toUpperCase() == widget.initialSelection!.toUpperCase()),
|
||||
orElse: () => elements[0]);
|
||||
} else {
|
||||
selectedItem = elements[0];
|
||||
}
|
||||
_onInit(selectedItem);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
if (widget.initialSelection != null) {
|
||||
selectedItem = elements.firstWhere(
|
||||
(item) =>
|
||||
(item.code!.toUpperCase() == widget.initialSelection!.toUpperCase()) ||
|
||||
(item.dialCode == widget.initialSelection) ||
|
||||
(item.name!.toUpperCase() == widget.initialSelection!.toUpperCase()),
|
||||
orElse: () => elements[0]);
|
||||
} else {
|
||||
selectedItem = elements[0];
|
||||
}
|
||||
|
||||
favoriteElements = elements
|
||||
.where((item) =>
|
||||
widget.favorite.firstWhereOrNull((criteria) => item.code!.toUpperCase() == criteria.toUpperCase() || item.dialCode == criteria || item.name!.toUpperCase() == criteria.toUpperCase()) !=
|
||||
null)
|
||||
.toList();
|
||||
}
|
||||
|
||||
void showCountryCodePickerDialog() async {
|
||||
final item = await showDialog(
|
||||
barrierColor: widget.barrierColor ?? Colors.grey.withOpacity(0.5),
|
||||
context: context,
|
||||
builder: (context) => Center(
|
||||
child: Dialog(
|
||||
child: SelectionDialog(
|
||||
elements,
|
||||
favoriteElements,
|
||||
showCountryOnly: widget.showCountryOnly,
|
||||
emptySearchBuilder: widget.emptySearchBuilder,
|
||||
searchDecoration: widget.searchDecoration,
|
||||
searchStyle: widget.searchStyle,
|
||||
textStyle: widget.dialogTextStyle,
|
||||
boxDecoration: widget.boxDecoration,
|
||||
showFlag: widget.showFlagDialog ?? widget.showFlag,
|
||||
flagWidth: widget.flagWidth,
|
||||
size: widget.dialogSize,
|
||||
backgroundColor: widget.dialogBackgroundColor,
|
||||
barrierColor: widget.barrierColor,
|
||||
hideSearch: widget.hideSearch,
|
||||
closeIcon: widget.closeIcon,
|
||||
flagDecoration: widget.flagDecoration,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
if (item != null) {
|
||||
setState(() {
|
||||
selectedItem = item;
|
||||
});
|
||||
|
||||
_publishSelection(item);
|
||||
}
|
||||
}
|
||||
|
||||
void _publishSelection(CountryCode countryCode) {
|
||||
if (widget.onChanged != null) {
|
||||
widget.onChanged!(countryCode);
|
||||
}
|
||||
}
|
||||
|
||||
void _onInit(CountryCode? countryCode) {
|
||||
if (widget.onInit != null) {
|
||||
widget.onInit!(countryCode);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/utils/AppPermissionHandler.dart';
|
||||
|
||||
|
||||
|
||||
Future<ConfirmAction?> showConfirmDialogs(
|
||||
context, msg, positiveText, negativeText) async {
|
||||
return showDialog<ConfirmAction>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
backgroundColor: Colors.white,
|
||||
title: Text(msg, style: TextStyle(fontSize: 16)),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: Text(
|
||||
negativeText,
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(ConfirmAction.CANCEL);
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(
|
||||
positiveText,
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(ConfirmAction.ACCEPT);
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/utils/AppPermissionHandler.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart';
|
||||
|
||||
Future<ConfirmAction?> showConfirmDialogs(context, msg, positiveText, negativeText) async {
|
||||
return showDialog<ConfirmAction>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
backgroundColor: Colors.white,
|
||||
title: Text(msg, style: TextStyle(fontSize: 16)),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: Text(
|
||||
negativeText,
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(ConfirmAction.CANCEL);
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(
|
||||
positiveText,
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(ConfirmAction.ACCEPT);
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void actionConfirmationBottomSheet({required BuildContext context, required Widget title, required subtitle, required Widget actionButtonYes, required Widget actionButtonNo}) {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
enableDrag: true,
|
||||
builder: (BuildContext context) {
|
||||
return InfoBottomSheet(
|
||||
title: title,
|
||||
description: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
"$subtitle".toText(fontSize: 16),
|
||||
25.height,
|
||||
Row(
|
||||
children: [
|
||||
actionButtonYes,
|
||||
20.width,
|
||||
actionButtonNo,
|
||||
],
|
||||
),
|
||||
19.height,
|
||||
],
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue