Compare commits
4 Commits
86913a973b
...
b2961ca7d8
| Author | SHA1 | Date |
|---|---|---|
|
|
b2961ca7d8 | |
|
|
424226fe6f | |
|
|
c88324da81 | |
|
|
941b482e82 |
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
"name": "Launch Chrome against localhost",
|
||||
"url": "http://localhost:8080",
|
||||
"webRoot": "${workspaceFolder}"
|
||||
}
|
||||
]
|
||||
}
|
||||
190
lib/main.dart
190
lib/main.dart
|
|
@ -1,3 +1,5 @@
|
|||
// lib/main.dart
|
||||
|
||||
// ignore_for_file: deprecated_member_use
|
||||
|
||||
import 'dart:async';
|
||||
|
|
@ -7,6 +9,8 @@ import 'package:bot_toast/bot_toast.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';
|
||||
|
|
@ -32,56 +36,56 @@ 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';
|
||||
|
||||
// پکیج جدید برای Deep Linking
|
||||
import 'package:app_links/app_links.dart';
|
||||
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
import 'services/network/request.dart';
|
||||
|
||||
// متغیر استاتیک برای نگهداری لینک اولیه
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
Uri? initialURI;
|
||||
|
||||
@pragma('vm:entry-point')
|
||||
Future<void> _backgroundCallbackHomeWidget(Uri? uri) async {
|
||||
if (uri != null) {
|
||||
await HomeWidget.saveWidgetData("uri", uri.host);
|
||||
await HomeWidget.saveWidgetData("uri", uri.host);
|
||||
}
|
||||
}
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
try {
|
||||
if (!kIsWeb) {
|
||||
HomeWidget.registerBackgroundCallback(_backgroundCallbackHomeWidget);
|
||||
HomeWidget.registerInteractivityCallback(_backgroundCallbackHomeWidget);
|
||||
await NotificationService.initializeNotification();
|
||||
runZonedGuarded(
|
||||
() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
try {
|
||||
if (Platform.isAndroid) {
|
||||
await FlutterDownloader.initialize(
|
||||
debug: true,
|
||||
ignoreSsl: true
|
||||
);
|
||||
if (!kIsWeb) {
|
||||
HomeWidget.registerBackgroundCallback(_backgroundCallbackHomeWidget);
|
||||
HomeWidget.registerInteractivityCallback(_backgroundCallbackHomeWidget);
|
||||
await NotificationService.initializeNotification();
|
||||
try {
|
||||
if (Platform.isAndroid) {
|
||||
await FlutterDownloader.initialize(debug: true, ignoreSsl: true);
|
||||
}
|
||||
} catch (e) {
|
||||
e.printError();
|
||||
}
|
||||
}
|
||||
|
||||
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||
await FirebaseApi().initNotification();
|
||||
} catch (e) {
|
||||
e.printError();
|
||||
debugPrint(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
await Firebase.initializeApp(
|
||||
options: DefaultFirebaseOptions.currentPlatform);
|
||||
await FirebaseApi().initNotification();
|
||||
} catch (e) {
|
||||
debugPrint(e.toString());
|
||||
}
|
||||
|
||||
await SentryFlutter.init(
|
||||
(options) {
|
||||
options.dsn =
|
||||
'https://a4cfcaa7d67471240d295c25c968d91d@o4508585857384448.ingest.de.sentry.io/4508585886548048';
|
||||
options.tracesSampleRate = 1.0;
|
||||
options.profilesSampleRate = 1.0;
|
||||
await SentryFlutter.init(
|
||||
(options) {
|
||||
options.dsn = 'https://a4cfcaa7d67471240d295c25c968d91d@o4508585857384448.ingest.de.sentry.io/4508585886548048';
|
||||
options.tracesSampleRate = 1.0;
|
||||
options.profilesSampleRate = 1.0;
|
||||
},
|
||||
appRunner: () => runApp(const Didvan()),
|
||||
);
|
||||
},
|
||||
(error, stack) {
|
||||
Sentry.captureException(error, stackTrace: stack);
|
||||
},
|
||||
appRunner: () => runApp(const Didvan()),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -100,41 +104,57 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
|
|||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
// مقداردهی اولیه و گوش دادن به لینکها در اینجا انجام میشود
|
||||
_initDeepLinks();
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
_linkSubscription?.cancel(); // لغو کردن subscription
|
||||
_linkSubscription?.cancel();
|
||||
if (MediaService.currentPodcast != null) {
|
||||
MediaService.audioPlayer.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
/// منطق جدید برای مدیریت لینکها با app_links
|
||||
|
||||
Future<void> _initDeepLinks() async {
|
||||
_appLinks = AppLinks();
|
||||
|
||||
// لینک اولیه را فقط در متغیر ذخیره میکنیم
|
||||
initialURI = await _appLinks.getInitialLink();
|
||||
|
||||
// به لینکهای جدید زمانی که اپلیکیشن باز است گوش میدهیم
|
||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
|
||||
_navigateTo(uri);
|
||||
});
|
||||
}
|
||||
|
||||
/// تابع کمکی برای ناوبری
|
||||
|
||||
void _navigateTo(Uri uri) {
|
||||
if (mounted) {
|
||||
String path = uri.path;
|
||||
if (uri.fragment.isNotEmpty) {
|
||||
path = "/${uri.fragment}";
|
||||
final Map<String, String> 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 (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)},
|
||||
);
|
||||
}
|
||||
}
|
||||
navigatorKey.currentState?.pushNamed(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -143,11 +163,9 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
|
|||
if (!kIsWeb) {
|
||||
if (state == AppLifecycleState.resumed) {
|
||||
var r = await HomeWidget.getWidgetData("cRoute", defaultValue: '');
|
||||
if (r!.toString() != Routes.splash) {
|
||||
await HomeWidgetRepository.decideWhereToGo();
|
||||
|
||||
if (r.toString() != Routes.splash) {
|
||||
await HomeWidgetRepository.decideWhereToGo();
|
||||
NotificationMessage? data = HomeWidgetRepository.data;
|
||||
|
||||
if (data != null) {
|
||||
await HomeWidgetRepository.decideWhereToGoNotif();
|
||||
}
|
||||
|
|
@ -175,43 +193,43 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
|
|||
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"),
|
||||
)),
|
||||
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"),
|
||||
)),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
// lib/services/network/request.dart
|
||||
|
||||
// ignore_for_file: empty_catches
|
||||
|
||||
import 'dart:convert';
|
||||
|
|
@ -15,7 +17,7 @@ import 'package:mime/mime.dart';
|
|||
import 'package:permission_handler/permission_handler.dart';
|
||||
|
||||
class RequestService {
|
||||
static late String token;
|
||||
static String? token; // Made token nullable
|
||||
int? statusCode;
|
||||
|
||||
dynamic data(String s) {
|
||||
|
|
@ -48,12 +50,9 @@ class RequestService {
|
|||
}) {
|
||||
if (body != null) _requestBody = body;
|
||||
if (requestHeaders != null) _headers.addAll(requestHeaders);
|
||||
if (useAutherization) _headers.addAll({'Authorization': 'Bearer $token'});
|
||||
// if (kDebugMode) {
|
||||
// try {
|
||||
// print('Authorization : Bearer $token');
|
||||
// } catch (e) {}
|
||||
// }
|
||||
if (useAutherization && token != null) { // Check if token is not null
|
||||
_headers.addAll({'Authorization': 'Bearer $token'});
|
||||
}
|
||||
if (body != null) _requestBody = body;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ class HomeState extends CoreProvier {
|
|||
);
|
||||
await service.httpGet();
|
||||
if (service.isSuccess) {
|
||||
print("DEBUG : Homestate is succes");
|
||||
lastPage = service.result['lastPage'];
|
||||
results.addAll(
|
||||
List<OverviewData>.from(
|
||||
|
|
@ -94,12 +95,14 @@ class HomeState extends CoreProvier {
|
|||
appState = AppState.idle;
|
||||
return;
|
||||
}
|
||||
print("DEBUG : Homestate is NOT succes");
|
||||
appState = AppState.failed;
|
||||
}
|
||||
|
||||
Future<void> searchAll({required int page}) async {
|
||||
this.page = page;
|
||||
if (page == 1) {
|
||||
print("DEBUG : serach is busy");
|
||||
results.clear();
|
||||
appState = AppState.busy;
|
||||
}
|
||||
|
|
@ -115,6 +118,7 @@ class HomeState extends CoreProvier {
|
|||
);
|
||||
await service.httpGet();
|
||||
if (service.isSuccess) {
|
||||
print("DEBUG : HTTPget Home is succes");
|
||||
lastPage = service.result['lastPage'];
|
||||
unreadCount = service.result['unread'] ?? unreadCount;
|
||||
results.addAll(
|
||||
|
|
@ -128,6 +132,7 @@ class HomeState extends CoreProvier {
|
|||
appState = AppState.idle;
|
||||
return;
|
||||
}
|
||||
print("DEBUG : Homestate is faild");
|
||||
appState = AppState.failed;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,30 +33,44 @@ class MainPage extends StatefulWidget {
|
|||
class _MainPageState extends State<MainPage> {
|
||||
@override
|
||||
void initState() {
|
||||
context.read<MainPageState>().init();
|
||||
super.initState();
|
||||
print("DEBUG: _MainPageState initstate called");
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
print("DEBUG: addPostFrameCallback called");
|
||||
context.read<MainPageState>().init();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print("DEBUG: _MainPageState build called");
|
||||
return StateHandler<MainPageState>(
|
||||
onRetry: context.read<MainPageState>().init,
|
||||
onRetry: () => {
|
||||
print("DEBUG: _MainPageState onRetry called"),
|
||||
context.read<MainPageState>().init
|
||||
},
|
||||
state: context.watch<MainPageState>(),
|
||||
builder: (context, state) => ListView(
|
||||
builder: (context, state) {
|
||||
print("DEBUG: FutureBuilder waiting");
|
||||
print("DEBUG: FutureBuilder state.stories.isNotEmpty: ${state.stories.isNotEmpty}");
|
||||
print("DEBUG: FutureBuilder state.content: ${state.content!.lists}");
|
||||
print("DEBUG: FutureBuilder state.content != null: ${state.content != null}");
|
||||
print("DEBUG: FutureBuilder state.content!.lists.isNotEmpty: ${state.content!.lists.isNotEmpty}");
|
||||
return ListView(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
children: [
|
||||
if (state.stories.isNotEmpty) StorySection(stories: state.stories),
|
||||
const SizedBox(height: 12),
|
||||
const MainPageMainContent(),
|
||||
|
||||
Builder(builder: (context) {
|
||||
final List<Widget> pageContent = [];
|
||||
if (state.content != null && state.content!.lists.isNotEmpty) {
|
||||
final lists = state.content!.lists;
|
||||
|
||||
|
||||
for (int i = 0; i < lists.length; i++) {
|
||||
final currentList = lists[i];
|
||||
|
||||
|
||||
if (i == 4) {
|
||||
pageContent.add(
|
||||
Padding(
|
||||
|
|
@ -107,21 +121,23 @@ class _MainPageState extends State<MainPage> {
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
pageContent.add(_MainPageSection(
|
||||
list: currentList,
|
||||
isLast: i == lists.length - 1,
|
||||
));
|
||||
|
||||
|
||||
if (currentList.type == 'startup') {
|
||||
pageContent.add(_SwotSection(swotItems: state.swotItems));
|
||||
}
|
||||
}
|
||||
}
|
||||
print("DEBUG: FutureBuilder error");
|
||||
return Column(children: pageContent);
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -135,7 +151,7 @@ class _SwotSection extends StatelessWidget {
|
|||
if (swotItems.isEmpty) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(0.0),
|
||||
child: Column(
|
||||
|
|
@ -288,8 +304,7 @@ class _MainPageSection extends StatelessWidget {
|
|||
if (list.contents.isEmpty) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
// This condition handles the "Soha" module, which should not display the Opportunity/Threat module.
|
||||
|
||||
if (list.type == 'delphi') {
|
||||
return Column(
|
||||
children: [
|
||||
|
|
@ -298,8 +313,7 @@ class _MainPageSection extends StatelessWidget {
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
// For all other modules, display as before.
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
_buildSectionHeader(context, icon),
|
||||
|
|
@ -386,4 +400,4 @@ class _MainPageSection extends StatelessWidget {
|
|||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,12 +24,19 @@ class MainPageState extends CoreProvier {
|
|||
List<SwotItem> swotItems = [];
|
||||
|
||||
Future<void> _getMainPageContent() async {
|
||||
print("DEBUG: _getMainPageContent started");
|
||||
final service = RequestService(RequestHelper.mainPageContent);
|
||||
await service.httpGet();
|
||||
if (service.isSuccess) {
|
||||
print("DEBUG: _getMainPageContent success");
|
||||
content = MainPageContent.fromJson(service.result);
|
||||
print("DEBUG: _getMainPageContent service.result: ${service.result}");
|
||||
unread = service.result['unread'];
|
||||
print("DEBUG: __getMainPageContent unread: $unread, content: $content");
|
||||
notifyListeners();
|
||||
} else {
|
||||
print("DEBUG: _getMainPageContent failed state");
|
||||
notifyListeners();
|
||||
throw Exception('Failed to load main page content');
|
||||
}
|
||||
}
|
||||
|
|
@ -43,14 +50,14 @@ class MainPageState extends CoreProvier {
|
|||
try {
|
||||
swotItems = await SwotService.fetchSwotItems();
|
||||
} catch (e) {
|
||||
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _fetchStories() async {
|
||||
try {
|
||||
stories = await StoryService.getStories();
|
||||
print("Fetched ${stories.length} stories.");
|
||||
// print("Fetched ${stories.length} stories.");
|
||||
} catch (e) {
|
||||
stories = [];
|
||||
debugPrint("Could not fetch stories: $e");
|
||||
|
|
@ -58,6 +65,7 @@ class MainPageState extends CoreProvier {
|
|||
}
|
||||
|
||||
void init() {
|
||||
print("DEBUG: MainPageState init called");
|
||||
Future.delayed(Duration.zero, () async {
|
||||
appState = AppState.busy;
|
||||
try {
|
||||
|
|
@ -71,6 +79,7 @@ class MainPageState extends CoreProvier {
|
|||
appState = AppState.failed;
|
||||
}
|
||||
});
|
||||
_getMainPageContent();
|
||||
}
|
||||
|
||||
void markChangeHandler(String type, int id, bool value) {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
// lib/views/news/news_details/news_details_state.dart
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:math';
|
||||
|
||||
|
|
@ -8,6 +10,8 @@ import 'package:didvan/models/requests/news.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/services/storage/storage.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class NewsDetailsState extends CoreProvier {
|
||||
final List<NewsDetailsData?> news = [];
|
||||
|
|
@ -25,12 +29,24 @@ class NewsDetailsState extends CoreProvier {
|
|||
NewsDetailsData get currentNews => news[_currentIndex]!;
|
||||
|
||||
Future<void> getNewsDetails(int id, {bool? isForward}) async {
|
||||
if (isForward == null) {
|
||||
appState = AppState.busy;
|
||||
} else {
|
||||
isFetchingNewItem = true;
|
||||
notifyListeners();
|
||||
debugPrint('requset token ${RequestService.token}');
|
||||
// **FIX: Ensure the token is available before making a request.**
|
||||
if (RequestService.token == null) {
|
||||
final token = await StorageService.getValue(key: 'token');
|
||||
if (token != null) {
|
||||
RequestService.token = token;
|
||||
} else {
|
||||
// If no token, fail gracefully. You might want to navigate
|
||||
// to the login screen here in a real-world scenario.
|
||||
appState = AppState.failed;
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
isFetchingNewItem = true;
|
||||
notifyListeners();
|
||||
|
||||
final service = RequestService(RequestHelper.newsDetails(id, args));
|
||||
await service.httpGet();
|
||||
_handleTracking(sendRequest: isForward != null);
|
||||
|
|
@ -41,6 +57,7 @@ class NewsDetailsState extends CoreProvier {
|
|||
news.add(newsItem);
|
||||
initialIndex = 0;
|
||||
appState = AppState.idle;
|
||||
notifyListeners(); // Notify listeners after state change
|
||||
return;
|
||||
}
|
||||
NewsDetailsData? prevNews;
|
||||
|
|
@ -77,11 +94,12 @@ class NewsDetailsState extends CoreProvier {
|
|||
getRelatedContents();
|
||||
}
|
||||
appState = AppState.idle;
|
||||
notifyListeners(); // Notify listeners after state change
|
||||
return;
|
||||
}
|
||||
if (isForward == null) {
|
||||
appState = AppState.failed;
|
||||
}
|
||||
|
||||
appState = AppState.failed;
|
||||
notifyListeners(); // Notify listeners on failure
|
||||
}
|
||||
|
||||
bool exists(NewsDetailsData? newsItem) =>
|
||||
|
|
|
|||
|
|
@ -87,7 +87,9 @@ class _SplashState extends State<Splash> {
|
|||
Future<void> _initialize(ThemeProvider themeProvider,
|
||||
UserProvider userProvider, MediaProvider mediaProvider) async {
|
||||
try {
|
||||
print("checking if is in browser");
|
||||
if (kIsWeb) {
|
||||
print("detected browser");
|
||||
html.window.onBeforeUnload.listen((event) {
|
||||
StorageService.webStorage
|
||||
.removeWhere((key, value) => key == 'image-cache');
|
||||
|
|
@ -103,20 +105,22 @@ class _SplashState extends State<Splash> {
|
|||
await AppInitializer.setupServices(navigatorKey.currentContext!);
|
||||
|
||||
final String? token = await userProvider.setAndGetToken();
|
||||
print("detected token as $token");
|
||||
|
||||
if (token != null) {
|
||||
RequestService.token = token;
|
||||
if (!kIsWeb) {
|
||||
await mediaProvider.getDownloadsList();
|
||||
}
|
||||
|
||||
RequestService.token = token;
|
||||
|
||||
final result = await userProvider.getUserInfo();
|
||||
|
||||
if (!result) {
|
||||
print("no results were returned for user info");
|
||||
try {
|
||||
StorageService.delete(key: 'token');
|
||||
} catch (e) {
|
||||
print("error in case of no user info result: $e");
|
||||
// catch
|
||||
}
|
||||
|
||||
|
|
@ -127,28 +131,32 @@ class _SplashState extends State<Splash> {
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
print("got results for user info: $result");
|
||||
await ServerDataProvider.getData();
|
||||
}
|
||||
|
||||
// --- بخش اصلاح شده ---
|
||||
// ابتدا بررسی میکنیم که کاربر باید به کدام صفحه اصلی برود
|
||||
final String destinationRoute = token == null ? Routes.authenticaion : Routes.home;
|
||||
final dynamic routeArguments = token == null ? false : {'showDialogs': true};
|
||||
|
||||
// اگر لینک ورودی وجود داشت، آن را به عنوان آرگومان به صفحه Home میفرستیم
|
||||
if (destinationRoute == Routes.home && initialURI != null) {
|
||||
(routeArguments as Map)['deepLinkUri'] = initialURI;
|
||||
initialURI = null; // لینک را مصرف میکنیم تا دوباره استفاده نشود
|
||||
print("token route is $token, initalURI.path: ${initialURI?.path}, intitlPath: ${initialURI?.path}");
|
||||
String extractedPath = initialURI?.path.toString() == '/' ? Routes.home : initialURI?.path.toString() ?? Routes.home;
|
||||
final String destinationRoute = token == null ? Routes.authenticaion : extractedPath;
|
||||
dynamic routeArguments = token == null ? {'isResetPassword': false} : {'showDialogs': true};
|
||||
|
||||
|
||||
if (destinationRoute == Routes.home) {
|
||||
print("destination route was home and init uri is $initialURI");
|
||||
// (routeArguments as Map)['deepLinkUri'] = initialURI;
|
||||
initialURI = null;
|
||||
}
|
||||
|
||||
// در نهایت به مسیر تعیین شده میرویم
|
||||
if(destinationRoute == Routes.authenticaion){
|
||||
print("destination route is auth route");
|
||||
routeArguments = false;
|
||||
}
|
||||
|
||||
print("destination route: $destinationRoute, route args: $routeArguments");
|
||||
await navigatorKey.currentState!.pushReplacementNamed(
|
||||
destinationRoute,
|
||||
arguments: routeArguments,
|
||||
arguments: token == null ? false : null,
|
||||
);
|
||||
// --- پایان بخش اصلاح شده ---
|
||||
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_errorOccured = true;
|
||||
|
|
|
|||
9
makefile
9
makefile
|
|
@ -1,2 +1,9 @@
|
|||
update_js:
|
||||
cp ./lib/assets/js/main.js ./build/flutter_assets/lib/assets/js/main.js
|
||||
cp ./lib/assets/js/main.js ./build/flutter_assets/lib/assets/js/main.js
|
||||
|
||||
zip_web:
|
||||
powershell Compress-Archive -Path build\web\* -DestinationPath build.zip -Force
|
||||
|
||||
build_web:
|
||||
flutter build web
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue