From e969e25e9e05f1254b56a65f0a25745d97c24efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 4 Jun 2023 21:25:56 +0200 Subject: [PATCH] Added user search in talk, currently with no further functionality --- .../autocomplete/autocompleteApi.dart | 37 +++++++ .../autocomplete/autocompleteResponse.dart | 30 ++++++ .../autocomplete/autocompleteResponse.g.dart | 46 +++++++++ .../talk/setReadMarker/setReadMarker.dart | 2 +- .../setReadMarker/setReadMarkerParams.dart | 3 +- lib/view/pages/talk/chatList.dart | 14 ++- lib/view/pages/talk/joinChat.dart | 98 +++++++++++++++++++ 7 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 lib/api/marianumcloud/autocomplete/autocompleteApi.dart create mode 100644 lib/api/marianumcloud/autocomplete/autocompleteResponse.dart create mode 100644 lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart create mode 100644 lib/view/pages/talk/joinChat.dart diff --git a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart new file mode 100644 index 0000000..3618b97 --- /dev/null +++ b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:http/http.dart' as http; +import 'package:http/http.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'autocompleteResponse.dart'; + +class AutocompleteApi { + Future find(String query) async { + log("query starting"); + var preferences = await SharedPreferences.getInstance(); + Map getParameters = { + "search": query, + "itemType": " ", + "itemId": " ", + "shareTypes[]": ["0"], + "limit": "10", + }; + + Map headers = {}; + headers.putIfAbsent("Accept", () => "application/json"); + headers.putIfAbsent("OCS-APIRequest", () => "true"); + + Uri endpoint = Uri.https("${preferences.getString("username")!}:${preferences.getString("password")!}@cloud.marianum-fulda.de", "/ocs/v2.php/core/autocomplete/get", getParameters); + log(endpoint.query); + + Response response = await http.get(endpoint, headers: headers); + log(response.statusCode.toString()); + String result = response.body; + log(result); + + return AutocompleteResponse.fromJson(jsonDecode(result)['ocs']); + } + +} \ No newline at end of file diff --git a/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart b/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart new file mode 100644 index 0000000..8677726 --- /dev/null +++ b/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart @@ -0,0 +1,30 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'autocompleteResponse.g.dart'; + +@JsonSerializable(explicitToJson: true) +class AutocompleteResponse { + List data; + + AutocompleteResponse(this.data); + + factory AutocompleteResponse.fromJson(Map json) => _$AutocompleteResponseFromJson(json); + Map toJson() => _$AutocompleteResponseToJson(this); +} + +@JsonSerializable() +class AutocompleteResponseObject { + String id; + String label; + String? icon; + String? source; + List? status; + String? subline; + String? shareWithDisplayNameUniqe; + + AutocompleteResponseObject(this.id, this.label, this.icon, this.source, this.status, + this.subline, this.shareWithDisplayNameUniqe); + + factory AutocompleteResponseObject.fromJson(Map json) => _$AutocompleteResponseObjectFromJson(json); + Map toJson() => _$AutocompleteResponseObjectToJson(this); +} \ No newline at end of file diff --git a/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart b/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart new file mode 100644 index 0000000..e029e0e --- /dev/null +++ b/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'autocompleteResponse.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AutocompleteResponse _$AutocompleteResponseFromJson( + Map json) => + AutocompleteResponse( + (json['data'] as List) + .map((e) => + AutocompleteResponseObject.fromJson(e as Map)) + .toList(), + ); + +Map _$AutocompleteResponseToJson( + AutocompleteResponse instance) => + { + 'data': instance.data.map((e) => e.toJson()).toList(), + }; + +AutocompleteResponseObject _$AutocompleteResponseObjectFromJson( + Map json) => + AutocompleteResponseObject( + json['id'] as String, + json['label'] as String, + json['icon'] as String?, + json['source'] as String?, + (json['status'] as List?)?.map((e) => e as String).toList(), + json['subline'] as String?, + json['shareWithDisplayNameUniqe'] as String?, + ); + +Map _$AutocompleteResponseObjectToJson( + AutocompleteResponseObject instance) => + { + 'id': instance.id, + 'label': instance.label, + 'icon': instance.icon, + 'source': instance.source, + 'status': instance.status, + 'subline': instance.subline, + 'shareWithDisplayNameUniqe': instance.shareWithDisplayNameUniqe, + }; diff --git a/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart b/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart index 68593f4..ec31cfd 100644 --- a/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart +++ b/lib/api/marianumcloud/talk/setReadMarker/setReadMarker.dart @@ -1,9 +1,9 @@ import 'package:http/http.dart' as http; import 'package:http/http.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; import '../talkApi.dart'; +import 'setReadMarkerParams.dart'; class SetReadMarker extends TalkApi { String chatToken; diff --git a/lib/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart b/lib/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart index 7bacd17..58ac2a8 100644 --- a/lib/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart +++ b/lib/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart @@ -1,5 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:marianum_mobile/api/apiParams.dart'; + +import '../../../apiParams.dart'; part 'setReadMarkerParams.g.dart'; diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index b674b4a..600816f 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -2,20 +2,21 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/leaveRoom/leaveRoom.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/setReadMarker/setReadMarker.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart'; +import '../../../api/marianumcloud/talk/leaveRoom/leaveRoom.dart'; import '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; import '../../../api/marianumcloud/talk/setFavorite/setFavorite.dart'; +import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart'; +import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; import '../../../model/chatList/chatListProps.dart'; import '../../../widget/confirmDialog.dart'; import '../../../widget/unimplementedDialog.dart'; import 'chatView.dart'; +import 'joinChat.dart'; class ChatList extends StatefulWidget { const ChatList({Key? key}) : super(key: key); @@ -59,6 +60,13 @@ class _ChatListState extends State { ) ], ), + floatingActionButton: FloatingActionButton( + backgroundColor: Theme.of(context).primaryColor, + onPressed: () { + showSearch(context: context, delegate: JoinChat()); + }, + child: const Icon(Icons.add_comment_outlined), + ), body: Consumer( builder: (context, data, child) { diff --git a/lib/view/pages/talk/joinChat.dart b/lib/view/pages/talk/joinChat.dart new file mode 100644 index 0000000..fb58e9f --- /dev/null +++ b/lib/view/pages/talk/joinChat.dart @@ -0,0 +1,98 @@ +import 'dart:developer'; + +import 'package:async/async.dart'; +import 'package:flutter/material.dart'; + +import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart'; +import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart'; +import '../../../widget/errorView.dart'; + +class JoinChat extends SearchDelegate { + CancelableOperation? future; + + @override + List? buildActions(BuildContext context) { + return [ + if(future != null && query.isNotEmpty) FutureBuilder( + future: future!.value, + builder: (context, snapshot) { + if(snapshot.connectionState != ConnectionState.done) { + return Container( + padding: const EdgeInsets.all(10), + child: const Center( + child: SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + strokeWidth: 3, + ), + ), + ), + ); + } + return const SizedBox.shrink(); + }, + ), + if(query.isNotEmpty) IconButton(onPressed: () => query = "", icon: const Icon(Icons.delete)), + ]; + } + + @override + Widget? buildLeading(BuildContext context) { + return null; + } + + @override + Widget buildResults(BuildContext context) { + if(future != null) future!.cancel(); + + log("search started"); + if(query.isEmpty) { + return const ErrorView( + text: "Suche nach benutzern", + icon: Icons.person_search_outlined, + ); + } + + future = CancelableOperation.fromFuture(AutocompleteApi().find(query)); + return FutureBuilder( + future: future!.value, + builder: (context, snapshot) { + if(snapshot.hasData) { + return ListView.builder( + itemCount: snapshot.data!.data.length, + itemBuilder: (context, index) { + AutocompleteResponseObject object = snapshot.data!.data[index]; + CircleAvatar circleAvatar = CircleAvatar( + foregroundImage: Image.network("https://cloud.marianum-fulda.de/avatar/${object.id}/128").image, + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + child: const Icon(Icons.person), + ); + return ListTile( + leading: circleAvatar, + title: Text(object.label), + subtitle: Text(object.id), + trailing: const Icon(Icons.arrow_right), + onTap: () { + close(context, object.id); + }, + ); + } + ); + } else if(snapshot.hasError) { + log(snapshot.error.toString()); + return ErrorView(text: snapshot.error.toString()); + } + + return const Center(child: CircularProgressIndicator()); + }, + ); + } + + @override + Widget buildSuggestions(BuildContext context) { + return buildResults(context); + } + +} \ No newline at end of file