import 'dart:async'; import 'package:fluent_reader_lite/generated/l10n.dart'; import 'package:fluent_reader_lite/main.dart'; import 'package:fluent_reader_lite/models/services/service_import.dart'; import 'package:fluent_reader_lite/models/sync_model.dart'; import 'package:fluent_reader_lite/pages/setup_page.dart'; import 'package:fluent_reader_lite/pages/subscription_list_page.dart'; import 'package:fluent_reader_lite/pages/tablet_base_page.dart'; import 'package:fluent_reader_lite/utils/global.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:responsive_builder/responsive_builder.dart'; import 'package:uni_links/uni_links.dart'; import 'item_list_page.dart'; class HomePage extends StatefulWidget { HomePage() : super(key: Key("home")); @override _HomePageState createState() => _HomePageState(); } class ScrollTopNotifier with ChangeNotifier { int index = 0; void onTap(int newIndex) { var oldIndex = index; index = newIndex; if (newIndex == oldIndex) notifyListeners(); } } class _HomePageState extends State { final _scrollTopNotifier = ScrollTopNotifier(); final _controller = CupertinoTabController(); final List> _tabNavigatorKeys = [ GlobalKey(), GlobalKey(), ]; StreamSubscription _uriSub; void _uriStreamListener(Uri uri) { if (uri == null) return; if (uri.host == "import") { if (Global.syncModel.hasService) { showCupertinoDialog( context: context, builder: (context) => CupertinoAlertDialog( title: Text(S.of(context).serviceExists), actions: [ CupertinoDialogAction( child: Text(S.of(context).confirm), onPressed: () { Navigator.of(context).pop(); }, ), ], ), ); } else if (!Global.syncModel.syncing) { final import = ServiceImport(uri.queryParameters); final route = ServiceImport.typeMap[uri.queryParameters["t"]]; if (route != null) { final navigator = Navigator.of(context); while (navigator.canPop()) navigator.pop(); navigator.pushNamed(route, arguments: import); } } } } @override void initState() { super.initState(); _uriSub = getUriLinksStream().listen(_uriStreamListener); Future.delayed(Duration.zero, () async { try { final uri = await getInitialUri(); if (uri != null) { _uriStreamListener(uri); } } catch(exp) { print(exp); } }); } @override dispose() { _uriSub.cancel(); super.dispose(); } Widget _constructPage(Widget page, bool isMobile) { return isMobile ? CupertinoPageScaffold( child: page, backgroundColor: CupertinoColors.systemBackground.resolveFrom(context), ) : Container( child: page, color: CupertinoColors.systemBackground.resolveFrom(context), ); } Widget buildLeft(BuildContext context, {isMobile: true}) { final leftTabs = CupertinoTabScaffold( controller: _controller, backgroundColor: CupertinoColors.systemBackground, tabBar: CupertinoTabBar( backgroundColor: CupertinoColors.systemBackground, onTap: _scrollTopNotifier.onTap, items: [ BottomNavigationBarItem( icon: Icon(Icons.timeline), label: S.of(context).feed, ), BottomNavigationBarItem( icon: Icon(Icons.list), label: S.of(context).subscriptions, ), ], ), tabBuilder: (context, index) { return CupertinoTabView( navigatorKey: _tabNavigatorKeys[index], routes: { '/feed': (context) { Widget page = ItemListPage(_scrollTopNotifier); return _constructPage(page, isMobile); }, }, builder: (context) { Widget page = index == 0 ? ItemListPage(_scrollTopNotifier) : SubscriptionListPage(_scrollTopNotifier); return _constructPage(page, isMobile); }, ); }, ); return WillPopScope( child: leftTabs, onWillPop: () async { return !(await _tabNavigatorKeys[_controller.index].currentState.maybePop()); }, ); } @override Widget build(BuildContext context) { return Selector( selector: (context, syncModel) => syncModel.hasService, builder: (context, hasService, child) { if (!hasService) return SetupPage(); return ScreenTypeLayout.builder( breakpoints: ScreenBreakpoints( tablet: 640, watch: 0, desktop: 1600, ), mobile: (context) => buildLeft(context), tablet: (context) { final left = buildLeft(context, isMobile: false); final right = Container( decoration: BoxDecoration(), clipBehavior: Clip.hardEdge, child: CupertinoTabView( navigatorKey: Global.tabletPanel, routes: { "/": (context) => TabletBasePage(), ...MyApp.baseRoutes, }, )); return Container( color: CupertinoColors.systemBackground.resolveFrom(context), child: Row( children: [ Container( constraints: BoxConstraints(maxWidth: 320), child: left, ), VerticalDivider( width: 1, thickness: 1, color: CupertinoColors.systemGrey4.resolveFrom(context), ), Expanded(child: right), ], ) ); }, ); }, ); } }