Rhmn -- create ai in didvan -- 03/06/1403

This commit is contained in:
OkaykOrhmn 2024-08-24 12:10:37 +03:30
parent 8b88463efe
commit 8cad1eb1c0
34 changed files with 2226 additions and 699 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -12,9 +12,12 @@
/// - asset: fonts/Dicon.ttf
///
///
/// * Material Design Icons, Copyright (C) Google, Inc
/// Author: Google
/// License: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
/// Homepage: https://design.google.com/icons/
///
// ignore_for_file: constant_identifier_names
///
import 'package:flutter/widgets.dart';
@ -74,35 +77,35 @@ class DidvanIcons {
IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData arrow_up_regular =
IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData arrow_up_solid =
static const IconData avatar_regular =
IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData avatar_light =
IconData(0xe81a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData avatar_regular =
IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData avatar_solid =
IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData filter_regular =
IconData(0xe81c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData back_light =
static const IconData arrow_up_solid =
IconData(0xe81d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData back_regular =
static const IconData back_light =
IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData back_solid =
static const IconData back_regular =
IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData bitcoin_solid =
static const IconData back_solid =
IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData bookmark_light =
static const IconData bitcoin_solid =
IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData bookmark_regular =
static const IconData bookmark_light =
IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData bookmark_solid =
static const IconData bookmark_regular =
IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_day_light =
static const IconData bookmark_solid =
IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_day_regular =
static const IconData calendar_day_light =
IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_day_solid =
static const IconData calendar_day_regular =
IconData(0xe826, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_range_light =
static const IconData calendar_day_solid =
IconData(0xe827, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_range_regular =
IconData(0xe828, fontFamily: _kFontFam, fontPackage: _kFontPkg);
@ -116,37 +119,37 @@ class DidvanIcons {
IconData(0xe82c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData capital_market_solid =
IconData(0xe82d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData caret_down_regular =
IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData caret_down_solid =
IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData category_light =
IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData category_regular =
IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData caret_down_light =
IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData caret_down_regular =
IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData caret_down_solid =
IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData category_light =
IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData calendar_range_light =
IconData(0xe832, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData category_solid =
static const IconData category_regular =
IconData(0xe833, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chart_light =
static const IconData category_solid =
IconData(0xe834, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chart_regular =
static const IconData chart_light =
IconData(0xe835, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chart_solid =
static const IconData chart_regular =
IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chats_light =
static const IconData chart_solid =
IconData(0xe837, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chats_regular =
static const IconData chats_light =
IconData(0xe838, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData chats_solid =
IconData(0xe839, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_light =
static const IconData chats_regular =
IconData(0xe83a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_regular =
IconData(0xe83b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_solid =
IconData(0xe83c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe83b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_circle_light =
IconData(0xe83c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_regular =
IconData(0xe83d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData check_circle_regular =
IconData(0xe83e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
@ -170,29 +173,29 @@ class DidvanIcons {
IconData(0xe847, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData close_circle_solid =
IconData(0xe848, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData commodity_solid =
static const IconData check_light =
IconData(0xe849, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData currency_solid =
static const IconData commodity_solid =
IconData(0xe84a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData description_regular =
static const IconData currency_solid =
IconData(0xe84b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_light =
IconData(0xe84c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_regular =
IconData(0xe84d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_solid =
IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dislike_light =
IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dislike_regular =
IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dislike_solid =
IconData(0xe851, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData description_light =
IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData download_light =
IconData(0xe853, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe84c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData filter_solid =
IconData(0xe84d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData description_solid =
IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData description_regular =
IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_light =
IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_regular =
IconData(0xe851, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData didvan_solid =
IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dislike_light =
IconData(0xe853, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData dislike_regular =
IconData(0xe854, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData download_regular =
IconData(0xe855, fontFamily: _kFontFam, fontPackage: _kFontPkg);
@ -202,33 +205,33 @@ class DidvanIcons {
IconData(0xe857, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData evaluation_regular =
IconData(0xe858, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData evaluation_solid =
IconData(0xe859, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData exclamation_triangle_light =
IconData(0xe85a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe859, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData exclamation_triangle_regular =
IconData(0xe85b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData exclamation_triangle_solid =
IconData(0xe85c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_close_solid =
IconData(0xe85d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_light =
IconData(0xe85e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_regular =
IconData(0xe85f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_solid =
IconData(0xe860, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe85f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_slash_light =
IconData(0xe861, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_slash_regular =
IconData(0xe862, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_slash_solid =
IconData(0xe863, fontFamily: _kFontFam, fontPackage: _kFontPkg);
IconData(0xe860, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData filter_light =
IconData(0xe861, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData evaluation_solid =
IconData(0xe862, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData eye_slash_regular =
IconData(0xe863, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData download_light =
IconData(0xe864, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData filter_regular =
static const IconData dislike_solid =
IconData(0xe865, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData filter_solid =
static const IconData eye_slash_solid =
IconData(0xe866, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData fingerprint_light =
IconData(0xe867, fontFamily: _kFontFam, fontPackage: _kFontPkg);
@ -326,232 +329,246 @@ class DidvanIcons {
IconData(0xe895, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData media_forward_solid =
IconData(0xe896, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_light =
IconData(0xe897, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_regular =
IconData(0xe898, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_solid =
IconData(0xe899, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_light =
IconData(0xe89a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_regular =
IconData(0xe89b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_solid =
IconData(0xe89c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData metal_solid =
IconData(0xe89d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_light =
IconData(0xe89e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_regular =
IconData(0xe89f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_solid =
IconData(0xe8a0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_light =
IconData(0xe8a1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_regular =
IconData(0xe8a2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_solid =
IconData(0xe8a3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_light =
IconData(0xe8a4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_regular =
IconData(0xe8a5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_solid =
IconData(0xe8a6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData non_tick_square_regular =
IconData(0xe8a7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData note_solid =
IconData(0xe8a8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_light =
IconData(0xe8a9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_regular =
IconData(0xe8aa, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_solid =
IconData(0xe8ab, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_light =
IconData(0xe8ac, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_regular =
IconData(0xe8ad, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_solid =
IconData(0xe8ae, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_light =
IconData(0xe8af, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_regular =
IconData(0xe8b0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_solid =
IconData(0xe8b1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData people_solid =
IconData(0xe8b2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_light =
IconData(0xe8b3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_regular =
IconData(0xe8b4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_solid =
IconData(0xe8b5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_light =
IconData(0xe8b6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_regular =
IconData(0xe8b7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_solid =
IconData(0xe8b8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_light =
IconData(0xe8b9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_regular =
IconData(0xe8ba, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_solid =
IconData(0xe8bb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_light =
IconData(0xe8bc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_regular =
IconData(0xe8bd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_solid =
IconData(0xe8be, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_light =
IconData(0xe8bf, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_regular =
IconData(0xe8c0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_solid =
IconData(0xe8c1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_light =
IconData(0xe8c2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_regular =
IconData(0xe8c3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_solid =
IconData(0xe8c4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_light =
IconData(0xe8c5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_regular =
IconData(0xe8c6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_solid =
IconData(0xe8c7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_light =
IconData(0xe8c8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_regular =
IconData(0xe8c9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_solid =
IconData(0xe8ca, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_light =
IconData(0xe8cb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_regular =
IconData(0xe8cc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_solid =
IconData(0xe8cd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_light =
IconData(0xe8ce, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_regular =
IconData(0xe8cf, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_solid =
IconData(0xe8d0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_light =
IconData(0xe8d1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_regular =
IconData(0xe8d2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_solid =
IconData(0xe8d3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_light =
IconData(0xe8d4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_regular =
IconData(0xe8d5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_solid =
IconData(0xe8d6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_light =
IconData(0xe8d7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_regular =
IconData(0xe8d8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_solid =
IconData(0xe8d9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_light =
IconData(0xe8da, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_regular =
IconData(0xe8db, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_solid =
IconData(0xe8dc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_light =
IconData(0xe8dd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_regular =
IconData(0xe8de, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_solid =
IconData(0xe8df, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_light =
IconData(0xe8e0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_regular =
IconData(0xe8e1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_solid =
IconData(0xe8e2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_circle_solid =
IconData(0xe8e3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_light =
IconData(0xe8e4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_regular =
IconData(0xe8e5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_solid =
IconData(0xe8e6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData startup_solid =
IconData(0xe8e7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__light =
IconData(0xe8e8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__regular =
IconData(0xe8e9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__solid =
IconData(0xe8ea, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_light =
IconData(0xe8eb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_regular =
IconData(0xe8ec, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_solid =
IconData(0xe8ed, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_light =
IconData(0xe8ee, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_regular =
IconData(0xe8ef, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_solid =
IconData(0xe8f0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_light =
IconData(0xe8f1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_regular =
IconData(0xe8f2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_solid =
IconData(0xe8f3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData technology_solid =
IconData(0xe8f4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_light =
IconData(0xe8f5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_regular =
IconData(0xe8f6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_solid =
IconData(0xe8f7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData tick_square_regular =
IconData(0xe8f8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_light =
IconData(0xe8f9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_regular =
IconData(0xe8fa, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_solid =
IconData(0xe8fb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_light =
IconData(0xe8fc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_regular =
IconData(0xe8fd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_solid =
IconData(0xe8fe, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_light =
IconData(0xe8ff, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_regular =
IconData(0xe900, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_solid =
IconData(0xe901, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_light =
IconData(0xe902, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_regular =
IconData(0xe903, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_solid =
IconData(0xe904, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_light =
IconData(0xe905, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_regular =
IconData(0xe906, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_solid =
IconData(0xe907, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mention_icon =
IconData(0xe897, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_light =
IconData(0xe898, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_regular =
IconData(0xe899, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData menu_solid =
IconData(0xe89a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_light =
IconData(0xe89b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_regular =
IconData(0xe89c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData message_solid =
IconData(0xe89d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData metal_solid =
IconData(0xe89e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_light =
IconData(0xe89f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_regular =
IconData(0xe8a0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData mic_solid =
IconData(0xe8a1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_light =
IconData(0xe8a2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_regular =
IconData(0xe8a3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData minimize_solid =
IconData(0xe8a4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_light =
IconData(0xe8a5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_regular =
IconData(0xe8a6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData news_solid =
IconData(0xe8a7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData non_tick_square_regular =
IconData(0xe8a8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData note_solid =
IconData(0xe8a9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_light =
IconData(0xe8aa, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_regular =
IconData(0xe8ab, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData notification_solid =
IconData(0xe8ac, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_light =
IconData(0xe8ad, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_regular =
IconData(0xe8ae, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_solid =
IconData(0xe8af, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_light =
IconData(0xe8b0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_regular =
IconData(0xe8b1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData pause_circle_solid =
IconData(0xe8b2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData people_solid =
IconData(0xe8b3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_light =
IconData(0xe8b4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_regular =
IconData(0xe8b5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_solid =
IconData(0xe8b6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_light =
IconData(0xe8b7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_regular =
IconData(0xe8b8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData play_circle_solid =
IconData(0xe8b9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_light =
IconData(0xe8ba, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_regular =
IconData(0xe8bb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast_solid =
IconData(0xe8bc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_light =
IconData(0xe8bd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_regular =
IconData(0xe8be, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData profile_solid =
IconData(0xe8bf, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_light =
IconData(0xe8c0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_regular =
IconData(0xe8c1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData puzzle_solid =
IconData(0xe8c2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_light =
IconData(0xe8c3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_regular =
IconData(0xe8c4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radar_solid =
IconData(0xe8c5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_light =
IconData(0xe8c6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_regular =
IconData(0xe8c7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData refresh_solid =
IconData(0xe8c8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_light =
IconData(0xe8c9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_regular =
IconData(0xe8ca, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData saha_solid =
IconData(0xe8cb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_light =
IconData(0xe8cc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_regular =
IconData(0xe8cd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData scanning_solid =
IconData(0xe8ce, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_light =
IconData(0xe8cf, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_regular =
IconData(0xe8d0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData search_solid =
IconData(0xe8d1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_light =
IconData(0xe8d2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_regular =
IconData(0xe8d3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData send_solid =
IconData(0xe8d4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_light =
IconData(0xe8d5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_regular =
IconData(0xe8d6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData setting_solid =
IconData(0xe8d7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_light =
IconData(0xe8d8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_regular =
IconData(0xe8d9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sign_out_solid =
IconData(0xe8da, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_light =
IconData(0xe8db, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_regular =
IconData(0xe8dc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_enabled_solid =
IconData(0xe8dd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_light =
IconData(0xe8de, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_regular =
IconData(0xe8df, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sleep_timer_solid =
IconData(0xe8e0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_light =
IconData(0xe8e1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_regular =
IconData(0xe8e2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sort_solid =
IconData(0xe8e3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_circle_solid =
IconData(0xe8e4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_light =
IconData(0xe8e5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_regular =
IconData(0xe8e6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star_solid =
IconData(0xe8e7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData startup_solid =
IconData(0xe8e8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__light =
IconData(0xe8e9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__regular =
IconData(0xe8ea, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stats__solid =
IconData(0xe8eb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_light =
IconData(0xe8ec, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_regular =
IconData(0xe8ed, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData stop_circle_solid =
IconData(0xe8ee, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_light =
IconData(0xe8ef, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_regular =
IconData(0xe8f0, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData sub_category_solid =
IconData(0xe8f1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_light =
IconData(0xe8f2, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_regular =
IconData(0xe8f3, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData support_solid =
IconData(0xe8f4, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData technology_solid =
IconData(0xe8f5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_light =
IconData(0xe8f6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_regular =
IconData(0xe8f7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData theme_solid =
IconData(0xe8f8, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData tick_square_regular =
IconData(0xe8f9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_light =
IconData(0xe8fa, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_regular =
IconData(0xe8fb, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData timer_solid =
IconData(0xe8fc, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_light =
IconData(0xe8fd, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_regular =
IconData(0xe8fe, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData trash_solid =
IconData(0xe8ff, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_light =
IconData(0xe900, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_regular =
IconData(0xe901, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_edit_solid =
IconData(0xe902, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_light =
IconData(0xe903, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_regular =
IconData(0xe904, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData user_shield_solid =
IconData(0xe905, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_light =
IconData(0xe906, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_regular =
IconData(0xe907, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video_solid =
IconData(0xe908, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData contact_us_solid =
IconData(0xe909, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData ai_regular =
IconData(0xe90a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData ai_solid =
IconData(0xe90b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData add_regular =
IconData(0xe90c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData copy_regular =
IconData(0xe90d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData note_regular =
IconData(0xe90e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData font_size_solid =
IconData(0xe90f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}

View File

@ -15,6 +15,7 @@ import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/services/notification/firebase_api.dart';
import 'package:didvan/services/notification/notification_service.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/podcasts/podcasts_state.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:firebase_core/firebase_core.dart';
@ -140,6 +141,9 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
ChangeNotifierProvider<StudioDetailsState>(
create: (context) => StudioDetailsState(),
),
ChangeNotifierProvider<HistoryAiChatState>(
create: (context) => HistoryAiChatState(),
),
],
child: Consumer<ThemeProvider>(
builder: (context, themeProvider, child) => Container(

View File

@ -0,0 +1,8 @@
import 'package:didvan/models/ai/bots_model.dart';
class AiChatArgs {
final BotsModel bot;
final int? chatId;
AiChatArgs({required this.bot, this.chatId});
}

View File

@ -0,0 +1,21 @@
class BotsModel {
int? id;
String? name;
String? image;
BotsModel({this.id, this.name, this.image});
BotsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
image = json['image'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['image'] = image;
return data;
}
}

View File

@ -0,0 +1,108 @@
import 'package:didvan/models/ai/bots_model.dart';
class ChatsModel {
int? id;
int? userId;
int? botId;
String? title;
String? createdAt;
String? updatedAt;
BotsModel? bot;
List<Prompts>? prompts;
ChatsModel(
{this.id,
this.userId,
this.botId,
this.title,
this.createdAt,
this.updatedAt,
this.bot,
this.prompts});
ChatsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
userId = json['userId'];
botId = json['botId'];
title = json['title'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
bot = json['bot'] != null ? BotsModel.fromJson(json['bot']) : null;
if (json['prompts'] != null) {
prompts = <Prompts>[];
json['prompts'].forEach((v) {
prompts!.add(Prompts.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['userId'] = userId;
data['botId'] = botId;
data['title'] = title;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
if (bot != null) {
data['bot'] = bot!.toJson();
}
if (prompts != null) {
data['prompts'] = prompts!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Prompts {
int? id;
int? chatId;
String? text;
String? role;
String? createdAt;
bool? finished;
Prompts(
{this.id,
this.chatId,
this.text,
this.role,
this.createdAt,
this.finished});
Prompts.fromJson(Map<String, dynamic> json) {
id = json['id'];
chatId = json['chatId'];
text = json['text'];
role = json['role'];
createdAt = json['createdAt'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['chatId'] = chatId;
data['text'] = text;
data['role'] = role;
data['createdAt'] = createdAt;
return data;
}
Prompts copyWith({
int? id,
int? chatId,
String? text,
String? role,
String? createdAt,
bool? finished,
}) {
return Prompts(
id: id ?? this.id,
chatId: chatId ?? this.chatId,
text: text ?? this.text,
role: role ?? this.role,
createdAt: createdAt ?? this.createdAt,
finished: finished ?? this.finished,
);
}
}

View File

@ -17,8 +17,7 @@ class ActionSheetData {
final bool isBackgroundDropBlur;
final Color? backgroundColor;
const ActionSheetData( {
const ActionSheetData({
required this.content,
this.title,
this.confrimTitle,

View File

@ -1,3 +1,10 @@
// ignore_for_file: unused_import
import 'package:didvan/models/ai/ai_chat_args.dart';
import 'package:didvan/views/ai/ai_chat_page.dart';
import 'package:didvan/views/ai/ai_chat_state.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/authentication/authentication.dart';
import 'package:didvan/views/authentication/authentication_state.dart';
import 'package:didvan/views/comments/comments.dart';
@ -13,6 +20,7 @@ import 'package:didvan/views/home/infography/infography_screen.dart';
import 'package:didvan/views/home/infography/infography_screen_state.dart';
import 'package:didvan/views/home/main/main_page_state.dart';
import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/new_statistic/new_statistic.dart';
import 'package:didvan/views/home/new_statistic/new_statistics_state.dart';
import 'package:didvan/views/home/new_statistic/statistics_details/stat_cats_general_screen.dart';
import 'package:didvan/views/home/new_statistic/statistics_details/stat_cats_general_state.dart';
@ -82,6 +90,11 @@ class RouteGenerator {
)),
);
// case Routes.newStatic:
// return _createRoute(ChangeNotifierProvider<NewStatisticState>(
// create: (context) => NewStatisticState(),
// child: const NewStatistic()));
case Routes.notificationStatusStep:
return _createRoute(
ChangeNotifierProvider<CustomizeCategoryState>(
@ -110,12 +123,11 @@ class RouteGenerator {
ChangeNotifierProvider<StatisticState>(
create: (context) => StatisticState(),
),
ChangeNotifierProvider<NewStatisticState>(
create: (context) => NewStatisticState(),
),
ChangeNotifierProvider<BookmarksState>(
create: (context) => BookmarksState(),
),
ChangeNotifierProvider<NewStatisticState>(
create: (context) => NewStatisticState())
],
child: const Home(),
),
@ -126,7 +138,9 @@ class RouteGenerator {
);
case Routes.profile:
return _createRoute(
const ProfilePage(),
ChangeNotifierProvider<GeneralSettingsState>(
create: (context) => GeneralSettingsState(),
child: const ProfilePage()),
);
case Routes.generalSettings:
return _createRoute(
@ -285,6 +299,13 @@ class RouteGenerator {
(settings.arguments as Map<String, dynamic>)['onDeleted']),
),
);
case Routes.aiChat:
return _createRoute(ChangeNotifierProvider<AiChatState>(
create: (context) => AiChatState(),
child: AiChatPage(
args: settings.arguments as AiChatArgs,
)));
default:
return _errorRoute(settings.name ?? '');
}

View File

@ -1,5 +1,6 @@
class Routes {
static const String splash = '/';
static const String aiChat = '/ai-chat';
static const String home = '/home';
static const String radars = '/radars';
static const String news = '/news';
@ -30,4 +31,5 @@ class Routes {
static const String notificationStatusStep = '/notification-status-step';
static const String notificationTime = '/notification-time';
static const String widgetSetting = '/widget-setting';
static const String newStatic = '/new-static';
}

View File

@ -0,0 +1,39 @@
import 'dart:async';
import 'dart:convert';
import 'package:didvan/services/storage/storage.dart';
import 'package:http/http.dart' as http;
import 'package:http/http.dart';
class AiApiService {
static const String baseUrl = 'https://api.didvan.app/ai';
static final _client = http.Client();
static Future<Request> initial(
{required final String url,
required final String message,
final int? chatId}) async {
final headers = {
"Content-Type": "application/json",
"Authorization": "Bearer ${await StorageService.getValue(key: 'token')}"
};
var request = http.Request('POST', Uri.parse(baseUrl + url))
..headers.addAll(headers);
var body = {'prompt': message};
if (chatId != null) {
body.addAll({'chatId': chatId.toString()});
}
request.body = jsonEncode(body);
return request;
}
static Future<ByteStream> getResponse(Request request) async {
final res = _client.send(request).timeout(
const Duration(seconds: 15),
);
final http.StreamedResponse response = await res;
return response.stream;
}
}

View File

@ -1,6 +1,9 @@
// ignore_for_file: empty_catches
import 'dart:convert';
import 'dart:developer';
import 'package:didvan/services/storage/storage.dart';
import 'package:flutter/foundation.dart';
// ignore: depend_on_referenced_packages
import 'package:http/http.dart' as http;
@ -44,11 +47,11 @@ class RequestService {
if (body != null) _requestBody = body;
if (requestHeaders != null) _headers.addAll(requestHeaders);
if (useAutherization) _headers.addAll({'Authorization': 'Bearer $token'});
// print('Authorization : Bearer $token');
// _headers.addAll({
// 'Authorization':
// 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwicm9sZUlkIjo0LCJhcHBJZCI6MCwiaWF0IjoxNzEzOTM1NzkwfQ.i-SO9tLy0M9j-_C2Wh8tdp01vtYGlDZIBFPygglHQF0'
// });
if (kDebugMode) {
try {
print('Authorization : Bearer $token');
} catch (e) {}
}
if (body != null) _requestBody = body;
}
@ -63,7 +66,7 @@ class RequestService {
headers: _headers,
)
.timeout(
const Duration(seconds: 30),
const Duration(seconds: 100),
)
.catchError(
(e) => throw e,
@ -83,7 +86,7 @@ class RequestService {
headers: _headers,
)
.timeout(
const Duration(seconds: 10),
const Duration(seconds: 100),
)
.catchError(
(e) {
@ -105,7 +108,7 @@ class RequestService {
headers: _headers,
)
.timeout(
const Duration(seconds: 10),
const Duration(seconds: 100),
)
.catchError(
(e) => throw e,
@ -146,7 +149,7 @@ class RequestService {
final streamedResponse = await request
.send()
.timeout(
const Duration(seconds: 30),
const Duration(seconds: 100),
)
.catchError(
(e) => throw e,
@ -167,7 +170,7 @@ class RequestService {
headers: _headers,
)
.timeout(
const Duration(seconds: 10),
const Duration(seconds: 100),
)
.catchError(
(e) => throw e,

View File

@ -200,6 +200,15 @@ class RequestHelper {
static String deleteComment(int id) => '$baseUrl/comment/$id';
static String reportComment(int id) => '$baseUrl/comment/$id/report';
static String widgetNews() => '$baseUrl/user/widget';
static String aiChats() => '$baseUrl/ai/chat';
static String aiBots() => '$baseUrl/ai/bot';
static String aiSearchBots(String q) =>
'$baseUrl/ai/bot${_urlConcatGenerator([
MapEntry('q', q),
])}';
static String aiAChat(int id) => '$baseUrl/ai/chat/$id';
static String aiChatId() => '$baseUrl/ai/chat/id';
static String aiDeleteChats() => '$baseUrl/ai/chat';
static String _urlConcatGenerator(List<MapEntry<String, dynamic>> additions) {
String result = '';

View File

@ -1,4 +1,3 @@
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:didvan/models/notification_message.dart';
import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
@ -153,7 +152,6 @@ class NotificationService {
displayOnBackground: true,
displayOnForeground: true,
wakeUpScreen: true,
icon: 'resource://drawable/logo',
roundedLargeIcon: data.notificationType!.contains('2'),
payload: data.toPayload()),
);

View File

@ -180,7 +180,9 @@ class ActionSheetUtils {
await showDialog(
context: context,
builder: (context) => BackdropFilter(
filter: ImageFilter.blur(sigmaX: data.isBackgroundDropBlur? 10 : 0, sigmaY: data.isBackgroundDropBlur? 10: 0) ,
filter: ImageFilter.blur(
sigmaX: data.isBackgroundDropBlur ? 10 : 0,
sigmaY: data.isBackgroundDropBlur ? 10 : 0),
child: Dialog(
backgroundColor:
data.backgroundColor ?? Theme.of(context).colorScheme.surface,
@ -243,19 +245,20 @@ class ActionSheetUtils {
style: ButtonStyleMode.flat,
),
),
if (data.hasDismissButton)
if (data.hasDismissButton && data.hasDismissButton)
const SizedBox(
width: 20,
),
Expanded(
child: DidvanButton(
onPressed: () {
pop();
data.onConfirmed?.call();
},
title: data.confrimTitle ?? 'تایید',
if (data.hasDismissButton)
Expanded(
child: DidvanButton(
onPressed: () {
pop();
data.onConfirmed?.call();
},
title: data.confrimTitle ?? 'تایید',
),
),
),
],
),
],

View File

@ -124,18 +124,22 @@ class DateTimeUtils {
}
static String timeWithAmPm(String input) {
final dateTime = utcToLocalTime(input);
bool isAm = true;
int hour = 0;
int minute = 0;
if (dateTime.hour > 12) {
isAm = false;
hour = dateTime.hour - 12;
} else {
hour = dateTime.hour;
try {
final dateTime = utcToLocalTime(input);
bool isAm = true;
int hour = 0;
int minute = 0;
if (dateTime.hour > 12) {
isAm = false;
hour = dateTime.hour - 12;
} else {
hour = dateTime.hour;
}
minute = dateTime.minute;
return '$hour:${_timeNormalizer(minute)} ${isAm ? 'ق.ظ' : 'ب.ظ'}';
} catch (e) {
return '';
}
minute = dateTime.minute;
return '$hour:${_timeNormalizer(minute)} ${isAm ? 'ق.ظ' : 'ب.ظ'}';
}
static DateTime utcToLocalTime(String input) {

View File

@ -0,0 +1,331 @@
// ignore_for_file: library_private_types_in_public_api, deprecated_member_use
import 'package:cached_network_image/cached_network_image.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/assets.dart';
import 'package:didvan/main.dart';
import 'package:didvan/models/ai/ai_chat_args.dart';
import 'package:didvan/models/ai/chats_model.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/view/alert_data.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/ai/ai_chat_state.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/state_handlers/empty_state.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:provider/provider.dart';
class AiChatPage extends StatefulWidget {
final AiChatArgs args;
const AiChatPage({Key? key, required this.args}) : super(key: key);
@override
_AiChatPageState createState() => _AiChatPageState();
}
class _AiChatPageState extends State<AiChatPage> {
TextEditingController message = TextEditingController();
@override
void initState() {
final state = context.read<AiChatState>();
state.chatId = widget.args.chatId;
if (state.chatId != null) {
state.getAllMessages(state.chatId!);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
context.read<HistoryAiChatState>().getChats();
return true;
},
child: Scaffold(
appBar: AppBar(
shadowColor: Theme.of(context).colorScheme.border,
title: Row(
children: [
Padding(
padding: const EdgeInsets.all(12.0),
child: ClipOval(
child: CachedNetworkImage(
width: 32,
height: 32,
imageUrl: widget.args.bot.image.toString(),
),
),
),
Text('چت با ${widget.args.bot.name}'),
],
),
automaticallyImplyLeading: false,
actions: [
DidvanIconButton(
icon: DidvanIcons.angle_left_regular,
onPressed: () {
context.read<HistoryAiChatState>().getChats();
navigatorKey.currentState!.pop();
},
)
],
),
body: Consumer<AiChatState>(
builder: (BuildContext context, AiChatState state, Widget? child) {
return ValueListenableBuilder<bool>(
valueListenable: state.loading,
builder: (context, value, child) => value
? Center(
child: Image.asset(
Assets.loadingAnimation,
width: 60,
height: 60,
),
)
: state.messages.isEmpty
? Center(
child: EmptyState(
asset: Assets.emptyChat,
title: 'اولین پیام را بنویسید...',
),
)
: SingleChildScrollView(
reverse: true,
child: ListView.builder(
itemCount: state.messages.length,
controller: state.scrollController,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.only(top: 12, bottom: 90),
itemBuilder: (context, index) {
final message = state.messages[index];
return messageBubble(
message, context, state, index);
},
),
),
);
},
),
bottomSheet: Container(
width: MediaQuery.sizeOf(context).width,
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 8),
decoration: BoxDecoration(
border: Border(
top: BorderSide(
color: Theme.of(context).colorScheme.cardBorder,
),
),
color: Theme.of(context).colorScheme.surface,
),
child: ValueListenableBuilder(
valueListenable: context.read<AiChatState>().onResponsing,
builder: (context, value, child) => Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
width: 12,
),
SizedBox(
width: 46,
height: 46,
child: Center(
child: value
? Center(
child: SpinKitThreeBounce(
size: 18,
color: Theme.of(context).colorScheme.primary,
),
)
: DidvanIconButton(
icon: DidvanIcons.send_solid,
onPressed: () async {
if (message.text.isEmpty) {
return;
}
final state = context.read<AiChatState>();
state.messages.add(Prompts(
text: message.text,
finished: true,
role: 'user',
createdAt: DateTime.now()
.subtract(const Duration(minutes: 210))
.toIso8601String(),
));
message.clear();
await state.postMessage(widget.args.bot);
},
size: 32,
color: Theme.of(context).colorScheme.focusedBorder,
),
),
),
const SizedBox(
width: 12,
),
Expanded(
flex: 15,
child: Form(
child: TextFormField(
textInputAction: TextInputAction.newline,
style: Theme.of(context).textTheme.bodyMedium,
maxLines: 6,
minLines: 1,
// keyboardType: TextInputType.text,
controller: message,
enabled: !value,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'بنویسید...',
hintStyle: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
color:
Theme.of(context).colorScheme.disabledText),
),
onChanged: (value) {},
),
),
),
],
),
),
),
),
);
}
Padding messageBubble(
Prompts message, BuildContext context, AiChatState state, int index) {
MarkdownStyleSheet defaultMarkdownStyleSheet = MarkdownStyleSheet(
code: TextStyle(
backgroundColor: Theme.of(context).colorScheme.black,
color: Theme.of(context).colorScheme.white,
),
codeblockPadding: const EdgeInsets.all(8),
codeblockDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Theme.of(context).colorScheme.black));
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 4),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: message.role.toString().contains('user')
? CrossAxisAlignment.start
: CrossAxisAlignment.end,
children: [
Row(
mainAxisAlignment: message.role.toString().contains('user')
? MainAxisAlignment.start
: MainAxisAlignment.end,
children: [
Container(
padding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
decoration: BoxDecoration(
borderRadius: DesignConfig.mediumBorderRadius.copyWith(
bottomLeft: !message.role.toString().contains('user')
? Radius.zero
: null,
bottomRight: message.role.toString().contains('user')
? Radius.zero
: null,
),
color: (message.role.toString().contains('user')
? Theme.of(context).colorScheme.surface
: Theme.of(context).colorScheme.focused)
.withOpacity(0.9),
border: Border.all(
color: Theme.of(context).colorScheme.border,
width: 0.5,
),
),
child: Container(
constraints: BoxConstraints(
maxWidth: MediaQuery.sizeOf(context).width / 1.5),
child: state.messages[index].finished != null &&
!state.messages[index].finished!
? StreamBuilder<String>(
stream: state.messageOnstream,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const SizedBox();
}
return Markdown(
data: "${snapshot.data}...",
selectable: false,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
styleSheet: defaultMarkdownStyleSheet);
},
)
: Column(
children: [
Markdown(
data: state.messages[index].text.toString(),
selectable: true,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
styleSheet: defaultMarkdownStyleSheet,
),
if (!message.role.toString().contains('user'))
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: InkWell(
onTap: () async {
await Clipboard.setData(ClipboardData(
text: state.messages[index].text
.toString()));
ActionSheetUtils.showAlert(AlertData(
message: "متن با موفقیت کپی شد",
aLertType: ALertType.success));
},
child: Icon(
DidvanIcons.copy_regular,
size: 18,
color: Theme.of(context)
.colorScheme
.focusedBorder,
),
),
)
],
)
],
),
),
)
],
),
const SizedBox(height: 4),
Row(
mainAxisSize: MainAxisSize.min,
children: [
DidvanText(
DateTimeUtils.timeWithAmPm(message.createdAt.toString()),
// DateTimeUtils.timeWithAmPm(message.createdAt),
style: Theme.of(context).textTheme.labelSmall,
color: Theme.of(context).colorScheme.caption,
),
],
),
],
),
);
}
}

View File

@ -0,0 +1,140 @@
import 'dart:convert';
import 'package:didvan/models/ai/bots_model.dart';
import 'package:didvan/models/ai/chats_model.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/view/alert_data.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/ai/ai_api_service.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class AiChatState extends CoreProvier {
Stream<String> messageOnstream = const Stream.empty();
List<Prompts> messages = [];
ValueNotifier<bool> onResponsing = ValueNotifier(false);
ValueNotifier<bool> loading = ValueNotifier(false);
final ScrollController scrollController = ScrollController();
int? chatId;
Future<void> _scrolledEnd() async {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await scrollController.animateTo(
scrollController.position.minScrollExtent,
duration: const Duration(milliseconds: 600),
curve: Curves.easeInOut,
);
});
}
Future<void> _onError(e) async {
onResponsing.value = false;
messages.removeLast();
messages.removeLast();
messageOnstream = const Stream.empty();
await ActionSheetUtils.showAlert(AlertData(
message: 'خطا در برقراری ارتباط', aLertType: ALertType.error));
update();
}
Future<RequestService> getChatId() async {
final service = RequestService(
RequestHelper.aiChatId(),
);
await service.httpGet();
if (service.isSuccess) {
final id = service.result['id'];
chatId = id;
}
return service;
}
Future<void> getAllMessages(int chatId) async {
loading.value = true;
onResponsing.value = true;
final service = RequestService(
RequestHelper.aiAChat(chatId),
);
await service.httpGet();
if (service.isSuccess) {
messages.clear();
final allMessages = service.result['prompts'];
for (var i = 0; i < allMessages.length; i++) {
messages.add(Prompts.fromJson(allMessages[i]));
// chats.add("chats: $chats");
}
appState = AppState.idle;
loading.value = false;
onResponsing.value = false;
// Add this code to scroll to maxScrollExtent after the ListView is built
update();
return;
}
appState = AppState.failed;
loading.value = false;
onResponsing.value = false;
update();
}
Future<void> postMessage(BotsModel bot) async {
onResponsing.value = true;
update();
await _scrolledEnd();
String message = messages.last.text!;
messages.add(Prompts(
finished: false,
text: '...',
role: 'bot',
createdAt: DateTime.now()
.subtract(const Duration(minutes: 210))
.toIso8601String()));
final req = await AiApiService.initial(
url: '/${bot.id}/${bot.name}'.toLowerCase(),
message: message,
chatId: chatId);
final res = await AiApiService.getResponse(req).catchError((e) {
_onError(e);
throw e;
});
String responseMessgae = '';
var r = res.listen((value) async {
var str = utf8.decode(value);
responseMessgae += str;
messageOnstream = Stream.value(responseMessgae);
update();
_scrolledEnd();
});
r.onDone(() async {
if (chatId == null) {
final service = await getChatId();
if (!service.isSuccess) {
_onError(null);
return;
}
}
onResponsing.value = false;
messages.last = messages.last.copyWith(
finished: true,
text: responseMessgae,
);
messageOnstream = const Stream.empty();
update();
_scrolledEnd();
});
r.onError(_onError);
}
}

View File

@ -0,0 +1,367 @@
// ignore_for_file: library_private_types_in_public_api
import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/constants/assets.dart';
import 'package:didvan/main.dart';
import 'package:didvan/models/ai/ai_chat_args.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/utils/date_time.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/shimmer_placeholder.dart';
import 'package:didvan/views/widgets/state_handlers/empty_state.dart';
import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class HistoryAiChatPage extends StatefulWidget {
const HistoryAiChatPage({Key? key}) : super(key: key);
@override
_HistoryAiChatPageState createState() => _HistoryAiChatPageState();
}
class _HistoryAiChatPageState extends State<HistoryAiChatPage> {
ScrollController scrollController = ScrollController();
@override
void initState() {
final state = context.read<HistoryAiChatState>();
Future.delayed(
Duration.zero,
() => state.getChats(),
);
super.initState();
}
@override
Widget build(BuildContext context) {
return DidvanScaffold(
hidePlayer: true,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 92),
floatingActionButton: openAiListBtn(context),
scrollController: scrollController,
slivers: [
Consumer<HistoryAiChatState>(
builder: (context, state, child) {
return SliverStateHandler(
state: state,
emptyState: EmptyState(
asset: Assets.emptyResult,
title: 'لیست خالی است',
),
enableEmptyState: state.chats.isEmpty,
placeholder: const _HistoryPlaceholder(),
placeholderCount: 8,
// builder: (context, state, index) => _HistoryPlaceholder(),
builder: (context, state, index) {
final chat = state.chats[index];
return InkWell(
onTap: () {
if (state.chatsToDelete.isEmpty) {
navigatorKey.currentState!.pushNamed(Routes.aiChat,
arguments:
AiChatArgs(bot: chat.bot!, chatId: chat.id!));
} else {
if (state.chatsToDelete.contains(chat.id)) {
state.chatsToDelete.remove(chat.id!);
} else {
state.chatsToDelete.add(chat.id!);
}
}
state.update();
},
onLongPress: () {
if (state.chatsToDelete.isEmpty) {
state.chatsToDelete.add(chat.id!);
}
state.update();
},
child: Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color:
Theme.of(context).colorScheme.border))),
child: Stack(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(
width: 46,
height: 46,
),
const SizedBox(
width: 18,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
DidvanText(
chat.bot!.name.toString(),
fontWeight: FontWeight.bold,
),
DidvanText(
DateTimeUtils.momentGenerator(
chat.updatedAt.toString()),
style:
const TextStyle(fontSize: 12)),
],
),
SizedBox(
child: DidvanText(
chat.prompts![0].text.toString(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
),
],
),
Positioned(
bottom: 0,
right: 0,
top: 0,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: ClipOval(
child: CachedNetworkImage(
imageUrl: chat.bot!.image.toString(),
),
),
),
),
if (state.chatsToDelete.contains(chat.id))
Positioned(
right: 32,
bottom: 0,
child: Container(
// ignore: prefer_const_constructors
decoration: BoxDecoration(
color: Theme.of(context)
.scaffoldBackgroundColor,
shape: BoxShape.circle),
child: Icon(DidvanIcons.check_circle_solid,
size: 20,
color:
Theme.of(context).colorScheme.success),
),
)
],
),
),
);
},
childCount: state.chats.length,
onRetry: state.getChats);
},
)
],
appBarData: null,
);
}
Widget openAiListBtn(BuildContext context) {
final watch = context.watch<HistoryAiChatState>();
final state = context.read<HistoryAiChatState>();
return FloatingActionButton(
backgroundColor: watch.chatsToDelete.isEmpty
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.error,
shape: const OvalBorder(),
mini: true,
onPressed: () {
if (watch.chatsToDelete.isEmpty) {
state.getBots();
state.search = '';
_botsDialogSelect(context);
} else {
state.addChatToDelete();
}
},
child: watch.chatsToDelete.isEmpty
? const Icon(DidvanIcons.add_regular)
: const Icon(DidvanIcons.trash_regular),
);
}
void _botsDialogSelect(BuildContext context) {
final state = context.read<HistoryAiChatState>();
ActionSheetUtils.context = context;
ActionSheetUtils.openDialog(
data: ActionSheetData(
hasConfirmButton: false,
hasDismissButton: false,
content: Column(
children: [
// Row(
// mainAxisAlignment: MainAxisAlignment.end,
// children: [
// Padding(
// padding: const EdgeInsets.symmetric(vertical: 8.0),
// child: InkWell(
// onTap: () {
// ActionSheetUtils.pop();
// },
// child: const Icon(DidvanIcons.close_solid)),
// )
// ],
// ),
// SearchField(
// title: 'هوش مصنوعی',
// value: state.search,
// onChanged: (value) {
// state.search = value;
// if (value.isEmpty) {
// state.getBots();
// return;
// }
// state.timer?.cancel();
// state.timer = Timer(const Duration(seconds: 1), () {
// state.getSearchBots(value);
// });
// },
// focusNode: FocusNode()),
// const SizedBox(
// height: 12,
// ),
SizedBox(
width: double.infinity,
height: MediaQuery.sizeOf(context).height / 3,
child: ValueListenableBuilder<bool>(
valueListenable: state.loadingBots,
builder: (context, value, child) => value
? Center(
child: Image.asset(
Assets.loadingAnimation,
width: 60,
height: 60,
),
)
: state.bots.isEmpty
? Padding(
padding: const EdgeInsets.symmetric(
horizontal: 12.0),
child: EmptyState(
asset: Assets.emptyResult,
title: 'نتیجه‌ای پیدا نشد',
height: 120,
),
)
: ListView.builder(
padding:
const EdgeInsets.symmetric(vertical: 12),
itemCount: state.bots.length,
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
final bot = state.bots[index];
return InkWell(
onTap: () {
ActionSheetUtils.pop();
navigatorKey.currentState!.pushNamed(
Routes.aiChat,
arguments: AiChatArgs(bot: bot));
},
child: Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(
vertical: 8),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context)
.colorScheme
.border,
width: 1))),
child: Row(
children: [
ClipOval(
child: CachedNetworkImage(
imageUrl: bot.image.toString(),
width: 42,
height: 42,
),
),
const SizedBox(width: 12),
Text(bot.name.toString())
],
),
),
);
}),
),
)
],
)));
}
}
class _HistoryPlaceholder extends StatelessWidget {
const _HistoryPlaceholder({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.symmetric(vertical: 12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ClipOval(
child: ShimmerPlaceholder(
height: 42,
width: 42,
),
),
SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ShimmerPlaceholder(
height: 20,
width: 100,
),
ShimmerPlaceholder(
height: 14,
width: 100,
),
],
),
SizedBox(height: 12),
ShimmerPlaceholder(
height: 16,
width: double.infinity,
),
SizedBox(height: 8),
],
),
),
],
),
);
}
}

View File

@ -0,0 +1,111 @@
import 'dart:async';
import 'package:didvan/models/ai/bots_model.dart';
import 'package:didvan/models/ai/chats_model.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/view/alert_data.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:flutter/cupertino.dart';
class HistoryAiChatState extends CoreProvier {
final List<ChatsModel> chats = [];
final List<int> chatsToDelete = [];
final List<BotsModel> bots = [];
ValueNotifier<bool> loadingBots = ValueNotifier(false);
Timer? timer;
String search = '';
Future<void> getChats() async {
final service = RequestService(
RequestHelper.aiChats(),
);
await service.httpGet();
if (service.isSuccess) {
chats.clear();
final messages = service.result['chats'];
for (var i = 0; i < messages.length; i++) {
chats.add(ChatsModel.fromJson(messages[i]));
}
appState = AppState.idle;
update();
return;
}
appState = AppState.failed;
update();
}
Future<void> getBots() async {
loadingBots.value = true;
final service = RequestService(
RequestHelper.aiBots(),
);
await service.httpGet();
if (service.isSuccess) {
bots.clear();
final messages = service.result['bots'];
for (var i = 0; i < messages.length; i++) {
bots.add(BotsModel.fromJson(messages[i]));
}
appState = AppState.idle;
loadingBots.value = false;
update();
return;
}
appState = AppState.failed;
loadingBots.value = false;
update();
}
Future<void> getSearchBots(String q) async {
loadingBots.value = true;
final service = RequestService(
RequestHelper.aiSearchBots(q),
);
await service.httpGet();
if (service.isSuccess) {
bots.clear();
final messages = service.result['bots'];
for (var i = 0; i < messages.length; i++) {
bots.add(BotsModel.fromJson(messages[i]));
}
appState = AppState.idle;
loadingBots.value = false;
update();
return;
}
appState = AppState.failed;
loadingBots.value = false;
update();
}
Future<void> addChatToDelete() async {
final service = RequestService(RequestHelper.aiDeleteChats(),
body: {"ids": chatsToDelete});
await service.delete();
if (service.isSuccess) {
final List<ChatsModel> cs = [];
for (var chat in chats) {
if (!chatsToDelete.contains(chat.id)) {
cs.add(chat);
}
}
chatsToDelete.clear();
chats.clear();
chats.addAll(cs);
appState = AppState.idle;
update();
return;
}
appState = AppState.failed;
await ActionSheetUtils.showAlert(AlertData(
message: 'خطا در برقراری ارتباط', aLertType: ALertType.error));
update();
}
}

View File

@ -2,8 +2,10 @@ import 'dart:async';
import 'package:didvan/config/design_config.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/home/bookmarks/bookmark_state.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/menu_item.dart';
import 'package:didvan/views/widgets/overview/multitype.dart';
// import 'package:didvan/views/widgets/search_field.dart';
@ -39,7 +41,11 @@ class _BookmarksState extends State<Bookmarks> {
@override
Widget build(BuildContext context) {
final state = context.watch<BookmarksState>();
return CustomScrollView(
return DidvanScaffold(
appBarData: AppBarData(title: 'رصدخانه من', hasBack: true, isSmall: true),
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(8.0),
hidePlayer: true,
slivers: [
SliverPadding(
padding: const EdgeInsets.symmetric(horizontal: 16),

View File

@ -7,7 +7,7 @@ import 'package:didvan/providers/theme.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/services/notification/notification_service.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/home/bookmarks/bookmarks.dart';
import 'package:didvan/views/ai/history_ai_chat_page.dart';
import 'package:didvan/views/home/categories/categories_page.dart';
import 'package:didvan/views/home/main/main_page.dart';
import 'package:didvan/views/home/home_state.dart';
@ -100,10 +100,11 @@ class _HomeState extends State<Home>
controller: _tabController,
children: const [
MainPage(),
CategoriesPage(),
HistoryAiChatPage(),
NewStatistic(),
//Statistic(),
CategoriesPage(),
Bookmarks(),
// Bookmarks(),
],
),
),

View File

@ -38,266 +38,172 @@ class _NewStatisticState extends State<NewStatistic> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Center(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12),
color: Theme.of(context).colorScheme.background,
child: DidvanText(
'دسته‌بندی‌های کلان',
color: Theme.of(context).colorScheme.title,
style: Theme.of(context).textTheme.titleMedium,
),
return SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Center(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16),
color: Theme.of(context).colorScheme.background,
child: DidvanText(
'دسته‌بندی‌های کلان',
color: Theme.of(context).colorScheme.title,
style: Theme.of(context).textTheme.titleMedium,
),
),
const Padding(
padding: EdgeInsets.only(
left: 20,
right: 20,
top: 16,
),
child: NewStatisticCategories(),
),
const Padding(
padding: EdgeInsets.symmetric(
horizontal: 20,
),
const DidvanDivider(
verticalPadding: 4,
),
StateHandler<NewStatisticState>(
enableEmptyState: false,
onRetry: context.read<NewStatisticState>().init,
state: context.watch<NewStatisticState>(),
placeholder: Padding(
padding: const EdgeInsets.only(top: 48.0),
child: Column(
children: [
placeholder,
const SizedBox(
height: 8,
),
placeholder,
const SizedBox(
height: 8,
),
placeholder,
const SizedBox(
height: 8,
),
placeholder,
],
),
),
builder: (context, state) => Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
child: NewStatisticCategories(),
),
const DidvanDivider(
verticalPadding: 4,
),
StateHandler<NewStatisticState>(
enableEmptyState: false,
onRetry: context.read<NewStatisticState>().init,
state: context.watch<NewStatisticState>(),
placeholder: Padding(
padding: const EdgeInsets.only(top: 48.0),
child: Column(
children: [
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context)
.pushNamed(Routes.statGeneral, arguments: {
"id": 7,
"title": state.contents[0].header,
}).then((value) => _reset());
}),
child: StatHeader(
header: state.contents[0].header,
icon: DidvanIcons.star_circle_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[0].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[0].contents[index],
),
),
placeholder,
const SizedBox(
height: 46,
),
const DidvanDivider(
verticalPadding: 4,
placeholder,
const SizedBox(
height: 46,
),
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context).pushNamed(Routes.statGeneral,
arguments: {
"id": 1,
"title": state.contents[1].header
});
}).then((value) => _reset()),
child: StatHeader(
header: state.contents[1].header,
icon: DidvanIcons.currency_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[1].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[1].contents[index]))),
const DidvanDivider(
verticalPadding: 4,
placeholder,
const SizedBox(
height: 46,
),
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context).pushNamed(Routes.statGeneral,
arguments: {
"id": 2,
"title": state.contents[2].header
}).then((value) => _reset());
}),
child: StatHeader(
header: state.contents[2].header,
icon: DidvanIcons.bitcoin_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[2].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[2].contents[index]))),
const DidvanDivider(
verticalPadding: 4,
),
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context).pushNamed(Routes.statGeneral,
arguments: {
"id": 3,
"title": state.contents[3].header
});
}).then((value) => _reset()),
child: StatHeader(
header: state.contents[3].header,
icon: DidvanIcons.metal_solid,
),
),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[3].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[3].contents[index]))),
const DidvanDivider(
verticalPadding: 4,
),
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context).pushNamed(Routes.statGeneral,
arguments: {
"id": 4,
"title": state.contents[4].header
}).then((value) => _reset());
}),
child: StatHeader(
header: state.contents[4].header,
icon: DidvanIcons.commodity_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[4].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[4].contents[index]))),
const DidvanDivider(
verticalPadding: 4,
),
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context)
.pushNamed(Routes.statGeneral, arguments: {
"id": 5,
"title": state.contents[5].header,
}).then((value) => _reset());
}),
child: StatHeader(
header: state.contents[5].header,
icon: DidvanIcons.industry_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[5].contents.length,
itemBuilder: (context, index) => StatMainCard(
id: 5,
statistic: state.contents[5].contents[index]))),
placeholder,
],
),
),
],
),
builder: (context, state) => Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
itemsInStatics(context, state, 0),
itemsInStatics(context, state, 1),
itemsInStatics(context, state, 2),
itemsInStatics(context, state, 3),
itemsInStatics(context, state, 4),
itemsInStatics(context, state, 5, hasDivider: false),
],
),
),
],
),
);
}
Widget itemsInStatics(BuildContext context, NewStatisticState state, int id,
{final bool? hasDivider}) {
bool d = hasDivider ?? true;
return state.contents[id].contents.isEmpty
? const SizedBox()
: Padding(
padding: const EdgeInsets.only(top: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
GestureDetector(
onTap: () => Future.delayed(Duration.zero, () {
Navigator.of(context)
.pushNamed(Routes.statGeneral, arguments: {
"id": id == 0 ? 7 : id,
"title": state.contents[id].header,
}).then((value) => _reset());
}),
child: StatHeader(
header: state.contents[id].header,
icon: DidvanIcons.star_circle_solid,
)),
SizedBox(
height: 100,
width: 80,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: const ScrollPhysics(),
itemCount: state.contents[id].contents.length,
itemBuilder: (context, index) => StatMainCard(
statistic: state.contents[id].contents[index],
),
),
),
if (d)
const DidvanDivider(
verticalPadding: 4,
),
],
),
);
}
static Widget get placeholder => const Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ShimmerPlaceholder(
height: 16,
width: 100,
),
ShimmerPlaceholder(
height: 16,
width: 50,
)
],
Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ShimmerPlaceholder(
height: 16,
width: 100,
),
ShimmerPlaceholder(
height: 16,
width: 50,
)
],
),
),
SizedBox(
height: 8,
height: 18,
),
Row(
Flex(
direction: Axis.horizontal,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DidvanCard(
child: ShimmerPlaceholder(
height: 80,
width: 60,
Flexible(
flex: 1,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0),
child: DidvanCard(
child: ShimmerPlaceholder(
height: 60,
),
),
),
),
DidvanCard(
child: ShimmerPlaceholder(
height: 80,
width: 60,
Flexible(
flex: 1,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0),
child: DidvanCard(
child: ShimmerPlaceholder(
height: 60,
),
),
),
),
DidvanCard(
child: ShimmerPlaceholder(
height: 80,
width: 60,
),
),
DidvanCard(
child: ShimmerPlaceholder(
height: 80,
width: 60,
Flexible(
flex: 1,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0),
child: DidvanCard(
child: ShimmerPlaceholder(
height: 60,
),
),
),
),
],

View File

@ -19,8 +19,8 @@ class MainCategories extends StatelessWidget {
);
} else if (link.startsWith('tab-')) {
final state = context.read<HomeState>();
state.currentPageIndex = 1;
state.tabController.animateTo(1);
state.currentPageIndex = 3;
state.tabController.animateTo(3);
} else {
Navigator.of(context).pushNamed(link);
}

View File

@ -1,4 +1,5 @@
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/home_page_content/home_page_content.dart';
import 'package:didvan/providers/core.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
@ -15,6 +16,41 @@ class GeneralSettingsState extends CoreProvier {
String _brightness = 'light';
String time = "";
bool showSettings = false;
bool showThemes = false;
bool showContactUs = false;
int unread = 10;
late MainPageContent content;
void markChangeHandler(String type, int id, bool value) {
content.lists
.firstWhere((element) => element.type == type)
.contents
.firstWhere((element) => element.id == id)
.marked = value;
notifyListeners();
}
Future<void> _getMainPageContent() async {
final service = RequestService(RequestHelper.mainPageContent);
await service.httpGet();
if (service.isSuccess) {
content = MainPageContent.fromJson(service.result);
unread = service.result['unread'];
appState = AppState.idle;
return;
}
appState = AppState.failed;
}
void init() {
Future.delayed(Duration.zero, () {
_getMainPageContent();
});
}
Future<void> getTime() async {
appState = AppState.busy;
@ -23,7 +59,7 @@ class GeneralSettingsState extends CoreProvier {
);
await service.httpGet();
if (service.isSuccess) {
time = service.data('time');
time = service.data('time');
appState = AppState.idle;
} else {
@ -33,7 +69,6 @@ class GeneralSettingsState extends CoreProvier {
update();
}
set notificationTimeRange(List<int> value) {
_notificationTimeRange = value;
StorageService.setValue(

View File

@ -1,102 +1,453 @@
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/assets.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/profile/general_settings/settings_state.dart';
import 'package:didvan/views/widgets/animated_visibility.dart';
import 'package:didvan/views/widgets/didvan/radial_button.dart';
import 'package:didvan/views/widgets/menu_item.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class ProfilePage extends StatelessWidget {
class ProfilePage extends StatefulWidget {
const ProfilePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return DidvanScaffold(
padding: const EdgeInsets.all(16),
appBarData: AppBarData(
title: 'تنظیمات',
),
children: [
DidvanCard(
child: Column(
children: [
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName,
onTap: () =>
Navigator.of(context).pushNamed(Routes.editProfile),
),
const DidvanDivider(),
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () =>
Navigator.of(context).pushNamed(Routes.generalSettings),
),
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
),
),
const ItemTitle(
title: 'درباره ما',
),
DidvanCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MenuOption(
icon: DidvanIcons.info_circle_regular,
title: 'معرفی دیدوان',
onTap: () => launchUrl(Uri.parse('https://didvan.app/#info')),
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.support_regular,
title: 'پیام به پشتیبانی',
onTap: () {
Navigator.of(context).pushNamed(
Routes.direct,
arguments: {'type': 'پشتیبانی اپلیکیشن'},
);
},
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.alert_regular,
title: 'حریم خصوصی',
onTap: () => launchUrl(
Uri.parse('https://didvan.app/terms-of-use#privacy'),
),
),
],
),
),
const SizedBox(height: 16),
DidvanText(
'نسخه نرم‌افزار: 3.2.2',
style: Theme.of(context).textTheme.bodySmall,
),
],
State<ProfilePage> createState() => _ProfilePageState();
}
class _ProfilePageState extends State<ProfilePage> {
String fontScaleSuffix(double fontSizeScale) {
final fontScale = fontSizeScale;
if (fontScale == 1) return 'متوسط';
if (fontScale == 1.15) return 'بزرگ';
return 'کوچک';
}
@override
void initState() {
super.initState();
context.read<GeneralSettingsState>().init();
final state = context.read<GeneralSettingsState>();
Future.delayed(
Duration.zero,
() => state.getTime(),
);
}
}
@override
Widget build(BuildContext context) {
return Consumer<GeneralSettingsState>(
builder: (context, state, child) => StateHandler<GeneralSettingsState>(
onRetry: context.read<GeneralSettingsState>().init,
state: context.read<GeneralSettingsState>(),
builder: (context, state) => DidvanScaffold(
padding: const EdgeInsets.all(16),
appBarData: AppBarData(title: 'تنظیمات', hasBack: true),
children: [
DidvanCard(
child: Column(
children: [
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context)
.pushNamed(Routes.editProfile),
),
const DidvanDivider(),
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () {
state.showSettings = !state.showSettings;
state.update();
},
trailing: Icon(
state.showSettings
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
)),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: state.showSettings,
child: Padding(
padding: const EdgeInsets.only(right: 8.0, top: 8),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'زمان دریافت اعلان',
onTap: () =>
Navigator.of(context).pushNamed(
Routes.notificationTime,
arguments: {
"fromFav": false,
'onTimeChanged': () => Future.delayed(
Duration.zero,
() => state.getTime(),
)
},
),
icon: DidvanIcons.notification_regular,
suffix: state.time,
// suffix: 'از${DateTimeUtils.normalizeTimeDuration(
// Duration(minutes: state.notificationTimeRange[0]),
// )} تا ${DateTimeUtils.normalizeTimeDuration(
// Duration(minutes: state.notificationTimeRange[1]),
// )}',
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'شخصی سازی محتوا',
onTap: () => Navigator.of(context)
.pushNamed(Routes.favouritesStep,
arguments: {"toTimer": false}),
icon: DidvanIcons.note_regular,
// suffix: 'از${DateTimeUtils.normalizeTimeDuration(
// Duration(minutes: state.notificationTimeRange[0]),
// )} تا ${DateTimeUtils.normalizeTimeDuration(
// Duration(minutes: state.notificationTimeRange[1]),
// )}',
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix: state.fontFamily == 'Dana-FA'
? 'دانا'
: 'ایران سنس',
title: 'فونت برنامه',
onTap: _showFontFamilyBottomSheet,
icon: DidvanIcons.font_regular,
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix:
fontScaleSuffix(state.fontSizeScale),
title: 'اندازه متن',
onTap: _showFontScaleBottomSheet,
icon: DidvanIcons.font_size_solid,
)),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'ظاهر برنامه',
onTap: () {
state.showThemes = !state.showThemes;
state.update();
},
icon: DidvanIcons.theme_regular,
trailing: Icon(
state.showThemes
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context)
.colorScheme
.title,
))),
AnimatedVisibility(
isVisible: state.showThemes,
duration: DesignConfig.lowAnimationDuration,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
_themeItem(context, state, 'light'),
_themeItem(context, state, 'dark'),
],
),
),
),
],
),
),
),
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
),
),
const ItemTitle(
title: 'درباره ما',
),
DidvanCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MenuOption(
icon: DidvanIcons.info_circle_regular,
title: 'معرفی دیدوان',
onTap: () =>
launchUrl(Uri.parse('https://didvan.app/#info')),
),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.contact_us_solid,
title: 'تماس با ما',
onTap: () {
state.showContactUs = !state.showContactUs;
state.update();
},
trailing: Icon(
state.showContactUs
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
)),
AnimatedVisibility(
isVisible: state.showContactUs,
duration: DesignConfig.lowAnimationDuration,
child: Padding(
padding:
const EdgeInsets.only(right: 8.0, top: 8),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12),
child: MenuOption(
icon: DidvanIcons.support_regular,
title: 'پیام به پشتیبانی',
onTap: () {
Navigator.of(context).pushNamed(
Routes.direct,
arguments: {
'type': 'پشتیبانی اپلیکیشن'
},
);
},
),
),
Padding(
padding: const EdgeInsets.only(top: 12),
child: MenuOption(
icon: DidvanIcons.chats_regular,
title: 'صندوق پیام',
onTap: () {
Navigator.of(context)
.pushNamed(Routes.directList)
.then(
(value) => state.init(),
);
},
trailing: Row(
children: [
if (state.unread > 0)
Container(
width: 18,
height: 18,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context)
.colorScheme
.secondary,
),
alignment: Alignment.center,
child: DidvanText(
state.unread.toString(),
color: Colors.white,
fontSize: 12,
),
),
const SizedBox(
width: 12,
),
Icon(
DidvanIcons.angle_left_regular,
size: 18,
color: Theme.of(context)
.colorScheme
.title,
)
],
),
),
),
],
),
)),
const DidvanDivider(),
MenuOption(
icon: DidvanIcons.alert_regular,
title: 'حریم خصوصی',
onTap: () => launchUrl(
Uri.parse(
'https://didvan.app/terms-of-use#privacy'),
),
),
],
),
),
const SizedBox(height: 16),
DidvanText(
'نسخه نرم‌افزار: 3.2.2',
style: Theme.of(context).textTheme.bodySmall,
),
],
),
));
}
Future<void> _showFontFamilyBottomSheet() async {
final themeProvider = context.read<ThemeProvider>();
final state = context.read<GeneralSettingsState>();
final family = state.fontFamily;
await ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
content: StatefulBuilder(
builder: (context, setState) => Column(
children: [
DidvanRadialButton(
title: 'دانا',
fontFamily: 'Dana-FA',
onSelected: () {
state.fontFamily = 'Dana-FA';
setState(() {});
},
value: state.fontFamily == 'Dana-FA',
),
const SizedBox(height: 24),
DidvanRadialButton(
title: 'ایران سنس',
fontFamily: 'Iransans-FA',
onSelected: () {
state.fontFamily = 'Iransans-FA';
setState(() {});
},
value: state.fontFamily == 'Iransans-FA',
),
],
),
),
title: 'انتخاب فونت برنامه',
titleIcon: DidvanIcons.font_regular,
onDismissed: () => state.fontFamily = family,
onConfirmed: () => themeProvider.fontFamily = state.fontFamily,
),
);
}
Future<void> _showFontScaleBottomSheet() async {
final themeProvider = context.read<ThemeProvider>();
final state = context.read<GeneralSettingsState>();
final scale = state.fontSizeScale;
await ActionSheetUtils.showBottomSheet(
data: ActionSheetData(
content: StatefulBuilder(
builder: (context, setState) => Column(
children: [
DidvanRadialButton(
title: 'بزرگ',
fontSize: 15 * 1.15,
onSelected: () {
state.fontSizeScale = 1.15;
setState(() {});
},
value: state.fontSizeScale == 1.15,
),
const SizedBox(height: 24),
DidvanRadialButton(
title: 'متوسط',
onSelected: () {
state.fontSizeScale = 1;
setState(() {});
},
value: state.fontSizeScale == 1,
),
const SizedBox(height: 24),
DidvanRadialButton(
title: 'کوچک',
fontSize: 15 * 0.85,
onSelected: () {
state.fontSizeScale = 0.85;
setState(() {});
},
value: state.fontSizeScale == 0.85,
),
],
),
),
title: 'انتخاب اندازه متن',
titleIcon: DidvanIcons.font_regular,
onDismissed: () => state.fontSizeScale = scale,
onConfirmed: () => themeProvider.fontScale = state.fontSizeScale,
),
);
}
Widget _themeItem(
BuildContext context, GeneralSettingsState state, String brightness) {
final bool isDarkTheme = brightness == 'dark';
return GestureDetector(
onTap: () {
state.brightness = brightness;
if (isDarkTheme && DesignConfig.isDark) {
return;
} else if (!isDarkTheme && !DesignConfig.isDark) {
return;
} else {
if (isDarkTheme) {
context.read<ThemeProvider>().themeMode = ThemeMode.dark;
} else {
context.read<ThemeProvider>().themeMode = ThemeMode.light;
}
DesignConfig.updateSystemUiOverlayStyle();
}
},
child: Column(
children: [
SvgPicture.asset(isDarkTheme ? Assets.darkTheme : Assets.lightTheme),
const SizedBox(height: 8),
DidvanText(
isDarkTheme ? 'تیره' : 'روشن',
),
],
),
);
}
}

View File

@ -36,17 +36,20 @@ class DidvanAppBar extends StatelessWidget implements PreferredSizeWidget {
),
child: Row(
children: [
appBarData.hasBack? Column(
children: [
IconButton(
onPressed: () => Navigator.of(context).pop(),
color: Theme.of(context).colorScheme.title,
icon: const Icon(
DidvanIcons.back_regular,
),
),
],
):const SizedBox(),
appBarData.hasBack
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
onPressed: () => Navigator.of(context).pop(),
color: Theme.of(context).colorScheme.title,
icon: const Icon(
DidvanIcons.back_regular,
),
),
],
)
: const SizedBox(),
const SizedBox(width: 16),
Expanded(
child: Align(

View File

@ -52,23 +52,23 @@ class DidvanBNB extends StatelessWidget {
),
_NavBarItem(
isSelected: currentTabIndex == 1,
title: 'آمار و داده',
selectedIcon: DidvanIcons.stats__solid,
unselectedIcon: DidvanIcons.stats__light,
title: 'دسته‌بندی',
selectedIcon: DidvanIcons.category_solid,
unselectedIcon: DidvanIcons.category_light,
onTap: () => onTabChanged(1),
),
_NavBarItem(
isSelected: currentTabIndex == 2,
title: 'دسته‌بندی',
selectedIcon: DidvanIcons.category_solid,
unselectedIcon: DidvanIcons.category_light,
title: 'هوش مصنوعی',
selectedIcon: DidvanIcons.ai_solid,
unselectedIcon: DidvanIcons.ai_regular,
onTap: () => onTabChanged(2),
),
_NavBarItem(
isSelected: currentTabIndex == 3,
title: 'رصدخانه من',
selectedIcon: DidvanIcons.antenna_solid,
unselectedIcon: DidvanIcons.antenna_light,
title: 'آمار و داده',
selectedIcon: DidvanIcons.stats__solid,
unselectedIcon: DidvanIcons.stats__light,
onTap: () => onTabChanged(3),
),
],

View File

@ -15,6 +15,7 @@ class DidvanScaffold extends StatefulWidget {
final ScrollController? scrollController;
final bool showSliversFirst;
final bool hidePlayer;
final Widget? floatingActionButton;
const DidvanScaffold({
Key? key,
@ -28,6 +29,7 @@ class DidvanScaffold extends StatefulWidget {
this.scrollController,
this.showSliversFirst = false,
this.hidePlayer = false,
this.floatingActionButton,
}) : super(key: key);
@override
@ -60,6 +62,7 @@ class _DidvanScaffoldState extends State<DidvanScaffold> {
MediaQuery.of(context).padding.bottom;
return Scaffold(
backgroundColor: widget.backgroundColor,
floatingActionButton: widget.floatingActionButton,
body: Padding(
padding: widget.appBarData == null
? EdgeInsets.zero

View File

@ -56,38 +56,25 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
),
Row(
children: [
DidvanIconButton(
icon: DidvanIcons.profile_light,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.profile),
),
Container(
height: 32,
width: 1,
color: Theme.of(context).colorScheme.border,
),
Consumer<MainPageState>(
builder: (_, state, __) => Stack(
children: [
DidvanIconButton(
icon: state.unread == 0
? DidvanIcons.message_light
: DidvanIcons.message_solid,
icon: DidvanIcons.profile_light,
size: 32,
onPressed: () => Navigator.of(context)
.pushNamed(Routes.directList)
.pushNamed(Routes.profile)
.then(
(value) => state.init(),
),
),
if (state.unread > 0)
Positioned(
top: 8,
right: 4,
bottom: 15,
right: 12,
child: Container(
height: 12,
width: 12,
height: 10,
width: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).colorScheme.secondary,
@ -96,7 +83,18 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
),
],
),
)
),
Container(
height: 32,
width: 1,
color: Theme.of(context).colorScheme.border,
),
DidvanIconButton(
icon: DidvanIcons.antenna_light,
size: 32,
onPressed: () =>
Navigator.of(context).pushNamed(Routes.bookmarks),
),
],
),
],

View File

@ -11,6 +11,7 @@ class EmptyState extends StatelessWidget {
final String? buttonTitle;
final VoidCallback? action;
final Color? titleColor;
final double? height;
const EmptyState({
Key? key,
@ -20,6 +21,7 @@ class EmptyState extends StatelessWidget {
this.buttonTitle,
this.subtitle,
this.titleColor,
this.height,
}) : super(key: key);
@override
@ -27,7 +29,7 @@ class EmptyState extends StatelessWidget {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(height: 210, child: SvgPicture.asset(asset)),
SizedBox(height: height ?? 210, child: SvgPicture.asset(asset)),
const SizedBox(height: 16),
DidvanText(
title,

View File

@ -14,6 +14,7 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
final EdgeInsets? itemPadding;
final bool centerEmptyState;
final bool hasConstraints;
final int placeholderCount;
SliverStateHandler({
Key? key,
required this.state,
@ -26,6 +27,7 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
this.enableEmptyState = false,
this.centerEmptyState = true,
this.hasConstraints = false,
this.placeholderCount = 3,
}) : super(
key: key,
delegate: SliverChildBuilderDelegate(
@ -65,7 +67,7 @@ class SliverStateHandler<T extends CoreProvier> extends SliverList {
? 1
: childCount
: state.appState == AppState.busy
? 3
? placeholderCount
: 1,
),
);

View File

@ -371,6 +371,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_markdown:
dependency: "direct main"
description:
name: flutter_markdown
sha256: a23c41ee57573e62fc2190a1f36a0480c4d90bde3a8a8d7126e5d5992fb53fb7
url: "https://pub.dev"
source: hosted
version: "0.7.3+1"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
@ -661,6 +669,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
markdown:
dependency: transitive
description:
name: markdown
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
url: "https://pub.dev"
source: hosted
version: "7.2.2"
matcher:
dependency: transitive
description:
@ -1066,6 +1082,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
typewritertext:
dependency: "direct main"
description:
name: typewritertext
sha256: acfe197417b49943694618140ee7080c8361e4011ab8b0e64898ba35b403f9c7
url: "https://pub.dev"
source: hosted
version: "3.0.8"
universal_html:
dependency: "direct main"
description:

View File

@ -86,6 +86,8 @@ dependencies:
just_audio: ^0.9.39
video_player: ^2.8.7
chewie: ^1.8.3
typewritertext: ^3.0.8
flutter_markdown: ^0.7.3+1
# onesignal_flutter: ^3.5.0
dev_dependencies: