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