import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart'; import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart'; import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/matrix.dart'; class NewPrivateChat extends StatefulWidget { const NewPrivateChat({super.key}); @override NewPrivateChatController createState() => NewPrivateChatController(); } class NewPrivateChatController extends State { final TextEditingController controller = TextEditingController(); final FocusNode textFieldFocus = FocusNode(); Future>? searchResponse; Timer? _searchCoolDown; static const Duration _coolDown = Duration(milliseconds: 500); void searchUsers([String? input]) async { final searchTerm = input ?? controller.text; if (searchTerm.isEmpty) { _searchCoolDown?.cancel(); setState(() { searchResponse = _searchCoolDown = null; }); return; } _searchCoolDown?.cancel(); _searchCoolDown = Timer(_coolDown, () { setState(() { searchResponse = _searchUser(searchTerm); }); }); } Future> _searchUser(String searchTerm) async { final result = await Matrix.of(context).client.searchUserDirectory(searchTerm); final profiles = result.results; if (searchTerm.isValidMatrixId && searchTerm.sigil == '@' && !profiles.any((profile) => profile.userId == searchTerm)) { profiles.add(Profile(userId: searchTerm)); } return profiles; } void inviteAction() => FluffyShare.shareInviteLink(context); void openScannerAction() async { if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; if (info.version.sdkInt < 21) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( L10n.of(context)!.unsupportedAndroidVersionLong, ), ), ); return; } } await showAdaptiveBottomSheet( context: context, builder: (_) => QrScannerModal( onScan: (link) => UrlLauncher(context, link).openMatrixToUrl(), ), ); } void copyUserId() async { await Clipboard.setData( ClipboardData(text: Matrix.of(context).client.userID!), ); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(L10n.of(context)!.copiedToClipboard)), ); } void openUserModal(Profile profile) => showAdaptiveBottomSheet( context: context, builder: (c) => UserBottomSheet( profile: profile, outerContext: context, ), ); @override Widget build(BuildContext context) => NewPrivateChatView(this); }