feat: add more security enviroment variable based settings
This commit is contained in:
parent
fc3e1d98ef
commit
940f73809c
4 changed files with 147 additions and 2 deletions
|
|
@ -3,10 +3,20 @@ import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'src/app.dart';
|
import 'src/app.dart';
|
||||||
import 'src/shared/data/local/app_database.dart';
|
import 'src/shared/data/local/app_database.dart';
|
||||||
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await dotenv.load(fileName: '.env');
|
||||||
|
debugPrint('✅ Environment loaded: ${dotenv.env['ENVIRONMENT']}');
|
||||||
|
debugPrint('✅ API URL: ${dotenv.env['API_BASE_URL']}');
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('⚠️ Could not load .env file: $e');
|
||||||
|
debugPrint('⚠️ Using default production values');
|
||||||
|
}
|
||||||
|
|
||||||
await SystemChrome.setPreferredOrientations([
|
await SystemChrome.setPreferredOrientations([
|
||||||
DeviceOrientation.portraitUp,
|
DeviceOrientation.portraitUp,
|
||||||
DeviceOrientation.portraitDown,
|
DeviceOrientation.portraitDown,
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,36 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
|
|
||||||
class AppConstants {
|
class AppConstants {
|
||||||
|
// ✅ API Configuration aus Environment
|
||||||
|
static String get apiBaseUrl =>
|
||||||
|
dotenv.env['API_BASE_URL'] ?? 'https://slift.patanix.de';
|
||||||
|
|
||||||
|
static String get apiVersion => dotenv.env['API_VERSION'] ?? 'v1';
|
||||||
|
|
||||||
|
static String get environment => dotenv.env['ENVIRONMENT'] ?? 'production';
|
||||||
|
|
||||||
|
static bool get isDebugMode =>
|
||||||
|
dotenv.env['DEBUG_MODE']?.toLowerCase() == 'true';
|
||||||
|
|
||||||
|
// ✅ Helper Getter
|
||||||
|
static bool get isDevelopment => environment == 'development';
|
||||||
|
static bool get isProduction => environment == 'production';
|
||||||
|
|
||||||
|
// Debug Info
|
||||||
|
static void printConfig() {
|
||||||
|
debugPrint('═══════════════════════════════════');
|
||||||
|
debugPrint('🔧 APP CONFIGURATION');
|
||||||
|
debugPrint('Environment: $environment');
|
||||||
|
debugPrint('API Base URL: $apiBaseUrl');
|
||||||
|
debugPrint('API Version: $apiVersion');
|
||||||
|
debugPrint('Debug Mode: $isDebugMode');
|
||||||
|
debugPrint('═══════════════════════════════════');
|
||||||
|
}
|
||||||
// API Configuration
|
// API Configuration
|
||||||
// static const String apiBaseUrl = 'http://10.0.2.2:8090'; // Android emulator
|
// static const String apiBaseUrl = 'http://10.0.2.2:8090'; // Android emulator
|
||||||
static const String apiBaseUrl = 'https://slift.patanix.de';
|
// static const String apiBaseUrl = 'https://slift.patanix.de';
|
||||||
static const String apiVersion = 'v1';
|
// static const String apiVersion = 'v1';
|
||||||
|
|
||||||
// Wendler 5/3/1 Constants
|
// Wendler 5/3/1 Constants
|
||||||
static const double trainingMaxPercentage = 0.9;
|
static const double trainingMaxPercentage = 0.9;
|
||||||
|
|
|
||||||
96
lib/src/core/debug/debug_config_screen.dart
Normal file
96
lib/src/core/debug/debug_config_screen.dart
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
|
|
||||||
|
import '../constants/app_constants.dart';
|
||||||
|
import '../theme/app_theme.dart';
|
||||||
|
|
||||||
|
class DebugConfigScreen extends StatelessWidget {
|
||||||
|
const DebugConfigScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('🔧 Configuration'),
|
||||||
|
),
|
||||||
|
body: ListView(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
children: [
|
||||||
|
_buildSection(
|
||||||
|
'Environment',
|
||||||
|
[
|
||||||
|
_buildRow('Environment', AppConstants.environment),
|
||||||
|
_buildRow('Debug Mode', AppConstants.isDebugMode.toString()),
|
||||||
|
_buildRow(
|
||||||
|
'Is Development', AppConstants.isDevelopment.toString()),
|
||||||
|
_buildRow('Is Production', AppConstants.isProduction.toString()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
_buildSection(
|
||||||
|
'API Configuration',
|
||||||
|
[
|
||||||
|
_buildRow('Base URL', AppConstants.apiBaseUrl),
|
||||||
|
_buildRow('API Version', AppConstants.apiVersion),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
_buildSection(
|
||||||
|
'All Environment Variables',
|
||||||
|
dotenv.env.entries.map((e) => _buildRow(e.key, e.value)).toList(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildSection(String title, List<Widget> children) {
|
||||||
|
return Card(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: AppTheme.primaryColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
...children,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildRow(String key, String value) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
width: 120,
|
||||||
|
child: Text(
|
||||||
|
key,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
value,
|
||||||
|
style: const TextStyle(color: Colors.white),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
|
||||||
|
import '../../../../core/constants/app_constants.dart';
|
||||||
|
import '../../../../core/debug/debug_config_screen.dart';
|
||||||
import '../../../../core/theme/app_theme.dart';
|
import '../../../../core/theme/app_theme.dart';
|
||||||
import '../../../../shared/data/local/app_database.dart';
|
import '../../../../shared/data/local/app_database.dart';
|
||||||
import '../../../../shared/data/repositories/user_repository.dart';
|
import '../../../../shared/data/repositories/user_repository.dart';
|
||||||
|
|
@ -292,6 +294,17 @@ class _HubScreenState extends ConsumerState<HubScreen> {
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
|
if (AppConstants.isDevelopment)
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.settings),
|
||||||
|
onPressed: () => Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) =>
|
||||||
|
const DebugConfigScreen(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.person_outline),
|
icon: const Icon(Icons.person_outline),
|
||||||
onPressed: () => context.go('/profile'),
|
onPressed: () => context.go('/profile'),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue