diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index e42917b94..e001ba6ca 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -7,6 +7,7 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart'; +import 'package:fluffychat/pangea/chat/constants/default_power_level.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; @@ -71,6 +72,59 @@ class ChatPermissionsSettingsController extends State { false), ); + // #Pangea + Map get defaultPowerLevels { + final chatPowerLevels = RoomDefaults.defaultPowerLevels( + Matrix.of(context).client.userID!, + ).content; + + final spacePowerLevels = RoomDefaults.defaultSpacePowerLevels( + Matrix.of(context).client.userID!, + ).content; + + if (roomId == null) return chatPowerLevels; + final room = Matrix.of(context).client.getRoomById(roomId!); + if (room == null) return chatPowerLevels; + + return room.isSpace ? spacePowerLevels : chatPowerLevels; + } + + int getDefaultValue( + String permissionKey, { + String? category, + }) { + final room = Matrix.of(context).client.getRoomById(roomId!); + if (room == null) return 0; + final powerLevelsContent = Map.from( + room.getState(EventTypes.RoomPowerLevels)?.content ?? {}, + ); + + final powerLevels = Map.from(powerLevelsContent) + ..removeWhere((k, v) => v is! int); + + if (category == null) { + switch (permissionKey) { + case 'users_default': + case 'events_default': + return powerLevels[permissionKey] ?? 0; + case 'state_default': + return powerLevels[permissionKey] ?? 50; + case 'ban': + case 'kick': + case 'invite': + return powerLevels[permissionKey] ?? 0; + case 'redact': + return powerLevels[permissionKey] ?? + powerLevels['events_default'] ?? + 0; + } + } else if (category == 'events') { + return room.powerForChangingStateEvent(permissionKey); + } + return 0; + } + // Pangea# + @override Widget build(BuildContext context) => ChatPermissionsSettingsView(this); } diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart index f4e25d9f9..b2c57597e 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -44,6 +44,35 @@ class ChatPermissionsSettingsView extends StatelessWidget { final eventsPowerLevels = Map.from( powerLevelsContent.tryGetMap('events') ?? {}, )..removeWhere((k, v) => v is! int); + // #Pangea + final defaults = Map.from( + controller.defaultPowerLevels, + ); + + Map missingPowerLevels = Map.from( + defaults, + )..removeWhere((k, v) => v is! int || powerLevels.containsKey(k)); + + missingPowerLevels = missingPowerLevels.map( + (key, value) => MapEntry(key, controller.getDefaultValue(key)), + ); + + Map missingEventsPowerLevels = Map.from( + defaults.tryGetMap('events') ?? {}, + )..removeWhere( + (k, v) => v is! int || eventsPowerLevels.containsKey(k), + ); + + missingEventsPowerLevels = missingEventsPowerLevels.map( + (key, value) => MapEntry( + key, + controller.getDefaultValue(key, category: 'events'), + ), + ); + + powerLevels.addAll(missingPowerLevels); + eventsPowerLevels.addAll(missingEventsPowerLevels); + // Pangea# return Column( children: [ ListTile(