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 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 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; } } }