Skip to content

Commit ae46a4f

Browse files
authored
Merge pull request #36 from nstack-io/feature/platformoverride
Add platformOverride in `NStackAppOpen`
2 parents 0117f3e + 6ca7201 commit ae46a4f

File tree

9 files changed

+84
-34
lines changed

9 files changed

+84
-34
lines changed

example/lib/main.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/material.dart';
2+
23
import 'nstack.dart';
34

45
void main() {
@@ -18,16 +19,18 @@ class MainScreen extends StatelessWidget {
1819
@override
1920
Widget build(BuildContext context) {
2021
return NStackAppOpen(
22+
platformOverride: AppOpenPlatform.android,
2123
child: Scaffold(
2224
appBar: AppBar(
2325
title: Text(context.localization.test.testDollarSign),
2426
),
2527
body: Center(
26-
child: MaterialButton(onPressed: () async => {
27-
NStackScope.of(context).changeLanguage(Locale("de-DE"))
28-
},
29-
child: Text("Selected locale: ${NStackScope.of(context).nstack.activeLanguage.name}")
30-
,),
28+
child: MaterialButton(
29+
onPressed: () async =>
30+
{NStackScope.of(context).changeLanguage(Locale("de-DE"))},
31+
child: Text(
32+
"Selected locale: ${NStackScope.of(context).nstack.activeLanguage.name}"),
33+
),
3134
),
3235
),
3336
);

example/lib/nstack.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
33
import 'package:flutter/foundation.dart';
44
import 'package:flutter/widgets.dart';
5+
import 'package:nstack/models/app_open_platform.dart';
56
import 'package:nstack/models/language.dart';
67
import 'package:nstack/models/localize_index.dart';
78
import 'package:nstack/models/nstack_config.dart';
89
import 'package:nstack/nstack.dart';
910
import 'package:nstack/partial/section_key_delegate.dart';
1011

12+
export 'package:nstack/models/app_open_platform.dart';
13+
1114
// Update this file by running:
1215
// - `flutter pub run build_runner build`, if your package depends on Flutter
1316
// - `pub run build_runner build` otherwise
@@ -29,7 +32,7 @@ class _DefaultSection extends SectionKeyDelegate {
2932
class _Test extends SectionKeyDelegate {
3033
const _Test(): super('test');
3134

32-
String get testDollarSign => get('testDollarSign', "\$testing change back");
35+
String get testDollarSign => get('testDollarSign', "\$testing again sdfsdf");
3336
String get testSingleQuotationMark => get('testSingleQuotationMark', "\'testing\'");
3437
String get testDoubleQuotationMark => get('testDoubleQuotationMark', "\"testing\"");
3538
String get testMultipleLines => get('testMultipleLines', "testing\nmultiple\nlines");
@@ -43,7 +46,7 @@ final _languages = [
4346
];
4447

4548
const _bundledTranslations = {
46-
'en-EN': r'''{"data":{"default":{"title":"NStack SDK Demo","test":"test"},"test":{"testDollarSign":"$testing change back","testSingleQuotationMark":"'testing'","testDoubleQuotationMark":"\"testing\"","testMultipleLines":"testing\nmultiple\nlines"}},"meta":{"language":{"id":56,"name":"English","locale":"en-EN","direction":"LRM","is_default":false,"is_best_fit":false},"platform":{"id":515,"slug":"mobile"}}}''',
49+
'en-EN': r'''{"data":{"default":{"title":"NStack SDK Demo","test":"test"},"test":{"testDollarSign":"$testing again sdfsdf","testSingleQuotationMark":"'testing'","testDoubleQuotationMark":"\"testing\"","testMultipleLines":"testing\nmultiple\nlines"}},"meta":{"language":{"id":56,"name":"English","locale":"en-EN","direction":"LRM","is_default":false,"is_best_fit":false},"platform":{"id":515,"slug":"mobile"}}}''',
4750
'de-AT': r'''{"data":{"default":{"title":"NStack SDK Demo","test":"test"},"test":{"testDollarSign":"__testDollarSign","testSingleQuotationMark":"__testSingleQuotationMark","testDoubleQuotationMark":"__testDoubleQuotationMark","testMultipleLines":"__testMultipleLines"}},"meta":{"language":{"id":7,"name":"German (Austria)","locale":"de-AT","direction":"LRM","is_default":false,"is_best_fit":false},"platform":{"id":515,"slug":"mobile"}}}''',
4851
};
4952

@@ -90,8 +93,8 @@ class NStackState extends State<NStackWidget> {
9093
await _nstack.changeLocalization(locale).whenComplete(() => setState(() {}));
9194
}
9295

93-
Future<void> appOpen(Locale locale) async {
94-
await _nstack.appOpen(locale).whenComplete(() => setState(() {}));
96+
Future<void> appOpen(Locale locale, {AppOpenPlatform? platformOverride}) async {
97+
await _nstack.appOpen(locale, platformOverride: platformOverride).whenComplete(() => setState(() {}));
9598
}
9699

97100
@override
@@ -105,10 +108,12 @@ class NStackAppOpen extends StatefulWidget {
105108
Key? key,
106109
required this.child,
107110
this.onComplete,
111+
this.platformOverride
108112
}) : super(key: key);
109113

110114
final Widget child;
111115
final VoidCallback? onComplete;
116+
final AppOpenPlatform? platformOverride;
112117

113118
@override
114119
_NStackAppOpenState createState() => _NStackAppOpenState();
@@ -121,7 +126,7 @@ class _NStackAppOpenState extends State<NStackAppOpen> {
121126
Widget build(BuildContext context) {
122127
if (!_initializedNStack) {
123128
NStackScope.of(context)
124-
.appOpen(Localizations.localeOf(context))
129+
.appOpen(Localizations.localeOf(context), platformOverride: widget.platformOverride)
125130
.whenComplete(() => widget.onComplete?.call());
126131
_initializedNStack = true;
127132
}

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ packages:
302302
path: ".."
303303
relative: true
304304
source: path
305-
version: "0.4.0"
305+
version: "0.4.1"
306306
package_config:
307307
dependency: transitive
308308
description:

lib/models/app_open_platform.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/// See https://github.com/nstack-io/nstack-server/blob/master/project/Models/AppOpens/Validation/AppOpenValidator.php
2+
enum AppOpenPlatform {
3+
ios,
4+
android,
5+
windows,
6+
web,
7+
unknown,
8+
}
9+
10+
extension AppOpenPlatformExtensions on AppOpenPlatform {
11+
String get slug {
12+
switch (this) {
13+
case AppOpenPlatform.ios:
14+
return 'ios';
15+
case AppOpenPlatform.android:
16+
return 'android';
17+
case AppOpenPlatform.windows:
18+
return 'windows';
19+
case AppOpenPlatform.web:
20+
return 'web';
21+
case AppOpenPlatform.unknown:
22+
return 'unknown';
23+
}
24+
}
25+
}

lib/models/nstack_appopen_data.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import 'package:nstack/models/app_open_platform.dart';
2+
13
class NStackAppOpenData {
2-
final String platform;
4+
final AppOpenPlatform platform;
35
final String guid;
46
final String version;
57
final String oldVersion;

lib/nstack.dart

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44
import 'package:flutter/foundation.dart' as Foundation;
55
import 'package:flutter/widgets.dart';
66
import 'package:nstack/models/app_open.dart';
7+
import 'package:nstack/models/app_open_platform.dart';
78
import 'package:nstack/models/language.dart';
89
import 'package:nstack/models/language_response.dart';
910
import 'package:nstack/models/localize_index.dart';
@@ -28,7 +29,8 @@ class NStack<T> {
2829
late NStackAppOpenData _appOpenData;
2930
final bool debug;
3031

31-
List<Language> get availableLanguages => LocalizationRepository().availableLanguages;
32+
List<Language> get availableLanguages =>
33+
LocalizationRepository().availableLanguages;
3234

3335
Language get activeLanguage => LocalizationRepository().pickedLanguage;
3436

@@ -59,13 +61,13 @@ class NStack<T> {
5961
);
6062
}
6163

62-
Future<void> _setupAppOpenData() async {
64+
Future<void> _setupAppOpenData(AppOpenPlatform? platformOverride) async {
6365
WidgetsFlutterBinding.ensureInitialized();
6466
final prefs = await SharedPreferences.getInstance();
6567
String projectVersion;
6668
String guid;
6769
String lastUpdated;
68-
String platform;
70+
AppOpenPlatform platform;
6971

7072
projectVersion = await PackageInfo.fromPlatform()
7173
.then((PackageInfo info) => info.version)
@@ -85,19 +87,18 @@ class NStack<T> {
8587

8688
if (!Foundation.kIsWeb) {
8789
if (Platform.isAndroid) {
88-
platform = 'android';
90+
platform = AppOpenPlatform.android;
8991
} else if (Platform.isIOS) {
90-
platform = 'ios';
92+
platform = AppOpenPlatform.ios;
9193
} else {
92-
//need to update when new platforms come
93-
platform = 'unknown';
94+
platform = AppOpenPlatform.unknown;
9495
}
9596
} else {
96-
platform = 'web';
97+
platform = AppOpenPlatform.web;
9798
}
9899

99100
_appOpenData = NStackAppOpenData(
100-
platform: platform,
101+
platform: platformOverride ?? platform,
101102
guid: guid,
102103
lastUpdated: lastUpdated,
103104
oldVersion: projectVersion,
@@ -171,20 +172,24 @@ class NStack<T> {
171172
}
172173
}
173174

174-
Future<AppOpenResult> appOpen(Locale locale) async {
175+
Future<AppOpenResult> appOpen(
176+
Locale locale, {
177+
AppOpenPlatform? platformOverride,
178+
}) async {
175179
try {
176180
if (_appOpenCalled) {
177181
_log("NStack.appOpen() has already been called, returning early...");
178182
return AppOpenResult.success;
179183
}
180184

181-
await _setupAppOpenData();
185+
await _setupAppOpenData(platformOverride);
182186

183187
// Has user selected a language in the app?
184188
final prefs = await SharedPreferences.getInstance();
185189
var languageTag = locale.toLanguageTag();
186-
if(prefs.containsKey(_prefsSelectedLocale)) {
187-
languageTag = prefs.getString(_prefsSelectedLocale) ?? locale.toLanguageTag();
190+
if (prefs.containsKey(_prefsSelectedLocale)) {
191+
languageTag =
192+
prefs.getString(_prefsSelectedLocale) ?? locale.toLanguageTag();
188193
_log("NStack --> User has overwritten device locale to: $languageTag");
189194
}
190195

@@ -206,7 +211,8 @@ class NStack<T> {
206211
final nstackKey = 'nstack_lang_${bestFitLanguage?.language?.locale}';
207212

208213
// Fetch from the server or use the cache?
209-
if (bestFitLanguage?.shouldUpdate == true || !prefs.containsKey(nstackKey)) {
214+
if (bestFitLanguage?.shouldUpdate == true ||
215+
!prefs.containsKey(nstackKey)) {
210216
// Fetch best fit language from the server
211217
_log(
212218
'NStack --> Fetching best fit language: ${bestFitLanguage!.language!.locale}');
@@ -241,8 +247,10 @@ class NStack<T> {
241247
);
242248
// No cache, default values (this shouldn't happen, should_update should be true)
243249
} else {
244-
_log('NStack --> WARNING: No cache found for best fit language: ${bestFitLanguage?.language?.locale}');
245-
LocalizationRepository().switchBundledLocalization(bestFitLanguage!.language!.locale!);
250+
_log(
251+
'NStack --> WARNING: No cache found for best fit language: ${bestFitLanguage?.language?.locale}');
252+
LocalizationRepository()
253+
.switchBundledLocalization(bestFitLanguage!.language!.locale!);
246254
}
247255
}
248256

@@ -251,7 +259,8 @@ class NStack<T> {
251259
return AppOpenResult.success;
252260
} catch (e, s) {
253261
_appOpenCalled = true;
254-
LocalizationRepository().switchBundledLocalization(locale.toLanguageTag());
262+
LocalizationRepository()
263+
.switchBundledLocalization(locale.toLanguageTag());
255264
_log('NStack --> App Open failed because of: ${e.toString()}');
256265
_log(s.toString());
257266
return AppOpenResult.failed;

lib/src/nstack_builder.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,15 @@ class NstackBuilder implements Builder {
9090
9191
import 'package:flutter/foundation.dart';
9292
import 'package:flutter/widgets.dart';
93+
import 'package:nstack/models/app_open_platform.dart';
9394
import 'package:nstack/models/language.dart';
9495
import 'package:nstack/models/localize_index.dart';
9596
import 'package:nstack/models/nstack_config.dart';
9697
import 'package:nstack/nstack.dart';
9798
import 'package:nstack/partial/section_key_delegate.dart';
9899
100+
export 'package:nstack/models/app_open_platform.dart';
101+
99102
// Update this file by running:
100103
// - `flutter pub run build_runner build`, if your package depends on Flutter
101104
// - `pub run build_runner build` otherwise
@@ -262,8 +265,8 @@ class NStackState extends State<NStackWidget> {
262265
await _nstack.changeLocalization(locale).whenComplete(() => setState(() {}));
263266
}
264267
265-
Future<void> appOpen(Locale locale) async {
266-
await _nstack.appOpen(locale).whenComplete(() => setState(() {}));
268+
Future<void> appOpen(Locale locale, {AppOpenPlatform? platformOverride}) async {
269+
await _nstack.appOpen(locale, platformOverride: platformOverride).whenComplete(() => setState(() {}));
267270
}
268271
269272
@override
@@ -277,10 +280,12 @@ class NStackAppOpen extends StatefulWidget {
277280
Key? key,
278281
required this.child,
279282
this.onComplete,
283+
this.platformOverride
280284
}) : super(key: key);
281285
282286
final Widget child;
283287
final VoidCallback? onComplete;
288+
final AppOpenPlatform? platformOverride;
284289
285290
@override
286291
_NStackAppOpenState createState() => _NStackAppOpenState();
@@ -293,7 +298,7 @@ class _NStackAppOpenState extends State<NStackAppOpen> {
293298
Widget build(BuildContext context) {
294299
if (!_initializedNStack) {
295300
NStackScope.of(context)
296-
.appOpen(Localizations.localeOf(context))
301+
.appOpen(Localizations.localeOf(context), platformOverride: widget.platformOverride)
297302
.whenComplete(() => widget.onComplete?.call());
298303
_initializedNStack = true;
299304
}

lib/src/nstack_repository.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22

33
import 'package:http/http.dart' as http;
4+
import 'package:nstack/models/app_open_platform.dart';
45
import 'package:nstack/models/localize_index.dart';
56
import 'package:nstack/models/nstack_appopen_data.dart';
67
import 'package:nstack/models/nstack_config.dart';
@@ -29,7 +30,7 @@ class NStackRepository {
2930
mutableHeaders['Accept-Language'] = acceptHeader;
3031

3132
final requestBody = <String, String>{
32-
'platform': appOpenData.platform,
33+
'platform': appOpenData.platform.slug,
3334
'guid': appOpenData.guid,
3435
'version': appOpenData.version,
3536
'old_version': appOpenData.oldVersion,

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: nstack
22
description: Nstack plugin for Flutter.
3-
version: 0.4.0
3+
version: 0.4.1
44
homepage: https://github.com/nstack-io/flutter-sdk
55

66
environment:

0 commit comments

Comments
 (0)