ente/mobile/lib/ui/common/email_input.dart
2024-11-05 11:47:23 +05:30

130 lines
4.7 KiB
Dart

import 'package:flutter/material.dart';
import "package:photos/generated/l10n.dart";
import "package:photos/models/api/collection/user.dart";
import "package:photos/theme/ente_theme.dart";
import "package:photos/ui/components/captioned_text_widget.dart";
import "package:photos/ui/components/divider_widget.dart";
import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart";
import "package:photos/ui/sharing/user_avator_widget.dart";
class EmailInputField extends StatelessWidget {
final List<String> suggestions;
final ValueChanged<String>? onChanged;
final ValueChanged<String>? onSelected;
final String? initialValue;
const EmailInputField({
super.key,
required this.suggestions,
this.onChanged,
this.onSelected,
this.initialValue,
});
@override
Widget build(BuildContext context) {
return Autocomplete<String>(
initialValue:
initialValue != null ? TextEditingValue(text: initialValue!) : null,
optionsBuilder: (TextEditingValue textEditingValue) {
if (textEditingValue.text == '') {
return const Iterable<String>.empty();
}
return suggestions.where((String option) {
return option
.toLowerCase()
.contains(textEditingValue.text.toLowerCase());
});
},
onSelected: onSelected,
fieldViewBuilder: (
BuildContext context,
TextEditingController controller,
FocusNode focusNode,
VoidCallback onFieldSubmitted,
) {
return TextFormField(
controller: controller,
focusNode: focusNode,
onChanged: onChanged,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderRadius: const BorderRadius.all(Radius.circular(8.0)),
borderSide:
BorderSide(color: getEnteColorScheme(context).strokeMuted),
),
fillColor: getEnteColorScheme(context).fillFaint,
filled: true,
hintText: S.of(context).enterEmail,
contentPadding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 14,
),
border: UnderlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(8),
),
),
);
},
optionsViewBuilder: (
BuildContext context,
AutocompleteOnSelected<String> onSelected,
Iterable<String> options,
) {
return Align(
alignment: Alignment.topLeft,
child: Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Material(
elevation: 4,
borderRadius: BorderRadius.circular(8),
child: Container(
constraints: const BoxConstraints(maxHeight: 160),
width: MediaQuery.of(context).size.width -
16, // Adjust padding as needed
child: ListView.builder(
padding: EdgeInsets.zero,
physics: const ClampingScrollPhysics(),
shrinkWrap: true,
itemCount: options.length,
itemBuilder: (BuildContext context, int index) {
final String option = options.elementAt(index);
return Column(
children: [
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: option,
),
leadingIconSize: 24.0,
leadingIconWidget: UserAvatarWidget(
User(email: option, id: option.hashCode),
),
menuItemColor: getEnteColorScheme(context).fillFaint,
pressedColor: getEnteColorScheme(context).fillFaint,
trailingIcon: null,
onTap: () async {
onSelected(option);
},
isTopBorderRadiusRemoved: index > 0,
isBottomBorderRadiusRemoved: index < (options.length),
),
(index == (options.length - 1))
? const SizedBox.shrink()
: DividerWidget(
dividerType: DividerType.menu,
bgColor: getEnteColorScheme(context).fillFaint,
),
],
);
},
),
),
),
),
);
},
);
}
}