nc-photos/app/lib/widget/home.dart

214 lines
5.7 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'package:event_bus/event_bus.dart';
2021-04-10 06:28:12 +02:00
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kiwi/kiwi.dart';
2021-08-08 14:09:21 +02:00
import 'package:logging/logging.dart';
2021-04-10 06:28:12 +02:00
import 'package:nc_photos/account.dart';
2021-07-25 07:00:38 +02:00
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/account_controller.dart';
import 'package:nc_photos/controller/account_pref_controller.dart';
import 'package:nc_photos/di_container.dart';
2021-08-08 14:09:21 +02:00
import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/album/data_source.dart';
2021-08-08 14:09:21 +02:00
import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file/data_source.dart';
2023-07-17 09:35:45 +02:00
import 'package:nc_photos/entity/pref.dart';
2021-04-10 06:28:12 +02:00
import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/theme.dart';
2023-08-12 17:24:29 +02:00
import 'package:nc_photos/theme/dimension.dart';
2021-08-08 14:09:21 +02:00
import 'package:nc_photos/use_case/import_potential_shared_album.dart';
import 'package:nc_photos/widget/home_collections.dart';
2024-01-12 19:53:14 +01:00
import 'package:nc_photos/widget/home_photos2.dart';
2022-08-06 06:21:11 +02:00
import 'package:nc_photos/widget/home_search.dart';
2022-12-16 16:01:04 +01:00
import 'package:np_codegen/np_codegen.dart';
import 'package:np_common/or_null.dart';
2022-12-16 16:01:04 +01:00
part 'home.g.dart';
2021-04-10 06:28:12 +02:00
class HomeArguments {
HomeArguments(this.account);
final Account account;
}
class Home extends StatefulWidget {
static const routeName = "/home";
2021-07-23 22:05:57 +02:00
static Route buildRoute(HomeArguments args) => MaterialPageRoute(
builder: (context) => Home.fromArgs(args),
);
2021-09-15 08:58:06 +02:00
const Home({
2021-07-23 22:05:57 +02:00
Key? key,
required this.account,
2021-04-10 06:28:12 +02:00
}) : super(key: key);
2021-07-23 22:05:57 +02:00
Home.fromArgs(HomeArguments args, {Key? key})
2021-04-10 06:28:12 +02:00
: this(
2021-09-15 08:58:06 +02:00
key: key,
2021-04-10 06:28:12 +02:00
account: args.account,
);
@override
createState() => _HomeState();
final Account account;
}
2022-12-16 16:01:04 +01:00
@npLog
class _HomeState extends State<Home> with TickerProviderStateMixin {
2021-08-08 14:09:21 +02:00
@override
initState() {
super.initState();
2023-05-17 19:42:08 +02:00
_importPotentialSharedAlbum().then((value) {
if (value.isNotEmpty) {
AccountPref.of(widget.account).setNewSharedAlbum(true);
}
});
_animationController.value = 1;
// call once to pre-cache the value
unawaited(context
.read<AccountController>()
.serverController
.status
.first
.then((value) {
_log.info("Server status: $value");
}));
}
@override
dispose() {
_animationController.dispose();
super.dispose();
2021-08-08 14:09:21 +02:00
}
2021-04-10 06:28:12 +02:00
@override
build(BuildContext context) {
2022-11-12 10:55:33 +01:00
return Scaffold(
bottomNavigationBar: _buildBottomNavigationBar(context),
body: Builder(builder: (context) => _buildContent(context)),
extendBody: true,
resizeToAvoidBottomInset: false,
2021-04-10 06:28:12 +02:00
);
}
Widget _buildBottomNavigationBar(BuildContext context) {
2022-11-12 10:55:33 +01:00
return NavigationBar(
2023-08-12 17:24:29 +02:00
height: AppDimension.of(context).homeBottomAppBarHeight,
2022-11-12 10:55:33 +01:00
destinations: [
NavigationDestination(
2021-04-10 06:28:12 +02:00
icon: const Icon(Icons.photo_outlined),
2022-11-12 10:55:33 +01:00
selectedIcon: const Icon(Icons.photo),
label: L10n.global().photosTabLabel,
2021-04-10 06:28:12 +02:00
),
2022-11-12 10:55:33 +01:00
NavigationDestination(
2022-08-06 06:21:11 +02:00
icon: const Icon(Icons.search),
label: L10n.global().searchTooltip,
),
2022-11-12 10:55:33 +01:00
NavigationDestination(
2021-08-29 16:16:42 +02:00
icon: const Icon(Icons.grid_view_outlined),
2022-11-12 10:55:33 +01:00
selectedIcon: const Icon(Icons.grid_view_sharp),
2021-08-29 16:16:42 +02:00
label: L10n.global().collectionsTooltip,
2021-04-10 06:28:12 +02:00
),
],
2022-11-12 10:55:33 +01:00
selectedIndex: _nextPage,
onDestinationSelected: _onTapNavItem,
backgroundColor: Theme.of(context).homeNavigationBarBackgroundColor,
2021-04-10 06:28:12 +02:00
);
}
Widget _buildContent(BuildContext context) {
return PageView.builder(
controller: _pageController,
physics: const NeverScrollableScrollPhysics(),
2022-08-06 06:21:11 +02:00
itemCount: 3,
itemBuilder: (context, index) => SlideTransition(
position: Tween(
begin: const Offset(0, .05),
end: Offset.zero,
).animate(_animation),
child: FadeTransition(
opacity: _animation,
child: _buildPage(context, index),
),
),
2021-04-10 06:28:12 +02:00
);
}
Widget _buildPage(BuildContext context, int index) {
switch (index) {
case 0:
2024-01-12 19:53:14 +01:00
return const HomePhotos2();
2021-04-10 06:28:12 +02:00
case 1:
return HomeSearch(
account: widget.account,
);
2022-08-06 06:21:11 +02:00
case 2:
return const HomeCollections();
2021-04-10 06:28:12 +02:00
default:
throw ArgumentError("Invalid page index: $index");
}
}
void _onTapNavItem(int index) {
if (index == _nextPage) {
if (index == 0) {
KiwiContainer()
.resolve<EventBus>()
.fire(const HomePhotos2BackToTopEvent());
}
return;
}
_pageController.jumpToPage(index);
2021-04-10 06:28:12 +02:00
setState(() {
_nextPage = index;
});
_animationController
..reset()
..forward();
2021-04-10 06:28:12 +02:00
}
2021-08-08 14:09:21 +02:00
Future<List<Album>> _importPotentialSharedAlbum() async {
final c = KiwiContainer().resolve<DiContainer>().copyWith(
// don't want the potential albums to be cached at this moment
fileRepo: const OrNull(FileRepo(FileWebdavDataSource())),
albumRepo: OrNull(AlbumRepo(AlbumRemoteDataSource())),
);
2021-08-08 14:09:21 +02:00
try {
return await ImportPotentialSharedAlbum(c)(
widget.account,
context
.read<AccountController>()
.accountPrefController
.shareFolderValue,
);
2021-08-08 14:09:21 +02:00
} catch (e, stacktrace) {
_log.shout(
"[_importPotentialSharedAlbum] Failed while ImportPotentialSharedAlbum",
e,
stacktrace);
return [];
}
}
2021-07-23 22:05:57 +02:00
final _pageController = PageController(initialPage: 0, keepPage: false);
2021-04-10 06:28:12 +02:00
int _nextPage = 0;
2021-08-08 14:09:21 +02:00
late final _animationController = AnimationController(
2022-01-24 11:05:35 +01:00
duration: k.animationDurationTabTransition,
vsync: this,
);
late final _animation = CurvedAnimation(
parent: _animationController,
curve: Curves.easeIn,
);
2021-04-10 06:28:12 +02:00
}