* fix: fixed long system messages overflowing * fix: fixed long system messages overflowing * [UI-Kit] Refactor, add support for downloading attachments. Signed-off-by: Sahil Kumar <[email protected]> * fix: header casing * [UI-Kit] Disable attachment download dialog pop using back button Signed-off-by: Sahil Kumar <[email protected]> * stream_chat_flutter fix svg on web * [UI-Kit] Pop attachment download dialog in case of any error. Signed-off-by: Sahil Kumar <[email protected]> * restore svg * feat: add pr title linter * fix test * fix client headers * update system message design * update gh token env var * add scopes * expose systemMessageBuilder in messagelistview * fix(ui): fix button size * add dispatch workflow * add dispatch workflow * update dispatch acton * add runson * fix ref * fix ref * update secret * specify repo * fix: list scroll keyboard behaviour (#304) * fix: Keyboard now closes by clicking on space or scrolling. * fix: Exposed system and normal message tap builders * fmt: dartfmt * feat: Add support for messages filter in `MessageListView` and `MessageListCore` (#303) * [MessageListView, MessageListCore] Add support for message filter Signed-off-by: Sahil Kumar <[email protected]> * [UI-Kit -> Pubspec] Remove `stream_chat_flutter_core` relative import Signed-off-by: Sahil Kumar <[email protected]> * add relative import * add relative import * remove svg for web * remove badge logic on web * style: Update for team lint (#297) * Update for team lint * fix tests * remove pedantic and sort deps * remove jiffy from system message Co-authored-by: Salvatore Giordano <[email protected]> * add section highlighting sample app repo (#307) Co-authored-by: Salvatore Giordano <[email protected]> * add null check to debounce * fix messagelistview loading errors * remove core relative import * fix: fixes message newline issue (#308) * fix: minor * fix: generate image thumbnails and use transparent image as placeholder for cached network images (#310) * update cdn handling * fix image attachment with new cdn * fix(ui): Fix message input permission request crash (#311) Signed-off-by: Sahil Kumar <[email protected]> * fix(llc): update member presence and add skip_push to message (#314) * update member presence * add skip_push to message * fix tests * fix: Fixed shimmer overflow (#316) * fix dialogs * fix(llc): Fix attachment upload state uneven progress. (#315) * feat(llc): Add rate limiter functions. fix(llc): Fix attachment upload state uneven progress. Signed-off-by: Sahil Kumar <[email protected]> * feat(llc): Export `async.dart` and `rate_limit.dart` Signed-off-by: Sahil Kumar <[email protected]> * refactor(llc): Replace our `rate_limit` implementation with the dart port of js `lodash` to better handlw `cancel` and `flush` functions. Signed-off-by: Sahil Kumar <[email protected]> * fix(UI-Kit): Make android example run on real devices Signed-off-by: Sahil Kumar <[email protected]> * fix offline behaviour Co-authored-by: Salvatore Giordano <[email protected]> * feat: Introduce onAttachmentTap on messages attachment (#309) * introdce onAttachmentTap on message * correct indent * sdfsd Co-authored-by: Salvatore Giordano <[email protected]> * feat: added customization options in main widgets (#312) * polish channelpreview customization options * polish channelheader customization options * polish messageinput customization options * polish threadheader customization options * polish channellistheader customization options * show the parent message if no messages in thread * fix edit message * fix channelinfo textstyle * fix review * fix useravatar * add ontitle tap to thread header * add custom message actions * add borderradius and button builder * add ontap to messageinput custom send button * fix bottom sheet * add doc * use placeholder image * add doc * fix listtile density * remove subtitle from ChannelListHeaderTheme.copyWith * add InputDecoration.merge extension * fix: use shimmer in images * fix: remove notification badge logic from the sdk and move it to sample app * fix import * fix: Method being called during build (#317) * method call bug fix * dartfmt * fix: show error messages as system and keep them in the message input (#319) * fix: pre release (#324) * use share_plus plugin * bump dependency versions * fix ui for web * unfocus messageinput only on commands * fix default error for messagesearchlistview * fix thumbnail animation * fix lint * ignore example in linter * update changelogs * fix lint * fix lint * update stream_chat pana min * add doc Co-authored-by: Sahil Kumar <[email protected]> Co-authored-by: Deven Joshi <[email protected]> Co-authored-by: Neevash Ramdial (Nash) <[email protected]> Co-authored-by: Nelson Nunes <[email protected]>
100 lines
3.5 KiB
Dart
100 lines
3.5 KiB
Dart
import 'package:characters/characters.dart';
|
|
import 'package:emojis/emoji.dart';
|
|
import 'package:file_picker/file_picker.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
|
|
|
final _emojis = Emoji.all();
|
|
|
|
/// String extension
|
|
extension StringExtension on String {
|
|
/// Returns the capitalized string
|
|
String capitalize() {
|
|
return '${this[0].toUpperCase()}${substring(1)}';
|
|
}
|
|
|
|
/// Returns whether the string contains only emoji's or not.
|
|
///
|
|
/// 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 = trim().characters;
|
|
if (characters.isEmpty) return false;
|
|
if (characters.length > 3) return false;
|
|
return characters.every((c) => _emojis.map((e) => e.char).contains(c));
|
|
}
|
|
}
|
|
|
|
/// List extension
|
|
extension IterableX<T> on Iterable<T> {
|
|
/// Insert any item<T> inBetween the list items
|
|
List<T> insertBetween(T item) => expand((e) sync* {
|
|
yield item;
|
|
yield e;
|
|
}).skip(1).toList(growable: false);
|
|
}
|
|
|
|
/// Useful extension for [PlatformFile]
|
|
extension PlatformFileX on PlatformFile {
|
|
/// Converts the [PlatformFile] into [AttachmentFile]
|
|
AttachmentFile get toAttachmentFile => AttachmentFile(
|
|
path: path,
|
|
name: name,
|
|
bytes: bytes,
|
|
size: size,
|
|
);
|
|
}
|
|
|
|
extension InputDecorationX on InputDecoration {
|
|
InputDecoration merge(InputDecoration other) {
|
|
if (other == null) return this;
|
|
return copyWith(
|
|
icon: other?.icon,
|
|
labelText: other?.labelText,
|
|
labelStyle: labelStyle?.merge(other.labelStyle) ?? other.labelStyle,
|
|
helperText: other?.helperText,
|
|
helperStyle: helperStyle?.merge(other.helperStyle) ?? other.helperStyle,
|
|
helperMaxLines: other?.helperMaxLines,
|
|
hintText: other?.hintText,
|
|
hintStyle: hintStyle?.merge(other.hintStyle) ?? other.hintStyle,
|
|
hintTextDirection: other?.hintTextDirection,
|
|
hintMaxLines: other?.hintMaxLines,
|
|
errorText: other?.errorText,
|
|
errorStyle: errorStyle?.merge(other.errorStyle) ?? other.errorStyle,
|
|
errorMaxLines: other?.errorMaxLines,
|
|
floatingLabelBehavior: other?.floatingLabelBehavior,
|
|
isCollapsed: other?.isCollapsed,
|
|
isDense: other?.isDense,
|
|
contentPadding: other?.contentPadding,
|
|
prefixIcon: other?.prefixIcon,
|
|
prefix: other?.prefix,
|
|
prefixText: other?.prefixText,
|
|
prefixIconConstraints: other?.prefixIconConstraints,
|
|
prefixStyle: prefixStyle?.merge(other.prefixStyle) ?? other.prefixStyle,
|
|
suffixIcon: other?.suffixIcon,
|
|
suffix: other?.suffix,
|
|
suffixText: other?.suffixText,
|
|
suffixStyle: suffixStyle?.merge(other.suffixStyle) ?? other.suffixStyle,
|
|
suffixIconConstraints: other?.suffixIconConstraints,
|
|
counter: other?.counter,
|
|
counterText: other?.counterText,
|
|
counterStyle:
|
|
counterStyle?.merge(other.counterStyle) ?? other.counterStyle,
|
|
filled: other?.filled,
|
|
fillColor: other?.fillColor,
|
|
focusColor: other?.focusColor,
|
|
hoverColor: other?.hoverColor,
|
|
errorBorder: other?.errorBorder,
|
|
focusedBorder: other?.focusedBorder,
|
|
focusedErrorBorder: other?.focusedErrorBorder,
|
|
disabledBorder: other?.disabledBorder,
|
|
enabledBorder: other?.enabledBorder,
|
|
border: other?.border,
|
|
enabled: other?.enabled,
|
|
semanticCounterText: other?.semanticCounterText,
|
|
alignLabelWithHint: other?.alignLabelWithHint,
|
|
);
|
|
}
|
|
}
|