fixed ios videocast

This commit is contained in:
jebeli 2025-09-06 15:16:22 +03:30
parent fc8ac99ea3
commit 1708218a8f
33 changed files with 438 additions and 271 deletions

View File

@ -1,9 +1,10 @@
PODS:
- app_links (0.0.2):
- Flutter
- audio_session (0.0.1):
- Flutter
- awesome_notifications (0.8.1):
- device_info_plus (0.0.1):
- Flutter
- IosAwnCore (~> 0.8.0)
- DKImagePickerController/Core (4.3.9):
- DKImagePickerController/ImageDataManager
- DKImagePickerController/Resource
@ -38,97 +39,101 @@ PODS:
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
- Firebase/CoreOnly (10.29.0):
- FirebaseCore (= 10.29.0)
- Firebase/Messaging (10.29.0):
- Firebase/CoreOnly (11.10.0):
- FirebaseCore (~> 11.10.0)
- Firebase/Messaging (11.10.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 10.29.0)
- firebase_core (3.3.0):
- Firebase/CoreOnly (= 10.29.0)
- FirebaseMessaging (~> 11.10.0)
- firebase_core (3.13.0):
- Firebase/CoreOnly (= 11.10.0)
- Flutter
- firebase_messaging (15.0.4):
- Firebase/Messaging (= 10.29.0)
- firebase_messaging (15.2.5):
- Firebase/Messaging (= 11.10.0)
- firebase_core
- Flutter
- FirebaseCore (10.29.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.12)
- GoogleUtilities/Logger (~> 7.12)
- FirebaseCoreInternal (10.29.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseInstallations (10.29.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (10.29.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.3)
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Reachability (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseCore (11.10.0):
- FirebaseCoreInternal (~> 11.10.0)
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/Logger (~> 8.0)
- FirebaseCoreInternal (11.10.0):
- "GoogleUtilities/NSData+zlib (~> 8.0)"
- FirebaseInstallations (11.10.0):
- FirebaseCore (~> 11.10.0)
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
- PromisesObjC (~> 2.4)
- FirebaseMessaging (11.10.0):
- FirebaseCore (~> 11.10.0)
- FirebaseInstallations (~> 11.0)
- GoogleDataTransport (~> 10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/Reachability (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
- nanopb (~> 3.30910.0)
- Flutter (1.0.0)
- flutter_background_service_ios (0.0.3):
- Flutter
- flutter_downloader (0.0.1):
- Flutter
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
- OrderedSet (~> 6.0.3)
- flutter_inappwebview_ios/Core (0.0.1):
- Flutter
- OrderedSet (~> 6.0.3)
- flutter_local_notifications (0.0.1):
- Flutter
- flutter_secure_storage (6.0.0):
- Flutter
- flutter_sound (9.6.0):
- flutter_sound (9.28.0):
- Flutter
- flutter_sound_core (= 9.6.0)
- flutter_sound_core (9.6.0)
- flutter_vibrate (0.0.1):
- Flutter
- GoogleDataTransport (9.4.1):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30911.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/AppDelegateSwizzler (7.13.3):
- flutter_sound_core (= 9.28.0)
- flutter_sound_core (9.28.0)
- GoogleDataTransport (10.1.0):
- nanopb (~> 3.30910.0)
- PromisesObjC (~> 2.4)
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (7.13.3):
- GoogleUtilities/Environment (8.1.0):
- GoogleUtilities/Privacy
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.13.3):
- GoogleUtilities/Logger (8.1.0):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- GoogleUtilities/Network (7.13.3):
- GoogleUtilities/Network (8.1.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.13.3)":
- "GoogleUtilities/NSData+zlib (8.1.0)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (7.13.3)
- GoogleUtilities/Reachability (7.13.3):
- GoogleUtilities/Privacy (8.1.0)
- GoogleUtilities/Reachability (8.1.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (7.13.3):
- GoogleUtilities/UserDefaults (8.1.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- home_widget (0.0.1):
- Flutter
- image_cropper (0.0.4):
- Flutter
- TOCropViewController (~> 2.6.1)
- TOCropViewController (~> 2.7.4)
- image_picker_ios (0.0.1):
- Flutter
- IosAwnCore (0.8.0)
- just_audio (0.0.1):
- Flutter
- nanopb (2.30910.0):
- nanopb/decode (= 2.30910.0)
- nanopb/encode (= 2.30910.0)
- nanopb/decode (2.30910.0)
- nanopb/encode (2.30910.0)
- FlutterMacOS
- nanopb (3.30910.0):
- nanopb/decode (= 3.30910.0)
- nanopb/encode (= 3.30910.0)
- nanopb/decode (3.30910.0)
- nanopb/encode (3.30910.0)
- OrderedSet (6.0.3)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
@ -139,17 +144,23 @@ PODS:
- PromisesObjC (2.4.0)
- record_darwin (1.0.0):
- Flutter
- FlutterMacOS
- rive_common (0.0.1):
- Flutter
- SDWebImage (5.19.7):
- SDWebImage/Core (= 5.19.7)
- SDWebImage/Core (5.19.7)
- sqflite (0.0.3):
- SDWebImage (5.21.2):
- SDWebImage/Core (= 5.21.2)
- SDWebImage/Core (5.21.2)
- Sentry/HybridSDK (8.46.0)
- sentry_flutter (8.14.2):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.46.0)
- sms_autofill (0.0.1):
- Flutter
- sqflite_darwin (0.0.4):
- Flutter
- FlutterMacOS
- SwiftyGif (5.4.5)
- TOCropViewController (2.6.1)
- TOCropViewController (2.7.4)
- url_launcher_ios (0.0.1):
- Flutter
- video_player_avfoundation (0.0.1):
@ -159,34 +170,38 @@ PODS:
- Flutter
- webview_flutter_wkwebview (0.0.1):
- Flutter
- FlutterMacOS
DEPENDENCIES:
- app_links (from `.symlinks/plugins/app_links/ios`)
- audio_session (from `.symlinks/plugins/audio_session/ios`)
- awesome_notifications (from `.symlinks/plugins/awesome_notifications/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`)
- flutter_downloader (from `.symlinks/plugins/flutter_downloader/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
- flutter_vibrate (from `.symlinks/plugins/flutter_vibrate/ios`)
- home_widget (from `.symlinks/plugins/home_widget/ios`)
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- just_audio (from `.symlinks/plugins/just_audio/ios`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- record_darwin (from `.symlinks/plugins/record_darwin/ios`)
- rive_common (from `.symlinks/plugins/rive_common/ios`)
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- sms_autofill (from `.symlinks/plugins/sms_autofill/ios`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`)
SPEC REPOS:
trunk:
@ -200,18 +215,21 @@ SPEC REPOS:
- flutter_sound_core
- GoogleDataTransport
- GoogleUtilities
- IosAwnCore
- nanopb
- OrderedSet
- PromisesObjC
- SDWebImage
- Sentry
- SwiftyGif
- TOCropViewController
EXTERNAL SOURCES:
app_links:
:path: ".symlinks/plugins/app_links/ios"
audio_session:
:path: ".symlinks/plugins/audio_session/ios"
awesome_notifications:
:path: ".symlinks/plugins/awesome_notifications/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
firebase_core:
@ -224,14 +242,14 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_background_service_ios/ios"
flutter_downloader:
:path: ".symlinks/plugins/flutter_downloader/ios"
flutter_inappwebview_ios:
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios"
flutter_sound:
:path: ".symlinks/plugins/flutter_sound/ios"
flutter_vibrate:
:path: ".symlinks/plugins/flutter_vibrate/ios"
home_widget:
:path: ".symlinks/plugins/home_widget/ios"
image_cropper:
@ -239,7 +257,7 @@ EXTERNAL SOURCES:
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
just_audio:
:path: ".symlinks/plugins/just_audio/ios"
:path: ".symlinks/plugins/just_audio/darwin"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
@ -250,8 +268,12 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/record_darwin/ios"
rive_common:
:path: ".symlinks/plugins/rive_common/ios"
sqflite:
:path: ".symlinks/plugins/sqflite/darwin"
sentry_flutter:
:path: ".symlinks/plugins/sentry_flutter/ios"
sms_autofill:
:path: ".symlinks/plugins/sms_autofill/ios"
sqflite_darwin:
:path: ".symlinks/plugins/sqflite_darwin/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation:
@ -259,52 +281,56 @@ EXTERNAL SOURCES:
wakelock_plus:
:path: ".symlinks/plugins/wakelock_plus/ios"
webview_flutter_wkwebview:
:path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207
awesome_notifications: db394d2e061e4583ba0f738ddea611e3986cc3fb
app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
Firebase: cec914dab6fd7b1bd8ab56ea07ce4e03dd251c2d
firebase_core: 57aeb91680e5d5e6df6b888064be7c785f146efb
firebase_messaging: c862b3d2b973ecc769194dc8de09bd22c77ae757
FirebaseCore: 30e9c1cbe3d38f5f5e75f48bfcea87d7c358ec16
FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934
FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd
FirebaseMessaging: 7b5d8033e183ab59eb5b852a53201559e976d366
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2
firebase_core: 2d4534e7b489907dcede540c835b48981d890943
firebase_messaging: 75bc93a4df25faccad67f6662ae872ac9ae69b64
FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7
FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679
FirebaseInstallations: 9980995bdd06ec8081dfb6ab364162bdd64245c3
FirebaseMessaging: 2b9f56aa4ed286e1f0ce2ee1d413aabb8f9f5cb9
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_background_service_ios: e30e0d3ee69e4cee66272d0c78eacd48c2e94aac
flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_sound: dde9a913063b65a27ba8fdc2039036b99b136c79
flutter_sound_core: 0c6eb9d5268adc70ff159b3d65fd3d98a82d3a27
flutter_vibrate: 9f4c2ab57008965f78969472367c329dd77eb801
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
IosAwnCore: ed1b2b6d84962a758354dbacd9ce525c72ce28a9
just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa
nanopb: 438bc412db1928dac798aa6fd75726007be04262
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
flutter_background_service_ios: 00d31bdff7b4bfe06d32375df358abe0329cf87e
flutter_downloader: 78da0da1084e709cbfd3b723c7ea349c71681f09
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
flutter_sound: b9236a5875299aaa4cef1690afd2f01d52a3f890
flutter_sound_core: 427465f72d07ab8c3edbe8ffdde709ddacd3763c
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
image_cropper: c4326ea50132b1e1564499e5d32a84f01fb03537
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
record_darwin: df0a677188e5fed18472550298e675f19ddaffbe
rive_common: c537b4eed761e903a9403d93c347b69bd7a4762f
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
record_darwin: fb1f375f1d9603714f55b8708a903bbb91ffdb0a
rive_common: 436bbc8ffad130e54693666382cbdaade8dac9e0
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
sentry_flutter: 27892878729f42701297c628eb90e7c6529f3684
sms_autofill: b36b2147535657fea83d7f3898d7831de70bd8e4
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2
PODFILE CHECKSUM: 76346ded4b0438dd89826a25813fc91ef681eb1f
COCOAPODS: 1.15.2
COCOAPODS: 1.16.2

View File

@ -59,6 +59,7 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">

View File

@ -3,7 +3,7 @@ import Flutter
import Firebase
import FirebaseCore
@UIApplicationMain
@main
@objc class AppDelegate: FlutterAppDelegate, MessagingDelegate {
override func application(
_ application: UIApplication,

View File

@ -32,12 +32,14 @@ class AppInitializer {
final studioState = context.read<StudioDetailsState>();
MediaService.audioPlayer.playingStream.listen((event) {
if (event &&
(MediaService.audioPlayerTag?.contains('podcast') ?? false)) {
(MediaService.audioPlayerTag?.contains('podcast') ?? false) &&
MediaService.currentPodcast != null) {
studioState.handleTracking(
id: MediaService.currentPodcast!.id,
sendRequest: false,
);
} else if (MediaService.audioPlayerTag?.contains('podcast') ?? false) {
} else if ((MediaService.audioPlayerTag?.contains('podcast') ?? false) &&
MediaService.currentPodcast != null) {
studioState.handleTracking(id: MediaService.currentPodcast!.id);
}
});

View File

@ -10,6 +10,7 @@ import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/ai/ai_state.dart';
import 'package:didvan/views/ai/ai.dart';
import 'package:didvan/views/ai/history_ai_chat_state.dart';
import 'package:didvan/views/ai/widgets/hoshan_drawer.dart';
import 'package:didvan/views/home/categories/categories_page.dart';
@ -43,103 +44,6 @@ class _HomeState extends State<Home>
with SingleTickerProviderStateMixin, WidgetsBindingObserver {
late final TabController _tabController;
Future<void> _showDialog(BuildContext context) async {
WidgetsBinding.instance.addPostFrameCallback((_) {
ActionSheetUtils(context)
.openDialog(
data: ActionSheetData(
hasDismissButton: false,
hasConfirmButton: false,
withoutButtonMode: true,
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
InkWrapper(
onPressed: () => Navigator.of(context).pop(),
child: const Icon(DidvanIcons.close_solid, size: 24),
),
],
),
const SizedBox(height: 15),
SvgPicture.asset(Assets.horizontalLogoWithText, height: 80),
const SizedBox(height: 24),
DidvanText(
'به سوپر اپلیکیشن دیدوان خوش آمدید',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 24),
],
),
),
)
.then((value) => ActionSheetUtils(context).openDialog(
data: ActionSheetData(
// ignore: deprecated_member_use
backgroundColor: Theme.of(context).colorScheme.background,
isBackgroundDropBlur: true,
content: Stack(
children: [
Padding(
padding: const EdgeInsets.only(top: 24.0),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
DidvanText(
'شخصی سازی محتوا',
style:
Theme.of(context).textTheme.displaySmall,
color: Theme.of(context).colorScheme.text,
),
],
),
const SizedBox(
height: 12,
),
const DidvanText(
"کاربر گرامی\nلطفا جهت شخصی‌سازی و استفاده بهتر از برنامه، دسته‌بندی‌های مورد علاقه خود و زمان دریافت اعلانات را انتخاب نمایید.")
],
),
),
Positioned(
top: 0,
left: 0,
child: InkWrapper(
onPressed: () {
Future.delayed(
Duration.zero,
() => Navigator.of(context).pop(),
);
},
child: const Icon(
DidvanIcons.close_solid,
size: 24,
),
),
),
],
),
onConfirmed: () {
Future.delayed(
Duration.zero,
() =>
Navigator.of(navigatorKey.currentContext!).pushNamed(
Routes.favouritesStep,
arguments: {"toTimer": true},
),
);
},
confrimTitle: 'تایید',
),
));
});
}
@override
void initState() {
// Remove dialog showing logic to prevent welcome popups
@ -151,10 +55,11 @@ class _HomeState extends State<Home>
DesignConfig.updateSystemUiOverlayStyle();
_tabController = TabController(length: 4, vsync: this, initialIndex: 0);
state.tabController = _tabController;
_tabController.addListener(() {
state.currentPageIndex = _tabController.index;
if (_tabController.index == 3) { // Changed from 2 to 3 for Houshan tab
if (_tabController.index == 3) {
// Changed from 2 to 3 for Houshan tab
// با هر بار ورود به تب هوشان، لیست چتها ریست میشود
final historyState = context.read<HistoryAiChatState>();
historyState.chats.clear();
@ -183,20 +88,20 @@ class _HomeState extends State<Home>
}
PreferredSizeWidget getAppBar() {
// Show HoshanAppBar only for AI section (index 3)
if (context.watch<HomeState>().tabController.index == 3) {
return HoshanAppBar(
onBack: () {
final state = context.read<AiState>();
if (state.page == 1) {
state.goToAi();
}
},
);
}
// For all other tabs (home, categories, statistics), show LogoAppBar
return const LogoAppBar();
// Show HoshanAppBar only for AI section (index 3)
if (context.watch<HomeState>().tabController.index == 3) {
return HoshanAppBar(
onBack: () {
final state = context.read<AiState>();
if (state.page == 1) {
state.goToAi();
}
},
);
}
// For all other tabs (home, categories, statistics), show LogoAppBar
return const LogoAppBar();
}
@override
Widget build(BuildContext context) {
@ -228,7 +133,8 @@ class _HomeState extends State<Home>
confrimTitle: 'بله',
dismissTitle: 'خیر',
));
} else if (context.read<HomeState>().tabController.index == 3) { // Changed from 2 to 3
} else if (context.read<HomeState>().tabController.index == 3) {
// Changed from 2 to 3
switch (context.read<AiState>().page) {
case 1:
context.read<AiState>().goToAi();
@ -258,7 +164,7 @@ class _HomeState extends State<Home>
MainPage(),
CategoriesPage(),
NewStatistic(),
// AiSection(),
Ai(),
],
),
),

View File

@ -39,6 +39,7 @@ class _MainPagePodcastItemState extends State<MainPagePodcastItem> {
Widget build(BuildContext context) {
return GestureDetector(
onTap: () async {
debugPrint("Playing podcast from URL: ${widget.content.link}");
final state = context.read<StudioDetailsState>();
await state.getStudioDetails(
widget.content.id,

View File

@ -9,6 +9,7 @@ import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/audio/audio_player_widget.dart';
import 'package:didvan/views/widgets/didvan/app_bar.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:didvan/views/widgets/video/primary_controls.dart';
@ -66,13 +67,14 @@ class _StudioDetailsState extends State<StudioDetails> {
}
Future<void> _initializePlayer(StudioDetailsData studio) async {
if (widget.pageData['args']['type'] == 'video') {
if (studio.type == 'video') {
// Disposing old controllers before creating new ones.
_videoPlayerController?.dispose();
_chewieController?.dispose();
debugPrint("Playing video from URL: ${studio.link}");
_videoPlayerController = VideoPlayerController.network(studio.link);
try {
await _videoPlayerController!.initialize();
if (mounted) {
@ -92,7 +94,7 @@ class _StudioDetailsState extends State<StudioDetails> {
});
}
} catch (e) {
debugPrint("Error initializing video player: $e");
debugPrint("Error initializing video player: $e");
}
} else {
// Handle audio playback using MediaService
@ -149,7 +151,9 @@ class _StudioDetailsState extends State<StudioDetails> {
appBarData: AppBarData(
trailing: BookmarkButton(
itemId: state.studio.id,
type: state.args?.type == 'video' ? 'video' : 'podcast',
type: state.studio.type == 'video'
? 'video'
: 'podcast',
value: state.studio.marked,
onMarkChanged: (value) {
widget.pageData['onMarkChanged'](
@ -167,12 +171,12 @@ class _StudioDetailsState extends State<StudioDetails> {
height: d.size.height - d.padding.top - 56,
child: Column(
children: [
if (state.args?.type == 'video')
if (state.studio.type == 'video')
AspectRatio(
aspectRatio: 16 / 9,
child: (_chewieController != null &&
_chewieController!
.videoPlayerController.value.isInitialized)
_chewieController!.videoPlayerController
.value.isInitialized)
? Chewie(controller: _chewieController!)
: Center(
child: Image.asset(
@ -182,6 +186,8 @@ class _StudioDetailsState extends State<StudioDetails> {
),
),
),
if (state.studio.type == 'podcast')
AudioPlayerWidget(podcast: state.studio),
Expanded(
child: StudioDetailsWidget(
onMarkChanged: (id, value) => widget
@ -207,4 +213,4 @@ class _StudioDetailsState extends State<StudioDetails> {
_chewieController?.dispose();
super.dispose();
}
}
}

View File

@ -7,6 +7,7 @@ import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/podcasts/studio_details/widgets/studio_details_widget.dart';
import 'package:didvan/views/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/audio/audio_player_widget.dart';
import 'package:didvan/views/widgets/didvan/app_bar.dart';
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
import 'package:flutter/material.dart';
@ -42,17 +43,20 @@ class _StudioDetailsState extends State<StudioDetails> {
state: state,
onRetry: () => state.getStudioDetails(state.studio.id),
builder: (context, state) {
// ignore: undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory(
"video",
(int viewId) => html.IFrameElement()
..allowFullscreen = true
..src = Uri.dataFromString(
'<style>*{padding: 0 ; margin: 0; background: black;}</style>${state.studio.iframe!}',
mimeType: 'text/html',
).toString()
..style.border = 'none',
);
if (state.studio.type == 'video') {
debugPrint("Playing video from URL: ${state.studio.link}");
// ignore: undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory(
"video",
(int viewId) => html.IFrameElement()
..allowFullscreen = true
..src = Uri.dataFromString(
'<style>*{padding: 0 ; margin: 0; background: black;}</style>${state.studio.iframe!}',
mimeType: 'text/html',
).toString()
..style.border = 'none',
);
}
return WillPopScope(
onWillPop: () async {
if (MediaService.currentPodcast != null) {
@ -70,7 +74,8 @@ class _StudioDetailsState extends State<StudioDetails> {
appBarData: AppBarData(
trailing: BookmarkButton(
itemId: state.studio.id,
type: 'video',
type:
state.studio.type == 'video' ? 'video' : 'podcast',
value: state.studio.marked,
onMarkChanged: (value) {
widget.pageData['onMarkChanged'](
@ -89,13 +94,16 @@ class _StudioDetailsState extends State<StudioDetails> {
height: d.size.height - d.padding.top - 56,
child: Column(
children: [
AspectRatio(
aspectRatio: 16 / 9,
child: HtmlElementView(
viewType: 'video',
key: ValueKey(state.studio.id),
if (state.studio.type == 'video')
AspectRatio(
aspectRatio: 16 / 9,
child: HtmlElementView(
viewType: 'video',
key: ValueKey(state.studio.id),
),
),
),
if (state.studio.type == 'podcast')
AudioPlayerWidget(podcast: state.studio),
Expanded(
child: StudioDetailsWidget(
onMarkChanged: (id, value) => widget

View File

@ -35,12 +35,12 @@ class StudioDetailsWidget extends StatelessWidget {
child: Consumer<StudioDetailsState>(
builder: (context, state, child) {
bool isVideo = state.studio.iframe != null;
double topOffset = isVideo
? ds.width * 9 / 16
: 400; // برای ویدیو aspect ratio، برای پادکست ارتفاع AudioPlayerWidget
return Container(
height: max(
ds.height -
ds.width * 9 / 16 -
72 -
MediaQuery.of(context).padding.top,
ds.height - topOffset - 72 - MediaQuery.of(context).padding.top,
0),
color: Theme.of(context).colorScheme.surface,
child: Stack(

View File

@ -103,7 +103,7 @@ class _UserStoryViewerState extends State<UserStoryViewer>
_currentStoryIndex =
widget.userStories.stories.indexWhere((story) => !story.isViewed.value);
if (_currentStoryIndex == -1) {
_currentStoryIndex = 0;
}
@ -142,6 +142,7 @@ class _UserStoryViewerState extends State<UserStoryViewer>
_animationController.forward();
break;
case MediaType.video:
debugPrint("Playing story video from URL: ${story.url}");
_videoController =
VideoPlayerController.networkUrl(Uri.parse(story.url));
_videoController!.initialize().then((_) {
@ -167,6 +168,12 @@ class _UserStoryViewerState extends State<UserStoryViewer>
if (mounted) {
_nextStory();
}
}).timeout(const Duration(seconds: 10), onTimeout: () {
// ignore: avoid_print
print("Video initialization timed out. Skipping.");
if (mounted) {
_nextStory();
}
});
break;
}
@ -409,4 +416,4 @@ class _UserInfo extends StatelessWidget {
],
);
}
}
}

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/app_links_linux-1.0.3/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/device_info_plus-11.5.0/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/file_picker-8.3.7/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.3+2/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-6.0.0/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.2/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/gtk-2.1.0/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1+2/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/record_linux-0.7.2/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/sentry_flutter-8.14.2/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.1/

View File

@ -0,0 +1 @@
/Users/arytan/.pub-cache/hosted/pub.dev/wakelock_plus-1.3.1/

View File

@ -0,0 +1,35 @@
//
// Generated file. Do not edit.
//
// clang-format off
#include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <gtk/gtk_plugin.h>
#include <record_linux/record_linux_plugin.h>
#include <sentry_flutter/sentry_flutter_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) gtk_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin");
gtk_plugin_register_with_registrar(gtk_registrar);
g_autoptr(FlPluginRegistrar) record_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin");
record_linux_plugin_register_with_registrar(record_linux_registrar);
g_autoptr(FlPluginRegistrar) sentry_flutter_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "SentryFlutterPlugin");
sentry_flutter_plugin_register_with_registrar(sentry_flutter_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
}

View File

@ -0,0 +1,15 @@
//
// Generated file. Do not edit.
//
// clang-format off
#ifndef GENERATED_PLUGIN_REGISTRANT_
#define GENERATED_PLUGIN_REGISTRANT_
#include <flutter_linux/flutter_linux.h>
// Registers Flutter plugins.
void fl_register_plugins(FlPluginRegistry* registry);
#endif // GENERATED_PLUGIN_REGISTRANT_

View File

@ -0,0 +1,29 @@
#
# Generated file, do not edit.
#
list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
flutter_secure_storage_linux
gtk
record_linux
sentry_flutter
url_launcher_linux
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)

View File

@ -0,0 +1,52 @@
//
// Generated file. Do not edit.
//
import FlutterMacOS
import Foundation
import app_links
import audio_session
import device_info_plus
import file_picker
import file_selector_macos
import firebase_core
import firebase_messaging
import flutter_inappwebview_macos
import flutter_local_notifications
import flutter_secure_storage_macos
import just_audio
import package_info_plus
import path_provider_foundation
import record_darwin
import rive_common
import sentry_flutter
import sqflite_darwin
import url_launcher_macos
import video_player_avfoundation
import wakelock_plus
import webview_flutter_wkwebview
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RecordPlugin.register(with: registry.registrar(forPlugin: "RecordPlugin"))
RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin"))
SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin"))
}

View File

@ -0,0 +1,11 @@
// This is a generated file; do not edit or check into version control.
FLUTTER_ROOT=/Users/arytan/Desktop/Dev/Sdks/flutter
FLUTTER_APPLICATION_PATH=/Users/arytan/Desktop/Flutter Projects/didvan-app
COCOAPODS_PARALLEL_CODE_SIGN=true
FLUTTER_BUILD_DIR=build
FLUTTER_BUILD_NAME=4.0.1
FLUTTER_BUILD_NUMBER=6000
DART_OBFUSCATION=false
TRACK_WIDGET_CREATION=true
TREE_SHAKE_ICONS=false
PACKAGE_CONFIG=.dart_tool/package_config.json

View File

@ -0,0 +1,12 @@
#!/bin/sh
# This is a generated file; do not edit or check into version control.
export "FLUTTER_ROOT=/Users/arytan/Desktop/Dev/Sdks/flutter"
export "FLUTTER_APPLICATION_PATH=/Users/arytan/Desktop/Flutter Projects/didvan-app"
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
export "FLUTTER_BUILD_DIR=build"
export "FLUTTER_BUILD_NAME=4.0.1"
export "FLUTTER_BUILD_NUMBER=6000"
export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=true"
export "TREE_SHAKE_ICONS=false"
export "PACKAGE_CONFIG=.dart_tool/package_config.json"

42
macos/Podfile Normal file
View File

@ -0,0 +1,42 @@
platform :osx, '10.14'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_macos_podfile_setup
target 'Runner' do
use_frameworks!
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_macos_build_settings(target)
end
end

View File

@ -1670,34 +1670,34 @@ packages:
dependency: "direct main"
description:
name: webview_flutter
sha256: caf0f5a1012aa3c2d33c4215adc72dc1194bb59a2d3ed901f457965626805e66
sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba
url: "https://pub.dev"
source: hosted
version: "4.11.0"
version: "4.13.0"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
sha256: "5c3b6f992d123084903ec091b84f021c413a92a9af49038e4564a1b26c8452cf"
sha256: "9a25f6b4313978ba1c2cda03a242eea17848174912cfb4d2d8ee84a556f248e3"
url: "https://pub.dev"
source: hosted
version: "4.4.1"
version: "4.10.1"
webview_flutter_platform_interface:
dependency: transitive
description:
name: webview_flutter_platform_interface
sha256: "18b1640839cf6546784a524c72aded5b6e86b23e7167dc2311cc96f7658b64bd"
sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0"
url: "https://pub.dev"
source: hosted
version: "2.11.0"
version: "2.14.0"
webview_flutter_wkwebview:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: c9f9be526fa0d3347374ceaa05c4b3acb85f4f112abd62f7d74b7d301fa515ff
sha256: fb46db8216131a3e55bcf44040ca808423539bc6732e7ed34fb6d8044e3d512f
url: "https://pub.dev"
source: hosted
version: "3.20.0"
version: "3.23.0"
win32:
dependency: transitive
description:

View File

@ -61,7 +61,7 @@ dependencies:
# image_cropper: ^1.5.0
firebase_core: ^3.1.0
firebase_messaging: ^15.0.1
webview_flutter: ^4.8.0
webview_flutter: ^4.13.0
expandable_bottom_sheet: ^1.1.1+1
permission_handler: ^11.0.0
# better_player: