2024-06-11 21:27:20 -04:00
|
|
|
import 'dart:math';
|
|
|
|
|
2024-06-15 23:29:15 -04:00
|
|
|
import 'package:async_tools/async_tools.dart';
|
2024-02-11 23:18:20 -05:00
|
|
|
import 'package:flutter/material.dart';
|
2024-06-11 21:27:20 -04:00
|
|
|
import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart';
|
2024-02-13 22:03:26 -05:00
|
|
|
import 'package:provider/provider.dart';
|
2024-06-15 23:29:15 -04:00
|
|
|
import 'package:veilid_support/veilid_support.dart';
|
2024-02-11 23:18:20 -05:00
|
|
|
|
2024-02-13 22:03:26 -05:00
|
|
|
import '../../account_manager/account_manager.dart';
|
2024-06-15 23:29:15 -04:00
|
|
|
import '../../chat/chat.dart';
|
2024-02-11 23:18:20 -05:00
|
|
|
import '../../theme/theme.dart';
|
2024-06-16 22:12:24 -04:00
|
|
|
import '../../tools/tools.dart';
|
|
|
|
import 'active_account_page_controller_wrapper.dart';
|
2024-06-11 21:27:20 -04:00
|
|
|
import 'drawer_menu/drawer_menu.dart';
|
2024-02-13 22:03:26 -05:00
|
|
|
import 'home_account_invalid.dart';
|
|
|
|
import 'home_account_locked.dart';
|
|
|
|
import 'home_account_missing.dart';
|
2024-06-16 22:12:24 -04:00
|
|
|
import 'home_account_ready/home_account_ready.dart';
|
2024-02-13 22:03:26 -05:00
|
|
|
import 'home_no_active.dart';
|
2024-02-11 23:18:20 -05:00
|
|
|
|
2024-06-16 22:12:24 -04:00
|
|
|
class HomeScreen extends StatefulWidget {
|
|
|
|
const HomeScreen({super.key});
|
2024-02-11 23:18:20 -05:00
|
|
|
|
|
|
|
@override
|
2024-06-16 22:12:24 -04:00
|
|
|
HomeScreenState createState() => HomeScreenState();
|
2024-02-11 23:18:20 -05:00
|
|
|
}
|
|
|
|
|
2024-06-16 22:12:24 -04:00
|
|
|
class HomeScreenState extends State<HomeScreen> {
|
2024-02-11 23:18:20 -05:00
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
2024-06-16 22:12:24 -04:00
|
|
|
Widget _buildAccountReadyDeviceSpecific(BuildContext context) {
|
|
|
|
final hasActiveChat = context.watch<ActiveChatCubit>().state != null;
|
|
|
|
if (responsiveVisibility(
|
|
|
|
context: context,
|
|
|
|
tablet: false,
|
|
|
|
tabletLandscape: false,
|
|
|
|
desktop: false)) {
|
|
|
|
if (hasActiveChat) {
|
|
|
|
return const HomeAccountReadyChat();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return const HomeAccountReadyMain();
|
|
|
|
}
|
|
|
|
|
2024-06-19 11:35:51 -04:00
|
|
|
Widget _buildAccount(BuildContext context, TypedKey superIdentityRecordKey,
|
|
|
|
PerAccountCollectionState perAccountCollectionState) {
|
|
|
|
switch (perAccountCollectionState.accountInfo.status) {
|
|
|
|
case AccountInfoStatus.accountInvalid:
|
|
|
|
return const HomeAccountInvalid();
|
|
|
|
case AccountInfoStatus.accountLocked:
|
|
|
|
return const HomeAccountLocked();
|
|
|
|
case AccountInfoStatus.accountUnlocked:
|
|
|
|
// Are we ready to render?
|
|
|
|
if (!perAccountCollectionState.isReady) {
|
|
|
|
return waitingPage();
|
|
|
|
}
|
2024-02-13 22:03:26 -05:00
|
|
|
|
2024-06-19 11:35:51 -04:00
|
|
|
// Re-export all ready blocs to the account display subtree
|
|
|
|
return perAccountCollectionState.provide(
|
2024-06-20 19:04:39 -04:00
|
|
|
child: Builder(builder: _buildAccountReadyDeviceSpecific));
|
2024-06-19 11:35:51 -04:00
|
|
|
}
|
2024-06-15 23:29:15 -04:00
|
|
|
}
|
|
|
|
|
2024-06-16 22:12:24 -04:00
|
|
|
Widget _buildAccountPageView(BuildContext context) {
|
|
|
|
final localAccounts = context.watch<LocalAccountsCubit>().state;
|
2024-06-20 19:04:39 -04:00
|
|
|
final activeLocalAccount = context.watch<ActiveLocalAccountCubit>().state;
|
2024-06-19 11:35:51 -04:00
|
|
|
final perAccountCollectionBlocMapState =
|
|
|
|
context.watch<PerAccountCollectionBlocMapCubit>().state;
|
2024-06-16 22:12:24 -04:00
|
|
|
|
2024-06-20 19:04:39 -04:00
|
|
|
final activeIndex = localAccounts
|
|
|
|
.indexWhere((x) => x.superIdentity.recordKey == activeLocalAccount);
|
2024-06-16 22:12:24 -04:00
|
|
|
if (activeIndex == -1) {
|
|
|
|
return const HomeNoActive();
|
2024-02-13 22:03:26 -05:00
|
|
|
}
|
2024-06-16 22:12:24 -04:00
|
|
|
|
|
|
|
return Provider<ActiveAccountPageControllerWrapper>(
|
|
|
|
lazy: false,
|
|
|
|
create: (context) =>
|
|
|
|
ActiveAccountPageControllerWrapper(context.read, activeIndex),
|
|
|
|
dispose: (context, value) {
|
|
|
|
value.dispose();
|
|
|
|
},
|
|
|
|
child: Builder(
|
2024-06-18 21:20:06 -04:00
|
|
|
builder: (context) => PageView.builder(
|
2024-06-16 22:12:24 -04:00
|
|
|
onPageChanged: (idx) {
|
|
|
|
singleFuture(this, () async {
|
|
|
|
await AccountRepository.instance.switchToAccount(
|
|
|
|
localAccounts[idx].superIdentity.recordKey);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
controller: context
|
|
|
|
.read<ActiveAccountPageControllerWrapper>()
|
|
|
|
.pageController,
|
2024-06-18 21:20:06 -04:00
|
|
|
itemCount: localAccounts.length,
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
final superIdentityRecordKey =
|
|
|
|
localAccounts[index].superIdentity.recordKey;
|
2024-06-19 11:35:51 -04:00
|
|
|
final perAccountCollectionState =
|
|
|
|
perAccountCollectionBlocMapState
|
|
|
|
.get(superIdentityRecordKey);
|
|
|
|
if (perAccountCollectionState == null) {
|
2024-06-18 21:20:06 -04:00
|
|
|
return HomeAccountMissing(
|
|
|
|
key: ValueKey(superIdentityRecordKey));
|
|
|
|
}
|
|
|
|
return _buildAccount(context, superIdentityRecordKey,
|
2024-06-19 11:35:51 -04:00
|
|
|
perAccountCollectionState);
|
2024-06-18 21:20:06 -04:00
|
|
|
})));
|
2024-02-13 22:03:26 -05:00
|
|
|
}
|
|
|
|
|
2024-02-11 23:18:20 -05:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final theme = Theme.of(context);
|
|
|
|
final scale = theme.extension<ScaleScheme>()!;
|
|
|
|
|
2024-06-11 21:27:20 -04:00
|
|
|
final gradient = LinearGradient(
|
|
|
|
begin: Alignment.topCenter,
|
|
|
|
end: Alignment.bottomCenter,
|
|
|
|
colors: [
|
|
|
|
scale.tertiaryScale.subtleBackground,
|
|
|
|
scale.tertiaryScale.appBackground,
|
|
|
|
]);
|
|
|
|
|
2024-02-11 23:18:20 -05:00
|
|
|
return SafeArea(
|
2024-04-10 16:13:08 -04:00
|
|
|
child: DecoratedBox(
|
2024-06-11 21:27:20 -04:00
|
|
|
decoration: BoxDecoration(gradient: gradient),
|
|
|
|
child: ZoomDrawer(
|
|
|
|
controller: _zoomDrawerController,
|
|
|
|
//menuBackgroundColor: Colors.transparent,
|
|
|
|
menuScreen: const DrawerMenu(),
|
|
|
|
mainScreen: DecoratedBox(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: scale.primaryScale.activeElementBackground),
|
2024-06-15 23:29:15 -04:00
|
|
|
child: Provider<ZoomDrawerController>.value(
|
|
|
|
value: _zoomDrawerController,
|
2024-06-16 22:12:24 -04:00
|
|
|
child: Builder(builder: _buildAccountPageView))),
|
2024-06-11 21:27:20 -04:00
|
|
|
borderRadius: 24,
|
|
|
|
showShadow: true,
|
|
|
|
angle: 0,
|
|
|
|
drawerShadowsBackgroundColor: theme.shadowColor,
|
|
|
|
mainScreenOverlayColor: theme.shadowColor.withAlpha(0x3F),
|
|
|
|
openCurve: Curves.fastEaseInToSlowEaseOut,
|
|
|
|
// duration: const Duration(milliseconds: 250),
|
|
|
|
// reverseDuration: const Duration(milliseconds: 250),
|
|
|
|
menuScreenTapClose: true,
|
2024-06-13 14:52:34 -04:00
|
|
|
mainScreenTapClose: true,
|
2024-06-11 21:27:20 -04:00
|
|
|
mainScreenScale: .25,
|
|
|
|
slideWidth: min(360, MediaQuery.of(context).size.width * 0.9),
|
|
|
|
)));
|
2024-02-11 23:18:20 -05:00
|
|
|
}
|
2024-06-11 21:27:20 -04:00
|
|
|
|
2024-06-15 23:29:15 -04:00
|
|
|
final _zoomDrawerController = ZoomDrawerController();
|
2024-02-11 23:18:20 -05:00
|
|
|
}
|