parent
6d9a8e812b
commit
a0605a3617
6 changed files with 334 additions and 84 deletions
14
lib/controllers/capabilities.dart
Normal file
14
lib/controllers/capabilities.dart
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/client.dart";
|
||||
import "package:nexus/models/capabilities.dart";
|
||||
|
||||
class CapabilitiesController extends AsyncNotifier<Capabilities> {
|
||||
@override
|
||||
Future<Capabilities> build() =>
|
||||
ref.read(ClientController.provider.notifier).getCapabilities();
|
||||
|
||||
static final provider =
|
||||
AsyncNotifierProvider<CapabilitiesController, Capabilities>(
|
||||
CapabilitiesController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -488,11 +488,21 @@ class ClientController(final String? accountId) extends AsyncNotifier<int> {
|
|||
}))["visibility"] ==
|
||||
"public";
|
||||
|
||||
Future<void> setRoomPublished(String roomId, bool published) =>
|
||||
_sendCommand("publish_room", {
|
||||
"room_id": roomId,
|
||||
"visibility": published ? "public" : "private",
|
||||
});
|
||||
Future<void> setRoomPublished(String roomId, bool published) => _sendCommand(
|
||||
"publish_room",
|
||||
{"room_id": roomId, "visibility": published ? "public" : "private"},
|
||||
);
|
||||
|
||||
Future<String> upgradeRoom(
|
||||
String roomId,
|
||||
String version, {
|
||||
ISet<String> additionalCreators = const .empty(),
|
||||
}) async => (await _sendCommand("upgrade_room", {
|
||||
"room_id": roomId,
|
||||
"new_version": version,
|
||||
if (additionalCreators.isNotEmpty)
|
||||
"additional_creators": additionalCreators.toList(),
|
||||
}))["replacement_room"];
|
||||
|
||||
/// The room [alias] points to, or null if it doesn't exist.
|
||||
Future<String?> resolveAlias(String alias) async {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/rooms.dart";
|
||||
import "package:nexus/helpers/extensions/room_version_at_least.dart";
|
||||
import "package:nexus/models/content/content.dart";
|
||||
import "package:nexus/models/content/create.dart";
|
||||
import "package:nexus/models/content/power_levels.dart";
|
||||
|
|
@ -26,8 +27,7 @@ class RoomPowerLevelsController(final String roomId)
|
|||
_ => null,
|
||||
};
|
||||
// Creators only outrank everyone from room version 12, earlier ones just have a power level
|
||||
final creatorsPrivileged =
|
||||
(int.tryParse(create?.roomVersion ?? "") ?? 0) >= 12;
|
||||
final creatorsPrivileged = (create?.roomVersion).versionAtLeast(12);
|
||||
|
||||
return .new(
|
||||
content: switch (stateEvent(.powerLevels)?.content) {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import "package:nexus/controllers/room_published.dart";
|
|||
import "package:nexus/controllers/rooms.dart";
|
||||
import "package:nexus/controllers/space_edges.dart";
|
||||
import "package:nexus/helpers/extensions/join_rule_name.dart";
|
||||
import "package:nexus/helpers/extensions/room_version_at_least.dart";
|
||||
import "package:nexus/helpers/file_dialog_helper.dart";
|
||||
import "package:nexus/helpers/hooks/saving.dart";
|
||||
import "package:nexus/main.dart";
|
||||
|
|
@ -29,6 +30,7 @@ import "package:nexus/models/content/membership.dart";
|
|||
import "package:nexus/models/content/message.dart";
|
||||
import "package:nexus/models/content/name.dart";
|
||||
import "package:nexus/models/content/power_levels.dart";
|
||||
import "package:nexus/models/content/tombstone.dart";
|
||||
import "package:nexus/models/content/topic.dart";
|
||||
import "package:nexus/models/join_rule.dart";
|
||||
import "package:nexus/models/power_level_permission.dart";
|
||||
|
|
@ -46,6 +48,7 @@ import "package:nexus/widgets/settings/local_aliases_sheet.dart";
|
|||
import "package:nexus/widgets/settings/power_level_entry_sheet.dart";
|
||||
import "package:nexus/widgets/settings/power_level_tile.dart";
|
||||
import "package:nexus/widgets/settings/text_setting_tile.dart";
|
||||
import "package:nexus/widgets/settings/upgrade_room_sheet.dart";
|
||||
|
||||
class RoomSettingsSectionsController(final String roomId)
|
||||
extends AsyncNotifier<IMap<String, IList<SettingsCategory>>> {
|
||||
|
|
@ -122,18 +125,18 @@ class RoomSettingsSectionsController(final String roomId)
|
|||
?canonicalAlias.alias,
|
||||
]).toISet();
|
||||
|
||||
final roomVersion = switch (stateContent(.create)) {
|
||||
CreateContent(:final roomVersion) => int.tryParse(roomVersion),
|
||||
final versionName = switch (stateContent(.create)) {
|
||||
CreateContent(:final roomVersion) => roomVersion,
|
||||
_ => null,
|
||||
};
|
||||
bool versionAtLeast(int version) =>
|
||||
roomVersion == null || roomVersion >= version;
|
||||
final canUpgrade =
|
||||
canSet(.tombstone) && stateContent(.tombstone) is! TombstoneContent;
|
||||
final joinRuleOptions = [
|
||||
JoinRule.public,
|
||||
JoinRule.invite,
|
||||
if (versionAtLeast(7)) JoinRule.knock,
|
||||
if (versionAtLeast(8)) JoinRule.restricted,
|
||||
if (versionAtLeast(10)) JoinRule.knockRestricted,
|
||||
if (versionName.versionAtLeast(7)) JoinRule.knock,
|
||||
if (versionName.versionAtLeast(8)) JoinRule.restricted,
|
||||
if (versionName.versionAtLeast(10)) JoinRule.knockRestricted,
|
||||
];
|
||||
bool isRestricted(JoinRule rule) =>
|
||||
rule == .restricted || rule == .knockRestricted;
|
||||
|
|
@ -577,9 +580,8 @@ class RoomSettingsSectionsController(final String roomId)
|
|||
? (value) => saving.run(
|
||||
() => ref
|
||||
.read(
|
||||
RoomPublishedController.provider(
|
||||
roomId,
|
||||
).notifier,
|
||||
RoomPublishedController.provider(roomId)
|
||||
.notifier,
|
||||
)
|
||||
.set(value)
|
||||
.onError(showError),
|
||||
|
|
@ -589,6 +591,52 @@ class RoomSettingsSectionsController(final String roomId)
|
|||
},
|
||||
),
|
||||
),
|
||||
.new(
|
||||
title: "Room Version",
|
||||
description: "The rules the room follows, set when it's created.",
|
||||
icon: Icons.upgrade,
|
||||
builder: (title, description, icon) => HookBuilder(
|
||||
builder: (context) {
|
||||
final saving = Saving.use();
|
||||
|
||||
return ListTile(
|
||||
leading: Icon(icon),
|
||||
title: Text(title),
|
||||
subtitle: Text(
|
||||
versionName == null
|
||||
? description
|
||||
: "Version $versionName",
|
||||
),
|
||||
trailing: TextButton(
|
||||
onPressed:
|
||||
canUpgrade && versionName != null && !saving.active
|
||||
? () => context.showAdaptiveSheet(
|
||||
(_) => UpgradeRoomSheet(
|
||||
roomId: roomId,
|
||||
currentVersion: versionName,
|
||||
creators: roomPowerLevels.creators.remove(
|
||||
userId ?? "",
|
||||
),
|
||||
userId: userId,
|
||||
onSave: (version, creators) => saving.run(
|
||||
() => client
|
||||
.upgradeRoom(
|
||||
roomId,
|
||||
version,
|
||||
additionalCreators: creators,
|
||||
)
|
||||
.then<void>((_) {})
|
||||
.onError(showError),
|
||||
),
|
||||
),
|
||||
)
|
||||
: null,
|
||||
child: Text("Upgrade"),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
]),
|
||||
),
|
||||
.new(
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
|
|||
import "package:intl/intl.dart";
|
||||
import "package:nexus/controllers/accounts.dart";
|
||||
import "package:nexus/controllers/active_account.dart";
|
||||
import "package:nexus/controllers/capabilities.dart";
|
||||
import "package:nexus/controllers/selected_room.dart";
|
||||
import "package:nexus/controllers/notification.dart";
|
||||
import "package:nexus/controllers/client_state.dart";
|
||||
|
|
@ -215,9 +216,9 @@ class UnifiedPushController extends AsyncNotifier<String?> {
|
|||
state = .loading();
|
||||
try {
|
||||
await Future(() async {
|
||||
final capabilities = await ref
|
||||
.read(ClientController.provider.notifier)
|
||||
.getCapabilities();
|
||||
final capabilities = await ref.read(
|
||||
CapabilitiesController.provider.future,
|
||||
);
|
||||
|
||||
if (capabilities.webpush?.vapid == null) {
|
||||
throw UnsupportedError(
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import "dart:io";
|
||||
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/client.dart";
|
||||
import "package:nexus/controllers/capabilities.dart";
|
||||
import "package:nexus/controllers/unified_push_distributors.dart";
|
||||
|
||||
class UnifiedPushAllowedController extends AsyncNotifier<String?> {
|
||||
|
|
@ -19,9 +19,9 @@ class UnifiedPushAllowedController extends AsyncNotifier<String?> {
|
|||
: "Your platform is not currently supported by UnifiedPush"}.";
|
||||
}
|
||||
|
||||
final capabilities = await ref
|
||||
.read(ClientController.provider.notifier)
|
||||
.getCapabilities();
|
||||
final capabilities = await ref.watch(
|
||||
CapabilitiesController.provider.future,
|
||||
);
|
||||
|
||||
if (capabilities.webpush?.vapid == null) {
|
||||
return "Your homeserver does not support MSC4174 (Web Push), and therefore cannot send notifications to Nexus.";
|
||||
|
|
|
|||
Loading…
Reference in a new issue