fix some bugs
This commit is contained in:
parent
a2c8b5ddac
commit
86c03984cd
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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>(
|
||||||
id: settings.arguments as int?,
|
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?,
|
||||||
|
),
|
||||||
));
|
));
|
||||||
case Routes.info:
|
case Routes.info:
|
||||||
return _createRoute(const InfoPage());
|
return _createRoute(const InfoPage());
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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,23 +343,30 @@ class _AiChatPageState extends State<AiChatPage> {
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return const SizedBox();
|
return const SizedBox();
|
||||||
}
|
}
|
||||||
return Markdown(
|
return Directionality(
|
||||||
data: "${snapshot.data}...",
|
textDirection: snapshot.data
|
||||||
onTapLink: (text, href, title) {
|
.toString()
|
||||||
if (href != null) {
|
.startsWithEnglish()
|
||||||
launchUrlString(
|
? TextDirection.ltr
|
||||||
href,
|
: TextDirection.rtl,
|
||||||
mode:
|
child: Markdown(
|
||||||
LaunchMode.inAppBrowserView,
|
data: "${snapshot.data}...",
|
||||||
);
|
onTapLink: (text, href, title) {
|
||||||
}
|
if (href != null) {
|
||||||
},
|
launchUrlString(
|
||||||
selectable: false,
|
href,
|
||||||
shrinkWrap: true,
|
mode: LaunchMode
|
||||||
physics:
|
.inAppBrowserView,
|
||||||
const NeverScrollableScrollPhysics(),
|
);
|
||||||
styleSheet:
|
}
|
||||||
defaultMarkdownStyleSheet);
|
},
|
||||||
|
selectable: false,
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics:
|
||||||
|
const NeverScrollableScrollPhysics(),
|
||||||
|
styleSheet:
|
||||||
|
defaultMarkdownStyleSheet),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
|
@ -417,20 +425,26 @@ class _AiChatPageState extends State<AiChatPage> {
|
||||||
((message.audio == null ||
|
((message.audio == null ||
|
||||||
(message.audio != null &&
|
(message.audio != null &&
|
||||||
!message.audio!))))
|
!message.audio!))))
|
||||||
Markdown(
|
Directionality(
|
||||||
data: message.text.toString(),
|
textDirection:
|
||||||
onTapLink: (text, href, title) {
|
message.text.toString().startsWithEnglish()
|
||||||
if (href != null) {
|
? TextDirection.ltr
|
||||||
launchUrlString(
|
: TextDirection.rtl,
|
||||||
href,
|
child: Markdown(
|
||||||
mode: LaunchMode.inAppBrowserView,
|
data: message.text.toString(),
|
||||||
);
|
onTapLink: (text, href, title) {
|
||||||
}
|
if (href != null) {
|
||||||
},
|
launchUrlString(
|
||||||
selectable: true,
|
href,
|
||||||
shrinkWrap: true,
|
mode: LaunchMode.inAppBrowserView,
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
);
|
||||||
styleSheet: defaultMarkdownStyleSheet,
|
}
|
||||||
|
},
|
||||||
|
selectable: true,
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
styleSheet: defaultMarkdownStyleSheet,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding:
|
padding:
|
||||||
|
|
@ -438,7 +452,10 @@ class _AiChatPageState extends State<AiChatPage> {
|
||||||
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 ??
|
||||||
|
|
|
||||||
|
|
@ -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,22 +51,25 @@ 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: switchAssistants(context, state),
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 12.0),
|
||||||
|
child: switchAssistants(context, state),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
SliverStateHandler(
|
SliverStateHandler(
|
||||||
childCount: state.isMyAssistants
|
childCount: state.isMyAssistants
|
||||||
|
|
@ -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: [
|
||||||
|
|
|
||||||
|
|
@ -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() ||
|
||||||
FileCreateAssistantsModel(
|
file.path.isAudio()) {
|
||||||
fromNetwork: false,
|
state.files.add(
|
||||||
file: file,
|
FileCreateAssistantsModel(
|
||||||
url: null));
|
fromNetwork: false,
|
||||||
|
file: file,
|
||||||
|
url: null));
|
||||||
|
} else {
|
||||||
|
ActionSheetUtils(context)
|
||||||
|
.showAlert(AlertData(
|
||||||
|
message:
|
||||||
|
'باید فایل انتخاب شده صوتی یا Pdf باشد',
|
||||||
|
aLertType: ALertType
|
||||||
|
.error));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state.update();
|
state.update();
|
||||||
|
|
@ -529,107 +491,125 @@ 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(
|
||||||
children: [
|
child: Stack(
|
||||||
Container(
|
children: [
|
||||||
width: MediaQuery.sizeOf(
|
Container(
|
||||||
context)
|
width: MediaQuery
|
||||||
.width /
|
.sizeOf(
|
||||||
5,
|
context)
|
||||||
height: MediaQuery.sizeOf(
|
.width /
|
||||||
context)
|
5,
|
||||||
.width /
|
height: MediaQuery.sizeOf(
|
||||||
5,
|
context)
|
||||||
margin: const EdgeInsets
|
.width /
|
||||||
.symmetric(
|
5,
|
||||||
horizontal: 8,
|
margin: const EdgeInsets
|
||||||
vertical: 12),
|
.symmetric(
|
||||||
padding: const EdgeInsets
|
horizontal: 8,
|
||||||
.all(8),
|
vertical: 12),
|
||||||
decoration: BoxDecoration(
|
padding:
|
||||||
color: Theme.of(context)
|
const EdgeInsets.all(
|
||||||
.colorScheme
|
8),
|
||||||
.disabledBackground,
|
decoration: BoxDecoration(
|
||||||
borderRadius: DesignConfig
|
color: Theme.of(context)
|
||||||
.lowBorderRadius),
|
.colorScheme
|
||||||
child: Column(
|
.disabledBackground,
|
||||||
children: [
|
borderRadius: DesignConfig
|
||||||
Expanded(
|
.lowBorderRadius),
|
||||||
child: files[index]
|
child: Column(
|
||||||
.fromNetwork
|
children: [
|
||||||
? files[index]
|
Expanded(
|
||||||
.url!
|
child: state
|
||||||
.isImage()
|
.files[
|
||||||
? CachedNetworkImage(
|
index]
|
||||||
imageUrl:
|
|
||||||
files[index]
|
|
||||||
.url!)
|
|
||||||
: const Icon(
|
|
||||||
CupertinoIcons
|
|
||||||
.doc)
|
|
||||||
: files[index]
|
|
||||||
.file!
|
|
||||||
.path
|
|
||||||
.isImage()
|
|
||||||
? Image.file(
|
|
||||||
File(files[
|
|
||||||
index]
|
|
||||||
.file!
|
|
||||||
.path))
|
|
||||||
: const Icon(
|
|
||||||
CupertinoIcons
|
|
||||||
.doc),
|
|
||||||
),
|
|
||||||
MarqueeText(
|
|
||||||
text: files[index]
|
|
||||||
.fromNetwork
|
.fromNetwork
|
||||||
? files[index]
|
? state
|
||||||
.url!
|
.files[
|
||||||
.split('/')
|
index]
|
||||||
.last
|
.url!
|
||||||
: files[index]
|
.isImage()
|
||||||
.file!
|
? CachedNetworkImage(
|
||||||
.name,
|
imageUrl: state
|
||||||
textDirection:
|
.files[
|
||||||
TextDirection
|
index]
|
||||||
.rtl,
|
.url!)
|
||||||
style: Theme.of(
|
: const Icon(
|
||||||
context)
|
CupertinoIcons
|
||||||
.textTheme
|
.doc)
|
||||||
.labelSmall!)
|
: state
|
||||||
],
|
.files[
|
||||||
)),
|
index]
|
||||||
Positioned(
|
.file!
|
||||||
top: 8,
|
.path
|
||||||
left: 4,
|
.isImage()
|
||||||
child: InkWell(
|
? Image.file(File(state
|
||||||
onTap: () {
|
.files[
|
||||||
files.removeAt(index);
|
index]
|
||||||
state.update();
|
.file!
|
||||||
},
|
.path))
|
||||||
child: Container(
|
: const Icon(
|
||||||
padding:
|
CupertinoIcons
|
||||||
const EdgeInsets
|
.doc),
|
||||||
.all(6),
|
),
|
||||||
decoration:
|
MarqueeText(
|
||||||
BoxDecoration(
|
text: state
|
||||||
shape: BoxShape
|
.files[
|
||||||
.circle,
|
index]
|
||||||
color: Theme.of(
|
.fromNetwork
|
||||||
context)
|
? state
|
||||||
.colorScheme
|
.files[
|
||||||
.error),
|
index]
|
||||||
child: const Icon(
|
.url!
|
||||||
DidvanIcons
|
.split(
|
||||||
.trash_solid,
|
'/')
|
||||||
color: Colors.white,
|
.last
|
||||||
size: 18,
|
: state
|
||||||
|
.files[
|
||||||
|
index]
|
||||||
|
.file!
|
||||||
|
.name,
|
||||||
|
textDirection:
|
||||||
|
TextDirection
|
||||||
|
.rtl,
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.labelSmall!)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
Positioned(
|
||||||
|
top: 8,
|
||||||
|
left: 4,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
state.files
|
||||||
|
.removeAt(index);
|
||||||
|
state.update();
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets
|
||||||
|
.all(6),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape
|
||||||
|
.circle,
|
||||||
|
color: Theme.of(
|
||||||
|
context)
|
||||||
|
.colorScheme
|
||||||
|
.error),
|
||||||
|
child: const Icon(
|
||||||
|
DidvanIcons
|
||||||
|
.trash_solid,
|
||||||
|
color: Colors.white,
|
||||||
|
size: 18,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
))
|
||||||
))
|
],
|
||||||
],
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,45 +379,52 @@ 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(
|
||||||
textInputAction: TextInputAction.newline,
|
textDirection: state.message.text
|
||||||
style: Theme.of(context).textTheme.bodyMedium,
|
.toString()
|
||||||
minLines: 1,
|
.startsWithEnglish()
|
||||||
maxLines: 6, // Set this
|
? TextDirection.ltr
|
||||||
keyboardType: TextInputType.multiline,
|
: TextDirection.rtl,
|
||||||
controller: state.message,
|
child: TextFormField(
|
||||||
|
textInputAction: TextInputAction.newline,
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
|
minLines: 1,
|
||||||
|
maxLines: 6, // Set this
|
||||||
|
keyboardType: TextInputType.multiline,
|
||||||
|
controller: state.message,
|
||||||
|
|
||||||
enabled: !(state.file != null &&
|
enabled: !(state.file != null &&
|
||||||
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)
|
||||||
.textTheme
|
.textTheme
|
||||||
.bodySmall!
|
.bodySmall!
|
||||||
.copyWith(
|
.copyWith(
|
||||||
color: Theme.of(context)
|
color: Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.disabledText),
|
.disabledText),
|
||||||
suffixIcon: state.isEdite
|
suffixIcon: state.isEdite
|
||||||
? InkWell(
|
? InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
state.isEdite = false;
|
state.isEdite = false;
|
||||||
state.update();
|
state.update();
|
||||||
},
|
},
|
||||||
child: const Icon(
|
child: const Icon(
|
||||||
DidvanIcons.close_circle_solid),
|
DidvanIcons.close_circle_solid),
|
||||||
)
|
)
|
||||||
: const SizedBox(),
|
: const SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
onChanged: (value) {
|
||||||
|
if (value.isEmpty || value.length == 1) {
|
||||||
|
state.update();
|
||||||
|
}
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
onChanged: (value) {
|
|
||||||
if (value.isEmpty || value.length == 1) {
|
|
||||||
state.update();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
|
|
|
||||||
|
|
@ -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,68 +392,81 @@ 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)
|
|
||||||
.textTheme
|
|
||||||
.bodyMedium,
|
|
||||||
minLines: 1,
|
|
||||||
maxLines:
|
|
||||||
6, // Set this
|
|
||||||
// expands: true, //
|
|
||||||
// keyboardType: TextInputType.text,
|
|
||||||
keyboardType:
|
|
||||||
TextInputType
|
|
||||||
.multiline,
|
|
||||||
controller:
|
|
||||||
state.message,
|
|
||||||
|
|
||||||
enabled: !(state
|
|
||||||
.file !=
|
|
||||||
null &&
|
|
||||||
widget.bot
|
|
||||||
.attachment ==
|
|
||||||
1),
|
|
||||||
|
|
||||||
decoration:
|
|
||||||
InputDecoration(
|
|
||||||
border: InputBorder
|
|
||||||
.none,
|
|
||||||
hintText:
|
|
||||||
'بنویسید...',
|
|
||||||
hintStyle: Theme.of(
|
|
||||||
context)
|
context)
|
||||||
.textTheme
|
.textTheme
|
||||||
.bodySmall!
|
.bodyMedium,
|
||||||
.copyWith(
|
minLines: 1,
|
||||||
color: Theme.of(
|
maxLines:
|
||||||
context)
|
6, // Set this
|
||||||
.colorScheme
|
// expands: true, //
|
||||||
.disabledText),
|
// keyboardType: TextInputType.text,
|
||||||
suffixIcon: state
|
keyboardType:
|
||||||
.isEdite
|
TextInputType
|
||||||
? InkWell(
|
.multiline,
|
||||||
onTap: () {
|
controller:
|
||||||
state.isEdite =
|
state.message,
|
||||||
false;
|
|
||||||
state
|
|
||||||
.update();
|
|
||||||
},
|
|
||||||
child: const Icon(
|
|
||||||
DidvanIcons
|
|
||||||
.close_circle_solid),
|
|
||||||
)
|
|
||||||
: const SizedBox(),
|
|
||||||
),
|
|
||||||
|
|
||||||
onChanged: (value) {
|
enabled: !(state
|
||||||
messageText.value =
|
.file !=
|
||||||
value;
|
null &&
|
||||||
state.update();
|
widget.bot
|
||||||
},
|
.attachment ==
|
||||||
|
1),
|
||||||
|
|
||||||
|
decoration:
|
||||||
|
InputDecoration(
|
||||||
|
border:
|
||||||
|
InputBorder
|
||||||
|
.none,
|
||||||
|
hintText:
|
||||||
|
'بنویسید...',
|
||||||
|
hintStyle: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall!
|
||||||
|
.copyWith(
|
||||||
|
color: Theme.of(
|
||||||
|
context)
|
||||||
|
.colorScheme
|
||||||
|
.disabledText),
|
||||||
|
suffixIcon: state
|
||||||
|
.isEdite
|
||||||
|
? InkWell(
|
||||||
|
onTap:
|
||||||
|
() {
|
||||||
|
state.isEdite =
|
||||||
|
false;
|
||||||
|
state
|
||||||
|
.update();
|
||||||
|
},
|
||||||
|
child: const Icon(
|
||||||
|
DidvanIcons
|
||||||
|
.close_circle_solid),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
onChanged: (value) {
|
||||||
|
messageText
|
||||||
|
.value =
|
||||||
|
value;
|
||||||
|
state.update();
|
||||||
|
},
|
||||||
|
),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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,14 +65,23 @@ class HoshanAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
Navigator.pushNamed(context, Routes.info);
|
Navigator.pushNamed(context, Routes.info);
|
||||||
}),
|
}),
|
||||||
if (withActions)
|
if (withActions)
|
||||||
DidvanIconButton(
|
Stack(
|
||||||
icon: DidvanIcons.antenna_light,
|
children: [
|
||||||
size: 32,
|
DidvanIconButton(
|
||||||
onPressed: () {
|
icon: DidvanIcons.ai_regular,
|
||||||
context.read<BotAssistantsState>().getMyAssissmant();
|
size: 32,
|
||||||
|
onPressed: () {
|
||||||
|
context.read<BotAssistantsState>().getMyAssissmant();
|
||||||
|
|
||||||
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(
|
||||||
|
|
@ -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,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue