veilidchat/lib/layout/home/home_screen.dart

161 lines
5.7 KiB
Dart
Raw Normal View History

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,
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
}