Merge branch 'master' into hotfix/video

This commit is contained in:
Deven Joshi
2021-02-03 14:04:15 +05:30
committed by GitHub
125 changed files with 476 additions and 6517 deletions
@@ -195,7 +195,7 @@ class _ChannelBottomSheetState extends State<ChannelBottomSheet> {
OptionListTile(
leading: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: StreamSvgIcon.close_small(
child: StreamSvgIcon.closeSmall(
color: StreamChatTheme.of(context).colorTheme.grey,
),
),
@@ -209,7 +209,7 @@ class _ChannelBottomSheetState extends State<ChannelBottomSheet> {
);
}
void _showDeleteDialog() async {
Future<void> _showDeleteDialog() async {
final res = await showConfirmationDialog(
context,
title: 'Delete Conversation',
@@ -227,7 +227,7 @@ class _ChannelBottomSheetState extends State<ChannelBottomSheet> {
}
}
void _showLeaveDialog() async {
Future<void> _showLeaveDialog() async {
final res = await showConfirmationDialog(
context,
title: 'Leave conversation',
@@ -89,8 +89,8 @@ class ChannelHeader extends StatelessWidget implements PreferredSizeWidget {
return ConnectionStatusBuilder(
statusBuilder: (context, status) {
String statusString = '';
bool showStatus = true;
var statusString = '';
var showStatus = true;
switch (status) {
case ConnectionStatus.connected:
@@ -82,8 +82,8 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget {
final user = _client.state.user;
return ConnectionStatusBuilder(
statusBuilder: (context, status) {
String statusString = '';
bool showStatus = true;
var statusString = '';
var showStatus = true;
switch (status) {
case ConnectionStatus.connected:
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:jiffy/jiffy.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import '../stream_chat_flutter.dart';
import 'channel_name.dart';
@@ -269,7 +269,7 @@ class ChannelPreview extends StatelessWidget {
TextStyle normalTextStyle,
TextStyle mentionsTextStyle) {
var textList = text.split(' ');
List<TextSpan> resList = [];
var resList = <TextSpan>[];
for (var e in textList) {
if (mentions != null &&
mentions.isNotEmpty &&
@@ -1,4 +1,5 @@
import 'dart:async';
import 'package:synchronized/synchronized.dart';
import 'package:video_compress/video_compress.dart';
@@ -16,5 +17,5 @@ class ICompressVideoService {
}
}
ICompressVideoService get CompressVideoService =>
ICompressVideoService get compressVideoService =>
ICompressVideoService.instance;
@@ -1,18 +1,20 @@
import 'package:emojis/emoji.dart';
import 'package:characters/characters.dart';
import 'package:emojis/emoji.dart';
final _emojis = Emoji.all();
/// String extension
extension StringExtension on String {
/// Returns the capitalized string
String capitalize() {
return "${this[0].toUpperCase()}${this.substring(1)}";
return '${this[0].toUpperCase()}${substring(1)}';
}
// Emojis guidelines
// 1 to 3 emojis: big size with no text bubble.
// 4+ emojis or emojis+text: standard size with text bubble.
bool get isOnlyEmoji {
final characters = this.trim().characters;
final characters = trim().characters;
if (characters.isEmpty) return false;
if (characters.length > 3) return false;
return characters.every((c) => _emojis.map((e) => e.char).contains(c));
@@ -3,10 +3,10 @@ import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter/src/utils.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:video_compress/video_compress.dart';
import 'package:video_player/video_player.dart';
@@ -110,7 +110,7 @@ class _FileAttachmentState extends State<FileAttachment> {
type: MaterialType.transparency,
child: widget.trailing ??
IconButton(
icon: StreamSvgIcon.cloud_download(
icon: StreamSvgIcon.cloudDownload(
color: StreamChatTheme.of(context).colorTheme.black,
),
padding: const EdgeInsets.all(8),
@@ -266,9 +266,9 @@ class VideoPackage {
_videoPlayerController.addListener(errorListener);
}
get videoPlayer => _videoPlayerController;
VideoPlayerController get videoPlayer => _videoPlayerController;
get chewieController => _chewieController;
ChewieController get chewieController => _chewieController;
void dispose() {
_videoPlayerController.dispose();
@@ -56,7 +56,7 @@ class ImageActionsModal extends StatelessWidget {
_buildButton(
context,
'Reply',
StreamSvgIcon.Icon_curve_line_left_up(
StreamSvgIcon.iconCurveLineLeftUp(
size: 24.0,
color: StreamChatTheme.of(context).colorTheme.grey,
),
@@ -76,7 +76,7 @@ class ImageActionsModal extends StatelessWidget {
_buildButton(
context,
'Save ${urls[currentIndex].type == 'video' ? 'Video' : 'Image'}',
StreamSvgIcon.Icon_save(
StreamSvgIcon.iconSave(
size: 24.0,
color: StreamChatTheme.of(context).colorTheme.grey,
),
@@ -167,14 +167,14 @@ class ImageActionsModal extends StatelessWidget {
final result = await ImageGallerySaver.saveImage(
Uint8List.fromList(response.data),
quality: 60,
name: "${DateTime.now().millisecondsSinceEpoch}");
name: '${DateTime.now().millisecondsSinceEpoch}');
return result;
}
Future<void> _saveVideo(String url) async {
var appDocDir = await getTemporaryDirectory();
var savePath =
appDocDir.path + "/${DateTime.now().millisecondsSinceEpoch}.mp4";
appDocDir.path + '/${DateTime.now().millisecondsSinceEpoch}.mp4';
await Dio().download(url, savePath);
final result = await ImageGallerySaver.saveFile(savePath);
print(result);
@@ -7,9 +7,9 @@ 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:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
class ImageFooter extends StatefulWidget implements PreferredSizeWidget {
/// Callback to call when pressing the back button.
@@ -54,36 +54,17 @@ class ImageFooter extends StatefulWidget implements PreferredSizeWidget {
}
class _ImageFooterState extends State<ImageFooter> {
//ignore:unused_field
bool _userSearchMode = false;
TextEditingController _searchController;
final TextEditingController _messageController = TextEditingController();
final FocusNode _messageFocusNode = FocusNode();
//ignore:unused_field
String _channelNameQuery;
final List<Channel> _selectedChannels = [];
Timer _debounce;
Function modalSetStateCallback;
void _userNameListener() {
if (_debounce?.isActive ?? false) _debounce.cancel();
_debounce = Timer(const Duration(milliseconds: 350), () {
if (mounted && modalSetStateCallback != null) {
modalSetStateCallback(() {
_channelNameQuery = _searchController.text;
});
}
});
}
@override
void initState() {
super.initState();
_searchController = TextEditingController()..addListener(_userNameListener);
_messageFocusNode.addListener(() {
setState(() {});
});
@@ -92,7 +73,6 @@ class _ImageFooterState extends State<ImageFooter> {
@override
void dispose() {
_searchController?.clear();
_searchController?.removeListener(_userNameListener);
_searchController?.dispose();
super.dispose();
}
@@ -113,7 +93,7 @@ class _ImageFooterState extends State<ImageFooter> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
icon: StreamSvgIcon.Icon_SHARE(
icon: StreamSvgIcon.iconShare(
size: 24.0,
color: StreamChatTheme.of(context).colorTheme.black,
),
@@ -151,7 +131,7 @@ class _ImageFooterState extends State<ImageFooter> {
),
),
IconButton(
icon: StreamSvgIcon.Icon_grid(
icon: StreamSvgIcon.iconGrid(
color: StreamChatTheme.of(context).colorTheme.black,
),
onPressed: () => _showPhotosModal(context),
@@ -174,9 +154,9 @@ class _ImageFooterState extends State<ImageFooter> {
backgroundColor: StreamChatTheme.of(context).colorTheme.white,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: const BorderRadius.only(
topLeft: const Radius.circular(16.0),
topRight: const Radius.circular(16.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0),
),
),
builder: (context) {
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'image_actions_modal.dart';
class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
@@ -63,7 +64,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
StreamChatTheme.of(context).channelTheme.channelHeaderTheme.color,
actions: <Widget>[
IconButton(
icon: StreamSvgIcon.Icon_menu_point_v(
icon: StreamSvgIcon.iconMenuPoint(
color: StreamChatTheme.of(context).colorTheme.black,
),
onPressed: () {
@@ -158,7 +158,7 @@ class _MediaListViewState extends State<MediaListView> {
final media = await assetList.getAssetListPaged(_currentPage, 50);
if (!media.isEmpty) {
if (media.isNotEmpty) {
setState(() {
_media.addAll(media);
});
@@ -1,14 +1,14 @@
import 'package:http_parser/http_parser.dart' as httpParser;
import 'package:http_parser/http_parser.dart' as http_parser;
import 'package:mime/mime.dart';
class MediaUtils {
static httpParser.MediaType getMimeType(String filename) {
httpParser.MediaType mimeType;
static http_parser.MediaType getMimeType(String filename) {
http_parser.MediaType mimeType;
if (filename != null) {
if (filename.toLowerCase().endsWith('heic')) {
mimeType = httpParser.MediaType.parse('image/heic');
mimeType = http_parser.MediaType.parse('image/heic');
} else {
mimeType = httpParser.MediaType.parse(lookupMimeType(filename));
mimeType = http_parser.MediaType.parse(lookupMimeType(filename));
}
}
@@ -9,12 +9,13 @@ import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/reaction_picker.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter/src/utils.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'extension.dart';
import 'message_input.dart';
import 'message_widget.dart';
import 'stream_chat.dart';
import 'stream_chat_theme.dart';
import 'extension.dart';
class MessageActionsModal extends StatefulWidget {
final Widget Function(BuildContext, Message) editMessageInputBuilder;
@@ -284,20 +285,22 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
setState(() {
_showActions = false;
});
var answer = await showConfirmationDialog(context,
title: 'Delete message',
icon: StreamSvgIcon.flag(
color: StreamChatTheme.of(context).colorTheme.accentRed,
size: 24.0,
),
question: 'Are you sure you want to permanently delete this\nmessage?',
okText: 'DELETE',
cancelText: 'CANCEL');
var answer = await showConfirmationDialog(
context,
title: 'Delete message',
icon: StreamSvgIcon.flag(
color: StreamChatTheme.of(context).colorTheme.accentRed,
size: 24.0,
),
question: 'Are you sure you want to permanently delete this\nmessage?',
okText: 'DELETE',
cancelText: 'CANCEL',
);
if (answer) {
try {
Navigator.pop(context);
StreamChat.of(context).client.deleteMessage(
await StreamChat.of(context).client.deleteMessage(
widget.message,
StreamChannel.of(context).channel.cid,
);
@@ -474,7 +477,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
padding: const EdgeInsets.symmetric(vertical: 11.0, horizontal: 16.0),
child: Row(
children: [
StreamSvgIcon.icon_flag(
StreamSvgIcon.iconFlag(
color: StreamChatTheme.of(context).primaryIconTheme.color,
),
const SizedBox(width: 16),
@@ -581,7 +584,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
padding: const EdgeInsets.symmetric(vertical: 11.0, horizontal: 16.0),
child: Row(
children: [
StreamSvgIcon.circle_up(
StreamSvgIcon.circleUp(
color: StreamChatTheme.of(context).colorTheme.accentBlue,
),
const SizedBox(width: 16),
@@ -636,7 +639,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
),
IconButton(
visualDensity: VisualDensity.compact,
icon: StreamSvgIcon.close_small(),
icon: StreamSvgIcon.closeSmall(),
onPressed: Navigator.of(context).pop,
),
],
@@ -9,17 +9,17 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:http_parser/http_parser.dart' as httpParser;
import 'package:http_parser/http_parser.dart' as http_parser;
import 'package:image_picker/image_picker.dart';
import 'package:mime/mime.dart';
import 'package:photo_manager/photo_manager.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/compress_video_service.dart';
import 'package:stream_chat_flutter/src/media_list_view.dart';
import 'package:stream_chat_flutter/src/message_list_view.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter/src/user_avatar.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:substring_highlight/substring_highlight.dart';
import 'package:video_compress/video_compress.dart';
@@ -202,7 +202,7 @@ class MessageInputState extends State<MessageInput> {
bool _openFilePickerSection = false;
int _filePickerIndex = 0;
double _filePickerSize = _kMinMediaPickerSize;
KeyboardVisibilityController _keyboardVisibilityController =
final KeyboardVisibilityController _keyboardVisibilityController =
KeyboardVisibilityController();
/// The editing controller passed to the input TextField
@@ -247,7 +247,7 @@ class MessageInputState extends State<MessageInput> {
),
IconButton(
visualDensity: VisualDensity.compact,
icon: StreamSvgIcon.close_small(),
icon: StreamSvgIcon.closeSmall(),
onPressed: widget.onQuotedMessageCleared,
),
],
@@ -493,7 +493,7 @@ class MessageInputState extends State<MessageInput> {
: null,
suffixIcon: _commandEnabled
? IconButton(
icon: StreamSvgIcon.close_small(),
icon: StreamSvgIcon.closeSmall(),
splashRadius: 24,
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tightFor(
@@ -1040,7 +1040,7 @@ class MessageInputState extends State<MessageInput> {
if (file.size > _kMaxAttachmentSize) {
if (medium?.type == AssetType.video) {
final mediaInfo = await CompressVideoService.compressVideo(file.path);
final mediaInfo = await compressVideoService.compressVideo(file.path);
if (mediaInfo.filesize / (1024 * 1024) > _kMaxAttachmentSize) {
_showErrorAlert(
@@ -1128,7 +1128,7 @@ class MessageInputState extends State<MessageInput> {
case 'ban':
return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
child: StreamSvgIcon.Icon_user_delete(
child: StreamSvgIcon.iconUserDelete(
size: 16.0,
color: Colors.white,
),
@@ -1964,7 +1964,7 @@ class MessageInputState extends State<MessageInput> {
final mimeType = _getMimeType(file.path.split('/').last);
Map<String, dynamic> extraDataMap = {};
var extraDataMap = <String, dynamic>{};
if (camera) {
if (mimeType.type == 'video' || mimeType.type == 'image') {
@@ -1999,7 +1999,7 @@ class MessageInputState extends State<MessageInput> {
if (file.size / 1024 > _kMaxAttachmentSize) {
if (attachmentType == 'video') {
final mediaInfo = await CompressVideoService.compressVideo(file.path);
final mediaInfo = await compressVideoService.compressVideo(file.path);
file = PlatformFile(
name: mediaInfo.title,
size: (mediaInfo.filesize / 1024).ceil(),
@@ -2074,13 +2074,13 @@ class MessageInputState extends State<MessageInput> {
return res.file;
}
httpParser.MediaType _getMimeType(String filename) {
httpParser.MediaType mimeType;
http_parser.MediaType _getMimeType(String filename) {
http_parser.MediaType mimeType;
if (filename != null) {
if (filename.toLowerCase().endsWith('heic')) {
mimeType = httpParser.MediaType.parse('image/heic');
mimeType = http_parser.MediaType.parse('image/heic');
} else {
mimeType = httpParser.MediaType.parse(lookupMimeType(filename));
mimeType = http_parser.MediaType.parse(lookupMimeType(filename));
}
}
@@ -2424,5 +2424,12 @@ class Tuple2<T1, T2> {
@override
bool operator ==(Object other) =>
other is Tuple2 && other.item1 == item1 && other.item2 == item2;
identical(this, other) ||
other is Tuple2 &&
runtimeType == other.runtimeType &&
item1 == other.item1 &&
item2 == other.item2;
@override
int get hashCode => item1.hashCode ^ item2.hashCode;
}
@@ -6,18 +6,18 @@ import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:rxdart/rxdart.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/info_tile.dart';
import 'package:stream_chat_flutter/src/message_widget.dart';
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
import 'package:stream_chat_flutter/src/system_message.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:visibility_detector/visibility_detector.dart';
import '../stream_chat_flutter.dart';
import 'connection_status_builder.dart';
import 'date_divider.dart';
import 'swipeable.dart';
import 'extension.dart';
import 'swipeable.dart';
typedef MessageBuilder = Widget Function(
BuildContext,
@@ -237,7 +237,7 @@ class _MessageListViewState extends State<MessageListView> {
bool _inBetweenList = false;
MessageListController _messageListController = MessageListController();
final MessageListController _messageListController = MessageListController();
Map<String, VideoPackage> videoPackages = {};
@@ -310,8 +310,8 @@ class _MessageListViewState extends State<MessageListView> {
children: [
ConnectionStatusBuilder(
statusBuilder: (context, status) {
String statusString = '';
bool showStatus = true;
var statusString = '';
var showStatus = true;
switch (status) {
case ConnectionStatus.connected:
statusString = 'Connected';
@@ -881,7 +881,7 @@ class _MessageListViewState extends State<MessageListView> {
if (messages.map((e) => e.id).contains(quotedMessageId)) {
scrollToIndex();
} else {
streamChannel.loadChannelAtMessage(quotedMessageId).then((_) {
await streamChannel.loadChannelAtMessage(quotedMessageId).then((_) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (messages.map((e) => e.id).contains(quotedMessageId)) {
scrollToIndex();
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
/// It shows the current [Message] preview.
///
@@ -152,7 +152,7 @@ class MessageSearchItem extends StatelessWidget {
TextStyle normalTextStyle,
TextStyle mentionsTextStyle) {
var textList = text.split(' ');
List<TextSpan> resList = [];
var resList = <TextSpan>[];
for (var e in textList) {
if (mentions != null &&
mentions.isNotEmpty &&
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/info_tile.dart';
import 'package:stream_chat_flutter/src/message_search_item.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import '../stream_chat_flutter.dart';
@@ -116,7 +116,7 @@ class MessageSearchListView extends StatefulWidget {
}
class _MessageSearchListViewState extends State<MessageSearchListView> {
MessageSearchListController _messageSearchListController =
final MessageSearchListController _messageSearchListController =
MessageSearchListController();
@override
@@ -245,7 +245,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
}
Widget _buildQueryProgressIndicator(context) {
MessageSearchBlocState messageSearchBloc = MessageSearchBloc.of(context);
final messageSearchBloc = MessageSearchBloc.of(context);
return StreamBuilder<bool>(
stream: messageSearchBloc.queryMessagesLoading,
@@ -68,7 +68,7 @@ class MessageText extends StatelessWidget {
String _replaceMentions(String text) {
message.mentionedUsers?.map((u) => u.name)?.toSet()?.forEach((userName) {
text = text.replaceAll(
'@${userName}', '[@${userName}](@${userName.replaceAll(' ', '')})');
'@$userName', '[@$userName](@${userName.replaceAll(' ', '')})');
});
return text;
}
@@ -1,11 +1,11 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/src/channel_header.dart';
import 'package:stream_chat_flutter/src/channel_preview.dart';
import 'package:stream_chat_flutter/src/message_input.dart';
import 'package:stream_chat_flutter/src/reaction_icon.dart';
import 'package:stream_chat_flutter/src/utils.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
/// Inherited widget providing the [StreamChatThemeData] to the widget tree
class StreamChatTheme extends InheritedWidget {
@@ -476,7 +476,7 @@ class ColorTheme {
this.bgGradient = const LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [const Color(0xfff7f7f7), const Color(0xfffcfcfc)],
colors: [Color(0xfff7f7f7), Color(0xfffcfcfc)],
stops: [0, 1],
),
this.borderTop = const Effect(
@@ -519,7 +519,10 @@ class ColorTheme {
this.bgGradient = const LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [const Color(0xff101214), const Color(0xff070a0d)],
colors: [
Color(0xff101214),
Color(0xff070a0d),
],
stops: [0, 1],
),
});
@@ -386,7 +386,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.cloud_download({
factory StreamSvgIcon.cloudDownload({
double size,
Color color,
}) {
@@ -434,7 +434,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.arrow_right({
factory StreamSvgIcon.arrowRight({
double size,
Color color,
}) {
@@ -446,7 +446,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.close_small({
factory StreamSvgIcon.closeSmall({
double size,
Color color,
}) {
@@ -458,7 +458,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_curve_line_left_up({
factory StreamSvgIcon.iconCurveLineLeftUp({
double size,
Color color,
}) {
@@ -470,7 +470,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_moon({
factory StreamSvgIcon.iconMoon({
double size,
Color color,
}) {
@@ -482,7 +482,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_SHARE({
factory StreamSvgIcon.iconShare({
double size,
Color color,
}) {
@@ -494,7 +494,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_grid({
factory StreamSvgIcon.iconGrid({
double size,
Color color,
}) {
@@ -506,7 +506,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_send_message({
factory StreamSvgIcon.iconSendMessage({
double size,
Color color,
}) {
@@ -518,7 +518,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_menu_point_v({
factory StreamSvgIcon.iconMenuPoint({
double size,
Color color,
}) {
@@ -530,7 +530,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_save({
factory StreamSvgIcon.iconSave({
double size,
Color color,
}) {
@@ -542,7 +542,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.share_arrow({
factory StreamSvgIcon.shareArrow({
double size,
Color color,
}) {
@@ -554,7 +554,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_7z({
factory StreamSvgIcon.filetype7z({
double size,
Color color,
}) {
@@ -566,7 +566,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_csv({
factory StreamSvgIcon.filetypeCsv({
double size,
Color color,
}) {
@@ -578,7 +578,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_doc({
factory StreamSvgIcon.filetypeDoc({
double size,
Color color,
}) {
@@ -590,7 +590,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_docx({
factory StreamSvgIcon.filetypeDocx({
double size,
Color color,
}) {
@@ -602,7 +602,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_Generic({
factory StreamSvgIcon.filetypeGeneric({
double size,
Color color,
}) {
@@ -614,7 +614,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_html({
factory StreamSvgIcon.filetypeHtml({
double size,
Color color,
}) {
@@ -626,7 +626,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_md({
factory StreamSvgIcon.filetypeMd({
double size,
Color color,
}) {
@@ -638,7 +638,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_odt({
factory StreamSvgIcon.filetypeOdt({
double size,
Color color,
}) {
@@ -650,7 +650,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_pdf({
factory StreamSvgIcon.filetypePdf({
double size,
Color color,
}) {
@@ -662,7 +662,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_ppt({
factory StreamSvgIcon.filetypePpt({
double size,
Color color,
}) {
@@ -674,7 +674,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_pptx({
factory StreamSvgIcon.filetypePptx({
double size,
Color color,
}) {
@@ -686,7 +686,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_rar({
factory StreamSvgIcon.filetypeRar({
double size,
Color color,
}) {
@@ -698,7 +698,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_rtf({
factory StreamSvgIcon.filetypeRtf({
double size,
Color color,
}) {
@@ -710,7 +710,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_tar({
factory StreamSvgIcon.filetypeTar({
double size,
Color color,
}) {
@@ -722,7 +722,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_txt({
factory StreamSvgIcon.filetypeTxt({
double size,
Color color,
}) {
@@ -734,7 +734,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_xls({
factory StreamSvgIcon.filetypeXls({
double size,
Color color,
}) {
@@ -746,7 +746,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_xlsx({
factory StreamSvgIcon.filetypeXlsx({
double size,
Color color,
}) {
@@ -758,7 +758,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.filetype_zip({
factory StreamSvgIcon.filetypeZip({
double size,
Color color,
}) {
@@ -770,7 +770,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_group({
factory StreamSvgIcon.iconGroup({
double size,
Color color,
}) {
@@ -782,7 +782,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_notification({
factory StreamSvgIcon.iconNotification({
double size,
Color color,
}) {
@@ -794,7 +794,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_user_delete({
factory StreamSvgIcon.iconUserDelete({
double size,
Color color,
}) {
@@ -818,7 +818,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.circle_up({
factory StreamSvgIcon.circleUp({
double size,
Color color,
}) {
@@ -830,7 +830,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.Icon_user_settings({
factory StreamSvgIcon.iconUserSettings({
double size,
Color color,
}) {
@@ -890,7 +890,7 @@ class StreamSvgIcon extends StatelessWidget {
);
}
factory StreamSvgIcon.icon_flag({
factory StreamSvgIcon.iconFlag({
double size,
Color color,
}) {
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'user_item.dart';
@@ -138,7 +138,7 @@ class _UserListViewState extends State<UserListView>
with WidgetsBindingObserver {
bool get _isListView => widget.crossAxisCount == 1;
UserListController _userListController = UserListController();
final UserListController _userListController = UserListController();
@override
Widget build(BuildContext context) {
+19 -19
View File
@@ -221,7 +221,7 @@ String getSizeText(int bytes) {
}
if (bytes <= 1000) {
return '${bytes} bytes';
return '$bytes bytes';
} else if (bytes <= 100000) {
return '${(bytes / 1000).toStringAsFixed(2)} KB';
} else {
@@ -233,58 +233,58 @@ String getSizeText(int bytes) {
StreamSvgIcon getFileTypeImage(String type) {
switch (type) {
case '7z':
return StreamSvgIcon.filetype_7z();
return StreamSvgIcon.filetype7z();
break;
case 'csv':
return StreamSvgIcon.filetype_csv();
return StreamSvgIcon.filetypeCsv();
break;
case 'doc':
return StreamSvgIcon.filetype_doc();
return StreamSvgIcon.filetypeDoc();
break;
case 'docx':
return StreamSvgIcon.filetype_docx();
return StreamSvgIcon.filetypeDocx();
break;
case 'html':
return StreamSvgIcon.filetype_html();
return StreamSvgIcon.filetypeHtml();
break;
case 'md':
return StreamSvgIcon.filetype_md();
return StreamSvgIcon.filetypeMd();
break;
case 'odt':
return StreamSvgIcon.filetype_odt();
return StreamSvgIcon.filetypeOdt();
break;
case 'pdf':
return StreamSvgIcon.filetype_pdf();
return StreamSvgIcon.filetypePdf();
break;
case 'ppt':
return StreamSvgIcon.filetype_ppt();
return StreamSvgIcon.filetypePpt();
break;
case 'pptx':
return StreamSvgIcon.filetype_pptx();
return StreamSvgIcon.filetypePptx();
break;
case 'rar':
return StreamSvgIcon.filetype_rar();
return StreamSvgIcon.filetypeRar();
break;
case 'rtf':
return StreamSvgIcon.filetype_rtf();
return StreamSvgIcon.filetypeRtf();
break;
case 'tar':
return StreamSvgIcon.filetype_tar();
return StreamSvgIcon.filetypeTar();
break;
case 'txt':
return StreamSvgIcon.filetype_txt();
return StreamSvgIcon.filetypeTxt();
break;
case 'xls':
return StreamSvgIcon.filetype_xls();
return StreamSvgIcon.filetypeXls();
break;
case 'xlsx':
return StreamSvgIcon.filetype_xlsx();
return StreamSvgIcon.filetypeXlsx();
break;
case 'zip':
return StreamSvgIcon.filetype_zip();
return StreamSvgIcon.filetypeZip();
break;
default:
return StreamSvgIcon.filetype_Generic();
return StreamSvgIcon.filetypeGeneric();
break;
}
}