fix fetching spec versions early

This commit is contained in:
Henry Hiles 2026-08-23 14:00:11 -04:00
commit e2f25749e0
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 64 additions and 42 deletions

View file

@ -1,4 +1,5 @@
import "dart:io"; import "dart:io";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
@ -8,6 +9,7 @@ import "package:nexus/controllers/account_data.dart";
import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client.dart";
import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/client_state.dart";
import "package:nexus/controllers/settings.dart"; import "package:nexus/controllers/settings.dart";
import "package:nexus/controllers/spec_versions.dart";
import "package:nexus/models/account_data.dart"; import "package:nexus/models/account_data.dart";
import "package:nexus/models/settings_category.dart"; import "package:nexus/models/settings_category.dart";
import "package:nexus/main.dart"; import "package:nexus/main.dart";
@ -18,9 +20,6 @@ class SettingsSectionsController
@override @override
Future<IMap<String, IList<SettingsCategory>>> build() async { Future<IMap<String, IList<SettingsCategory>>> build() async {
final settings = await ref.watch(SettingsController.provider.future); final settings = await ref.watch(SettingsController.provider.future);
final specVersionsResponse = await ref
.watch(ClientController.provider.notifier)
.getSpecVersions();
return .new({ return .new({
"General": .new([ "General": .new([
@ -49,8 +48,7 @@ class SettingsSectionsController
.new( .new(
title: "Use Dynamic Theme", title: "Use Dynamic Theme",
icon: Icons.palette, icon: Icons.palette,
description: description: "Toggle on or off Dynamic Theme. Only available on Android, Linux, Windows, or MacOS.",
"Toggle on or off Dynamic Theme. Only available on Android, Linux, Windows, or MacOS.",
builder: (title, description, icon) => SwitchListTile( builder: (title, description, icon) => SwitchListTile(
title: Text(title), title: Text(title),
subtitle: Text(description), subtitle: Text(description),
@ -76,8 +74,7 @@ class SettingsSectionsController
settings: .new([ settings: .new([
.new( .new(
title: "Linux Mobile Mode", title: "Linux Mobile Mode",
description: description: "Enables some fixes for Linux mobile, e.g. disabling dragging appbar for moving window.",
"Enables some fixes for Linux mobile, e.g. disabling dragging appbar for moving window.",
icon: Icons.construction, icon: Icons.construction,
builder: (title, description, icon) => SwitchListTile( builder: (title, description, icon) => SwitchListTile(
title: Text(title), title: Text(title),
@ -104,40 +101,51 @@ class SettingsSectionsController
settings: .new([ settings: .new([
.new( .new(
title: "Invite Blocking", title: "Invite Blocking",
description: description: "Block invites, either completely, or block only invites from users without shared private rooms (depends on server support).",
"Block invites, either completely, or block only invites from users without shared private rooms (depends on server support).",
builder: (title, description, icon) => Consumer( builder: (title, description, icon) => Consumer(
builder: (context, ref, _) => builder: (context, ref, _) {
DialogListTile<DefaultInviteAction>( final specVersionsResponse = ref.watch(
icon: Icon(icon), SpecVersionsController.provider,
title: title, );
subtitle: Text(description), return DialogListTile<DefaultInviteAction>(
initialValue: ref icon: Icon(icon),
.watch(AccountDataController.provider) title: title,
.invitePermissionConfig subtitle: Text(description),
.defaultAction, initialValue: ref
options: specVersionsResponse.unstableFeatures.msc4494 .watch(AccountDataController.provider)
? DefaultInviteAction.values .invitePermissionConfig
: IList( .defaultAction,
DefaultInviteAction.values, options:
).remove(.denyPublic).toList(), specVersionsResponse.maybeWhen(
getName: (option) => switch (option) { data: (data) => data.unstableFeatures.msc4494,
.allow => "Allow", orElse: () => true,
.deny => "Deny", )
.denyPublic => "Deny public", ? DefaultInviteAction.values
}, : IList(DefaultInviteAction.values)
onChanged: (value) => ref .remove(.denyPublic)
.watch(ClientController.provider.notifier) .toList(),
.setAccountData( getName: (option) => switch (option) {
.new( .allow => "Allow",
type: AccountData.invitePermissionConfigKey, .deny => "Deny",
content: InvitePermissionConfig( .denyPublic => "Deny public",
defaultAction: value, },
), onChanged: specVersionsResponse.maybeWhen(
), data: (_) =>
) (value) => ref
.onError(showError), .watch(ClientController.provider.notifier)
.setAccountData(
.new(
type: AccountData.invitePermissionConfigKey,
content: InvitePermissionConfig(
defaultAction: value,
),
),
)
.onError(showError),
orElse: () => null,
), ),
);
},
), ),
icon: Icons.person_off, icon: Icons.person_off,
), ),
@ -156,9 +164,8 @@ class SettingsSectionsController
final colorScheme = Theme.of(context).colorScheme; final colorScheme = Theme.of(context).colorScheme;
return M3EButton.icon( return M3EButton.icon(
onPressed: () async { onPressed: () async {
Navigator.of( Navigator.of(context)
context, .popUntil((route) => route.isFirst);
).popUntil((route) => route.isFirst);
await WidgetsBinding.instance.endOfFrame; await WidgetsBinding.instance.endOfFrame;

View file

@ -0,0 +1,15 @@
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/client.dart";
import "package:nexus/models/spec_versions_response.dart";
class SpecVersionsController extends AsyncNotifier<SpecVersionsResponse> {
@override
Future<SpecVersionsResponse> build() =>
ref.watch(ClientController.provider.notifier).getSpecVersions();
static final provider =
AsyncNotifierProvider.autoDispose<
SpecVersionsController,
SpecVersionsResponse
>(SpecVersionsController.new);
}