Skip to content

Commit 3318494

Browse files
committed
Fix Toast translation
1 parent 46a7c2a commit 3318494

File tree

10 files changed

+131
-66
lines changed

10 files changed

+131
-66
lines changed

integration_test/framework/test_helper.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ class TestHelper {
1717
/// the result but no longer available for the next run, causing the
1818
/// subsequent tests to hang. For this reason, call this in your Test class's
1919
/// setupApp() once before running the tests.
20-
static Future<EnsembleConfig> setupApp({required String appName}) async {
21-
I18nProps i18nProps = I18nProps('en', 'en', false);
22-
i18nProps.path = 'ensemble/i18n';
20+
static Future<EnsembleConfig> setupApp(
21+
{required String appName, String? forcedLocale}) async {
22+
I18nProps i18nProps =
23+
I18nProps('en', 'en', false, forcedLocale: forcedLocale);
24+
i18nProps.path = 'integration_test/local/$appName/i18n';
2325

2426
EnsembleConfig config = EnsembleConfig(
2527
definitionProvider: LocalDefinitionProvider(
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
View:
2+
styles:
3+
useSafeArea: true
4+
body:
5+
Column:
6+
children:
7+
- TextInput:
8+
id: myName
9+
value: Peter
10+
- Text:
11+
text: [email protected] ${myName.value}
12+
- Button:
13+
label: Show Toast
14+
onTap:
15+
showToast:
16+
message: [email protected] [email protected] ${myName.value}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
home:
2+
hello: Hello
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
home:
2+
hello: Hola
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:ensemble/ensemble.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
import 'framework/test_helper.dart';
5+
6+
void main() {
7+
group('Default English locale', () {
8+
testWidgets("default locale should work properly", (tester) async {
9+
EnsembleConfig config = await TestHelper.setupApp(appName: 'translation');
10+
await TestHelper.loadScreen(tester, 'Basic', config);
11+
12+
expect(find.text("Hello Peter"), findsOneWidget);
13+
14+
await tester.tap(find.text("Show Toast"));
15+
await tester.pumpAndSettle();
16+
expect(find.text("Hello Hello Peter"), findsOneWidget);
17+
});
18+
});
19+
20+
group('Forcing Spanish locale', () {
21+
testWidgets("forcing Spanish locale should work", (tester) async {
22+
EnsembleConfig config =
23+
await TestHelper.setupApp(appName: 'translation', forcedLocale: 'es');
24+
await TestHelper.loadScreen(tester, 'Basic', config);
25+
26+
expect(find.text("Hola Peter"), findsOneWidget);
27+
28+
await tester.tap(find.text("Show Toast"));
29+
await tester.pumpAndSettle();
30+
expect(find.text("Hola Hola Peter"), findsOneWidget);
31+
});
32+
});
33+
}

lib/action/toast_actions.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import 'package:ensemble/framework/action.dart';
2+
import 'package:ensemble/framework/error_handling.dart';
3+
import 'package:ensemble/framework/extensions.dart';
4+
import 'package:ensemble/framework/scope.dart';
5+
import 'package:ensemble/framework/widget/toast.dart';
6+
import 'package:ensemble/util/utils.dart';
7+
import 'package:flutter/cupertino.dart';
8+
9+
enum ToastType { success, error, warning, info }
10+
11+
class ShowToastAction extends EnsembleAction {
12+
ShowToastAction(
13+
{super.initiator,
14+
this.type,
15+
this.title,
16+
this.message,
17+
this.body,
18+
this.dismissible,
19+
this.alignment,
20+
this.duration,
21+
this.styles});
22+
23+
ToastType? type;
24+
final String? title;
25+
26+
// either message or widget is needed
27+
final String? message;
28+
final dynamic body;
29+
30+
final bool? dismissible;
31+
32+
final Alignment? alignment;
33+
final int? duration; // the during in seconds before toast is dismissed
34+
final Map<String, dynamic>? styles;
35+
36+
factory ShowToastAction.fromYaml({Map? payload}) {
37+
if (payload == null ||
38+
(payload['message'] == null &&
39+
payload['body'] == null &&
40+
payload['widget'] == null)) {
41+
throw LanguageError(
42+
"${ActionType.showToast.name} requires either a message or a body widget.");
43+
}
44+
return ShowToastAction(
45+
type: ToastType.values.from(payload['options']?['type']),
46+
title: Utils.optionalString(payload['title']),
47+
message: Utils.optionalString(payload['message']),
48+
body: payload['body'] ?? payload['widget'],
49+
dismissible: Utils.optionalBool(payload['options']?['dismissible']),
50+
alignment: Utils.getAlignment(payload['options']?['alignment']),
51+
duration: Utils.optionalInt(payload['options']?['duration'], min: 1),
52+
styles: Utils.getMap(payload['styles']));
53+
}
54+
55+
factory ShowToastAction.fromMap(dynamic inputs) =>
56+
ShowToastAction.fromYaml(payload: Utils.getYamlMap(inputs));
57+
58+
@override
59+
Future execute(BuildContext context, ScopeManager scopeManager) {
60+
Widget? customToastBody;
61+
if (body != null) {
62+
customToastBody = scopeManager.buildWidgetFromDefinition(body);
63+
}
64+
ToastController().showToast(context, this, customToastBody,
65+
dataContext: scopeManager.dataContext);
66+
return Future.value(null);
67+
}
68+
}

lib/action/upload_files_action.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:convert';
33
import 'dart:isolate';
44
import 'dart:ui';
55

6+
import 'package:ensemble/action/toast_actions.dart';
67
import 'package:ensemble/ensemble_app.dart';
78
import 'package:ensemble/framework/action.dart';
89
import 'package:ensemble/framework/apiproviders/http_api_provider.dart';

lib/framework/action.dart

Lines changed: 1 addition & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:ensemble/action/navigation_action.dart';
1414
import 'package:ensemble/action/notification_action.dart';
1515
import 'package:ensemble/action/phone_contact_action.dart';
1616
import 'package:ensemble/action/sign_in_out_action.dart';
17-
import 'package:ensemble/ensemble.dart';
17+
import 'package:ensemble/action/toast_actions.dart';
1818
import 'package:ensemble/framework/data_context.dart';
1919
import 'package:ensemble/framework/error_handling.dart';
2020
import 'package:ensemble/framework/event.dart';
@@ -23,7 +23,6 @@ import 'package:ensemble/framework/keychain_manager.dart';
2323
import 'package:ensemble/framework/permissions_manager.dart';
2424
import 'package:ensemble/framework/scope.dart';
2525
import 'package:ensemble/framework/view/page_group.dart';
26-
import 'package:ensemble/framework/widget/toast.dart';
2726
import 'package:ensemble/framework/widget/view_util.dart';
2827
import 'package:ensemble/receive_intent_manager.dart';
2928
import 'package:ensemble/screen_controller.dart';
@@ -607,65 +606,6 @@ class OpenUrlAction extends EnsembleAction {
607606
OpenUrlAction.fromYaml(payload: Utils.getYamlMap(inputs));
608607
}
609608

610-
class ShowToastAction extends EnsembleAction {
611-
ShowToastAction(
612-
{super.initiator,
613-
this.type,
614-
this.title,
615-
this.message,
616-
this.body,
617-
this.dismissible,
618-
this.alignment,
619-
this.duration,
620-
this.styles});
621-
622-
ToastType? type;
623-
final String? title;
624-
625-
// either message or widget is needed
626-
final String? message;
627-
final dynamic body;
628-
629-
final bool? dismissible;
630-
631-
final Alignment? alignment;
632-
final int? duration; // the during in seconds before toast is dismissed
633-
final Map<String, dynamic>? styles;
634-
635-
factory ShowToastAction.fromYaml({Map? payload}) {
636-
if (payload == null ||
637-
(payload['message'] == null &&
638-
payload['body'] == null &&
639-
payload['widget'] == null)) {
640-
throw LanguageError(
641-
"${ActionType.showToast.name} requires either a message or a body widget.");
642-
}
643-
return ShowToastAction(
644-
type: ToastType.values.from(payload['options']?['type']),
645-
title: Utils.optionalString(payload['title']),
646-
message: payload['message']?.toString(),
647-
body: payload['body'] ?? payload['widget'],
648-
dismissible: Utils.optionalBool(payload['options']?['dismissible']),
649-
alignment: Utils.getAlignment(payload['options']?['alignment']),
650-
duration: Utils.optionalInt(payload['options']?['duration'], min: 1),
651-
styles: Utils.getMap(payload['styles']));
652-
}
653-
654-
factory ShowToastAction.fromMap(dynamic inputs) =>
655-
ShowToastAction.fromYaml(payload: Utils.getYamlMap(inputs));
656-
657-
@override
658-
Future execute(BuildContext context, ScopeManager scopeManager) {
659-
Widget? customToastBody;
660-
if (body != null) {
661-
customToastBody = scopeManager.buildWidgetFromDefinition(body);
662-
}
663-
ToastController().showToast(context, this, customToastBody,
664-
dataContext: scopeManager.dataContext);
665-
return Future.value(null);
666-
}
667-
}
668-
669609
class GetLocationAction extends EnsembleAction {
670610
GetLocationAction(
671611
{this.onLocationReceived,
@@ -1158,8 +1098,6 @@ enum ActionType {
11581098
logEvent
11591099
}
11601100

1161-
enum ToastType { success, error, warning, info }
1162-
11631101
/// payload representing an Action to do (navigateToScreen, InvokeAPI, ..)
11641102
abstract class EnsembleAction {
11651103
EnsembleAction({this.initiator, this.inputs});

lib/framework/widget/toast.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:ensemble/action/toast_actions.dart';
12
import 'package:ensemble/framework/data_context.dart';
23
import 'package:ensemble/framework/error_handling.dart';
34
import 'package:ensemble/framework/action.dart';

pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ flutter:
154154
- integration_test/local/themedApp/
155155
- integration_test/local/dialogsAndToast/
156156
- integration_test/local/widgets/
157+
- integration_test/local/translation/
158+
- integration_test/local/translation/i18n/
157159

158160
fonts:
159161
# icon fonts

0 commit comments

Comments
 (0)