import 'package:flutter/material.dart';
import '../../core/localization/app_localizations.dart';
import '../../core/navigation/deep_link.dart';
import '../../services/analytics_service.dart';
import '../../services/settings_service.dart';
import '../categories/categories_page.dart';
import '../home/home_page.dart';
import '../map/map_page.dart';
import '../tours/tours_page.dart';
import '../favorites/favorites_page.dart';
import '../offline/offline_downloads_page.dart';
import '../learning/learning_home_page.dart';
import '../learning/new_in_weimar_page.dart';
import '../settings/settings_page.dart';
import 'deep_link_detail_page.dart';
import 'extras_drawer.dart';
class MainShell extends StatefulWidget {
const MainShell({super.key, required this.settings, this.initialDeepLink});
final SettingsService settings;
final DeepLink? initialDeepLink;
@override
State<MainShell> createState() => _MainShellState();
}
class _MainShellState extends State<MainShell> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
late int _index;
static const _screenNames = ['home', 'discover', 'tours', 'map'];
@override
void initState() {
super.initState();
_index = _indexFor(widget.initialDeepLink);
if (widget.initialDeepLink != null && !widget.initialDeepLink!.isHome) {
AnalyticsService.instance.track('deep_link_open', properties: {
'deep_link_kind': widget.initialDeepLink!.kind.name,
'object_id': widget.initialDeepLink!.id ?? ''
});
}
AnalyticsService.instance.screenView(_screenNames[_index]);
WidgetsBinding.instance.addPostFrameCallback((_) => _openInitialDeepLink());
}
int _indexFor(DeepLink? link) {
switch (link?.kind) {
case DeepLinkKind.discover:
return 1;
case DeepLinkKind.tours:
return 2;
case DeepLinkKind.map:
return 3;
default:
return 0;
}
}
void _openInitialDeepLink() {
if (!mounted) {
return;
}
final link = widget.initialDeepLink;
if (link == null ||
link.isHome ||
link.kind == DeepLinkKind.discover ||
link.kind == DeepLinkKind.tours ||
link.kind == DeepLinkKind.map) {
return;
}
Widget? page;
switch (link.kind) {
case DeepLinkKind.favorites:
page = const FavoritesPage();
break;
case DeepLinkKind.offline:
page = const OfflineDownloadsPage();
break;
case DeepLinkKind.learnGerman:
page = const LearningHomePage();
break;
case DeepLinkKind.newInWeimar:
page = const NewInWeimarPage();
break;
case DeepLinkKind.settings:
page = SettingsPage(settings: widget.settings);
break;
case DeepLinkKind.tour:
case DeepLinkKind.poi:
page = DeepLinkDetailPage(deepLink: link);
break;
case DeepLinkKind.unknown:
case DeepLinkKind.home:
case DeepLinkKind.discover:
case DeepLinkKind.tours:
case DeepLinkKind.map:
break;
}
if (page != null) {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => page!));
}
}
void _selectDestination(int value) {
if (value == 4) {
AnalyticsService.instance.screenView('extras');
_scaffoldKey.currentState?.openEndDrawer();
return;
}
setState(() => _index = value);
AnalyticsService.instance.screenView(_screenNames[value]);
}
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
final pages = [
const HomePage(),
const CategoriesPage(),
const ToursPage(),
const MapPage(),
];
return Scaffold(
key: _scaffoldKey,
body: IndexedStack(index: _index, children: pages),
endDrawer: ExtrasDrawer(settings: widget.settings),
bottomNavigationBar: NavigationBar(
selectedIndex: _index,
onDestinationSelected: _selectDestination,
destinations: [
NavigationDestination(
icon: const Icon(Icons.home_outlined),
selectedIcon: const Icon(Icons.home_rounded),
label: l10n.t('home'),
),
NavigationDestination(
icon: const Icon(Icons.grid_view_outlined),
selectedIcon: const Icon(Icons.grid_view_rounded),
label: l10n.t('discover'),
),
NavigationDestination(
icon: const Icon(Icons.route_outlined),
selectedIcon: const Icon(Icons.route),
label: l10n.t('tours'),
),
NavigationDestination(
icon: const Icon(Icons.map_outlined),
selectedIcon: const Icon(Icons.map),
label: l10n.t('map'),
),
NavigationDestination(
icon: const Icon(Icons.more_horiz_rounded),
selectedIcon: const Icon(Icons.more_horiz_rounded),
label: l10n.t('more'),
),
],
),
);
}
}

