chore: if default power level is missing in power levels state event, show its default value (#2920)

This commit is contained in:
ggurdin 2025-06-04 09:46:18 -04:00 committed by GitHub
parent 844155b01e
commit f619b3345e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 83 additions and 0 deletions

View file

@ -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<ChatPermissionsSettings> {
false),
);
// #Pangea
Map<String, dynamic> 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<String, Object?>.from(
room.getState(EventTypes.RoomPowerLevels)?.content ?? {},
);
final powerLevels = Map<String, dynamic>.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);
}

View file

@ -44,6 +44,35 @@ class ChatPermissionsSettingsView extends StatelessWidget {
final eventsPowerLevels = Map<String, int?>.from(
powerLevelsContent.tryGetMap<String, int?>('events') ?? {},
)..removeWhere((k, v) => v is! int);
// #Pangea
final defaults = Map<String, dynamic>.from(
controller.defaultPowerLevels,
);
Map<String, dynamic> missingPowerLevels = Map<String, dynamic>.from(
defaults,
)..removeWhere((k, v) => v is! int || powerLevels.containsKey(k));
missingPowerLevels = missingPowerLevels.map(
(key, value) => MapEntry(key, controller.getDefaultValue(key)),
);
Map<String, int?> missingEventsPowerLevels = Map<String, int?>.from(
defaults.tryGetMap<String, int?>('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(