import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.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/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'; import '../../widgets/adaptive_dialogs/user_dialog.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); Future 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); Future 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(), ), ); } Future 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) => UserDialog.show(context: context, profile: profile); @override Widget build(BuildContext context) => NewPrivateChatView(this); }