Files
tatuchat/lib/utils/account_config.dart
Welton Moura 058926cf6f feat: sincronizar cor do tema via account data da conta Matrix
A cor escolhida no Appearance passa a ser guardada em im.fluffychat.account_config (primary_color), em vez de apenas nas preferencias locais do dispositivo.

- ApplicationAccountConfig ganha primaryColor, preservado em updateApplicationAccountConfig e no novo setApplicationAccountColor
- ThemeController restaura a cor da conta activa, aguarda accountDataLoading e reage a alteracoes remotas via onSync
- A cor final e derivada de _accountPrimaryColor ?? _localPrimaryColor, evitando corrida entre as preferencias locais e o sync
- Matrix notifica a troca de conta activa em initMatrix, setActiveClient e logout, corrigindo o indice do cliente activo
- Apagar o wallpaper preserva a cor; testes de serializacao do modelo
2026-09-25 12:53:21 -03:00

86 lines
2.8 KiB
Dart

// SPDX-FileCopyrightText: 2019-Present Christian Kußowski
// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat
//
// SPDX-License-Identifier: AGPL-3.0-or-later
import 'package:matrix/matrix.dart';
extension ApplicationAccountConfigExtension on Client {
static const String accountDataKey = 'im.fluffychat.account_config';
ApplicationAccountConfig get applicationAccountConfig =>
ApplicationAccountConfig.fromJson(
accountData[accountDataKey]?.content ?? {},
);
Future<void> setApplicationAccountConfig(ApplicationAccountConfig config) =>
setAccountData(userID!, accountDataKey, config.toJson());
/// Only updates the specified values in ApplicationAccountConfig
Future<void> updateApplicationAccountConfig(ApplicationAccountConfig config) {
final currentConfig = applicationAccountConfig;
return setAccountData(
userID!,
accountDataKey,
ApplicationAccountConfig(
wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl,
wallpaperOpacity:
config.wallpaperOpacity ?? currentConfig.wallpaperOpacity,
wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur,
primaryColor: config.primaryColor ?? currentConfig.primaryColor,
).toJson(),
);
}
Future<void> setApplicationAccountColor(int? primaryColor) {
final currentConfig = applicationAccountConfig;
return setApplicationAccountConfig(
ApplicationAccountConfig(
wallpaperUrl: currentConfig.wallpaperUrl,
wallpaperOpacity: currentConfig.wallpaperOpacity,
wallpaperBlur: currentConfig.wallpaperBlur,
primaryColor: primaryColor,
),
);
}
}
class ApplicationAccountConfig {
final Uri? wallpaperUrl;
final double? wallpaperOpacity;
final double? wallpaperBlur;
final int? primaryColor;
const ApplicationAccountConfig({
this.wallpaperUrl,
this.wallpaperOpacity,
this.wallpaperBlur,
this.primaryColor,
});
static double _sanitizedOpacity(double? opacity) {
if (opacity == null) return 1;
if (opacity > 1 || opacity < 0) return 1;
return opacity;
}
factory ApplicationAccountConfig.fromJson(Map<String, dynamic> json) =>
ApplicationAccountConfig(
wallpaperUrl: json['wallpaper_url'] is String
? Uri.tryParse(json['wallpaper_url'])
: null,
wallpaperOpacity: _sanitizedOpacity(
json.tryGet<double>('wallpaper_opacity'),
),
wallpaperBlur: json.tryGet<double>('wallpaper_blur'),
primaryColor: json.tryGet<int>('primary_color'),
);
Map<String, dynamic> toJson() => {
'wallpaper_url': wallpaperUrl?.toString(),
'wallpaper_opacity': wallpaperOpacity,
'wallpaper_blur': wallpaperBlur,
'primary_color': primaryColor,
};
}