96 lines
2.8 KiB
Dart
96 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'core/theme/app_theme.dart';
|
|
import 'core/user/user_state.dart';
|
|
import 'features/gallery/gallery_screen.dart';
|
|
import 'features/generate_video/generate_progress_screen.dart';
|
|
import 'features/generate_video/generate_video_screen.dart';
|
|
import 'features/gallery/models/gallery_task_item.dart';
|
|
import 'features/generate_video/generation_result_screen.dart';
|
|
import 'features/home/home_screen.dart';
|
|
import 'features/home/models/task_item.dart';
|
|
import 'features/profile/profile_screen.dart';
|
|
import 'features/recharge/recharge_screen.dart';
|
|
import 'shared/widgets/bottom_nav_bar.dart';
|
|
|
|
/// Root app widget with navigation
|
|
class App extends StatefulWidget {
|
|
const App({super.key});
|
|
|
|
@override
|
|
State<App> createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends State<App> {
|
|
NavTab _currentTab = NavTab.home;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return UserCreditsScope(
|
|
child: MaterialApp(
|
|
title: 'AI Video App',
|
|
theme: AppTheme.light,
|
|
debugShowCheckedModeBanner: false,
|
|
initialRoute: '/',
|
|
builder: (context, child) {
|
|
return SafeArea(
|
|
top: true,
|
|
left: false,
|
|
right: false,
|
|
bottom: false,
|
|
child: child ?? const SizedBox.shrink(),
|
|
);
|
|
},
|
|
routes: {
|
|
'/': (_) => _MainScaffold(
|
|
currentTab: _currentTab,
|
|
onTabSelected: (tab) => setState(() => _currentTab = tab),
|
|
),
|
|
'/recharge': (_) => const RechargeScreen(),
|
|
'/generate': (ctx) {
|
|
final task = ModalRoute.of(ctx)?.settings.arguments as TaskItem?;
|
|
return GenerateVideoScreen(task: task);
|
|
},
|
|
'/progress': (ctx) {
|
|
final taskId = ModalRoute.of(ctx)?.settings.arguments;
|
|
return GenerateProgressScreen(taskId: taskId);
|
|
},
|
|
'/result': (ctx) {
|
|
final mediaItem =
|
|
ModalRoute.of(ctx)?.settings.arguments as GalleryMediaItem?;
|
|
return GenerationResultScreen(mediaItem: mediaItem);
|
|
},
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _MainScaffold extends StatelessWidget {
|
|
const _MainScaffold({
|
|
required this.currentTab,
|
|
required this.onTabSelected,
|
|
});
|
|
|
|
final NavTab currentTab;
|
|
final ValueChanged<NavTab> onTabSelected;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: IndexedStack(
|
|
index: currentTab.index,
|
|
children: [
|
|
const HomeScreen(),
|
|
GalleryScreen(isActive: currentTab == NavTab.gallery),
|
|
ProfileScreen(isActive: currentTab == NavTab.profile),
|
|
],
|
|
),
|
|
bottomNavigationBar: BottomNavBar(
|
|
currentTab: currentTab,
|
|
onTabSelected: onTabSelected,
|
|
),
|
|
);
|
|
}
|
|
}
|