// 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 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, wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur, primaryColor: config.primaryColor ?? currentConfig.primaryColor, softenThemeColor: config.softenThemeColor ?? currentConfig.softenThemeColor, ).toJson(), ); } Future setApplicationAccountColor(int? primaryColor) { final currentConfig = applicationAccountConfig; return setApplicationAccountConfig( ApplicationAccountConfig( wallpaperUrl: currentConfig.wallpaperUrl, wallpaperOpacity: currentConfig.wallpaperOpacity, wallpaperBlur: currentConfig.wallpaperBlur, primaryColor: primaryColor, softenThemeColor: currentConfig.softenThemeColor, ), ); } Future setApplicationAccountSoftenThemeColor(bool soften) { final currentConfig = applicationAccountConfig; return setApplicationAccountConfig( ApplicationAccountConfig( wallpaperUrl: currentConfig.wallpaperUrl, wallpaperOpacity: currentConfig.wallpaperOpacity, wallpaperBlur: currentConfig.wallpaperBlur, primaryColor: currentConfig.primaryColor, softenThemeColor: soften, ), ); } } class ApplicationAccountConfig { final Uri? wallpaperUrl; final double? wallpaperOpacity; final double? wallpaperBlur; final int? primaryColor; final bool? softenThemeColor; const ApplicationAccountConfig({ this.wallpaperUrl, this.wallpaperOpacity, this.wallpaperBlur, this.primaryColor, this.softenThemeColor, }); 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'), ), wallpaperBlur: json.tryGet('wallpaper_blur'), primaryColor: json.tryGet('primary_color'), softenThemeColor: json.tryGet('soften_theme_color'), ); Map toJson() => { 'wallpaper_url': wallpaperUrl?.toString(), 'wallpaper_opacity': wallpaperOpacity, 'wallpaper_blur': wallpaperBlur, 'primary_color': primaryColor, 'soften_theme_color': softenThemeColor, }; }