2023-11-19 11:49:15 +00:00
|
|
|
import 'dart:async';
|
|
|
|
|
2021-04-15 07:05:41 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2022-05-20 22:46:47 +00:00
|
|
|
import 'package:flutter/services.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
|
2022-02-15 08:25:13 +00:00
|
|
|
import 'package:device_info_plus/device_info_plus.dart';
|
2021-04-15 07:05:41 +00:00
|
|
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
import 'package:matrix/matrix.dart';
|
2021-04-15 07:05:41 +00:00
|
|
|
|
2021-11-09 20:32:16 +00:00
|
|
|
import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart';
|
|
|
|
import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart';
|
2023-11-19 11:49:15 +00:00
|
|
|
import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart';
|
2023-01-07 09:29:34 +00:00
|
|
|
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
import 'package:fluffychat/utils/fluffy_share.dart';
|
2022-05-03 14:32:00 +00:00
|
|
|
import 'package:fluffychat/utils/platform_infos.dart';
|
2021-10-26 16:50:34 +00:00
|
|
|
import 'package:fluffychat/utils/url_launcher.dart';
|
|
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
|
|
|
2021-04-15 07:05:41 +00:00
|
|
|
class NewPrivateChat extends StatefulWidget {
|
2023-10-28 11:03:16 +00:00
|
|
|
const NewPrivateChat({super.key});
|
2021-10-14 16:09:30 +00:00
|
|
|
|
2021-04-15 07:05:41 +00:00
|
|
|
@override
|
|
|
|
NewPrivateChatController createState() => NewPrivateChatController();
|
|
|
|
}
|
|
|
|
|
|
|
|
class NewPrivateChatController extends State<NewPrivateChat> {
|
2021-11-13 17:09:16 +00:00
|
|
|
final TextEditingController controller = TextEditingController();
|
|
|
|
final FocusNode textFieldFocus = FocusNode();
|
2022-05-20 22:46:47 +00:00
|
|
|
|
2023-11-21 11:01:18 +00:00
|
|
|
Future<List<Profile>>? searchResponse;
|
2021-04-15 07:05:41 +00:00
|
|
|
|
2023-11-19 11:49:15 +00:00
|
|
|
Timer? _searchCoolDown;
|
2021-08-24 12:15:35 +00:00
|
|
|
|
2023-11-19 11:49:15 +00:00
|
|
|
static const Duration _coolDown = Duration(milliseconds: 500);
|
2021-04-15 07:05:41 +00:00
|
|
|
|
2023-11-19 11:49:15 +00:00
|
|
|
void searchUsers([String? input]) async {
|
|
|
|
final searchTerm = input ?? controller.text;
|
|
|
|
if (searchTerm.isEmpty) {
|
|
|
|
_searchCoolDown?.cancel();
|
|
|
|
setState(() {
|
|
|
|
searchResponse = _searchCoolDown = null;
|
|
|
|
});
|
|
|
|
return;
|
2021-04-15 07:05:41 +00:00
|
|
|
}
|
2023-11-19 11:49:15 +00:00
|
|
|
|
|
|
|
_searchCoolDown?.cancel();
|
|
|
|
_searchCoolDown = Timer(_coolDown, () {
|
|
|
|
setState(() {
|
2023-11-21 11:01:18 +00:00
|
|
|
searchResponse = _searchUser(searchTerm);
|
2023-11-19 11:49:15 +00:00
|
|
|
});
|
|
|
|
});
|
2021-04-15 07:05:41 +00:00
|
|
|
}
|
|
|
|
|
2023-11-21 11:01:18 +00:00
|
|
|
Future<List<Profile>> _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;
|
|
|
|
}
|
|
|
|
|
2023-08-11 12:07:51 +00:00
|
|
|
void inviteAction() => FluffyShare.shareInviteLink(context);
|
2021-04-15 07:05:41 +00:00
|
|
|
|
2021-08-23 16:36:13 +00:00
|
|
|
void openScannerAction() async {
|
2022-05-03 14:31:51 +00:00
|
|
|
if (PlatformInfos.isAndroid) {
|
|
|
|
final info = await DeviceInfoPlugin().androidInfo;
|
2022-11-03 14:37:40 +00:00
|
|
|
if (info.version.sdkInt < 21) {
|
2022-05-03 14:31:51 +00:00
|
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
|
|
SnackBar(
|
|
|
|
content: Text(
|
|
|
|
L10n.of(context)!.unsupportedAndroidVersionLong,
|
|
|
|
),
|
2022-02-20 09:35:37 +00:00
|
|
|
),
|
2022-05-03 14:31:51 +00:00
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
2022-02-20 09:35:37 +00:00
|
|
|
}
|
2023-01-07 09:29:34 +00:00
|
|
|
await showAdaptiveBottomSheet(
|
2021-08-23 16:36:13 +00:00
|
|
|
context: context,
|
2023-11-01 08:53:59 +00:00
|
|
|
builder: (_) => QrScannerModal(
|
|
|
|
onScan: (link) => UrlLauncher(context, link).openMatrixToUrl(),
|
|
|
|
),
|
2021-08-23 16:36:13 +00:00
|
|
|
);
|
|
|
|
}
|
2021-08-22 19:19:22 +00:00
|
|
|
|
2023-11-19 11:49:15 +00:00
|
|
|
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,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
|
2021-04-15 07:05:41 +00:00
|
|
|
@override
|
2021-05-22 07:13:47 +00:00
|
|
|
Widget build(BuildContext context) => NewPrivateChatView(this);
|
2021-04-15 07:05:41 +00:00
|
|
|
}
|