Skip to content

Commit 35fa7b0

Browse files
committed
environment selector
1 parent af38044 commit 35fa7b0

File tree

6 files changed

+99
-3
lines changed

6 files changed

+99
-3
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:domain/env/env_config.dart';
2+
import 'package:domain/services/environment_service.dart';
3+
import 'package:flutter/material.dart';
4+
5+
import '../../../main/init.dart';
6+
7+
class EnvironmentSelector extends StatelessWidget {
8+
EnvironmentSelector({
9+
super.key,
10+
});
11+
12+
final EnvironmentService environmentService = getIt<EnvironmentService>();
13+
14+
DropdownMenuItem<String> _item(
15+
String value, String label, TextStyle textStyle) =>
16+
DropdownMenuItem<String>(
17+
value: value,
18+
child: Padding(
19+
padding: const EdgeInsets.symmetric(horizontal: 8.0),
20+
child: Text(label, style: textStyle),
21+
),
22+
);
23+
24+
@override
25+
Widget build(BuildContext context) {
26+
final textStyle =
27+
Theme.of(context).textTheme.bodyLarge?.copyWith(color: Colors.black);
28+
29+
final items = <DropdownMenuItem<String>>[
30+
_item(EnvConfig.kDevEnv, 'Development', textStyle!),
31+
_item(EnvConfig.kQaEnv, 'QA', textStyle),
32+
_item(EnvConfig.kProdEnv, 'Production', textStyle),
33+
];
34+
35+
return DropdownButtonFormField<String>(
36+
initialValue: EnvConfig.env,
37+
style: textStyle,
38+
decoration: InputDecoration(
39+
labelText: 'Environment',
40+
border: const OutlineInputBorder(),
41+
prefixIcon: const Icon(Icons.settings),
42+
labelStyle: textStyle,
43+
),
44+
items: items,
45+
onChanged: (value) => environmentService.setEnvironment(value!),
46+
);
47+
}
48+
}

app/lib/presentation/ui/pages/login/login_page.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import 'package:app/presentation/ui/custom/app_theme_switch.dart';
88
import 'package:app/presentation/ui/custom/loading_screen.dart';
99
import 'package:flutter_bloc/flutter_bloc.dart';
1010

11+
import '../../custom/environment_selector.dart';
12+
1113
class LoginPage extends StatelessWidget {
1214
AuthService get _authService => getIt();
1315

@@ -39,6 +41,8 @@ class LoginPage extends StatelessWidget {
3941
},
4042
),
4143
),
44+
const SizedBox(height: 32),
45+
EnvironmentSelector(),
4246
],
4347
),
4448
),

modules/data/lib/init.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import 'package:data/repositories/common_repository_impl.dart';
66
import 'package:dio/dio.dart';
77
import 'package:domain/repositories/auth_repository.dart';
88
import 'package:domain/repositories/common_repository.dart';
9+
import 'package:domain/services/environment_service.dart';
910
import 'package:get_it/get_it.dart';
1011
import 'package:shared_preferences/shared_preferences.dart';
1112

13+
import 'network/config/environment_service_impl.dart';
14+
1215
class DataInit {
1316
static Future<void> initialize(GetIt getIt) async {
1417
final pref = await SharedPreferences.getInstance();
@@ -18,12 +21,13 @@ class DataInit {
1821

1922
//Network
2023
getIt.registerLazySingleton<Dio>(() => NetworkConfig.provideDio());
24+
getIt.registerLazySingleton<EnvironmentService>(() => EnvironmentServiceImpl(getIt()));
2125

2226
//Data Sources
2327

2428
//Repositories
2529
getIt.registerLazySingleton<AuthRepository>(
26-
() => AuthRepositoryImpl(getIt()),
30+
() => AuthRepositoryImpl(getIt(), getIt()),
2731
);
2832
getIt.registerLazySingleton<CommonRepository>(
2933
() => CommonRepositoryImpl(getIt()),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:data/network/config/network_config.dart';
2+
import 'package:dio/dio.dart';
3+
import 'package:domain/env/env_config.dart';
4+
import 'package:domain/services/environment_service.dart';
5+
6+
class EnvironmentServiceImpl extends EnvironmentService {
7+
final Dio _dio;
8+
9+
EnvironmentServiceImpl(this._dio);
10+
11+
@override
12+
void setEnvironment(String env) {
13+
EnvConfig.env = env;
14+
NetworkConfig.updateBaseUrl(_dio);
15+
}
16+
}
Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,39 @@
11
import 'package:dio/dio.dart';
2+
import 'package:domain/env/env_config.dart';
3+
import 'package:flutter/foundation.dart';
24

35
import 'network_constants.dart';
46

57
class NetworkConfig {
68
static Dio provideDio() {
79
final options = BaseOptions(
8-
baseUrl: NetworkConstants.baseUrl,
10+
baseUrl: EnvConfig.apiUrl,
911
connectTimeout: const Duration(
1012
seconds: NetworkConstants.connectTimeout,
1113
),
1214
receiveTimeout: const Duration(
1315
seconds: NetworkConstants.receiveTimeout,
1416
),
1517
);
16-
return Dio(options);
18+
19+
final dio = Dio(options);
20+
21+
// Add debug logging only in debug mode
22+
if (kDebugMode) {
23+
dio.interceptors.add(LogInterceptor(
24+
requestBody: true,
25+
responseBody: true,
26+
requestHeader: true,
27+
responseHeader: true,
28+
error: true,
29+
logPrint: (object) => debugPrint(object.toString()),
30+
));
31+
}
32+
33+
return dio;
34+
}
35+
36+
static void updateBaseUrl(Dio dio) {
37+
dio.options.baseUrl = EnvConfig.apiUrl;
1738
}
1839
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
abstract class EnvironmentService {
2+
void setEnvironment(String env);
3+
}

0 commit comments

Comments
 (0)