Merge pull request #1632 from GetStream/feat/bump-jiffy
This commit is contained in:
@@ -8,6 +8,7 @@ coverage
|
||||
.pub/
|
||||
.dart_tool/
|
||||
pubspec.lock
|
||||
pubspec_overrides.yaml
|
||||
flutter_export_environment.sh
|
||||
|
||||
examples/all_plugins/pubspec.yaml
|
||||
|
||||
@@ -97,6 +97,8 @@
|
||||
- Updated `video_player` dependency to `^2.7.0`.
|
||||
- Updated `chewie` dependency to `^1.6.0`.
|
||||
- Updated `share_plus` dependency to `^7.0.2`.
|
||||
- Deprecated `StreamUserItem` in favor of `StreamUserListTile`.
|
||||
- Updated `jiffy` dependency to `^6.2.1`.
|
||||
|
||||
## 6.4.0
|
||||
|
||||
|
||||
@@ -106,9 +106,10 @@ class _ConnectedTitleState extends StatelessWidget {
|
||||
style: textStyle,
|
||||
);
|
||||
} else {
|
||||
final lastActive = otherMember.user?.lastActive ?? DateTime.now();
|
||||
alternativeWidget = Text(
|
||||
'${context.translations.userLastOnlineText} '
|
||||
'${Jiffy(otherMember.user?.lastActive).fromNow()}',
|
||||
'${Jiffy.parseFromDateTime(lastActive).fromNow()}',
|
||||
style: textStyle,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -349,16 +349,16 @@ class _Date extends StatelessWidget {
|
||||
|
||||
if (lastMessageAt.millisecondsSinceEpoch >=
|
||||
startOfDay.millisecondsSinceEpoch) {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).jm;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).jm;
|
||||
} else if (lastMessageAt.millisecondsSinceEpoch >=
|
||||
startOfDay
|
||||
.subtract(const Duration(days: 1))
|
||||
.millisecondsSinceEpoch) {
|
||||
stringDate = context.translations.yesterdayLabel;
|
||||
} else if (startOfDay.difference(lastMessageAt).inDays < 7) {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).EEEE;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).EEEE;
|
||||
} else {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).yMd;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).yMd;
|
||||
}
|
||||
|
||||
return Text(
|
||||
|
||||
@@ -611,13 +611,15 @@ class DefaultTranslations implements Translations {
|
||||
} else if (date == yesterday) {
|
||||
return 'yesterday';
|
||||
} else {
|
||||
return 'on ${Jiffy(date).MMMd}';
|
||||
return 'on ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Sent ${_getDay(date)} at ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Sent ${_getDay(date)} at ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Today';
|
||||
|
||||
@@ -669,14 +669,20 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
|
||||
final isPartOfThread = message.replyCount! > 0 ||
|
||||
message.showInChannel == true;
|
||||
|
||||
final createdAt = message.createdAt.toLocal();
|
||||
final nextCreatedAt = nextMessage.createdAt.toLocal();
|
||||
if (!Jiffy(createdAt).isSame(nextCreatedAt, Units.DAY)) {
|
||||
final createdAt = Jiffy.parseFromDateTime(
|
||||
message.createdAt.toLocal(),
|
||||
);
|
||||
|
||||
final nextCreatedAt = Jiffy.parseFromDateTime(
|
||||
nextMessage.createdAt.toLocal(),
|
||||
);
|
||||
|
||||
if (!createdAt.isSame(nextCreatedAt, unit: Unit.day)) {
|
||||
separator = _buildDateDivider(nextMessage);
|
||||
} else {
|
||||
final hasTimeDiff = !Jiffy(createdAt).isSame(
|
||||
final hasTimeDiff = !createdAt.isSame(
|
||||
nextCreatedAt,
|
||||
Units.MINUTE,
|
||||
unit: Unit.minute,
|
||||
);
|
||||
|
||||
final isNextUserSame =
|
||||
@@ -1071,10 +1077,12 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
|
||||
|
||||
var hasTimeDiff = false;
|
||||
if (nextMessage != null) {
|
||||
hasTimeDiff = !Jiffy(message.createdAt.toLocal()).isSame(
|
||||
final createdAt = Jiffy.parseFromDateTime(message.createdAt.toLocal());
|
||||
final nextCreatedAt = Jiffy.parseFromDateTime(
|
||||
nextMessage.createdAt.toLocal(),
|
||||
Units.MINUTE,
|
||||
);
|
||||
|
||||
hasTimeDiff = !createdAt.isSame(nextCreatedAt, unit: Unit.minute);
|
||||
}
|
||||
|
||||
final hasFileAttachment =
|
||||
|
||||
@@ -191,7 +191,7 @@ class BottomRow extends StatelessWidget {
|
||||
),
|
||||
if (showTimeStamp)
|
||||
Text(
|
||||
Jiffy(message.createdAt.toLocal()).jm,
|
||||
Jiffy.parseFromDateTime(message.createdAt.toLocal()).jm,
|
||||
style: messageTheme.createdAtStyle,
|
||||
),
|
||||
if (showSendingIndicator)
|
||||
|
||||
@@ -20,17 +20,17 @@ class StreamDateDivider extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final createdAt = Jiffy(dateTime);
|
||||
final now = Jiffy(DateTime.now());
|
||||
final createdAt = Jiffy.parseFromDateTime(dateTime);
|
||||
final now = Jiffy.parseFromDateTime(DateTime.now());
|
||||
|
||||
var dayInfo = createdAt.MMMd;
|
||||
if (createdAt.isSame(now, Units.DAY)) {
|
||||
if (createdAt.isSame(now, unit: Unit.day)) {
|
||||
dayInfo = context.translations.todayLabel;
|
||||
} else if (createdAt.isSame(now.subtract(days: 1), Units.DAY)) {
|
||||
} else if (createdAt.isSame(now.subtract(days: 1), unit: Unit.day)) {
|
||||
dayInfo = context.translations.yesterdayLabel;
|
||||
} else if (createdAt.isAfter(now.subtract(days: 7), Units.DAY)) {
|
||||
} else if (createdAt.isAfter(now.subtract(days: 7), unit: Unit.day)) {
|
||||
dayInfo = createdAt.EEEE;
|
||||
} else if (createdAt.isAfter(now.subtract(years: 1), Units.DAY)) {
|
||||
} else if (createdAt.isAfter(now.subtract(years: 1), unit: Unit.day)) {
|
||||
dayInfo = createdAt.MMMd;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -287,16 +287,16 @@ class ChannelLastMessageDate extends StatelessWidget {
|
||||
|
||||
if (lastMessageAt.millisecondsSinceEpoch >=
|
||||
startOfDay.millisecondsSinceEpoch) {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).jm;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).jm;
|
||||
} else if (lastMessageAt.millisecondsSinceEpoch >=
|
||||
startOfDay
|
||||
.subtract(const Duration(days: 1))
|
||||
.millisecondsSinceEpoch) {
|
||||
stringDate = context.translations.yesterdayLabel;
|
||||
} else if (startOfDay.difference(lastMessageAt).inDays < 7) {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).EEEE;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).EEEE;
|
||||
} else {
|
||||
stringDate = Jiffy(lastMessageAt.toLocal()).yMd;
|
||||
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).yMd;
|
||||
}
|
||||
|
||||
return Text(
|
||||
|
||||
+2
-2
@@ -227,9 +227,9 @@ class MessageSearchTileMessageDate extends StatelessWidget {
|
||||
if (now.year != createdAt.year ||
|
||||
now.month != createdAt.month ||
|
||||
now.day != createdAt.day) {
|
||||
stringDate = Jiffy(createdAt.toLocal()).yMd;
|
||||
stringDate = Jiffy.parseFromDateTime(createdAt.toLocal()).yMd;
|
||||
} else {
|
||||
stringDate = Jiffy(createdAt.toLocal()).jm;
|
||||
stringDate = Jiffy.parseFromDateTime(createdAt.toLocal()).jm;
|
||||
}
|
||||
|
||||
return Text(
|
||||
|
||||
+2
-1
@@ -176,11 +176,12 @@ class UserLastActive extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final chatTheme = StreamChatTheme.of(context);
|
||||
final lastActive = user.lastActive ?? DateTime.now();
|
||||
return Text(
|
||||
user.online
|
||||
? context.translations.userOnlineText
|
||||
: '${context.translations.userLastOnlineText} '
|
||||
'${Jiffy(user.lastActive).fromNow()}',
|
||||
'${Jiffy.parseFromDateTime(lastActive).fromNow()}',
|
||||
style: chatTheme.textTheme.footnote.copyWith(
|
||||
color: chatTheme.colorTheme.textHighEmphasis.withOpacity(0.5),
|
||||
),
|
||||
|
||||
@@ -165,9 +165,9 @@ class StreamChatState extends State<StreamChat> {
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
final currentLocale = Localizations.localeOf(context).toString();
|
||||
final availableLocales = Jiffy.getAllAvailableLocales();
|
||||
final availableLocales = Jiffy.getSupportedLocales();
|
||||
if (availableLocales.contains(currentLocale)) {
|
||||
Jiffy.locale(currentLocale);
|
||||
Jiffy.setLocale(currentLocale);
|
||||
}
|
||||
super.didChangeDependencies();
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||
/// [StreamChatTheme].
|
||||
/// Modify it to change the widget's appearance.
|
||||
/// {@endtemplate}
|
||||
@Deprecated('Use `StreamUserListTile` instead.')
|
||||
class StreamUserItem extends StatelessWidget {
|
||||
/// {@macro streamUserItem}
|
||||
const StreamUserItem({
|
||||
@@ -73,11 +74,12 @@ class StreamUserItem extends StatelessWidget {
|
||||
|
||||
Widget _buildLastActive(BuildContext context) {
|
||||
final chatTheme = StreamChatTheme.of(context);
|
||||
final lastActive = user.lastActive ?? DateTime.now();
|
||||
return Text(
|
||||
user.online
|
||||
? context.translations.userOnlineText
|
||||
: '${context.translations.userLastOnlineText} '
|
||||
'${Jiffy(user.lastActive).fromNow()}',
|
||||
'${Jiffy.parseFromDateTime(lastActive).fromNow()}',
|
||||
style: chatTheme.textTheme.footnote.copyWith(
|
||||
color: chatTheme.colorTheme.textHighEmphasis.withOpacity(0.5),
|
||||
),
|
||||
|
||||
@@ -29,7 +29,7 @@ dependencies:
|
||||
http_parser: ^4.0.0
|
||||
image_gallery_saver: ^2.0.1
|
||||
image_picker: ">=0.8.2 <2.0.0"
|
||||
jiffy: ^5.0.0
|
||||
jiffy: ^6.2.1
|
||||
lottie: ^2.0.0
|
||||
meta: ^1.8.0
|
||||
path_provider: ^2.0.9
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## Upcoming
|
||||
|
||||
* Updated `stream_chat_flutter` dependency to [`Upcoming`](https://pub.dev/packages/stream_chat_flutter/changelog).
|
||||
|
||||
## 5.4.0
|
||||
|
||||
* Updated `stream_chat_flutter` dependency to [`6.4.0`](https://pub.dev/packages/stream_chat_flutter/changelog).
|
||||
|
||||
@@ -270,13 +270,15 @@ class NnStreamChatLocalizations extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'yesterday';
|
||||
} else {
|
||||
return 'on ${Jiffy(date).MMMd}';
|
||||
return 'on ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Sent ${_getDay(date)} at ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Sent ${_getDay(date)} at ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Today';
|
||||
|
||||
@@ -249,13 +249,15 @@ class StreamChatLocalizationsCa extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'ahir';
|
||||
} else {
|
||||
return 'el ${Jiffy(date).MMMd}';
|
||||
return 'el ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'''Enviat el ${_getDay(date)} a les ${Jiffy(time.toLocal()).format('HH:mm')}''';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Enviat el ${_getDay(date)} a les ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Avui';
|
||||
|
||||
@@ -239,13 +239,15 @@ class StreamChatLocalizationsDe extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'Gestern';
|
||||
} else {
|
||||
return 'am ${Jiffy(date).MMMd}';
|
||||
return 'am ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Gesendet ${_getDay(date)} am ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Gesendet ${_getDay(date)} am ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Heute';
|
||||
|
||||
@@ -246,13 +246,15 @@ class StreamChatLocalizationsEn extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'yesterday';
|
||||
} else {
|
||||
return 'on ${Jiffy(date).MMMd}';
|
||||
return 'on ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Sent ${_getDay(date)} at ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Sent ${_getDay(date)} at ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Today';
|
||||
|
||||
@@ -250,13 +250,15 @@ class StreamChatLocalizationsEs extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'ayer';
|
||||
} else {
|
||||
return 'el ${Jiffy(date).MMMd}';
|
||||
return 'el ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'''Enviado el ${_getDay(date)} a las ${Jiffy(time.toLocal()).format('HH:mm')}''';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Enviado el ${_getDay(date)} a las ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Hoy';
|
||||
|
||||
@@ -249,13 +249,15 @@ class StreamChatLocalizationsFr extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'hier';
|
||||
} else {
|
||||
return 'le ${Jiffy(date).MMMd}';
|
||||
return 'le ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Envoyé ${_getDay(date)} à ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Envoyé ${_getDay(date)} à ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => "Aujourd'hui";
|
||||
|
||||
@@ -243,13 +243,15 @@ class StreamChatLocalizationsHi extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'कल';
|
||||
} else {
|
||||
return '${Jiffy(date).MMMd} को';
|
||||
return '${Jiffy.parseFromDateTime(date).MMMd} को';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'${_getDay(date)} ${Jiffy(time.toLocal()).format('HH:mm')} बजे भेजा गया';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return '${_getDay(date)} ${atTime.jm} बजे भेजा गया';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'आज';
|
||||
|
||||
@@ -252,13 +252,15 @@ Il file è troppo grande per essere caricato. Il limite è di $limitInMB MB.''';
|
||||
} else if (date == yesterday) {
|
||||
return 'ieri';
|
||||
} else {
|
||||
return 'il ${Jiffy(date).MMMd}';
|
||||
return 'il ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
"Inviato ${_getDay(date)} alle ${Jiffy(time.toLocal()).format('HH:mm')}";
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Inviato ${_getDay(date)} alle ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Oggi';
|
||||
|
||||
@@ -236,13 +236,15 @@ class StreamChatLocalizationsJa extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return '昨日';
|
||||
} else {
|
||||
return '${Jiffy(date).MMMd}に';
|
||||
return '${Jiffy.parseFromDateTime(date).MMMd}に';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'${_getDay(date)}の${Jiffy(time.toLocal()).format('HH:mm')}に送信しました ';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return '${_getDay(date)}の${atTime.jm}に送信しました ';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => '今日';
|
||||
|
||||
@@ -235,13 +235,15 @@ class StreamChatLocalizationsKo extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return '어제';
|
||||
} else {
|
||||
return '${Jiffy(date).MMMd}에';
|
||||
return '${Jiffy.parseFromDateTime(date).MMMd}에';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'${_getDay(date)} ${Jiffy(time.toLocal()).format('HH:mm')}에 보냈습니다';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return '${_getDay(date)} ${atTime.jm}에 보냈습니다';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => '오늘';
|
||||
|
||||
@@ -242,13 +242,15 @@ class StreamChatLocalizationsNo extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'i går';
|
||||
} else {
|
||||
return 'på ${Jiffy(date).MMMd}';
|
||||
return 'på ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'Sent ${_getDay(date)} kl. ${Jiffy(time.toLocal()).format('HH:mm')}';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Sent ${_getDay(date)} kl. ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'I dag';
|
||||
|
||||
@@ -244,13 +244,15 @@ class StreamChatLocalizationsPt extends GlobalStreamChatLocalizations {
|
||||
} else if (date == yesterday) {
|
||||
return 'Ontem';
|
||||
} else {
|
||||
return 'o ${Jiffy(date).MMMd}';
|
||||
return 'o ${Jiffy.parseFromDateTime(date).MMMd}';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String sentAtText({required DateTime date, required DateTime time}) =>
|
||||
'''Enviado ${_getDay(date)} às ${Jiffy(time.toLocal()).format('HH:mm')}''';
|
||||
String sentAtText({required DateTime date, required DateTime time}) {
|
||||
final atTime = Jiffy.parseFromDateTime(time.toLocal());
|
||||
return 'Enviado ${_getDay(date)} às ${atTime.jm}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get todayLabel => 'Hoje';
|
||||
|
||||
Reference in New Issue
Block a user