mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-08-11 15:40:29 -04:00
concurrency work in prep for speeding things up
refactor splash screen to process initialization in a better way more async tools for async cubit constructors greatly improved StateMapFollower class
This commit is contained in:
parent
8da1dc7d32
commit
9bb20f4dd2
47 changed files with 886 additions and 579 deletions
|
@ -9,7 +9,6 @@ import 'package:go_router/go_router.dart';
|
|||
import 'package:stream_transform/stream_transform.dart';
|
||||
|
||||
import '../../../account_manager/account_manager.dart';
|
||||
import '../../init.dart';
|
||||
import '../../layout/layout.dart';
|
||||
import '../../settings/settings.dart';
|
||||
import '../../tools/tools.dart';
|
||||
|
@ -24,19 +23,10 @@ final _homeNavKey = GlobalKey<NavigatorState>(debugLabel: 'homeNavKey');
|
|||
|
||||
class RouterCubit extends Cubit<RouterState> {
|
||||
RouterCubit(AccountRepository accountRepository)
|
||||
: super(const RouterState(
|
||||
isInitialized: false,
|
||||
hasAnyAccount: false,
|
||||
: super(RouterState(
|
||||
hasAnyAccount: accountRepository.getLocalAccounts().isNotEmpty,
|
||||
hasActiveChat: false,
|
||||
)) {
|
||||
// Watch for changes that the router will care about
|
||||
Future.delayed(Duration.zero, () async {
|
||||
await eventualInitialized.future;
|
||||
emit(state.copyWith(
|
||||
isInitialized: true,
|
||||
hasAnyAccount: accountRepository.getLocalAccounts().isNotEmpty));
|
||||
});
|
||||
|
||||
// Subscribe to repository streams
|
||||
_accountRepositorySubscription = accountRepository.stream.listen((event) {
|
||||
switch (event) {
|
||||
|
@ -63,10 +53,6 @@ class RouterCubit extends Cubit<RouterState> {
|
|||
|
||||
/// Our application routes
|
||||
List<RouteBase> get routes => [
|
||||
GoRoute(
|
||||
path: '/',
|
||||
builder: (context, state) => const IndexPage(),
|
||||
),
|
||||
ShellRoute(
|
||||
navigatorKey: _homeNavKey,
|
||||
builder: (context, state, child) => HomeShell(
|
||||
|
@ -75,11 +61,11 @@ class RouterCubit extends Cubit<RouterState> {
|
|||
HomeAccountReadyShell(context: context, child: child))),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: '/home',
|
||||
path: '/',
|
||||
builder: (context, state) => const HomeAccountReadyMain(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/home/chat',
|
||||
path: '/chat',
|
||||
builder: (context, state) => const HomeAccountReadyChat(),
|
||||
),
|
||||
],
|
||||
|
@ -103,17 +89,9 @@ class RouterCubit extends Cubit<RouterState> {
|
|||
// No matter where we are, if there's not
|
||||
|
||||
switch (goRouterState.matchedLocation) {
|
||||
case '/':
|
||||
|
||||
// Wait for initialization to complete
|
||||
if (!eventualInitialized.isCompleted) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return state.hasAnyAccount ? '/home' : '/new_account';
|
||||
case '/new_account':
|
||||
return state.hasAnyAccount ? '/home' : null;
|
||||
case '/home':
|
||||
return state.hasAnyAccount ? '/' : null;
|
||||
case '/':
|
||||
if (!state.hasAnyAccount) {
|
||||
return '/new_account';
|
||||
}
|
||||
|
@ -123,11 +101,11 @@ class RouterCubit extends Cubit<RouterState> {
|
|||
tabletLandscape: false,
|
||||
desktop: false)) {
|
||||
if (state.hasActiveChat) {
|
||||
return '/home/chat';
|
||||
return '/chat';
|
||||
}
|
||||
}
|
||||
return null;
|
||||
case '/home/chat':
|
||||
case '/chat':
|
||||
if (!state.hasAnyAccount) {
|
||||
return '/new_account';
|
||||
}
|
||||
|
@ -137,10 +115,10 @@ class RouterCubit extends Cubit<RouterState> {
|
|||
tabletLandscape: false,
|
||||
desktop: false)) {
|
||||
if (!state.hasActiveChat) {
|
||||
return '/home';
|
||||
return '/';
|
||||
}
|
||||
} else {
|
||||
return '/home';
|
||||
return '/';
|
||||
}
|
||||
return null;
|
||||
case '/settings':
|
||||
|
|
|
@ -20,7 +20,6 @@ RouterState _$RouterStateFromJson(Map<String, dynamic> json) {
|
|||
|
||||
/// @nodoc
|
||||
mixin _$RouterState {
|
||||
bool get isInitialized => throw _privateConstructorUsedError;
|
||||
bool get hasAnyAccount => throw _privateConstructorUsedError;
|
||||
bool get hasActiveChat => throw _privateConstructorUsedError;
|
||||
|
||||
|
@ -36,7 +35,7 @@ abstract class $RouterStateCopyWith<$Res> {
|
|||
RouterState value, $Res Function(RouterState) then) =
|
||||
_$RouterStateCopyWithImpl<$Res, RouterState>;
|
||||
@useResult
|
||||
$Res call({bool isInitialized, bool hasAnyAccount, bool hasActiveChat});
|
||||
$Res call({bool hasAnyAccount, bool hasActiveChat});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
@ -52,15 +51,10 @@ class _$RouterStateCopyWithImpl<$Res, $Val extends RouterState>
|
|||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? isInitialized = null,
|
||||
Object? hasAnyAccount = null,
|
||||
Object? hasActiveChat = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
isInitialized: null == isInitialized
|
||||
? _value.isInitialized
|
||||
: isInitialized // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
hasAnyAccount: null == hasAnyAccount
|
||||
? _value.hasAnyAccount
|
||||
: hasAnyAccount // ignore: cast_nullable_to_non_nullable
|
||||
|
@ -81,7 +75,7 @@ abstract class _$$RouterStateImplCopyWith<$Res>
|
|||
__$$RouterStateImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({bool isInitialized, bool hasAnyAccount, bool hasActiveChat});
|
||||
$Res call({bool hasAnyAccount, bool hasActiveChat});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
@ -95,15 +89,10 @@ class __$$RouterStateImplCopyWithImpl<$Res>
|
|||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? isInitialized = null,
|
||||
Object? hasAnyAccount = null,
|
||||
Object? hasActiveChat = null,
|
||||
}) {
|
||||
return _then(_$RouterStateImpl(
|
||||
isInitialized: null == isInitialized
|
||||
? _value.isInitialized
|
||||
: isInitialized // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
hasAnyAccount: null == hasAnyAccount
|
||||
? _value.hasAnyAccount
|
||||
: hasAnyAccount // ignore: cast_nullable_to_non_nullable
|
||||
|
@ -120,15 +109,11 @@ class __$$RouterStateImplCopyWithImpl<$Res>
|
|||
@JsonSerializable()
|
||||
class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
||||
const _$RouterStateImpl(
|
||||
{required this.isInitialized,
|
||||
required this.hasAnyAccount,
|
||||
required this.hasActiveChat});
|
||||
{required this.hasAnyAccount, required this.hasActiveChat});
|
||||
|
||||
factory _$RouterStateImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$RouterStateImplFromJson(json);
|
||||
|
||||
@override
|
||||
final bool isInitialized;
|
||||
@override
|
||||
final bool hasAnyAccount;
|
||||
@override
|
||||
|
@ -136,7 +121,7 @@ class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
|||
|
||||
@override
|
||||
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||
return 'RouterState(isInitialized: $isInitialized, hasAnyAccount: $hasAnyAccount, hasActiveChat: $hasActiveChat)';
|
||||
return 'RouterState(hasAnyAccount: $hasAnyAccount, hasActiveChat: $hasActiveChat)';
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -144,7 +129,6 @@ class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
|||
super.debugFillProperties(properties);
|
||||
properties
|
||||
..add(DiagnosticsProperty('type', 'RouterState'))
|
||||
..add(DiagnosticsProperty('isInitialized', isInitialized))
|
||||
..add(DiagnosticsProperty('hasAnyAccount', hasAnyAccount))
|
||||
..add(DiagnosticsProperty('hasActiveChat', hasActiveChat));
|
||||
}
|
||||
|
@ -154,8 +138,6 @@ class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
|||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$RouterStateImpl &&
|
||||
(identical(other.isInitialized, isInitialized) ||
|
||||
other.isInitialized == isInitialized) &&
|
||||
(identical(other.hasAnyAccount, hasAnyAccount) ||
|
||||
other.hasAnyAccount == hasAnyAccount) &&
|
||||
(identical(other.hasActiveChat, hasActiveChat) ||
|
||||
|
@ -164,8 +146,7 @@ class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
|||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
int get hashCode =>
|
||||
Object.hash(runtimeType, isInitialized, hasAnyAccount, hasActiveChat);
|
||||
int get hashCode => Object.hash(runtimeType, hasAnyAccount, hasActiveChat);
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
|
@ -183,15 +164,12 @@ class _$RouterStateImpl with DiagnosticableTreeMixin implements _RouterState {
|
|||
|
||||
abstract class _RouterState implements RouterState {
|
||||
const factory _RouterState(
|
||||
{required final bool isInitialized,
|
||||
required final bool hasAnyAccount,
|
||||
{required final bool hasAnyAccount,
|
||||
required final bool hasActiveChat}) = _$RouterStateImpl;
|
||||
|
||||
factory _RouterState.fromJson(Map<String, dynamic> json) =
|
||||
_$RouterStateImpl.fromJson;
|
||||
|
||||
@override
|
||||
bool get isInitialized;
|
||||
@override
|
||||
bool get hasAnyAccount;
|
||||
@override
|
||||
|
|
|
@ -8,14 +8,12 @@ part of 'router_cubit.dart';
|
|||
|
||||
_$RouterStateImpl _$$RouterStateImplFromJson(Map<String, dynamic> json) =>
|
||||
_$RouterStateImpl(
|
||||
isInitialized: json['is_initialized'] as bool,
|
||||
hasAnyAccount: json['has_any_account'] as bool,
|
||||
hasActiveChat: json['has_active_chat'] as bool,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$RouterStateImplToJson(_$RouterStateImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'is_initialized': instance.isInitialized,
|
||||
'has_any_account': instance.hasAnyAccount,
|
||||
'has_active_chat': instance.hasActiveChat,
|
||||
};
|
||||
|
|
|
@ -3,8 +3,7 @@ part of 'router_cubit.dart';
|
|||
@freezed
|
||||
class RouterState with _$RouterState {
|
||||
const factory RouterState(
|
||||
{required bool isInitialized,
|
||||
required bool hasAnyAccount,
|
||||
{required bool hasAnyAccount,
|
||||
required bool hasActiveChat}) = _RouterState;
|
||||
|
||||
factory RouterState.fromJson(dynamic json) =>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue