"Updated AI models, routes, and UI components, including adding new fields, modifying widget layouts, and adjusting text styles."

This commit is contained in:
OkaykOrhmn 2024-11-21 12:05:43 +03:30
parent 28b9d7efb7
commit 2663a8b98e
11 changed files with 207 additions and 209 deletions

View File

@ -4,6 +4,7 @@ class BotsModel {
String? image; String? image;
String? responseType; String? responseType;
String? description; String? description;
String? short;
List<String>? attachmentType; List<String>? attachmentType;
int? attachment; int? attachment;
bool? editable; bool? editable;
@ -23,6 +24,7 @@ class BotsModel {
name = json['name']; name = json['name'];
image = json['image']; image = json['image'];
description = json['description']; description = json['description'];
short = json['short'];
if (json['attachmentType'] != null) { if (json['attachmentType'] != null) {
attachmentType = <String>[]; attachmentType = <String>[];
json['attachmentType'].forEach((v) { json['attachmentType'].forEach((v) {
@ -40,6 +42,7 @@ class BotsModel {
data['name'] = name; data['name'] = name;
data['image'] = image; data['image'] = image;
data['description'] = description; data['description'] = description;
data['short'] = short;
if (attachmentType != null) { if (attachmentType != null) {
data['attachmentType'] = attachmentType!.map((v) => v).toList(); data['attachmentType'] = attachmentType!.map((v) => v).toList();
} }

View File

@ -0,0 +1,21 @@
class InfoModel {
String? url;
String? title;
List<String>? description;
InfoModel({this.url, this.title, this.description});
InfoModel.fromJson(Map<String, dynamic> json) {
url = json['url'];
title = json['title'];
description = json['description'].cast<String>();
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['url'] = url;
data['title'] = title;
data['description'] = description;
return data;
}
}

View File

@ -9,6 +9,7 @@ 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';
import 'package:didvan/views/ai/info_state.dart';
import 'package:didvan/views/authentication/authentication.dart'; import 'package:didvan/views/authentication/authentication.dart';
import 'package:didvan/views/authentication/authentication_state.dart'; import 'package:didvan/views/authentication/authentication_state.dart';
import 'package:didvan/views/comments/comments.dart'; import 'package:didvan/views/comments/comments.dart';
@ -337,7 +338,13 @@ class RouteGenerator {
), ),
)); ));
case Routes.info: case Routes.info:
return _createRoute(const InfoPage()); return _createRoute(ChangeNotifierProvider<InfoState>(
create: (context) {
InfoState infoState = InfoState();
infoState.getTools();
return infoState;
},
child: const InfoPage()));
case Routes.web: case Routes.web:
return _createRoute(WebView( return _createRoute(WebView(

View File

@ -230,6 +230,7 @@ class RequestHelper {
static String archivedChat(int id) => '$baseUrl/ai/chat/$id/archive'; static String archivedChat(int id) => '$baseUrl/ai/chat/$id/archive';
static String placeholder(int id) => '$baseUrl/ai/chat/$id/placeholder'; static String placeholder(int id) => '$baseUrl/ai/chat/$id/placeholder';
static String tools() => '$baseUrl/ai/tool'; static String tools() => '$baseUrl/ai/tool';
static String info() => '$baseUrl/ai/video';
static String usersAssistants({final bool personal = false}) => static String usersAssistants({final bool personal = false}) =>
'$baseUrl/ai/user/bot${_urlConcatGenerator([ '$baseUrl/ai/user/bot${_urlConcatGenerator([
MapEntry('personal', personal), MapEntry('personal', personal),

View File

@ -159,8 +159,13 @@ class _AiChatPageState extends State<AiChatPage> {
horizontal: 20.0), horizontal: 20.0),
child: Center( child: Center(
child: DidvanText( child: DidvanText(
widget.args.bot.description ?? widget.args.bot.description ?? '',
'')), fontSize: 12,
color: Theme.of(context)
.colorScheme
.caption,
textAlign: TextAlign.justify,
)),
) )
], ],
) )

View File

@ -416,7 +416,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
minLine: 6, minLine: 6,
maxLine: 6, maxLine: 6,
maxLength: 400, maxLength: 2000,
hasHeight: false, hasHeight: false,
showLen: true, showLen: true,
onChanged: (value) { onChanged: (value) {
@ -679,6 +679,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
itemBuilder: (context, index) => Column( itemBuilder: (context, index) => Column(
children: [ children: [
DidvanTextField( DidvanTextField(
textAlign: TextAlign.left,
onChanged: (value) { onChanged: (value) {
state.countOfLink[index] = value; state.countOfLink[index] = value;
if (state.countOfLink[index] if (state.countOfLink[index]
@ -691,8 +692,7 @@ class _CreateBotAssistantsPageState extends State<CreateBotAssistantsPage> {
state.update(); state.update();
}, },
// validator: (value) {}, // validator: (value) {},
hintText: hintText: 'https://www.weforum.org',
'https://www.weforum.org/agenda/2024/08',
), ),
const SizedBox( const SizedBox(
height: 8, height: 8,

View File

@ -1,12 +1,17 @@
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/enums.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/ai/info_state.dart';
import 'package:didvan/views/widgets/didvan/divider.dart'; import 'package:didvan/views/widgets/didvan/divider.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';
import 'package:didvan/views/widgets/video/chat_video_player.dart'; import 'package:didvan/views/widgets/video/chat_video_player.dart';
import 'package:didvan/views/widgets/video/primary_controls.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:provider/provider.dart';
class InfoPage extends StatefulWidget { class InfoPage extends StatefulWidget {
const InfoPage({Key? key}) : super(key: key); const InfoPage({Key? key}) : super(key: key);
@ -23,7 +28,16 @@ class _InfoPageState extends State<InfoPage> {
withActions: false, withActions: false,
onBack: () => Navigator.pop(context), onBack: () => Navigator.pop(context),
), ),
body: Column( body: Consumer<InfoState>(builder: (context, state, child) {
if (state.appState == AppState.busy) {
return Center(
child: SpinKitThreeBounce(
size: 46,
color: Theme.of(context).colorScheme.primary,
),
);
}
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Expanded( Expanded(
@ -35,21 +49,21 @@ class _InfoPageState extends State<InfoPage> {
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 32, bottom: 24), padding: const EdgeInsets.only(top: 32, bottom: 24),
child: DidvanText( child: DidvanText(
'آموزش پرامپت نویسی اصولی', state.infoModel.title ?? 'آموزش پرامپت نویسی اصولی',
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.checkFav, color: Theme.of(context).colorScheme.checkFav,
), ),
), ),
), ),
const Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0), padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: ClipRRect( child: ClipRRect(
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
child: ChatVideoPlayer( child: ChatVideoPlayer(
src: src: state.infoModel.url ?? '',
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
showOptions: true, showOptions: true,
custome: const PrimaryControls(),
), ),
), ),
), ),
@ -68,122 +82,13 @@ class _InfoPageState extends State<InfoPage> {
), ),
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Column( child: ListView.builder(
children: [ physics: const NeverScrollableScrollPhysics(),
Row( shrinkWrap: true,
children: [ itemCount: state.infoModel.description!.length,
Container( itemBuilder: (context, index) => summery(
margin: const EdgeInsets.only(left: 8), state.infoModel.description?[index] ?? ''),
decoration: const ShapeDecoration( ))
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'انتخاب کلمات کلیدی مناسب',
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'ساختار و قالب‌بندی پرامپت‌ها',
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'تعیین سبک و استایل در پرامپت',
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'استفاده از جزییات و صفت‌ها',
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'بهینه‌سازی پرامپت‌ها و تکرار',
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(
width: 3, color: Colors.black)),
),
),
const DidvanText(
'اشتباهات رایج در پرامپت‌نویسی',
fontSize: 14,
),
],
),
],
),
)
], ],
), ),
), ),
@ -231,7 +136,33 @@ class _InfoPageState extends State<InfoPage> {
], ],
) )
], ],
);
}),
);
}
Column summery(String text) {
return Column(
children: [
Row(
children: [
Container(
margin: const EdgeInsets.only(left: 8),
decoration: const ShapeDecoration(
shape: CircleBorder(
side: BorderSide(width: 3, color: Colors.black)),
), ),
),
DidvanText(
text,
fontSize: 14,
),
],
),
const SizedBox(
height: 4,
),
],
); );
} }
} }

View File

@ -0,0 +1,23 @@
import 'package:didvan/models/ai/info_model.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
class InfoState extends CoreProvier {
late InfoModel infoModel;
void getTools() async {
final service = RequestService(
RequestHelper.info(),
);
await service.httpGet();
if (service.isSuccess) {
infoModel = InfoModel.fromJson(service.result);
appState = AppState.idle;
update();
return;
}
appState = AppState.failed;
update();
}
}

View File

@ -50,6 +50,7 @@ class _ToolScreenState extends State<ToolScreen> {
tool.guide!, tool.guide!,
fontSize: 12, fontSize: 12,
color: Theme.of(context).colorScheme.caption, color: Theme.of(context).colorScheme.caption,
textAlign: TextAlign.justify,
), ),
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
@ -91,17 +92,19 @@ class _ToolScreenState extends State<ToolScreen> {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.text, color: Theme.of(context).colorScheme.text,
), ),
if (bot.description != null) if (bot.short != null)
Column( Column(
children: [ children: [
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
DidvanText( DidvanText(
bot.description!, bot.short!,
fontSize: 14, fontSize: 12,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: const Color(0xffA8A6AC), color: const Color(0xffA8A6AC),
// maxLines: 2,
overflow: TextOverflow.ellipsis,
), ),
], ],
) )

View File

@ -120,7 +120,7 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
onFieldSubmitted: widget.onSubmitted, onFieldSubmitted: widget.onSubmitted,
onChanged: _onChanged, onChanged: _onChanged,
validator: _validator, validator: _validator,
maxLines: widget.maxLine, maxLines: _hideContent ? 1 : widget.maxLine,
minLines: widget.minLine, minLines: widget.minLine,
maxLength: widget.maxLength, maxLength: widget.maxLength,
obscuringCharacter: '*', obscuringCharacter: '*',

View File

@ -1,5 +1,6 @@
import 'package:cached_network_image/cached_network_image.dart'; 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/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/widgets/shimmer_placeholder.dart'; import 'package:didvan/views/widgets/shimmer_placeholder.dart';
@ -33,7 +34,10 @@ class SkeletonImage extends StatelessWidget {
borderRadius: borderRadius ?? BorderRadius.zero, borderRadius: borderRadius ?? BorderRadius.zero,
child: CachedNetworkImage( child: CachedNetworkImage(
errorWidget: (context, url, error) { errorWidget: (context, url, error) {
return const Text("مشکلی پیش آمده است"); return Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.disabledBackground),
child: const Icon(Icons.image_not_supported_outlined));
}, },
errorListener: (value) {}, errorListener: (value) {},
fit: BoxFit.cover, fit: BoxFit.cover,