diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index bf26010..7cf4c38 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -116,6 +116,9 @@
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
+
diff --git a/lib/main.dart b/lib/main.dart
index c61c2ad..dbefc9a 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,42 +1,39 @@
-// ignore_for_file: deprecated_member_use
-
import 'dart:async';
import 'dart:io';
+import 'package:app_links/app_links.dart';
import 'package:bot_toast/bot_toast.dart';
+import 'package:firebase_core/firebase_core.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_downloader/flutter_downloader.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:get/get.dart';
+import 'package:home_widget/home_widget.dart';
+import 'package:provider/provider.dart';
+import 'package:provider/single_child_widget.dart';
+import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/firebase_options.dart';
-import 'package:didvan/models/notification_message.dart';
import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/requests/radar.dart';
-import 'package:didvan/providers/media.dart';
-import 'package:didvan/providers/theme.dart';
-import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/route_generator.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
import 'package:didvan/services/media/media.dart';
+import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/notification/firebase_api.dart';
import 'package:didvan/services/notification/notification_service.dart';
import 'package:didvan/utils/my_custom_scroll_behavior.dart';
+import 'package:didvan/providers/media.dart';
+import 'package:didvan/providers/theme.dart';
+import 'package:didvan/providers/user.dart';
import 'package:didvan/views/ai/ai_chat_state.dart';
import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/bot_assistants_state.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';
-import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_localizations/flutter_localizations.dart';
-import 'package:get/get.dart';
-import 'package:home_widget/home_widget.dart';
-import 'package:provider/provider.dart';
-import 'package:flutter_downloader/flutter_downloader.dart';
-import 'package:sentry_flutter/sentry_flutter.dart';
-import 'package:app_links/app_links.dart';
-
-import 'services/network/request.dart';
final GlobalKey navigatorKey = GlobalKey();
Uri? initialURI;
@@ -52,29 +49,34 @@ void main() async {
runZonedGuarded(
() async {
WidgetsFlutterBinding.ensureInitialized();
+
try {
if (!kIsWeb) {
HomeWidget.registerBackgroundCallback(_backgroundCallbackHomeWidget);
- HomeWidget.registerInteractivityCallback(_backgroundCallbackHomeWidget);
+ HomeWidget.registerInteractivityCallback(
+ _backgroundCallbackHomeWidget);
await NotificationService.initializeNotification();
- try {
- if (Platform.isAndroid) {
+
+ if (Platform.isAndroid) {
+ try {
await FlutterDownloader.initialize(debug: true, ignoreSsl: true);
+ } catch (e) {
+ e.printError();
}
- } catch (e) {
- e.printError();
}
}
- await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
+ await Firebase.initializeApp(
+ options: DefaultFirebaseOptions.currentPlatform);
await FirebaseApi().initNotification();
} catch (e) {
- debugPrint(e.toString());
+ debugPrint("Initialization Error: $e");
}
await SentryFlutter.init(
(options) {
- options.dsn = 'https://a4cfcaa7d67471240d295c25c968d91d@o4508585857384448.ingest.de.sentry.io/4508585886548048';
+ options.dsn =
+ 'https://a4cfcaa7d67471240d295c25c968d91d@o4508585857384448.ingest.de.sentry.io/4508585886548048';
options.tracesSampleRate = 1.0;
options.profilesSampleRate = 1.0;
},
@@ -95,9 +97,24 @@ class Didvan extends StatefulWidget {
}
class _DidvanState extends State with WidgetsBindingObserver {
- late AppLinks _appLinks;
+ late final AppLinks _appLinks;
StreamSubscription? _linkSubscription;
+ final List _applicationProviders = [
+ ChangeNotifierProvider(create: (_) => PodcastsState()),
+ ChangeNotifierProvider(create: (_) => MediaProvider()),
+ ChangeNotifierProvider(create: (_) => UserProvider()),
+ ChangeNotifierProvider(create: (_) => ThemeProvider()),
+ ChangeNotifierProvider(
+ create: (_) => StudioDetailsState()),
+ ChangeNotifierProvider(
+ create: (_) => HistoryAiChatState()),
+ ChangeNotifierProvider(create: (_) => AiState()),
+ ChangeNotifierProvider(create: (_) => AiChatState()),
+ ChangeNotifierProvider(
+ create: (_) => BotAssistantsState()),
+ ];
+
@override
void initState() {
super.initState();
@@ -124,49 +141,47 @@ class _DidvanState extends State with WidgetsBindingObserver {
}
void _navigateTo(Uri uri) {
- if (mounted) {
- String path = uri.path;
- final Map params = uri.queryParameters;
+ if (!mounted) return;
- final String? token = params['token'];
+ final Map params = uri.queryParameters;
+ final String? token = params['token'];
- if (token != null) {
- //todo: this didnt work
- print("DEBUG: received token in url, token: $token, path: $path");
- RequestService.token = token;
+ if (token != null) {
+ debugPrint("DeepLink Token Received: $token");
+ RequestService.token = token;
+ }
+
+ final String path = uri.path;
+
+ if (path.startsWith('/news/')) {
+ final String idStr = path.split('/news/').last;
+ final int? id = int.tryParse(idStr);
+ if (id != null) {
+ navigatorKey.currentState?.pushNamed(
+ Routes.newsDetails,
+ arguments: {'id': id, 'args': const NewsRequestArgs(page: 0)},
+ );
}
-
- if (path.startsWith('/news/')) {
- final id = path.split('/news/').last;
- if (id.isNotEmpty) {
- navigatorKey.currentState?.pushNamed(
- Routes.newsDetails,
- arguments: {'id': int.parse(id), 'args': const NewsRequestArgs(page: 0)},
- );
- }
- } else if (path.startsWith('/radar/')) {
- final id = path.split('/radar/').last;
- if (id.isNotEmpty) {
- navigatorKey.currentState?.pushNamed(
- Routes.radarDetails,
- arguments: {'id': int.parse(id), 'args': const RadarRequestArgs(page: 0)},
- );
- }
+ } else if (path.startsWith('/radar/')) {
+ final String idStr = path.split('/radar/').last;
+ final int? id = int.tryParse(idStr);
+ if (id != null) {
+ navigatorKey.currentState?.pushNamed(
+ Routes.radarDetails,
+ arguments: {'id': id, 'args': const RadarRequestArgs(page: 0)},
+ );
}
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
- if (!kIsWeb) {
- if (state == AppLifecycleState.resumed) {
- var r = await HomeWidget.getWidgetData("cRoute", defaultValue: '');
- if (r.toString() != Routes.splash) {
- await HomeWidgetRepository.decideWhereToGo();
- NotificationMessage? data = HomeWidgetRepository.data;
- if (data != null) {
- await HomeWidgetRepository.decideWhereToGoNotif();
- }
+ if (!kIsWeb && state == AppLifecycleState.resumed) {
+ final route = await HomeWidget.getWidgetData("cRoute", defaultValue: '');
+ if (route.toString() != Routes.splash) {
+ await HomeWidgetRepository.decideWhereToGo();
+ if (HomeWidgetRepository.data != null) {
+ await HomeWidgetRepository.decideWhereToGoNotif();
}
}
}
@@ -175,60 +190,60 @@ class _DidvanState extends State with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
return MultiProvider(
- providers: [
- ChangeNotifierProvider(create: (context) => PodcastsState()),
- ChangeNotifierProvider(create: (context) => MediaProvider()),
- ChangeNotifierProvider(create: (context) => UserProvider()),
- ChangeNotifierProvider(create: (context) => ThemeProvider()),
- ChangeNotifierProvider(create: (context) => StudioDetailsState()),
- ChangeNotifierProvider(create: (context) => HistoryAiChatState()),
- ChangeNotifierProvider(create: (context) => AiState()),
- ChangeNotifierProvider(create: (context) => AiChatState()),
- ChangeNotifierProvider(create: (context) => BotAssistantsState()),
- ],
+ providers: _applicationProviders,
child: Consumer(
- builder: (context, themeProvider, child) => Container(
- color: Theme.of(context).colorScheme.surface,
- child: SafeArea(
- child: MaterialApp(
- scrollBehavior: MyCustomScrollBehavior(),
- navigatorKey: navigatorKey,
- debugShowCheckedModeBanner: false,
- title: 'Didvan',
- theme: LightThemeConfig.themeData.copyWith(
- bottomSheetTheme: const BottomSheetThemeData(
- surfaceTintColor: Colors.transparent,
- backgroundColor: Colors.transparent),
- textTheme: LightThemeConfig.themeData.textTheme.apply(
- fontFamily: themeProvider.fontFamily,
- )),
- darkTheme: DarkThemeConfig.themeData.copyWith(
- bottomSheetTheme: const BottomSheetThemeData(
- surfaceTintColor: Colors.transparent,
- backgroundColor: Colors.transparent),
- textTheme: DarkThemeConfig.themeData.textTheme.apply(
- fontFamily: themeProvider.fontFamily,
- )),
- color: LightThemeConfig.themeData.primaryColor,
- themeMode: themeProvider.themeMode,
- onGenerateRoute: (settings) =>
- RouteGenerator.generateRoute(settings),
- builder: BotToastInit(),
- navigatorObservers: [BotToastNavigatorObserver()],
- initialRoute: "/",
- localizationsDelegates: const [
- GlobalCupertinoLocalizations.delegate,
- GlobalMaterialLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- ],
- supportedLocales: const [
- Locale("fa", "IR"),
- ],
- locale: const Locale("fa", "IR"),
+ builder: (context, themeProvider, child) {
+ final lightTheme = LightThemeConfig.themeData.copyWith(
+ bottomSheetTheme: const BottomSheetThemeData(
+ surfaceTintColor: Colors.transparent,
+ backgroundColor: Colors.transparent,
),
- ),
- ),
+ textTheme: LightThemeConfig.themeData.textTheme.apply(
+ fontFamily: themeProvider.fontFamily,
+ ),
+ );
+
+ final darkTheme = DarkThemeConfig.themeData.copyWith(
+ bottomSheetTheme: const BottomSheetThemeData(
+ surfaceTintColor: Colors.transparent,
+ backgroundColor: Colors.transparent,
+ ),
+ textTheme: DarkThemeConfig.themeData.textTheme.apply(
+ fontFamily: themeProvider.fontFamily,
+ ),
+ );
+
+ return Container(
+ color: Theme.of(context).colorScheme.surface,
+ child: SafeArea(
+ child: MaterialApp(
+ scrollBehavior: MyCustomScrollBehavior(),
+ navigatorKey: navigatorKey,
+ debugShowCheckedModeBanner: false,
+ title: 'Didvan',
+ theme: lightTheme,
+ darkTheme: darkTheme,
+ color: lightTheme.primaryColor,
+ themeMode: themeProvider.themeMode,
+ onGenerateRoute: (settings) =>
+ RouteGenerator.generateRoute(settings),
+ builder: BotToastInit(),
+ navigatorObservers: [BotToastNavigatorObserver()],
+ initialRoute: "/",
+ localizationsDelegates: const [
+ GlobalCupertinoLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ ],
+ supportedLocales: const [
+ Locale("fa", "IR"),
+ ],
+ locale: const Locale("fa", "IR"),
+ ),
+ ),
+ );
+ },
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/models/home_page_content/content.dart b/lib/models/home_page_content/content.dart
index dc89c3d..172912a 100644
--- a/lib/models/home_page_content/content.dart
+++ b/lib/models/home_page_content/content.dart
@@ -8,6 +8,7 @@ class MainPageContentType {
final List subtitles;
final int? duration;
final String? description;
+ final String? riskScore;
MainPageContentType({
required this.id,
@@ -19,6 +20,7 @@ class MainPageContentType {
required this.subtitles,
this.duration,
this.description,
+ this.riskScore,
});
factory MainPageContentType.fromJson(Map json) =>
@@ -32,5 +34,6 @@ class MainPageContentType {
subtitles: List.from(json['subtitles']),
duration: json['duration'],
description: json['description'],
+ riskScore: json['score'],
);
}
diff --git a/lib/providers/user.dart b/lib/providers/user.dart
index 41f911f..1618f11 100644
--- a/lib/providers/user.dart
+++ b/lib/providers/user.dart
@@ -34,9 +34,6 @@ class UserProvider extends CoreProvier {
int get unreadMessageCount => _unreadMessageCount;
- // static final List _radarMarkQueue = [];
- // static final List _newsMarkQueue = [];
- // static final List _studioMarkQueue = [];
static final List _statisticMarkQueue = [];
static final List