68 lines
2.3 KiB
Dart
68 lines
2.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import '../theme/app_theme.dart';
|
|
|
|
/// Manages dynamic branding and app theme settings fetched from the Odoo backend.
|
|
/// Automatically handles offline caching via SharedPreferences.
|
|
class ThemeManager extends ChangeNotifier {
|
|
static final ThemeManager instance = ThemeManager._internal();
|
|
|
|
ThemeManager._internal();
|
|
|
|
Color _primaryColor = AppTheme.primary;
|
|
Color _secondaryColor = AppTheme.secondary;
|
|
String _brandLogo = '';
|
|
|
|
Color get primaryColor => _primaryColor;
|
|
Color get secondaryColor => _secondaryColor;
|
|
String get brandLogo => _brandLogo;
|
|
|
|
ThemeData get themeData => AppTheme.getTheme(
|
|
primaryColor: _primaryColor,
|
|
secondaryColor: _secondaryColor,
|
|
);
|
|
|
|
/// Initialize cached settings on app launch
|
|
Future<void> initialize() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final primHex = prefs.getString('theme_primary_color');
|
|
final secHex = prefs.getString('theme_secondary_color');
|
|
_brandLogo = prefs.getString('theme_brand_logo') ?? '';
|
|
|
|
if (primHex != null) {
|
|
_primaryColor = _parseHexColor(primHex) ?? AppTheme.primary;
|
|
}
|
|
if (secHex != null) {
|
|
_secondaryColor = _parseHexColor(secHex) ?? AppTheme.secondary;
|
|
}
|
|
}
|
|
|
|
/// Update theme options and persist them to SharedPreferences
|
|
Future<void> updateConfig({
|
|
required String primaryHex,
|
|
required String secondaryHex,
|
|
required String brandLogoB64,
|
|
}) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString('theme_primary_color', primaryHex);
|
|
await prefs.setString('theme_secondary_color', secondaryHex);
|
|
await prefs.setString('theme_brand_logo', brandLogoB64);
|
|
|
|
_primaryColor = _parseHexColor(primaryHex) ?? AppTheme.primary;
|
|
_secondaryColor = _parseHexColor(secondaryHex) ?? AppTheme.secondary;
|
|
_brandLogo = brandLogoB64;
|
|
notifyListeners();
|
|
}
|
|
|
|
Color? _parseHexColor(String hexString) {
|
|
try {
|
|
final buffer = StringBuffer();
|
|
if (hexString.length == 6 || hexString.length == 7) buffer.write('ff');
|
|
buffer.write(hexString.replaceFirst('#', ''));
|
|
return Color(int.parse(buffer.toString(), radix: 16));
|
|
} catch (_) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|