import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/oracle_code_provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import '../../../extensions/text_extensions.dart'; import '../../../models/service_request/spare_parts.dart'; import '../../../new_views/app_style/app_text_style.dart'; class AssetAutoCompleteField extends StatefulWidget { final String initialValue; final num? assetId; final bool clearAfterPick, byName; final Function(AssetNDAutoCompleteByDynamicCodesModel) onPick; const AssetAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true}) : super(key: key); @override _AssetAutoCompleteFieldState createState() => _AssetAutoCompleteFieldState(); } class _AssetAutoCompleteFieldState extends State { late OracleCodeProvider _oracleCodeProvider; late TextEditingController _controller; bool loading = false; @override void initState() { _controller = TextEditingController(text: widget.initialValue); super.initState(); _oracleCodeProvider = Provider.of(context, listen: false); } @override void didUpdateWidget(covariant AssetAutoCompleteField oldWidget) { if (widget.initialValue != oldWidget.initialValue) { _controller = TextEditingController(text: widget.initialValue); } super.didUpdateWidget(oldWidget); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); return Container( decoration: BoxDecoration( color: AppColor.background(context), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), child: Autocomplete( optionsBuilder: (TextEditingValue textEditingValue) async { if (textEditingValue.text.isEmpty) { if (loading) { setState(() { loading = false; }); } return const Iterable.empty(); } if (!loading) { setState(() { loading = true; }); } List workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text)); setState(() { loading = false; }); return workOrders; }, displayStringForOption: (AssetNDAutoCompleteByDynamicCodesModel option) => widget.byName ? option.displayName ?? "" : option.codeValue ?? "", fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { return TextField( controller: _controller, focusNode: fieldFocusNode, style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), textAlign: TextAlign.start, decoration: InputDecoration( border: border, disabledBorder: border, focusedBorder: border, enabledBorder: border, errorBorder: border, contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth), constraints: const BoxConstraints(), suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8), filled: true, fillColor: AppColor.fieldBgColor(context), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), labelText: context.translation.oracleCode, labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, ), textInputAction: TextInputAction.search, onChanged: (text) { fieldTextEditingController.text = text; }, onSubmitted: (String value) { onFieldSubmitted(); }, ); }, onSelected: (AssetNDAutoCompleteByDynamicCodesModel selection) { if (widget.clearAfterPick) { _controller.clear(); } else { _controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? ""); } widget.onPick(selection); }, ), ); } }