import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hiddify/core/router/app_router.dart'; import 'package:hiddify/features/about/view/about_page.dart'; import 'package:hiddify/features/common/adaptive_root_scaffold.dart'; import 'package:hiddify/features/geo_asset/overview/geo_assets_overview_page.dart'; import 'package:hiddify/features/home/view/view.dart'; import 'package:hiddify/features/intro/intro_page.dart'; import 'package:hiddify/features/logs/view/logs_page.dart'; import 'package:hiddify/features/profile/add/add_profile_modal.dart'; import 'package:hiddify/features/profile/details/profile_details_page.dart'; import 'package:hiddify/features/profile/overview/profiles_overview_page.dart'; import 'package:hiddify/features/proxies/view/view.dart'; import 'package:hiddify/features/settings/view/config_options_page.dart'; import 'package:hiddify/features/settings/view/per_app_proxy_page.dart'; import 'package:hiddify/features/settings/view/settings_page.dart'; import 'package:hiddify/utils/utils.dart'; part 'routes.g.dart'; GlobalKey? _dynamicRootKey = useMobileRouter ? rootNavigatorKey : null; @TypedShellRoute( routes: [ TypedGoRoute(path: "/intro", name: IntroRoute.name), TypedGoRoute( path: "/", name: HomeRoute.name, routes: [ TypedGoRoute( path: "add", name: AddProfileRoute.name, ), TypedGoRoute( path: "profiles", name: ProfilesOverviewRoute.name, ), TypedGoRoute( path: "profiles/new", name: NewProfileRoute.name, ), TypedGoRoute( path: "profiles/:id", name: ProfileDetailsRoute.name, ), TypedGoRoute( path: "logs", name: LogsRoute.name, ), TypedGoRoute( path: "settings", name: SettingsRoute.name, routes: [ TypedGoRoute( path: "config-options", name: ConfigOptionsRoute.name, ), TypedGoRoute( path: "per-app-proxy", name: PerAppProxyRoute.name, ), TypedGoRoute( path: "routing-assets", name: GeoAssetsRoute.name, ), ], ), TypedGoRoute( path: "about", name: AboutRoute.name, ), ], ), TypedGoRoute( path: "/proxies", name: ProxiesRoute.name, ), ], ) class MobileWrapperRoute extends ShellRouteData { const MobileWrapperRoute(); @override Widget builder(BuildContext context, GoRouterState state, Widget navigator) { return AdaptiveRootScaffold(navigator); } } @TypedShellRoute( routes: [ TypedGoRoute(path: "/intro", name: IntroRoute.name), TypedGoRoute( path: "/", name: HomeRoute.name, routes: [ TypedGoRoute( path: "add", name: AddProfileRoute.name, ), TypedGoRoute( path: "profiles", name: ProfilesOverviewRoute.name, ), TypedGoRoute( path: "profiles/new", name: NewProfileRoute.name, ), TypedGoRoute( path: "profiles/:id", name: ProfileDetailsRoute.name, ), ], ), TypedGoRoute( path: "/proxies", name: ProxiesRoute.name, ), TypedGoRoute( path: "/logs", name: LogsRoute.name, ), TypedGoRoute( path: "/settings", name: SettingsRoute.name, routes: [ TypedGoRoute( path: "config-options", name: ConfigOptionsRoute.name, ), TypedGoRoute( path: "routing-assets", name: GeoAssetsRoute.name, ), ], ), TypedGoRoute( path: "/about", name: AboutRoute.name, ), ], ) class DesktopWrapperRoute extends ShellRouteData { const DesktopWrapperRoute(); @override Widget builder(BuildContext context, GoRouterState state, Widget navigator) { return AdaptiveRootScaffold(navigator); } } class IntroRoute extends GoRouteData { const IntroRoute(); static const name = "Intro"; @override Page buildPage(BuildContext context, GoRouterState state) { return const MaterialPage( fullscreenDialog: true, name: name, child: IntroPage(), ); } } class HomeRoute extends GoRouteData { const HomeRoute(); static const name = "Home"; @override Page buildPage(BuildContext context, GoRouterState state) { return const NoTransitionPage( name: name, child: HomePage(), ); } } class ProxiesRoute extends GoRouteData { const ProxiesRoute(); static const name = "Proxies"; @override Page buildPage(BuildContext context, GoRouterState state) { return const NoTransitionPage( name: name, child: ProxiesPage(), ); } } class AddProfileRoute extends GoRouteData { const AddProfileRoute({this.url}); final String? url; static const name = "Add Profile"; static final GlobalKey $parentNavigatorKey = rootNavigatorKey; @override Page buildPage(BuildContext context, GoRouterState state) { return BottomSheetPage( fixed: true, name: name, builder: (controller) => AddProfileModal( url: url, scrollController: controller, ), ); } } class ProfilesOverviewRoute extends GoRouteData { const ProfilesOverviewRoute(); static const name = "Profiles"; static final GlobalKey $parentNavigatorKey = rootNavigatorKey; @override Page buildPage(BuildContext context, GoRouterState state) { return BottomSheetPage( name: name, builder: (controller) => ProfilesOverviewModal(scrollController: controller), ); } } class NewProfileRoute extends GoRouteData { const NewProfileRoute(); static const name = "New Profile"; static final GlobalKey $parentNavigatorKey = rootNavigatorKey; @override Page buildPage(BuildContext context, GoRouterState state) { return const MaterialPage( fullscreenDialog: true, name: name, child: ProfileDetailsPage("new"), ); } } class ProfileDetailsRoute extends GoRouteData { const ProfileDetailsRoute(this.id); final String id; static const name = "Profile Details"; static final GlobalKey $parentNavigatorKey = rootNavigatorKey; @override Page buildPage(BuildContext context, GoRouterState state) { return MaterialPage( fullscreenDialog: true, name: name, child: ProfileDetailsPage(id), ); } } class LogsRoute extends GoRouteData { const LogsRoute(); static const name = "Logs"; static final GlobalKey? $parentNavigatorKey = _dynamicRootKey; @override Page buildPage(BuildContext context, GoRouterState state) { if (useMobileRouter) { return const MaterialPage( fullscreenDialog: true, name: name, child: LogsPage(), ); } return const NoTransitionPage(name: name, child: LogsPage()); } } class SettingsRoute extends GoRouteData { const SettingsRoute(); static const name = "Settings"; static final GlobalKey? $parentNavigatorKey = _dynamicRootKey; @override Page buildPage(BuildContext context, GoRouterState state) { if (useMobileRouter) { return const MaterialPage( fullscreenDialog: true, name: name, child: SettingsPage(), ); } return const NoTransitionPage(name: name, child: SettingsPage()); } } class ConfigOptionsRoute extends GoRouteData { const ConfigOptionsRoute(); static const name = "Config Options"; static final GlobalKey? $parentNavigatorKey = _dynamicRootKey; @override Page buildPage(BuildContext context, GoRouterState state) { if (useMobileRouter) { return const MaterialPage( fullscreenDialog: true, name: name, child: ConfigOptionsPage(), ); } return const MaterialPage( fullscreenDialog: true, name: name, child: ConfigOptionsPage(), ); } } class PerAppProxyRoute extends GoRouteData { const PerAppProxyRoute(); static const name = "Per-app Proxy"; static final GlobalKey $parentNavigatorKey = rootNavigatorKey; @override Page buildPage(BuildContext context, GoRouterState state) { return const MaterialPage( fullscreenDialog: true, name: name, child: PerAppProxyPage(), ); } } class GeoAssetsRoute extends GoRouteData { const GeoAssetsRoute(); static const name = "Routing Assets"; static final GlobalKey? $parentNavigatorKey = _dynamicRootKey; @override Page buildPage(BuildContext context, GoRouterState state) { if (useMobileRouter) { return const MaterialPage( fullscreenDialog: true, name: name, child: GeoAssetsOverviewPage(), ); } return const MaterialPage( fullscreenDialog: true, name: name, child: GeoAssetsOverviewPage(), ); } } class AboutRoute extends GoRouteData { const AboutRoute(); static const name = "About"; static final GlobalKey? $parentNavigatorKey = _dynamicRootKey; @override Page buildPage(BuildContext context, GoRouterState state) { if (useMobileRouter) { return const MaterialPage( fullscreenDialog: true, name: name, child: AboutPage(), ); } return const NoTransitionPage(name: name, child: AboutPage()); } }