fix some bugs

This commit is contained in:
OkaykOrhmn 2024-11-17 16:52:37 +03:30
parent a2c8b5ddac
commit 86c03984cd
16 changed files with 504 additions and 408 deletions

View File

@ -57,7 +57,7 @@ android {
applicationId "com.didvan.didvanapp" applicationId "com.didvan.didvanapp"
minSdkVersion 24 minSdkVersion 24
//noinspection ExpiredTargetSdkVersion //noinspection ExpiredTargetSdkVersion
targetSdkVersion 31 targetSdkVersion 34
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }

View File

@ -43,8 +43,10 @@ class Assets {
static String loadingAnimation = '$_baseAnimationsPath/loading.gif'; static String loadingAnimation = '$_baseAnimationsPath/loading.gif';
static String bookmarkAnimation = '$_baseAnimationsPath/bookmark.gif'; static String bookmarkAnimation = '$_baseAnimationsPath/bookmark.gif';
static String boxAnimation = static String boxAnimationLight =
'$_baseAnimationsPath/onlinegiftools-$_themeSuffix.gif'; '$_baseAnimationsPath/onlinegiftools-light.gif';
static String boxAnimationDark =
'$_baseAnimationsPath/onlinegiftools-dark.gif';
static String get businessCategoryIcon => static String get businessCategoryIcon =>
'$_baseCategoriesPath/business-$_themeSuffix.svg'; '$_baseCategoriesPath/business-$_themeSuffix.svg';

View File

@ -20,7 +20,6 @@ import 'package:didvan/services/notification/notification_service.dart';
import 'package:didvan/utils/my_custom_scroll_behavior.dart'; import 'package:didvan/utils/my_custom_scroll_behavior.dart';
import 'package:didvan/views/ai/ai_state.dart'; import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/bot_assistants_state.dart'; import 'package:didvan/views/ai/bot_assistants_state.dart';
import 'package:didvan/views/ai/create_bot_assistants_state.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart'; import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/tools_state.dart'; import 'package:didvan/views/ai/tools_state.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart'; import 'package:didvan/views/podcasts/podcasts_state.dart';
@ -180,9 +179,6 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
ChangeNotifierProvider<ToolsState>( ChangeNotifierProvider<ToolsState>(
create: (context) => ToolsState(), create: (context) => ToolsState(),
), ),
ChangeNotifierProvider<CreateBotAssistantsState>(
create: (context) => CreateBotAssistantsState(),
),
ChangeNotifierProvider<BotAssistantsState>( ChangeNotifierProvider<BotAssistantsState>(
create: (context) => BotAssistantsState(), create: (context) => BotAssistantsState(),
), ),

View File

@ -5,6 +5,7 @@ import 'package:didvan/views/ai/ai_chat_page.dart';
import 'package:didvan/views/ai/ai_chat_state.dart'; import 'package:didvan/views/ai/ai_chat_state.dart';
import 'package:didvan/views/ai/bot_assistants_page.dart'; import 'package:didvan/views/ai/bot_assistants_page.dart';
import 'package:didvan/views/ai/create_bot_assistants_page.dart'; import 'package:didvan/views/ai/create_bot_assistants_page.dart';
import 'package:didvan/views/ai/create_bot_assistants_state.dart';
import 'package:didvan/views/ai/history_ai_chat_page.dart'; import 'package:didvan/views/ai/history_ai_chat_page.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart'; import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/info_page.dart'; import 'package:didvan/views/ai/info_page.dart';
@ -322,8 +323,18 @@ class RouteGenerator {
case Routes.botAssistants: case Routes.botAssistants:
return _createRoute(const BotAssistantsPage()); return _createRoute(const BotAssistantsPage());
case Routes.createBotAssistants: case Routes.createBotAssistants:
return _createRoute(CreateBotAssistantsPage( return _createRoute(ChangeNotifierProvider<CreateBotAssistantsState>(
create: (context) {
final CreateBotAssistantsState pr = CreateBotAssistantsState();
final id = settings.arguments as int?;
if (id != null) {
pr.getAnAssistant(id: id);
}
return pr;
},
child: CreateBotAssistantsPage(
id: settings.arguments as int?, id: settings.arguments as int?,
),
)); ));
case Routes.info: case Routes.info:
return _createRoute(const InfoPage()); return _createRoute(const InfoPage());

View File

@ -76,21 +76,10 @@ class _AiState extends State<Ai> {
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.only(bottom: 24), padding:
const EdgeInsets.only(bottom: 24, top: 32),
child: Column( child: Column(
children: [ children: [
const SizedBox(
height: 24,
),
Icon(
DidvanIcons.ai_solid,
size: MediaQuery.sizeOf(context).width / 5,
color: Theme.of(context).colorScheme.title,
),
DidvanText(
'هوشان',
color: Theme.of(context).colorScheme.title,
),
const SizedBox( const SizedBox(
height: 24, height: 24,
), ),

View File

@ -19,6 +19,7 @@ import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart'; import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart'; import 'package:didvan/utils/date_time.dart';
import 'package:didvan/utils/extension.dart';
import 'package:didvan/views/ai/ai_chat_state.dart'; import 'package:didvan/views/ai/ai_chat_state.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart'; import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/widgets/ai_message_bar.dart'; import 'package:didvan/views/ai/widgets/ai_message_bar.dart';
@ -342,14 +343,20 @@ class _AiChatPageState extends State<AiChatPage> {
if (!snapshot.hasData) { if (!snapshot.hasData) {
return const SizedBox(); return const SizedBox();
} }
return Markdown( return Directionality(
textDirection: snapshot.data
.toString()
.startsWithEnglish()
? TextDirection.ltr
: TextDirection.rtl,
child: Markdown(
data: "${snapshot.data}...", data: "${snapshot.data}...",
onTapLink: (text, href, title) { onTapLink: (text, href, title) {
if (href != null) { if (href != null) {
launchUrlString( launchUrlString(
href, href,
mode: mode: LaunchMode
LaunchMode.inAppBrowserView, .inAppBrowserView,
); );
} }
}, },
@ -358,7 +365,8 @@ class _AiChatPageState extends State<AiChatPage> {
physics: physics:
const NeverScrollableScrollPhysics(), const NeverScrollableScrollPhysics(),
styleSheet: styleSheet:
defaultMarkdownStyleSheet); defaultMarkdownStyleSheet),
);
}, },
); );
}), }),
@ -417,7 +425,12 @@ class _AiChatPageState extends State<AiChatPage> {
((message.audio == null || ((message.audio == null ||
(message.audio != null && (message.audio != null &&
!message.audio!)))) !message.audio!))))
Markdown( Directionality(
textDirection:
message.text.toString().startsWithEnglish()
? TextDirection.ltr
: TextDirection.rtl,
child: Markdown(
data: message.text.toString(), data: message.text.toString(),
onTapLink: (text, href, title) { onTapLink: (text, href, title) {
if (href != null) { if (href != null) {
@ -432,13 +445,17 @@ class _AiChatPageState extends State<AiChatPage> {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
styleSheet: defaultMarkdownStyleSheet, styleSheet: defaultMarkdownStyleSheet,
), ),
),
Padding( Padding(
padding: padding:
const EdgeInsets.symmetric(horizontal: 8.0), const EdgeInsets.symmetric(horizontal: 8.0),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
if (message.role.toString().contains('user')) if (message.role
.toString()
.contains('user') &&
widget.args.assistantsName == null)
PopupMenuButton( PopupMenuButton(
offset: const Offset(0, 46), offset: const Offset(0, 46),
onSelected: (value) async { onSelected: (value) async {
@ -446,7 +463,12 @@ class _AiChatPageState extends State<AiChatPage> {
Routes.aiChat, Routes.aiChat,
arguments: AiChatArgs( arguments: AiChatArgs(
bot: value, bot: value,
prompts: message)); prompts: message,
isTool: widget.args.isTool ??
context
.read<
HistoryAiChatState>()
.bots));
}, },
itemBuilder: (BuildContext context) { itemBuilder: (BuildContext context) {
final bots = widget.args.isTool ?? final bots = widget.args.isTool ??

View File

@ -6,7 +6,6 @@ import 'package:didvan/models/ai/bot_assistants_model.dart';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/ai/bot_assistants_state.dart'; import 'package:didvan/views/ai/bot_assistants_state.dart';
import 'package:didvan/views/ai/create_bot_assistants_state.dart';
import 'package:didvan/views/widgets/didvan/button.dart'; import 'package:didvan/views/widgets/didvan/button.dart';
import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/hoshan_app_bar.dart'; import 'package:didvan/views/widgets/hoshan_app_bar.dart';
@ -52,23 +51,26 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
(BuildContext context, BotAssistantsState state, Widget? child) => (BuildContext context, BotAssistantsState state, Widget? child) =>
CustomScrollView( CustomScrollView(
slivers: [ slivers: [
const SliverToBoxAdapter( SliverToBoxAdapter(
child: Center( child: Center(
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 32, bottom: 24), padding: const EdgeInsets.only(top: 32, bottom: 24),
child: DidvanText( child: DidvanText(
'انتخاب بات‌ها', 'انتخاب بات‌ها',
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Color(0xff1B3C59), color: Theme.of(context).colorScheme.checkFav,
), ),
), ),
), ),
), ),
if (state.appState != AppState.failed) if (state.appState != AppState.failed)
SliverToBoxAdapter( SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.only(bottom: 12.0),
child: switchAssistants(context, state), child: switchAssistants(context, state),
), ),
),
SliverStateHandler( SliverStateHandler(
childCount: state.isMyAssistants childCount: state.isMyAssistants
? state.myAssistants.length ? state.myAssistants.length
@ -101,8 +103,9 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
return Container( return Container(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 32), margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 32),
decoration: const BoxDecoration( decoration: BoxDecoration(
color: Colors.white, borderRadius: DesignConfig.lowBorderRadius), color: Theme.of(context).colorScheme.surface,
borderRadius: DesignConfig.lowBorderRadius),
child: Column( child: Column(
children: [ children: [
if (state.isMyAssistants) if (state.isMyAssistants)
@ -188,8 +191,8 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 32), margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 32),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all(color: const Color(0xffe0e0e0)), border: Border.all(color: Theme.of(context).colorScheme.border),
color: Colors.white, color: Theme.of(context).colorScheme.surface,
borderRadius: DesignConfig.lowBorderRadius), borderRadius: DesignConfig.lowBorderRadius),
child: Column( child: Column(
children: [ children: [
@ -265,10 +268,6 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
child: state.isMyAssistants child: state.isMyAssistants
? InkWell( ? InkWell(
onTap: () async { onTap: () async {
context
.read<CreateBotAssistantsState>()
.getAnAssistant(id: assistants.id!);
Navigator.pushNamed( Navigator.pushNamed(
context, Routes.createBotAssistants, context, Routes.createBotAssistants,
arguments: assistants.id); arguments: assistants.id);
@ -325,8 +324,10 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
title: 'استفاده از دستیار', title: 'استفاده از دستیار',
onPressed: () => Navigator.pushNamed(context, Routes.aiChat, onPressed: () => Navigator.pushNamed(context, Routes.aiChat,
arguments: AiChatArgs( arguments: AiChatArgs(
bot: assistants.bot! bot: assistants.bot!.copyWith(
.copyWith(id: assistants.id, image: assistants.image), id: assistants.id,
image: assistants.image,
description: assistants.description),
assistantsName: assistants.name)), assistantsName: assistants.name)),
) )
], ],
@ -338,8 +339,9 @@ class _BotAssistantsPageState extends State<BotAssistantsPage> {
return Container( return Container(
margin: const EdgeInsets.symmetric(horizontal: 32), margin: const EdgeInsets.symmetric(horizontal: 32),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
decoration: const BoxDecoration( decoration: BoxDecoration(
color: Colors.white, borderRadius: DesignConfig.lowBorderRadius), color: Theme.of(context).colorScheme.surface,
borderRadius: DesignConfig.lowBorderRadius),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [

View File

@ -8,7 +8,6 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/ai/bot_assistants_model.dart';
import 'package:didvan/models/ai/bot_assistants_req_model.dart'; import 'package:didvan/models/ai/bot_assistants_req_model.dart';
import 'package:didvan/models/ai/bots_model.dart'; import 'package:didvan/models/ai/bots_model.dart';
import 'package:didvan/models/ai/file_create_assistants_model.dart'; import 'package:didvan/models/ai/file_create_assistants_model.dart';
@ -20,7 +19,6 @@ import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/extension.dart'; import 'package:didvan/utils/extension.dart';
import 'package:didvan/views/ai/bot_assistants_state.dart'; import 'package:didvan/views/ai/bot_assistants_state.dart';
import 'package:didvan/views/ai/create_bot_assistants_state.dart'; import 'package:didvan/views/ai/create_bot_assistants_state.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/widgets/didvan/button.dart'; import 'package:didvan/views/widgets/didvan/button.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart'; import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/switch.dart'; import 'package:didvan/views/widgets/didvan/switch.dart';
@ -50,27 +48,12 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
borderRadius: DesignConfig.mediumBorderRadius, borderRadius: DesignConfig.mediumBorderRadius,
borderSide: BorderSide( borderSide: BorderSide(
width: 1, color: Theme.of(context).colorScheme.disabledText)); width: 1, color: Theme.of(context).colorScheme.disabledText));
late List<BotsModel> allBots = context.read<HistoryAiChatState>().bots;
final List<String> botModels = ['مدل زبانی', 'مدل تصویری'];
// final _formYouTubeKey = GlobalKey<FormState>(); // final _formYouTubeKey = GlobalKey<FormState>();
final _formNameKey = GlobalKey<FormState>(); final _formNameKey = GlobalKey<FormState>();
final _formPromptKey = GlobalKey<FormState>(); final _formPromptKey = GlobalKey<FormState>();
final _formDescKey = GlobalKey<FormState>(); final _formDescKey = GlobalKey<FormState>();
String name = '';
String prompt = '';
String desc = '';
// String? youtubeLink;
List<String> countOfLink = [''];
List<FileCreateAssistantsModel> files = [];
ValueNotifier<XFile?> image = ValueNotifier(null);
String selectedBotType = 'text';
bool isPrivate = true;
BotAssistants? assistant;
BotsModel? initialBot;
Timer? _timer; Timer? _timer;
@override @override
@ -100,7 +83,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
return; return;
} }
final List<XFile> resultFiles = []; final List<XFile> resultFiles = [];
for (var file in files) { for (var file in state.files) {
if (!file.fromNetwork) { if (!file.fromNetwork) {
resultFiles.add(file.file!); resultFiles.add(file.file!);
} }
@ -109,19 +92,20 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
final success = await state.createAssistants( final success = await state.createAssistants(
id: widget.id, id: widget.id,
data: BotAssistantsReqModel( data: BotAssistantsReqModel(
type: selectedBotType, type: state.selectedBotType,
name: name, name: state.name,
description: desc, description: state.desc,
botId: selectedBotId, botId: selectedBotId,
prompt: prompt, prompt: state.prompt,
webLinks: countOfLink.first.isEmpty ? null : countOfLink, webLinks:
state.countOfLink.first.isEmpty ? null : state.countOfLink,
// youtubeLink: youtubeLink, // youtubeLink: youtubeLink,
isPrivate: isPrivate, isPrivate: state.isPrivate,
files: resultFiles, files: resultFiles,
deleteImage: assistant != null deleteImage: state.assistant != null
? assistant!.image == null ? state.assistant!.image == null
: image.value == null, : state.image.value == null,
image: image.value)); image: state.image.value));
if (success) { if (success) {
context.read<BotAssistantsState>().getMyAssissmant(); context.read<BotAssistantsState>().getMyAssissmant();
context.read<CreateBotAssistantsState>().assistant = null; context.read<CreateBotAssistantsState>().assistant = null;
@ -135,10 +119,6 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
int selectedBotId = selectedBotType == 'text'
? allBots.first.id!
: context.read<CreateBotAssistantsState>().imageBots.first.id!;
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {
context.read<CreateBotAssistantsState>().assistant = null; context.read<CreateBotAssistantsState>().assistant = null;
@ -155,34 +135,9 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
), ),
body: Consumer<CreateBotAssistantsState>(builder: (BuildContext context, body: Consumer<CreateBotAssistantsState>(builder: (BuildContext context,
CreateBotAssistantsState state, Widget? child) { CreateBotAssistantsState state, Widget? child) {
if (assistant == null && state.assistant != null) { int selectedBotId = state.selectedBotType == 'text'
assistant = state.assistant; ? state.allBots.first.id!
: context.read<CreateBotAssistantsState>().imageBots.first.id!;
name = assistant!.name ?? '';
prompt = assistant!.prompt ?? '';
desc = assistant!.description ?? '';
// youtubeLink = assistant!.;
isPrivate = assistant!.private ?? true;
if (files.isEmpty &&
assistant!.files != null &&
assistant!.files!.isNotEmpty) {
for (var file in assistant!.files!) {
files.add(FileCreateAssistantsModel(
fromNetwork: true, file: null, url: file));
}
}
countOfLink = assistant!.websites ?? [''];
selectedBotType = assistant!.type ?? 'text';
final list = selectedBotType == 'text' ? allBots : state.imageBots;
for (var bot in list) {
if (bot.id == assistant!.botId) {
initialBot = bot;
break;
}
}
}
return state.loading return state.loading
? Center( ? Center(
child: SpinKitThreeBounce( child: SpinKitThreeBounce(
@ -202,9 +157,9 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
child: CustomDropdown<String>( child: CustomDropdown<String>(
closedHeaderPadding: const EdgeInsets.all(12), closedHeaderPadding: const EdgeInsets.all(12),
items: botModels, items: state.botModels,
enabled: assistant == null, enabled: state.assistant == null,
initialItem: botModels[0], initialItem: state.botModels[0],
hideSelectedFieldWhenExpanded: false, hideSelectedFieldWhenExpanded: false,
decoration: CustomDropdownDecoration( decoration: CustomDropdownDecoration(
listItemDecoration: ListItemDecoration( listItemDecoration: ListItemDecoration(
@ -220,10 +175,9 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
Theme.of(context).colorScheme.surface), Theme.of(context).colorScheme.surface),
// hintText: "انتخاب کنید", // hintText: "انتخاب کنید",
onChanged: (value) { onChanged: (value) {
setState(() { final index = state.botModels.indexOf(value!);
final index = botModels.indexOf(value!); state.selectedBotType =
selectedBotType = index == 0 ? 'text' : 'image'; index == 0 ? 'text' : 'image';
});
}, },
), ),
), ),
@ -231,7 +185,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
height: 24, height: 24,
), ),
ValueListenableBuilder( ValueListenableBuilder(
valueListenable: image, valueListenable: state.image,
builder: (context, img, _) { builder: (context, img, _) {
return Row( return Row(
mainAxisAlignment: mainAxisAlignment:
@ -240,24 +194,24 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
DidvanButton( DidvanButton(
width: 120, width: 120,
style: ButtonStyleMode.flat, style: ButtonStyleMode.flat,
color: image.value != null || color: state.image.value != null ||
assistant?.image != null state.assistant?.image != null
? Theme.of(context).colorScheme.error ? Theme.of(context).colorScheme.error
: null, : null,
title: image.value != null || title: state.image.value != null ||
assistant?.image != null state.assistant?.image != null
? 'حذف عکس' ? 'حذف عکس'
: 'انتخاب عکس', : 'انتخاب عکس',
onPressed: () async { onPressed: () async {
if (image.value != null || if (state.image.value != null ||
assistant?.image != null) { state.assistant?.image != null) {
if (assistant != null) { if (state.assistant != null) {
assistant!.image = null; state.assistant!.image = null;
} }
image.value = null; state.image.value = null;
return; return;
} }
image.value = state.image.value =
await MediaService.pickImage( await MediaService.pickImage(
source: ImageSource.gallery); source: ImageSource.gallery);
}, },
@ -273,9 +227,9 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
Image.file(File(img.path))), Image.file(File(img.path))),
) )
: SkeletonImage( : SkeletonImage(
imageUrl: assistant != null && imageUrl: state.assistant != null &&
assistant!.image != null state.assistant!.image != null
? assistant!.image! ? state.assistant!.image!
: 'https://via.placeholder.com/70x70', : 'https://via.placeholder.com/70x70',
width: 80, width: 80,
height: 80, height: 80,
@ -290,14 +244,14 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
Form( Form(
key: _formNameKey, key: _formNameKey,
child: DidvanTextField( child: DidvanTextField(
initialValue: name, initialValue: state.name,
onChanged: (value) { onChanged: (value) {
name = value; state.name = value;
if (value.isEmpty) { if (value.isEmpty) {
return; return;
} }
if (assistant == null) { if (state.assistant == null) {
_timer?.cancel(); _timer?.cancel();
_timer = _timer =
Timer(const Duration(seconds: 1), () async { Timer(const Duration(seconds: 1), () async {
@ -312,7 +266,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
result = 'نام نباید خالی باشد'; result = 'نام نباید خالی باشد';
} else if (value.length < 4) { } else if (value.length < 4) {
result = 'نام نباید کمتر از 4 حرف باشد'; result = 'نام نباید کمتر از 4 حرف باشد';
} else if (assistant == null && } else if (state.assistant == null &&
!state.successName) { !state.successName) {
result = result =
'اسم دیگری انتخاب کنید این اسم موجود است'; 'اسم دیگری انتخاب کنید این اسم موجود است';
@ -359,7 +313,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
Form( Form(
key: _formDescKey, key: _formDescKey,
child: DidvanTextField( child: DidvanTextField(
initialValue: desc, initialValue: state.desc,
// hintText: // hintText:
// 'به ربات خود بگویید که چگونه رفتار کند و چگونه به پیام‌های کاربر پاسخ دهد. سعی کنید تا حد امکان واضح و مشخص باشید.', // 'به ربات خود بگویید که چگونه رفتار کند و چگونه به پیام‌های کاربر پاسخ دهد. سعی کنید تا حد امکان واضح و مشخص باشید.',
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
@ -369,7 +323,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
hasHeight: false, hasHeight: false,
showLen: true, showLen: true,
onChanged: (value) { onChanged: (value) {
desc = value; state.desc = value;
}, },
validator: (value) { validator: (value) {
String? result; String? result;
@ -396,18 +350,18 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
width: MediaQuery.sizeOf(context).width, width: MediaQuery.sizeOf(context).width,
child: CustomDropdown<BotsModel>( child: CustomDropdown<BotsModel>(
closedHeaderPadding: const EdgeInsets.all(12), closedHeaderPadding: const EdgeInsets.all(12),
items: selectedBotType == 'text' items: state.selectedBotType == 'text'
? allBots ? state.allBots
: state.imageBots, : state.imageBots,
headerBuilder: (context, bot, enabled) => headerBuilder: (context, bot, enabled) =>
botRow(bot, context), botRow(bot, context),
listItemBuilder: (context, bot, isSelected, listItemBuilder: (context, bot, isSelected,
onItemSelect) => onItemSelect) =>
botRow(bot, context), botRow(bot, context),
initialItem: assistant != null initialItem: state.assistant != null
? initialBot ? state.initialBot
: (selectedBotType == 'text' : (state.selectedBotType == 'text'
? allBots ? state.allBots
: state.imageBots) : state.imageBots)
.first, .first,
hideSelectedFieldWhenExpanded: false, hideSelectedFieldWhenExpanded: false,
@ -427,9 +381,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
.surface), .surface),
// hintText: "انتخاب کنید", // hintText: "انتخاب کنید",
onChanged: (value) { onChanged: (value) {
setState(() {
selectedBotId = value!.id!; selectedBotId = value!.id!;
});
}, },
), ),
), ),
@ -440,7 +392,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
Form( Form(
key: _formPromptKey, key: _formPromptKey,
child: DidvanTextField( child: DidvanTextField(
initialValue: prompt, initialValue: state.prompt,
hintText: hintText:
'به ربات خود بگویید که چگونه رفتار کند و چگونه به پیام‌های کاربر پاسخ دهد. سعی کنید تا حد امکان واضح و مشخص باشید.', 'به ربات خود بگویید که چگونه رفتار کند و چگونه به پیام‌های کاربر پاسخ دهد. سعی کنید تا حد امکان واضح و مشخص باشید.',
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
@ -450,7 +402,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
hasHeight: false, hasHeight: false,
showLen: true, showLen: true,
onChanged: (value) { onChanged: (value) {
prompt = value; state.prompt = value;
}, },
validator: (value) { validator: (value) {
String? result; String? result;
@ -466,15 +418,15 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
const SizedBox( const SizedBox(
height: 24, height: 24,
), ),
if (assistant == null) if (state.assistant == null)
Column( Column(
children: [ children: [
if (selectedBotType == 'text') if (state.selectedBotType == 'text')
Column( Column(
children: [ children: [
title( title(
text: 'پایگاه دانش', isRequired: false), text: 'پایگاه دانش', isRequired: false),
if (files.length != 3) if (state.files.length != 3)
SizedBox( SizedBox(
height: 48, height: 48,
child: ElevatedButton( child: ElevatedButton(
@ -492,11 +444,21 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
.pickMultiFile(); .pickMultiFile();
if (picks != null) { if (picks != null) {
for (var file in picks.xFiles) { for (var file in picks.xFiles) {
files.add( if (file.path.isDocument() ||
file.path.isAudio()) {
state.files.add(
FileCreateAssistantsModel( FileCreateAssistantsModel(
fromNetwork: false, fromNetwork: false,
file: file, file: file,
url: null)); url: null));
} else {
ActionSheetUtils(context)
.showAlert(AlertData(
message:
'باید فایل انتخاب شده صوتی یا Pdf باشد',
aLertType: ALertType
.error));
}
} }
} }
state.update(); state.update();
@ -529,12 +491,14 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
MainAxisAlignment.spaceEvenly, MainAxisAlignment.spaceEvenly,
children: [ children: [
...List.generate( ...List.generate(
files.length, state.files.length,
(index) { (index) {
return Stack( return SizedBox(
child: Stack(
children: [ children: [
Container( Container(
width: MediaQuery.sizeOf( width: MediaQuery
.sizeOf(
context) context)
.width / .width /
5, 5,
@ -546,8 +510,9 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
.symmetric( .symmetric(
horizontal: 8, horizontal: 8,
vertical: 12), vertical: 12),
padding: const EdgeInsets padding:
.all(8), const EdgeInsets.all(
8),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
@ -557,24 +522,31 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
child: files[index] child: state
.files[
index]
.fromNetwork .fromNetwork
? files[index] ? state
.files[
index]
.url! .url!
.isImage() .isImage()
? CachedNetworkImage( ? CachedNetworkImage(
imageUrl: imageUrl: state
files[index] .files[
index]
.url!) .url!)
: const Icon( : const Icon(
CupertinoIcons CupertinoIcons
.doc) .doc)
: files[index] : state
.files[
index]
.file! .file!
.path .path
.isImage() .isImage()
? Image.file( ? Image.file(File(state
File(files[ .files[
index] index]
.file! .file!
.path)) .path))
@ -583,13 +555,20 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
.doc), .doc),
), ),
MarqueeText( MarqueeText(
text: files[index] text: state
.files[
index]
.fromNetwork .fromNetwork
? files[index] ? state
.files[
index]
.url! .url!
.split('/') .split(
'/')
.last .last
: files[index] : state
.files[
index]
.file! .file!
.name, .name,
textDirection: textDirection:
@ -606,15 +585,15 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
left: 4, left: 4,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
files.removeAt(index); state.files
.removeAt(index);
state.update(); state.update();
}, },
child: Container( child: Container(
padding: padding:
const EdgeInsets const EdgeInsets
.all(6), .all(6),
decoration: decoration: BoxDecoration(
BoxDecoration(
shape: BoxShape shape: BoxShape
.circle, .circle,
color: Theme.of( color: Theme.of(
@ -630,6 +609,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
), ),
)) ))
], ],
),
); );
}, },
) )
@ -666,25 +646,24 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
text: 'لینک وب سایت', isRequired: false), text: 'لینک وب سایت', isRequired: false),
Row( Row(
children: [ children: [
if (countOfLink.length > 1) if (state.countOfLink.length > 1)
DidvanIconButton( DidvanIconButton(
icon: icon:
CupertinoIcons.minus_circle_fill, CupertinoIcons.minus_circle_fill,
onPressed: () { onPressed: () {
setState(() { state.countOfLink.removeLast();
countOfLink.removeLast(); state.update();
});
}, },
), ),
if (countOfLink.length != 3) if (state.countOfLink.length != 3)
DidvanIconButton( DidvanIconButton(
icon: CupertinoIcons.plus_circle_fill, icon: CupertinoIcons.plus_circle_fill,
onPressed: () { onPressed: () {
setState(() { if (state
if (countOfLink.last.isNotEmpty) { .countOfLink.last.isNotEmpty) {
countOfLink.add(''); state.countOfLink.add('');
state.update();
} }
});
}, },
), ),
], ],
@ -693,13 +672,18 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
), ),
ListView.builder( ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: countOfLink.length, itemCount: state.countOfLink.length,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => Column( itemBuilder: (context, index) => Column(
children: [ children: [
DidvanTextField( DidvanTextField(
onChanged: (value) { onChanged: (value) {
countOfLink.insert(index, value); state.countOfLink[index] = value;
if (state.countOfLink[index].isEmpty &&
state.countOfLink.length != 1) {
state.countOfLink.removeAt(index);
}
state.update();
}, },
// validator: (value) {}, // validator: (value) {},
hintText: hintText:
@ -766,10 +750,10 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
width: 64, width: 64,
height: 48, height: 48,
child: DidvanSwitch( child: DidvanSwitch(
value: !isPrivate, value: !state.isPrivate,
title: '', title: '',
onChanged: (value) { onChanged: (value) {
isPrivate = !value; state.isPrivate = !value;
}, },
), ),
), ),
@ -853,7 +837,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
), ),
], ],
) )
: Column( : Stack(
children: [ children: [
DidvanButton( DidvanButton(
title: title:

View File

@ -1,11 +1,17 @@
import 'package:didvan/main.dart';
import 'package:didvan/models/ai/bot_assistants_model.dart'; import 'package:didvan/models/ai/bot_assistants_model.dart';
import 'package:didvan/models/ai/bot_assistants_req_model.dart'; import 'package:didvan/models/ai/bot_assistants_req_model.dart';
import 'package:didvan/models/ai/bots_model.dart'; import 'package:didvan/models/ai/bots_model.dart';
import 'package:didvan/models/ai/file_create_assistants_model.dart';
import 'package:didvan/models/ai/tools_model.dart'; import 'package:didvan/models/ai/tools_model.dart';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/providers/core.dart'; import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart'; import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:flutter/cupertino.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
class CreateBotAssistantsState extends CoreProvier { class CreateBotAssistantsState extends CoreProvier {
List<BotsModel> imageBots = []; List<BotsModel> imageBots = [];
@ -15,6 +21,21 @@ class CreateBotAssistantsState extends CoreProvier {
bool successName = false; bool successName = false;
bool loading = false; bool loading = false;
BotAssistants? assistant; BotAssistants? assistant;
String name = '';
String prompt = '';
String desc = '';
// String? youtubeLink;
late List<BotsModel> allBots =
navigatorKey.currentContext!.read<HistoryAiChatState>().bots;
final List<String> botModels = ['مدل زبانی', 'مدل تصویری'];
BotsModel? initialBot;
List<String> countOfLink = [''];
List<FileCreateAssistantsModel> files = [];
ValueNotifier<XFile?> image = ValueNotifier(null);
String selectedBotType = 'text';
bool isPrivate = true;
void getImageToolsBots() async { void getImageToolsBots() async {
loadingImageBots = true; loadingImageBots = true;
@ -77,6 +98,31 @@ class CreateBotAssistantsState extends CoreProvier {
await service.httpGet(); await service.httpGet();
if (service.isSuccess) { if (service.isSuccess) {
assistant = BotAssistants.fromJson(service.result['bot']); assistant = BotAssistants.fromJson(service.result['bot']);
if (assistant != null) {
name = assistant!.name ?? '';
prompt = assistant!.prompt ?? '';
desc = assistant!.description ?? '';
// youtubeLink = assistant!.;
isPrivate = assistant!.private ?? true;
if (files.isEmpty &&
assistant!.files != null &&
assistant!.files!.isNotEmpty) {
for (var file in assistant!.files!) {
files.add(FileCreateAssistantsModel(
fromNetwork: true, file: null, url: file));
}
}
countOfLink = assistant!.websites ?? [''];
selectedBotType = assistant!.type ?? 'text';
final list = selectedBotType == 'text' ? allBots : imageBots;
for (var bot in list) {
if (bot.id == assistant!.botId) {
initialBot = bot;
break;
}
}
}
appState = AppState.idle; appState = AppState.idle;
loading = false; loading = false;
update(); update();

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.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/constants/app_icons.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/widgets/didvan/divider.dart'; import 'package:didvan/views/widgets/didvan/divider.dart';
@ -25,14 +26,14 @@ class _InfoPageState extends State<InfoPage> {
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
const Center( Center(
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 32, bottom: 24), padding: const EdgeInsets.only(top: 32, bottom: 24),
child: DidvanText( child: DidvanText(
'آموزش پرامپت نویسی اصولی', 'آموزش پرامپت نویسی اصولی',
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Color(0xff1B3C59), color: Theme.of(context).colorScheme.checkFav,
), ),
), ),
), ),

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/models/ai/ai_chat_args.dart'; import 'package:didvan/models/ai/ai_chat_args.dart';
import 'package:didvan/models/ai/tools_model.dart'; import 'package:didvan/models/ai/tools_model.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
@ -40,7 +41,7 @@ class _ToolScreenState extends State<ToolScreen> {
tool.name!, tool.name!,
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: const Color(0xff1B3C59), color: Theme.of(context).colorScheme.checkFav,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Padding( Padding(
@ -48,7 +49,7 @@ class _ToolScreenState extends State<ToolScreen> {
child: DidvanText( child: DidvanText(
tool.guide!, tool.guide!,
fontSize: 12, fontSize: 12,
color: const Color(0xff666666), color: Theme.of(context).colorScheme.caption,
), ),
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
@ -88,7 +89,7 @@ class _ToolScreenState extends State<ToolScreen> {
bot.name!, bot.name!,
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: const Color(0xff2A282F), color: Theme.of(context).colorScheme.text,
), ),
if (bot.description != null) if (bot.description != null)
Column( Column(

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/assets.dart'; import 'package:didvan/constants/assets.dart';
import 'package:didvan/views/ai/ai_state.dart'; import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/tools_state.dart'; import 'package:didvan/views/ai/tools_state.dart';
@ -32,13 +33,13 @@ class _ToolsScreenState extends State<ToolsScreen> {
: const BouncingScrollPhysics(), : const BouncingScrollPhysics(),
child: Column( child: Column(
children: [ children: [
const Padding( Padding(
padding: EdgeInsets.only(top: 46, bottom: 24), padding: const EdgeInsets.only(top: 46, bottom: 24),
child: DidvanText( child: DidvanText(
'انتخاب بات‌ها', 'انتخاب بات‌ها',
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Color(0xff1B3C59), color: Theme.of(context).colorScheme.checkFav,
), ),
), ),
Consumer<ToolsState>( Consumer<ToolsState>(
@ -68,8 +69,9 @@ class _ToolsScreenState extends State<ToolsScreen> {
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
color: Theme.of(context).colorScheme.surface,
border: Border.all( border: Border.all(
color: const Color(0xffB8B8B8), color: Theme.of(context).colorScheme.border,
), ),
), ),
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
@ -125,7 +127,9 @@ class _ToolsScreenState extends State<ToolsScreen> {
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
DidvanText(tool.description!, DidvanText(tool.description!,
fontSize: 12, color: const Color(0xffA8A6AC)) fontSize: 12,
color:
Theme.of(context).colorScheme.caption)
], ],
), ),
) )

View File

@ -1,6 +1,7 @@
// ignore_for_file: library_private_types_in_public_api, avoid_web_libraries_in_flutter, deprecated_member_use // ignore_for_file: library_private_types_in_public_api, avoid_web_libraries_in_flutter, deprecated_member_use
import 'dart:async'; import 'dart:async';
import 'package:didvan/utils/extension.dart';
import 'package:record/record.dart'; import 'package:record/record.dart';
import 'package:universal_html/html.dart' as html; import 'package:universal_html/html.dart' as html;
import 'dart:io'; import 'dart:io';
@ -378,7 +379,13 @@ class _AiMessageBarState extends State<AiMessageBar> {
Expanded( Expanded(
child: state.file != null && state.file!.isRecorded child: state.file != null && state.file!.isRecorded
? audioContainer() ? audioContainer()
: TextFormField( : Directionality(
textDirection: state.message.text
.toString()
.startsWithEnglish()
? TextDirection.ltr
: TextDirection.rtl,
child: TextFormField(
textInputAction: TextInputAction.newline, textInputAction: TextInputAction.newline,
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
minLines: 1, minLines: 1,
@ -390,7 +397,7 @@ class _AiMessageBarState extends State<AiMessageBar> {
widget.bot.attachment == 1), widget.bot.attachment == 1),
decoration: InputDecoration( decoration: InputDecoration(
contentPadding: contentPadding:
const EdgeInsets.fromLTRB(12, 12, 12, 0), const EdgeInsets.fromLTRB(12, 12, 12, 12),
border: InputBorder.none, border: InputBorder.none,
hintText: 'بنویسید...', hintText: 'بنویسید...',
hintStyle: Theme.of(context) hintStyle: Theme.of(context)
@ -419,6 +426,7 @@ class _AiMessageBarState extends State<AiMessageBar> {
}, },
), ),
), ),
),
Padding( Padding(
padding: const EdgeInsets.only(bottom: 8.0), padding: const EdgeInsets.only(bottom: 8.0),
child: Row(children: [ child: Row(children: [

View File

@ -14,6 +14,7 @@ import 'package:didvan/services/media/media.dart';
import 'package:didvan/services/media/voice.dart'; import 'package:didvan/services/media/voice.dart';
import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart'; import 'package:didvan/utils/date_time.dart';
import 'package:didvan/utils/extension.dart';
import 'package:didvan/views/ai/ai_chat_state.dart'; import 'package:didvan/views/ai/ai_chat_state.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart'; import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/widgets/audio_wave.dart'; import 'package:didvan/views/ai/widgets/audio_wave.dart';
@ -391,12 +392,21 @@ class _AiMessageBarIOSState extends State<AiMessageBarIOS> {
state.file!.isRecorded state.file!.isRecorded
? audioContainer() ? audioContainer()
: Form( : Form(
child: Directionality(
textDirection: state
.message.text
.toString()
.startsWithEnglish()
? TextDirection
.ltr
: TextDirection
.rtl,
child: TextFormField( child: TextFormField(
textInputAction: textInputAction:
TextInputAction TextInputAction
.newline, .newline,
style: style: Theme.of(
Theme.of(context) context)
.textTheme .textTheme
.bodyMedium, .bodyMedium,
minLines: 1, minLines: 1,
@ -419,7 +429,8 @@ class _AiMessageBarIOSState extends State<AiMessageBarIOS> {
decoration: decoration:
InputDecoration( InputDecoration(
border: InputBorder border:
InputBorder
.none, .none,
hintText: hintText:
'بنویسید...', 'بنویسید...',
@ -435,7 +446,8 @@ class _AiMessageBarIOSState extends State<AiMessageBarIOS> {
suffixIcon: state suffixIcon: state
.isEdite .isEdite
? InkWell( ? InkWell(
onTap: () { onTap:
() {
state.isEdite = state.isEdite =
false; false;
state state
@ -449,10 +461,12 @@ class _AiMessageBarIOSState extends State<AiMessageBarIOS> {
), ),
onChanged: (value) { onChanged: (value) {
messageText.value = messageText
.value =
value; value;
state.update(); state.update();
}, },
),
)), )),
), ),
), ),

View File

@ -1,5 +1,7 @@
import 'dart:math'; import 'dart:math';
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/constants/assets.dart'; import 'package:didvan/constants/assets.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
@ -7,6 +9,7 @@ import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/bot_assistants_state.dart'; import 'package:didvan/views/ai/bot_assistants_state.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart'; import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -37,15 +40,17 @@ class HoshanAppBar extends StatelessWidget implements PreferredSizeWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
const Row( Row(
children: [ children: [
Icon( Icon(
DidvanIcons.ai_solid, DidvanIcons.ai_solid,
size: 40, size: 40,
color: Theme.of(context).colorScheme.title,
), ),
DidvanText( DidvanText(
'هوشان', 'هوشان',
fontSize: 14, fontSize: 14,
color: Theme.of(context).colorScheme.title,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
], ],
@ -60,8 +65,10 @@ class HoshanAppBar extends StatelessWidget implements PreferredSizeWidget {
Navigator.pushNamed(context, Routes.info); Navigator.pushNamed(context, Routes.info);
}), }),
if (withActions) if (withActions)
Stack(
children: [
DidvanIconButton( DidvanIconButton(
icon: DidvanIcons.antenna_light, icon: DidvanIcons.ai_regular,
size: 32, size: 32,
onPressed: () { onPressed: () {
context.read<BotAssistantsState>().getMyAssissmant(); context.read<BotAssistantsState>().getMyAssissmant();
@ -69,6 +76,13 @@ class HoshanAppBar extends StatelessWidget implements PreferredSizeWidget {
Navigator.pushNamed(context, Routes.botAssistants); Navigator.pushNamed(context, Routes.botAssistants);
}, },
), ),
Icon(
CupertinoIcons.plus,
color: Theme.of(context).colorScheme.primary,
size: 16,
)
],
),
context.watch<AiState>().page != 0 || !withActions context.watch<AiState>().page != 0 || !withActions
? Transform.rotate( ? Transform.rotate(
angle: 180 * pi / 180, angle: 180 * pi / 180,
@ -85,7 +99,9 @@ class HoshanAppBar extends StatelessWidget implements PreferredSizeWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.only(right: 8.0), padding: const EdgeInsets.only(right: 8.0),
child: Image.asset( child: Image.asset(
Assets.boxAnimation, DesignConfig.brightness == Brightness.dark
? Assets.boxAnimationDark
: Assets.boxAnimationLight,
width: 38, width: 38,
height: 38, height: 38,
), ),

View File

@ -1414,10 +1414,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.4" version: "14.2.5"
wakelock_plus: wakelock_plus:
dependency: transitive dependency: transitive
description: description: