diff --git a/packages/dart_client/lib/src/api/websocket.dart b/packages/dart_client/lib/src/api/websocket.dart index 7d904a12..a8288573 100644 --- a/packages/dart_client/lib/src/api/websocket.dart +++ b/packages/dart_client/lib/src/api/websocket.dart @@ -14,7 +14,11 @@ import 'web_socket_channel_stub.dart' if (dart.library.html) 'web_socket_channel_html.dart' if (dart.library.io) 'web_socket_channel_io.dart'; +/// Typedef which exposes an [Event] as the only parameter. typedef EventHandler = void Function(Event); + +/// Typedef used for connecting to a websocket. Method returns a [WebSocketChannel] +/// and accepts a connection [url] and an optional [Iterable] of `protocols`. typedef ConnectWebSocket = WebSocketChannel Function(String url, {Iterable protocols}); @@ -236,7 +240,9 @@ class WebSocket { try { await connect(); - } catch (e) {} + } catch (e) { + logger.log(Level.SEVERE, e.toString()); + } await Future.delayed( Duration(seconds: min(_retryAttempt * 5, 25)), () { diff --git a/packages/dart_client/lib/src/client.dart b/packages/dart_client/lib/src/client.dart index 4e0743ff..7e024c69 100644 --- a/packages/dart_client/lib/src/client.dart +++ b/packages/dart_client/lib/src/client.dart @@ -13,6 +13,7 @@ import 'package:stream_chat/src/models/channel_model.dart'; import 'package:stream_chat/src/models/own_user.dart'; import 'package:stream_chat/version.dart'; import 'package:uuid/uuid.dart'; +import 'package:pedantic/pedantic.dart' show unawaited; import 'api/channel.dart'; import 'api/connection_status.dart'; @@ -25,8 +26,15 @@ import 'models/event.dart'; import 'models/message.dart'; import 'models/user.dart'; +/// Handler function used for logging records. Function requires a single [LogRecord] +/// as the only parameter. typedef LogHandlerFunction = void Function(LogRecord record); + +/// Used for decoding [Map] data to a generic type `T`. typedef DecoderFunction = T Function(Map); + +/// A function which can be used to request a Stream Chat API token from your +/// own backend server. Function requires a single [userId]. typedef TokenProvider = Future Function(String userId); /// The key used to save the userId to sharedPreferences @@ -462,7 +470,7 @@ class Client { if (value == ConnectionStatus.connected && state.channels?.isNotEmpty == true) { - queryChannels(filter: { + unawaited (queryChannels(filter: { 'cid': { '\$in': state.channels.keys.toList(), }, @@ -474,7 +482,7 @@ class Client { online: true, )); }, - ); + )); } else { _synced = false; } @@ -712,7 +720,7 @@ class Client { } } - _parseError(DioError error) { + dynamic _parseError(DioError error) { if (error.type == DioErrorType.RESPONSE) { final apiError = ApiError(error.response?.data, error.response?.statusCode); diff --git a/packages/dart_client/lib/src/db/shared/native_db.dart b/packages/dart_client/lib/src/db/shared/native_db.dart index 38a1923e..deee5b08 100644 --- a/packages/dart_client/lib/src/db/shared/native_db.dart +++ b/packages/dart_client/lib/src/db/shared/native_db.dart @@ -1,3 +1,4 @@ +//ignore_for_file: public_member_api_docs import 'dart:io'; import 'dart:isolate'; import 'package:flutter/material.dart'; @@ -9,7 +10,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:stream_chat/src/db/offline_storage.dart'; class SharedDB { - static constructDatabase(dbName) async { + static Future constructDatabase(dbName) async { final dir = await getApplicationDocumentsDirectory(); final path = join(dir.path, dbName); final file = File(path); diff --git a/packages/dart_client/lib/src/db/shared/unsupported_db.dart b/packages/dart_client/lib/src/db/shared/unsupported_db.dart index 9d4ef84f..bbb4ccb7 100644 --- a/packages/dart_client/lib/src/db/shared/unsupported_db.dart +++ b/packages/dart_client/lib/src/db/shared/unsupported_db.dart @@ -1,3 +1,5 @@ +//ignore_for_file: public_member_api_docs +//ignore_for_file: always_declare_return_types class SharedDB { static constructDatabase(dbName) async { print('Unsupported Platform'); diff --git a/packages/dart_client/lib/src/db/shared/web_db.dart b/packages/dart_client/lib/src/db/shared/web_db.dart index bd579280..f79c224a 100644 --- a/packages/dart_client/lib/src/db/shared/web_db.dart +++ b/packages/dart_client/lib/src/db/shared/web_db.dart @@ -1,3 +1,5 @@ +//ignore_for_file: public_member_api_docs +//ignore_for_file: always_declare_return_types import 'package:moor/moor_web.dart'; import 'package:stream_chat/src/db/offline_storage.dart'; diff --git a/packages/flutter_widgets/example/lib/chat_info_screen.dart b/packages/flutter_widgets/example/lib/chat_info_screen.dart index 5eb0df7d..4106b96e 100644 --- a/packages/flutter_widgets/example/lib/chat_info_screen.dart +++ b/packages/flutter_widgets/example/lib/chat_info_screen.dart @@ -1,4 +1,3 @@ -import 'package:emojis/emojis.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; diff --git a/packages/flutter_widgets/example/lib/group_info_screen.dart b/packages/flutter_widgets/example/lib/group_info_screen.dart index cac6fc9c..253901c9 100644 --- a/packages/flutter_widgets/example/lib/group_info_screen.dart +++ b/packages/flutter_widgets/example/lib/group_info_screen.dart @@ -907,8 +907,6 @@ class _GroupInfoScreenState extends State { ); } - void _showRemoveUserModal(User user) {} - Widget _buildConnectedTitleState(User user) { var alternativeWidget; diff --git a/packages/flutter_widgets/example/lib/main.dart b/packages/flutter_widgets/example/lib/main.dart index 2c2c5bab..460a80a3 100644 --- a/packages/flutter_widgets/example/lib/main.dart +++ b/packages/flutter_widgets/example/lib/main.dart @@ -115,7 +115,7 @@ class _HomePageState extends State { return [ BottomNavigationBarItem( icon: Stack( - overflow: Overflow.visible, + clipBehavior: Clip.none, children: [ StreamSvgIcon.message( color: _isSelected(0) @@ -133,7 +133,7 @@ class _HomePageState extends State { ), BottomNavigationBarItem( icon: Stack( - overflow: Overflow.visible, + clipBehavior: Clip.none, children: [ StreamSvgIcon.mentions( color: _isSelected(1) diff --git a/packages/flutter_widgets/example/lib/routes/app_routes.dart b/packages/flutter_widgets/example/lib/routes/app_routes.dart index 20725b26..0c8a899f 100644 --- a/packages/flutter_widgets/example/lib/routes/app_routes.dart +++ b/packages/flutter_widgets/example/lib/routes/app_routes.dart @@ -79,6 +79,9 @@ class AppRoutes { builder: (_) { return GroupInfoScreen(); }); + // Default case, should not reach here. + default: + return null; } } } diff --git a/packages/flutter_widgets/example/pubspec.yaml b/packages/flutter_widgets/example/pubspec.yaml index 38c25b65..b4d32fa0 100644 --- a/packages/flutter_widgets/example/pubspec.yaml +++ b/packages/flutter_widgets/example/pubspec.yaml @@ -8,8 +8,7 @@ environment: dependencies: flutter: sdk: flutter - stream_chat_flutter: - path: ../ + stream_chat_flutter: 0.2.13+1 flutter_apns: ^1.4.1 flutter_local_notifications: ^2.0.2 flutter_svg: ^0.19.1 diff --git a/packages/flutter_widgets/lib/src/channel_file_display_screen.dart b/packages/flutter_widgets/lib/src/channel_file_display_screen.dart index c6132609..d5aef38c 100644 --- a/packages/flutter_widgets/lib/src/channel_file_display_screen.dart +++ b/packages/flutter_widgets/lib/src/channel_file_display_screen.dart @@ -160,8 +160,6 @@ class _ChannelFileDisplayScreenState extends State { ), child: ListView.builder( itemBuilder: (context, position) { - var channel = StreamChannel.of(context).channel; - return Padding( padding: const EdgeInsets.all(1.0), child: Padding( diff --git a/packages/flutter_widgets/lib/src/channel_list_view.dart b/packages/flutter_widgets/lib/src/channel_list_view.dart index 2de00c0e..61a0aabb 100644 --- a/packages/flutter_widgets/lib/src/channel_list_view.dart +++ b/packages/flutter_widgets/lib/src/channel_list_view.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:ui' as ui; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/packages/flutter_widgets/lib/src/image_footer.dart b/packages/flutter_widgets/lib/src/image_footer.dart index 8d4ca8b5..75e6bb73 100644 --- a/packages/flutter_widgets/lib/src/image_footer.dart +++ b/packages/flutter_widgets/lib/src/image_footer.dart @@ -1,7 +1,5 @@ import 'dart:async'; import 'dart:io'; -import 'dart:math'; -import 'dart:typed_data'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:chewie/chewie.dart'; @@ -9,8 +7,6 @@ import 'package:dio/dio.dart'; import 'package:esys_flutter_share/esys_flutter_share.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:image_gallery_saver/image_gallery_saver.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_flutter/src/stream_chat_theme.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; @@ -58,15 +54,16 @@ class ImageFooter extends StatefulWidget implements PreferredSizeWidget { } class _ImageFooterState extends State { + //ignore:unused_field bool _userSearchMode = false; TextEditingController _searchController; final TextEditingController _messageController = TextEditingController(); final FocusNode _messageFocusNode = FocusNode(); + //ignore:unused_field String _channelNameQuery; final List _selectedChannels = []; - bool _loading = false; Timer _debounce; @@ -311,95 +308,6 @@ class _ImageFooterState extends State { ); } - Widget _buildShareTextInputSection(modalSetState) { - return Align( - alignment: Alignment.bottomCenter, - child: BottomAppBar( - child: Container( - height: 40.0, - margin: const EdgeInsets.symmetric( - vertical: 8, - horizontal: 8, - ), - child: _loading - ? Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: CircularProgressIndicator(), - ), - ) - : Row( - children: [ - Expanded( - child: TextField( - controller: _messageController, - focusNode: _messageFocusNode, - onChanged: (val) { - modalSetState(() {}); - }, - onTap: () { - modalSetState(() {}); - setState(() {}); - }, - decoration: InputDecoration( - prefixText: ' ', - hintText: 'Add a comment', - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(24.0), - borderSide: BorderSide( - color: StreamChatTheme.of(context) - .colorTheme - .black - .withOpacity(0.16), - ), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(24.0), - borderSide: BorderSide( - color: StreamChatTheme.of(context) - .colorTheme - .black - .withOpacity(0.16), - )), - contentPadding: const EdgeInsets.all(0), - ), - ), - ), - SizedBox(width: 8), - IconTheme( - data: StreamChatTheme.of(context) - .channelTheme - .messageInputButtonIconTheme, - child: IconButton( - onPressed: () async { - modalSetState(() => _loading = true); - await sendMessage(); - modalSetState(() => _loading = false); - }, - splashRadius: 24, - visualDensity: VisualDensity.compact, - constraints: BoxConstraints.tightFor( - height: 24, - width: 24, - ), - padding: EdgeInsets.zero, - icon: Transform.rotate( - angle: -pi / 2, - child: StreamSvgIcon.Icon_send_message( - color: StreamChatTheme.of(context) - .colorTheme - .accentBlue, - ), - ), - ), - ), - ], - ), - ), - ), - ); - } - /// Sends the current message Future sendMessage() async { var text = _messageController.text.trim(); @@ -420,25 +328,6 @@ class _ImageFooterState extends State { _selectedChannels.clear(); Navigator.pop(context); } - - Future _saveImage(String url) async { - var response = await Dio() - .get(url, options: Options(responseType: ResponseType.bytes)); - final result = await ImageGallerySaver.saveImage( - Uint8List.fromList(response.data), - quality: 60, - name: "${DateTime.now().millisecondsSinceEpoch}"); - return result; - } - - Future _saveVideo(String url) async { - var appDocDir = await getTemporaryDirectory(); - var savePath = - appDocDir.path + "/${DateTime.now().millisecondsSinceEpoch}.mp4"; - await Dio().download(url, savePath); - final result = await ImageGallerySaver.saveFile(savePath); - print(result); - } } /// Used for clipping textfield prefix icon diff --git a/packages/flutter_widgets/lib/src/message_input.dart b/packages/flutter_widgets/lib/src/message_input.dart index 22a36882..6fafb5d8 100644 --- a/packages/flutter_widgets/lib/src/message_input.dart +++ b/packages/flutter_widgets/lib/src/message_input.dart @@ -798,6 +798,8 @@ class MessageInputState extends State { ? StreamChatTheme.of(context).colorTheme.black.withOpacity(0.2) : StreamChatTheme.of(context).colorTheme.black.withOpacity(0.5); break; + default: + return Colors.black; } } @@ -1014,6 +1016,8 @@ class MessageInputState extends State { ); }); break; + default: + return SizedBox(); } } @@ -1038,6 +1042,7 @@ class MessageInputState extends State { final mediaInfo = await CompressVideoService.compressVideo(file.path); if (mediaInfo.filesize / (1024 * 1024) > _kMaxAttachmentSize) { + // ignore: deprecated_member_use Scaffold.of(context).showSnackBar( SnackBar( content: Text( @@ -1058,6 +1063,7 @@ class MessageInputState extends State { path: mediaInfo.path, ); } else { + // ignore: deprecated_member_use Scaffold.of(context).showSnackBar( SnackBar( content: Text( @@ -1110,6 +1116,7 @@ class MessageInputState extends State { }); print(e); print(s); + // ignore: deprecated_member_use Scaffold.of(context).showSnackBar( SnackBar( content: Text('Error adding the attachment: $e'), @@ -2013,6 +2020,7 @@ class MessageInputState extends State { attachment.file = file; }); } else { + // ignore: deprecated_member_use Scaffold.of(context).showSnackBar( SnackBar( content: Text( diff --git a/packages/flutter_widgets/lib/src/message_reactions_modal.dart b/packages/flutter_widgets/lib/src/message_reactions_modal.dart index e09e21db..1ee3486d 100644 --- a/packages/flutter_widgets/lib/src/message_reactions_modal.dart +++ b/packages/flutter_widgets/lib/src/message_reactions_modal.dart @@ -220,7 +220,7 @@ class MessageReactionsModal extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Stack( - overflow: Overflow.visible, + clipBehavior: Clip.none, children: [ UserAvatar( onTap: onUserAvatarTap, diff --git a/packages/flutter_widgets/lib/src/option_list_tile.dart b/packages/flutter_widgets/lib/src/option_list_tile.dart index 1b87c9d7..61ce939e 100644 --- a/packages/flutter_widgets/lib/src/option_list_tile.dart +++ b/packages/flutter_widgets/lib/src/option_list_tile.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/src/stream_chat_theme.dart'; -import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; class OptionListTile extends StatelessWidget { final String title; diff --git a/packages/flutter_widgets/lib/src/user_list_view.dart b/packages/flutter_widgets/lib/src/user_list_view.dart index 6197a06e..c5bac576 100644 --- a/packages/flutter_widgets/lib/src/user_list_view.dart +++ b/packages/flutter_widgets/lib/src/user_list_view.dart @@ -524,6 +524,7 @@ abstract class ListItem { final user = (this as ListUserItem).user; return 'USER-${user.id}'; } + return null; } Widget when({ @@ -536,6 +537,7 @@ abstract class ListItem { if (this is ListUserItem) { return userItem((this as ListUserItem).user); } + return SizedBox(); } } diff --git a/packages/flutter_widgets/lib/src/utils.dart b/packages/flutter_widgets/lib/src/utils.dart index d1dec9c8..20e78a24 100644 --- a/packages/flutter_widgets/lib/src/utils.dart +++ b/packages/flutter_widgets/lib/src/utils.dart @@ -9,7 +9,7 @@ Future launchURL(BuildContext context, String url) async { if (await canLaunch(url)) { await launch(url); } else { - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Cannot launch the url'), ),