fix fetching spec versions early
This commit is contained in:
parent
47a3d9d92f
commit
e2f25749e0
2 changed files with 64 additions and 42 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
15
lib/controllers/spec_versions.dart
Normal file
15
lib/controllers/spec_versions.dart
Normal 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);
|
||||
}
|
||||
Loading…
Reference in a new issue