Try to fix error handling on sync

This commit is contained in:
Henry Hiles 2026-04-10 11:53:32 -04:00
commit 5154e0fc6b
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 35 additions and 18 deletions

View file

@ -1,11 +1,17 @@
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/main.dart";
import "package:nexus/models/sync_status.dart"; import "package:nexus/models/sync_status.dart";
class SyncStatusController extends Notifier<SyncStatus?> { class SyncStatusController extends Notifier<SyncStatus?> {
@override @override
Null build() => null; Null build() => null;
void set(SyncStatus newStatus) => state = newStatus; void set(SyncStatus newStatus) {
if (newStatus.type == SyncStatusType.permanentlyFailed) {
showError(newStatus.error ?? "Syncing failed");
}
state = newStatus;
}
static final provider = NotifierProvider<SyncStatusController, SyncStatus?>( static final provider = NotifierProvider<SyncStatusController, SyncStatus?>(
SyncStatusController.new, SyncStatusController.new,

View file

@ -5,7 +5,6 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/header_controller.dart"; import "package:nexus/controllers/header_controller.dart";
import "package:nexus/controllers/init_complete_controller.dart";
import "package:nexus/controllers/multi_provider_controller.dart"; import "package:nexus/controllers/multi_provider_controller.dart";
import "package:nexus/controllers/shared_prefs_controller.dart"; import "package:nexus/controllers/shared_prefs_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/better_when.dart";
@ -127,9 +126,7 @@ class App extends StatelessWidget {
} else if (!clientState.isVerified) { } else if (!clientState.isVerified) {
return VerifyPage(); return VerifyPage();
} else { } else {
return ref.watch(InitCompleteController.provider) return ChatPage();
? ChatPage()
: Loading();
} }
}, },
), ),

View file

@ -14,5 +14,5 @@ abstract class SyncStatus with _$SyncStatus {
_$SyncStatusFromJson(json); _$SyncStatusFromJson(json);
} }
@JsonEnum(fieldRename: FieldRename.snake) @JsonEnum(fieldRename: FieldRename.kebab)
enum SyncStatusType { ok, waiting, erroring, permanentlyFailed } enum SyncStatusType { ok, waiting, erroring, permanentlyFailed }

View file

@ -1,7 +1,10 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/init_complete_controller.dart";
import "package:nexus/widgets/appbar.dart";
import "package:nexus/widgets/chat_page/sidebar.dart"; import "package:nexus/widgets/chat_page/sidebar.dart";
import "package:nexus/widgets/chat_page/room_chat.dart"; import "package:nexus/widgets/chat_page/room_chat.dart";
import "package:nexus/widgets/loading.dart";
class ChatPage extends ConsumerWidget { class ChatPage extends ConsumerWidget {
const ChatPage({super.key}); const ChatPage({super.key});
@ -11,9 +14,12 @@ class ChatPage extends ConsumerWidget {
builder: (context, constraints) { builder: (context, constraints) {
final isDesktop = constraints.maxWidth > 650; final isDesktop = constraints.maxWidth > 650;
final showMembersByDefault = constraints.maxWidth > 1000; final showMembersByDefault = constraints.maxWidth > 1000;
final initComplete = ref.watch(InitCompleteController.provider);
return Scaffold( return Scaffold(
body: Builder( appBar: initComplete ? null : Appbar(),
body: initComplete
? Builder(
builder: (context) => Row( builder: (context) => Row(
children: [ children: [
if (isDesktop) Sidebar(isDesktop: isDesktop), if (isDesktop) Sidebar(isDesktop: isDesktop),
@ -25,8 +31,16 @@ class ChatPage extends ConsumerWidget {
), ),
], ],
), ),
)
: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [Loading(), Text("Syncing...")],
), ),
drawer: isDesktop ? null : Sidebar(isDesktop: isDesktop), ),
drawer: isDesktop || !initComplete
? null
: Sidebar(isDesktop: isDesktop),
); );
}, },
); );