This commit is contained in:
OkaykOrhmn 2024-09-17 13:59:06 +03:30
parent dcb7e6b0da
commit 2f1472e0c7
10 changed files with 162 additions and 107 deletions

View File

@ -73,6 +73,8 @@ android {
buildTypes { buildTypes {
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.release
minifyEnabled false
shrinkResources false
} }
} }

View File

@ -3,6 +3,7 @@
import 'dart:async'; import 'dart:async';
import 'package:android_intent_plus/android_intent.dart'; import 'package:android_intent_plus/android_intent.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:didvan/config/theme_data.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/firebase_options.dart'; import 'package:didvan/firebase_options.dart';
@ -33,16 +34,20 @@ final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@pragma('vm:entry-point') @pragma('vm:entry-point')
Future _initPushNotification(RemoteMessage message) async { Future _initPushNotification(RemoteMessage message) async {
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); if (!kIsWeb) {
if (kDebugMode) { await NotificationService.initializeNotification();
print("background: ${NotificationData.fromJson(message.data).toJson()}");
} }
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
// if (kDebugMode) {
print("background: ${NotificationData.fromJson(message.data).toJson()}");
// }
try { try {
NotificationService.showFirebaseNotification(message); NotificationService.showFirebaseNotification(message);
NotificationService.startListeningNotificationEvents();
} catch (e) { } catch (e) {
if (kDebugMode) { // if (kDebugMode) {
print(e); print(e);
} // }
} }
} }
@ -98,6 +103,7 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
NotificationService.startListeningNotificationEvents(); NotificationService.startListeningNotificationEvents();
} }
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
NotificationService.startListeningNotificationEvents();
super.initState(); super.initState();
} }

View File

@ -1,5 +1,6 @@
import 'package:didvan/models/notification_message.dart'; import 'package:didvan/models/notification_message.dart';
import 'package:didvan/services/app_initalizer.dart'; import 'package:didvan/services/app_initalizer.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:home_widget/home_widget.dart'; import 'package:home_widget/home_widget.dart';
import 'package:persian_number_utility/persian_number_utility.dart'; import 'package:persian_number_utility/persian_number_utility.dart';
@ -226,7 +227,10 @@ class HomeWidgetRepository {
} }
if (route.isNotEmpty) { if (route.isNotEmpty) {
navigatorKey.currentState!.pushNamed(route, arguments: args); navigatorKey.currentState!.pushNamed(route, arguments: args);
print("Push: $route");
} }
print("Push: empty");
return; return;
} }
} }

View File

@ -13,13 +13,15 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher.dart';
enum LaunchMode { inAppWebView } enum LaunchMode { inAppWebView }
void openInWebView(String src, {dynamic mode}) { void openInWebView(String src, {dynamic mode}) async {
if (kIsWeb) { if (kIsWeb) {
launchUrlString(src); if (!await launchUrl(Uri.parse(src))) {
throw Exception('Could not launch $src');
}
return; return;
} }
navigatorKey.currentState!.pushNamed(Routes.web, arguments: src); navigatorKey.currentState!.pushNamed(Routes.web, arguments: src);

View File

@ -1,5 +1,10 @@
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:didvan/models/notification_data.dart'; import 'package:didvan/models/notification_data.dart';
import 'package:didvan/models/notification_message.dart';
import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/services/notification/notification_service.dart'; import 'package:didvan/services/notification/notification_service.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -28,7 +33,10 @@ class FirebaseApi {
sound: true, sound: true,
); );
FirebaseMessaging.instance.getInitialMessage(); FirebaseMessaging.instance
.getInitialMessage()
.asStream()
.listen((event) async {});
FirebaseMessaging.onMessageOpenedApp.listen((event) {}); FirebaseMessaging.onMessageOpenedApp.listen((event) {});
FirebaseMessaging.onMessage.listen((event) => handleMessage(event)); FirebaseMessaging.onMessage.listen((event) => handleMessage(event));
} }
@ -36,13 +44,13 @@ class FirebaseApi {
void handleMessage(RemoteMessage? message) async { void handleMessage(RemoteMessage? message) async {
if (message == null) return; if (message == null) return;
//do ever you want with message //do ever you want with message
if (kDebugMode) { // if (kDebugMode) {
print("forground: ${NotificationData.fromJson(message.data).toJson()}"); print("forground: ${NotificationData.fromJson(message.data).toJson()}");
} // }
try { try {
await NotificationService.showFirebaseNotification(message); await NotificationService.showFirebaseNotification(message);
} catch (e) { } catch (e) {
rethrow; e.printError();
} }
} }
} }

View File

@ -70,6 +70,7 @@ class NotificationService {
NotificationMessage data = NotificationMessage data =
NotificationMessage.fromJson(receivedAction.payload!); NotificationMessage.fromJson(receivedAction.payload!);
HomeWidgetRepository.data = data; HomeWidgetRepository.data = data;
print("data: ${HomeWidgetRepository.data}");
await HomeWidgetRepository.decideWhereToGoNotif(); await HomeWidgetRepository.decideWhereToGoNotif();
await StorageService.delete( await StorageService.delete(
key: 'notification${AppInitializer.createNotificationId(data)}'); key: 'notification${AppInitializer.createNotificationId(data)}');

View File

@ -12,6 +12,7 @@ import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/home/home.dart'; import 'package:didvan/views/home/home.dart';
import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class Ai extends StatefulWidget { class Ai extends StatefulWidget {
@ -53,70 +54,102 @@ class _AiState extends State<Ai> {
); );
} }
final bot = state.bot!; final bot = state.bot!;
return Stack( return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Column( Expanded(
children: [ child: Stack(
const SizedBox( children: [
height: 24, SingleChildScrollView(
), child: Padding(
Icon( padding: const EdgeInsets.only(bottom: 24),
DidvanIcons.ai_solid, child: Column(
size: MediaQuery.sizeOf(context).width / 5, children: [
color: Theme.of(context).colorScheme.title, const SizedBox(
), height: 24,
DidvanText( ),
'هوشان', Icon(
color: Theme.of(context).colorScheme.title, DidvanIcons.ai_solid,
), size: MediaQuery.sizeOf(context).width / 5,
const SizedBox( color: Theme.of(context).colorScheme.title,
height: 24, ),
), DidvanText(
InkWell( 'هوشان',
onTap: () => ActionSheetUtils(context) color: Theme.of(context).colorScheme.title,
.botsDialogSelect(context: context, state: state), ),
child: Row( const SizedBox(
mainAxisAlignment: MainAxisAlignment.center, height: 24,
children: [ ),
Icon( InkWell(
DidvanIcons.caret_down_solid, onTap: () => ActionSheetUtils(context)
color: Theme.of(context).colorScheme.title, .botsDialogSelect(
context: context, state: state),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
DidvanIcons.caret_down_solid,
color: Theme.of(context).colorScheme.title,
),
DidvanText(bot.name.toString(),
color: Theme.of(context).colorScheme.title),
],
),
),
const SizedBox(
height: 8,
),
Container(
width: MediaQuery.sizeOf(context).height / 5,
height: MediaQuery.sizeOf(context).height / 5,
decoration: BoxDecoration(
borderRadius: DesignConfig.highBorderRadius,
color: Theme.of(context).colorScheme.focused),
padding: const EdgeInsets.all(12),
child: CachedNetworkImage(
imageUrl: bot.image.toString(),
),
),
const SizedBox(
height: 24,
),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20.0),
child: Text(
"به هوشان, هوش مصنوعی دیدوان خوش آمدید. \nبرای شروع گفتگو پیام مورد نظر خود را در کادر زیر بنویسید.\n دریافت پاسخ از: ${bot.name}",
textAlign: TextAlign.center,
),
)
],
), ),
DidvanText(bot.name.toString(), ),
color: Theme.of(context).colorScheme.title),
],
), ),
), Positioned(
const SizedBox( top: 32,
height: 8, right: 0,
), child: InkWell(
Container( onTap: () => homeScaffKey.currentState!.openDrawer(),
width: MediaQuery.sizeOf(context).height / 5, child: Container(
height: MediaQuery.sizeOf(context).height / 5, width: 46,
decoration: BoxDecoration( height: 46,
borderRadius: DesignConfig.highBorderRadius, decoration: BoxDecoration(
color: Theme.of(context).colorScheme.focused), color: Theme.of(context).colorScheme.surface,
padding: const EdgeInsets.all(12), borderRadius: const BorderRadius.only(
child: CachedNetworkImage( topLeft: Radius.circular(12),
imageUrl: bot.image.toString(), bottomLeft: Radius.circular(12)),
), boxShadow: DesignConfig.defaultShadow),
), child: Icon(
const SizedBox( DidvanIcons.angle_left_light,
height: 24, color: Theme.of(context).colorScheme.title,
), ),
Padding( )),
padding: const EdgeInsets.symmetric(horizontal: 20.0), )
child: Text( ],
"به هوشان, هوش مصنوعی دیدوان خوش آمدید. \nبرای شروع گفتگو پیام مورد نظر خود را در کادر زیر بنویسید.\n دریافت پاسخ از: ${bot.name}", ),
textAlign: TextAlign.center,
),
)
],
), ),
Positioned( Padding(
bottom: 32, padding: const EdgeInsets.fromLTRB(20, 0, 20, 32),
left: 20,
right: 20,
child: InkWell( child: InkWell(
onTap: () => Navigator.of(context).pushNamed(Routes.aiChat, onTap: () => Navigator.of(context).pushNamed(Routes.aiChat,
arguments: AiChatArgs( arguments: AiChatArgs(
@ -161,26 +194,6 @@ class _AiState extends State<Ai> {
), ),
)), )),
), ),
Positioned(
top: 32,
right: 0,
child: InkWell(
onTap: () => homeScaffKey.currentState!.openDrawer(),
child: Container(
width: 46,
height: 46,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
bottomLeft: Radius.circular(12)),
boxShadow: DesignConfig.defaultShadow),
child: Icon(
DidvanIcons.angle_left_light,
color: Theme.of(context).colorScheme.title,
),
)),
)
], ],
); );
}, },

View File

@ -156,7 +156,8 @@ class _TypingState extends State<_Typing> {
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: InputBorder.none,
hintText: 'بنویسید یا پیام صوتی بگذارید...', hintText:
kIsWeb ? 'بنویسید...' : 'بنویسید یا پیام صوتی بگذارید...',
hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith( hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(
color: Theme.of(context).colorScheme.disabledText), color: Theme.of(context).colorScheme.disabledText),
), ),

View File

@ -9,15 +9,17 @@ class CategoriesPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: Column( child: SingleChildScrollView(
children: [ child: Column(
DidvanText( children: [
'دسته‌بندی‌ها', DidvanText(
style: Theme.of(context).textTheme.titleMedium, 'دسته‌بندی‌ها',
), style: Theme.of(context).textTheme.titleMedium,
const SizedBox(height: 20), ),
const MainCategories(), const SizedBox(height: 20),
], const MainCategories(),
],
),
), ),
); );
} }

View File

@ -36,6 +36,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../services/app_home_widget/home_widget_repository.dart'; import '../../services/app_home_widget/home_widget_repository.dart';
@ -320,9 +321,21 @@ class _HomeState extends State<Home>
? Padding( ? Padding(
padding: padding:
const EdgeInsets.all(12.0), const EdgeInsets.all(12.0),
child: EmptyState( child: Column(
asset: Assets.emptyResult, children: [
title: 'لیست خالی است', SvgPicture.asset(
Assets.emptyResult,
height: MediaQuery.sizeOf(
context)
.height /
10,
),
const DidvanText(
'لیست خالی است',
fontSize: 14,
fontWeight: FontWeight.bold,
)
],
), ),
) )
: state.loadingdeleteAll || : state.loadingdeleteAll ||
@ -450,6 +463,9 @@ class _HomeState extends State<Home>
body: WillPopScope( body: WillPopScope(
onWillPop: () async { onWillPop: () async {
if (context.read<HomeState>().tabController.index == 0) { if (context.read<HomeState>().tabController.index == 0) {
if (kIsWeb) {
return true;
}
ActionSheetUtils(context).openDialog( ActionSheetUtils(context).openDialog(
data: ActionSheetData( data: ActionSheetData(
content: const DidvanText( content: const DidvanText(