Skip to content

Commit f5c7a54

Browse files
committed
content: Follow user_settings.twenty_four_hour_time in global times
Fixes zulip#1015.
1 parent 47ebab0 commit f5c7a54

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

lib/widgets/content.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,13 +1501,27 @@ class GlobalTime extends StatelessWidget {
15011501
final GlobalTimeNode node;
15021502
final TextStyle ambientTextStyle;
15031503

1504-
static final _dateFormat = intl.DateFormat('EEE, MMM d, y, h:mm a'); // TODO(i18n): localize date
1504+
static final _format12 =
1505+
intl.DateFormat('EEE, MMM d, y').addPattern('h:mm aa', ', ');
1506+
static final _format24 =
1507+
intl.DateFormat('EEE, MMM d, y').addPattern('Hm', ', ');
1508+
static final _formatLocaleDefault =
1509+
intl.DateFormat('EEE, MMM d, y').addPattern('jm', ', ');
15051510

15061511
@override
15071512
Widget build(BuildContext context) {
1513+
final store = PerAccountStoreWidget.maybeOf(context);
1514+
final twentyFourHourTimeMode = store?.userSettings.twentyFourHourTime;
15081515
// Design taken from css for `.rendered_markdown & time` in web,
15091516
// see zulip:web/styles/rendered_markdown.css .
1510-
final text = _dateFormat.format(node.datetime.toLocal());
1517+
// TODO(i18n): localize; see plan with ffi in #45
1518+
final format = switch (twentyFourHourTimeMode) {
1519+
TwentyFourHourTimeMode.twelveHour => _format12,
1520+
TwentyFourHourTimeMode.twentyFourHour => _format24,
1521+
TwentyFourHourTimeMode.localeDefault => _formatLocaleDefault,
1522+
null => _formatLocaleDefault, // Not in a per-account context
1523+
};
1524+
final text = format.format(node.datetime.toLocal());
15111525
final contentTheme = ContentTheme.of(context);
15121526
return Padding(
15131527
padding: const EdgeInsets.symmetric(horizontal: 2),

test/widgets/content_test.dart

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter_checks/flutter_checks.dart';
88
import 'package:flutter_test/flutter_test.dart';
99
import 'package:url_launcher/url_launcher.dart';
1010
import 'package:zulip/api/core.dart';
11+
import 'package:zulip/api/model/model.dart';
1112
import 'package:zulip/model/content.dart';
1213
import 'package:zulip/model/narrow.dart';
1314
import 'package:zulip/model/settings.dart';
@@ -139,9 +140,16 @@ void main() {
139140
Future<void> prepareContent(WidgetTester tester, Widget child, {
140141
List<NavigatorObserver> navObservers = const [],
141142
bool wrapWithPerAccountStoreWidget = false,
143+
TwentyFourHourTimeMode? twentyFourHourTimeMode
142144
}) async {
143145
if (wrapWithPerAccountStoreWidget) {
144-
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
146+
final initialSnapshot = eg.initialSnapshot();
147+
if (twentyFourHourTimeMode != null) {
148+
initialSnapshot.userSettings.twentyFourHourTime = twentyFourHourTimeMode;
149+
}
150+
await testBinding.globalStore.add(eg.selfAccount, initialSnapshot);
151+
} else {
152+
assert(twentyFourHourTimeMode == null);
145153
}
146154

147155
addTearDown(testBinding.reset);
@@ -1102,11 +1110,45 @@ void main() {
11021110
// the timezone of the environment running these tests. Accept here a wide
11031111
// range of times. See comments in "show dates" test in
11041112
// `test/widgets/message_list_test.dart`.
1105-
final renderedTextRegexp = RegExp(r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d [AP]M$');
1113+
final renderedTextRegexp = RegExp(r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d(?: [AP]M)?$');
1114+
final renderedTextRegexpTwelveHour = RegExp(r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d [AP]M$');
1115+
final renderedTextRegexpTwentyFourHour = RegExp(r'^(Tue, Jan 30|Wed, Jan 31), 2024, \d+:\d\d$');
11061116

11071117
testWidgets('smoke', (tester) async {
1108-
await prepareContent(tester, plainContent('<p>$timeSpanHtml</p>'));
1118+
await prepareContent(tester,
1119+
wrapWithPerAccountStoreWidget: false,
1120+
plainContent('<p>$timeSpanHtml</p>'));
11091121
tester.widget(find.textContaining(renderedTextRegexp));
1122+
1123+
// TODO(#1727) test with different locales
1124+
tester.widget(find.textContaining(renderedTextRegexpTwelveHour));
1125+
});
1126+
1127+
testWidgets('TwentyFourHourTimeMode.twelveHour', (tester) async {
1128+
await prepareContent(tester,
1129+
wrapWithPerAccountStoreWidget: true,
1130+
twentyFourHourTimeMode: TwentyFourHourTimeMode.twelveHour,
1131+
plainContent('<p>$timeSpanHtml</p>'));
1132+
check(find.textContaining(renderedTextRegexpTwelveHour)).findsOne();
1133+
});
1134+
1135+
testWidgets('TwentyFourHourTimeMode.twentyFourHour', (tester) async {
1136+
await prepareContent(tester,
1137+
wrapWithPerAccountStoreWidget: true,
1138+
twentyFourHourTimeMode: TwentyFourHourTimeMode.twentyFourHour,
1139+
plainContent('<p>$timeSpanHtml</p>'));
1140+
check(find.textContaining(renderedTextRegexpTwentyFourHour)).findsOne();
1141+
});
1142+
1143+
testWidgets('TwentyFourHourTimeMode.localeDefault', (tester) async {
1144+
await prepareContent(tester,
1145+
wrapWithPerAccountStoreWidget: true,
1146+
twentyFourHourTimeMode: TwentyFourHourTimeMode.localeDefault,
1147+
plainContent('<p>$timeSpanHtml</p>'));
1148+
tester.widget(find.textContaining(renderedTextRegexp));
1149+
1150+
// TODO(#1727) test with different locales
1151+
check(find.textContaining(renderedTextRegexpTwelveHour)).findsOne();
11101152
});
11111153

11121154
void testIconAndTextSameColor(String description, String html) {

0 commit comments

Comments
 (0)