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 setApplicationAccountConfig( ApplicationAccountConfig config, ) => setAccountData( userID!, accountDataKey, config.toJson(), ); /// Only updates the specified values in ApplicationAccountConfig Future updateApplicationAccountConfig( ApplicationAccountConfig config, ) { final currentConfig = applicationAccountConfig; return setAccountData( userID!, accountDataKey, ApplicationAccountConfig( wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl, wallpaperOpacity: config.wallpaperOpacity ?? currentConfig.wallpaperOpacity, ).toJson(), ); } } class ApplicationAccountConfig { final Uri? wallpaperUrl; final double? wallpaperOpacity; const ApplicationAccountConfig({ this.wallpaperUrl, this.wallpaperOpacity, }); static double _sanitizedOpacity(double? opacity) { if (opacity == null) return 1; if (opacity > 1 || opacity < 0) return 1; return opacity; } factory ApplicationAccountConfig.fromJson(Map json) => ApplicationAccountConfig( wallpaperUrl: json['wallpaper_url'] is String ? Uri.tryParse(json['wallpaper_url']) : null, wallpaperOpacity: _sanitizedOpacity(json.tryGet('wallpaper_opacity')), ); Map toJson() => { 'wallpaper_url': wallpaperUrl?.toString(), 'wallpaper_opacity': wallpaperOpacity, }; }