didvan-app/lib/views/ai_section/ai_section_page.dart

237 lines
7.2 KiB
Dart

// lib/views/ai_section/ai_section_page.dart
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/ai/ai_chat_args.dart';
import 'package:didvan/models/ai/tools_model.dart';
import 'package:didvan/views/ai/ai.dart';
import 'package:didvan/views/ai/ai_chat_page.dart';
import 'package:didvan/views/ai/widgets/hoshan_drawer.dart';
import 'package:didvan/views/ai_section/widgets/ai_section_bnb.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/hoshan_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/widgets/tool_category_view_widget.dart';
class ImageGenerationScreen extends StatelessWidget {
const ImageGenerationScreen({super.key});
@override
Widget build(BuildContext context) {
final aiState = context.watch<AiState>();
if (aiState.tools == null || aiState.tools!.isEmpty) {
if (aiState.loading) {
return const Center(child: CircularProgressIndicator());
}
return const Center(
child: DidvanText('لیست ابزارها هنوز بارگذاری نشده یا خالی است.'));
}
final Tools imageGenToolCategory = aiState.tools![0];
return ToolCategoryViewWidget(tool: imageGenToolCategory);
}
}
class VoiceChatScreen extends StatelessWidget {
const VoiceChatScreen({super.key});
@override
Widget build(BuildContext context) {
final aiState = context.watch<AiState>();
if (aiState.tools == null || aiState.tools!.isEmpty) {
if (aiState.loading) {
return const Center(child: CircularProgressIndicator());
}
return const Center(
child: DidvanText('لیست ابزارها هنوز بارگذاری نشده یا خالی است.'));
}
final Tools voiceChatToolCategory = aiState.tools!.last;
return ToolCategoryViewWidget(tool: voiceChatToolCategory);
}
}
class ChartAnalysisScreen extends StatelessWidget {
const ChartAnalysisScreen({super.key});
@override
Widget build(BuildContext context) {
final aiState = context.watch<AiState>();
if (aiState.tools == null || aiState.tools!.isEmpty) {
if (aiState.loading) {
return const Center(child: CircularProgressIndicator());
}
return const Center(
child: DidvanText('لیست ابزارها هنوز بارگذاری نشده یا خالی است.'));
}
if (aiState.tools!.length < 2) {
return const Center(
child:
DidvanText('ابزار کافی برای "تحلیل نمودار" وجود ندارد.'));
}
final Tools chartAnalysisToolCategory = aiState.tools![1];
return ToolCategoryViewWidget(tool: chartAnalysisToolCategory);
}
}
class TranslationScreen extends StatelessWidget {
const TranslationScreen({super.key});
@override
Widget build(BuildContext context) {
final aiState = context.watch<AiState>();
if (aiState.tools == null || aiState.tools!.isEmpty) {
if (aiState.loading) {
return const Center(child: CircularProgressIndicator());
}
return const Center(
child: DidvanText('لیست ابزارها هنوز بارگذاری نشده یا خالی است.'));
}
if (aiState.tools!.length < 3) {
return const Center(
child: DidvanText('ابزار کافی برای "ترجمه" وجود ندارد.'));
}
final Tools translationToolCategory = aiState.tools![2];
return ToolCategoryViewWidget(tool: translationToolCategory);
}
}
class AiSectionPage extends StatefulWidget {
const AiSectionPage({super.key});
@override
State<AiSectionPage> createState() => _AiSectionPageState();
}
class _AiSectionPageState extends State<AiSectionPage> {
int _currentTabIndex = 2;
final GlobalKey<ScaffoldState> _aiSectionScaffoldKey =
GlobalKey<ScaffoldState>();
final List<Widget> _pages = const [
ImageGenerationScreen(),
VoiceChatScreen(),
Ai(),
ChartAnalysisScreen(),
TranslationScreen(),
];
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final historyAiChatState = context.read<HistoryAiChatState>();
if (historyAiChatState.bots.isEmpty) {
historyAiChatState.getBots();
}
final aiState = context.read<AiState>();
aiState.endChat();
if (aiState.tools == null) {
aiState.getTools();
}
});
}
void _onTabChanged(int index) {
final aiState = context.read<AiState>();
aiState.endChat();
setState(() {
_currentTabIndex = index;
});
if (aiState.tools != null && aiState.tools!.isNotEmpty) {
Tools? tool;
switch (index) {
case 0:
tool = aiState.tools![0];
break;
case 1:
tool = aiState.tools!.last;
break;
case 2:
return;
case 3:
if (aiState.tools!.length > 1) {
tool = aiState.tools![1];
}
break;
case 4:
if (aiState.tools!.length > 2) {
tool = aiState.tools![2];
}
break;
}
if (tool != null && tool.bots != null && tool.bots!.isNotEmpty) {
final firstBot = tool.bots!.first;
aiState.startChat(AiChatArgs(bot: firstBot));
}
}
}
@override
Widget build(BuildContext context) {
final aiState = context.watch<AiState>();
return Scaffold(
key: _aiSectionScaffoldKey,
appBar: HoshanAppBar(
onBack: () {
if (aiState.isChatting) {
aiState.endChat();
setState(() {
_currentTabIndex = 2;
});
} else {
Navigator.of(context).pop();
}
},
withActions: true,
),
drawer: HoshanDrawer(scaffKey: _aiSectionScaffoldKey),
body: Stack(
children: [
aiState.isChatting
? AiChatPage(args: aiState.currentChatArgs!)
: IndexedStack(
index: _currentTabIndex,
children: _pages,
),
Positioned(
top: 32,
right: 0,
child: InkWell(
onTap: () => _aiSectionScaffoldKey.currentState?.openDrawer(),
child: Container(
width: 46,
height: 46,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
bottomLeft: Radius.circular(12)),
boxShadow: DesignConfig.defaultShadow),
child: Icon(
DidvanIcons.angle_left_light,
color: Theme.of(context).colorScheme.title,
),
),
),
)
],
),
bottomNavigationBar: AiSectionBNB(
currentTabIndex: _currentTabIndex,
onTabChanged: _onTabChanged,
),
);
}
}