v2.2.2 build 20

This commit is contained in:
MohammadTaha Basiri 2022-06-20 16:08:34 +04:30
parent fc2bf59620
commit 053f8d233b
17 changed files with 101 additions and 71 deletions

View File

@ -4,27 +4,12 @@ import 'package:didvan/providers/media.dart';
import 'package:didvan/providers/theme.dart'; import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart'; import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/route_generator.dart'; import 'package:didvan/routes/route_generator.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart'; import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
void main() async { void main() async {
if (!kIsWeb) {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
final initMsg = await FirebaseMessaging.instance.getInitialMessage();
if (initMsg != null) {
AppInitializer.clickAction = initMsg.data['click_action'].replaceAll(
'navigate-',
'',
);
}
}
runApp(const Didvan()); runApp(const Didvan());
} }

View File

@ -1,21 +1,38 @@
import 'package:didvan/models/settings_data.dart'; import 'package:didvan/models/settings_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/services/storage/storage.dart'; import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.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: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';
class AppInitializer { class AppInitializer {
static String? fcmToken; static String? fcmToken;
static String? clickAction; static String? clickAction;
static Future<void> setupServices() async { static Future<void> setupServices(BuildContext context) async {
if (!kIsWeb) { if (!kIsWeb) {
StorageService.appDocsDir = StorageService.appDocsDir =
(await getApplicationDocumentsDirectory()).path; (await getApplicationDocumentsDirectory()).path;
StorageService.appTempsDir = (await getTemporaryDirectory()).path; StorageService.appTempsDir = (await getTemporaryDirectory()).path;
} }
final studioState = context.read<StudioDetailsState>();
MediaService.audioPlayer.isPlaying.listen((event) {
if (event &&
(MediaService.audioPlayerTag?.contains('podcast') ?? false)) {
studioState.handleTracking(
id: MediaService.currentPodcast!.id,
sendRequest: false,
);
} else if (MediaService.audioPlayerTag?.contains('podcast') ?? false) {
studioState.handleTracking(id: MediaService.currentPodcast!.id);
}
});
} }
static Future<SettingsData> initilizeSettings() async { static Future<SettingsData> initilizeSettings() async {
@ -82,6 +99,13 @@ class AppInitializer {
} catch (e) { } catch (e) {
Firebase.app(); Firebase.app();
} }
final initMsg = await FirebaseMessaging.instance.getInitialMessage();
if (initMsg != null) {
clickAction = initMsg.data['click_action'].replaceAll(
'navigate-',
'',
);
}
final FirebaseMessaging fcm = FirebaseMessaging.instance; final FirebaseMessaging fcm = FirebaseMessaging.instance;
fcmToken = await fcm.getToken( fcmToken = await fcm.getToken(
vapidKey: kIsWeb vapidKey: kIsWeb

View File

@ -97,7 +97,7 @@ class RequestHelper {
MapEntry('search', args.search), MapEntry('search', args.search),
]); ]);
static String sudioSlider(String type) => static String studioSlider(String type) =>
_baseStudioUrl + _baseStudioUrl +
'/slider' + '/slider' +
_urlConcatGenerator([MapEntry('type', type)]); _urlConcatGenerator([MapEntry('type', type)]);

View File

@ -1,15 +1,10 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/views/home/home_state.dart'; import 'package:didvan/views/home/home_state.dart';
import 'package:didvan/views/home/news/news.dart'; import 'package:didvan/views/home/news/news.dart';
import 'package:didvan/views/home/radar/radar.dart'; import 'package:didvan/views/home/radar/radar.dart';
import 'package:didvan/views/home/settings/settings.dart'; import 'package:didvan/views/home/settings/settings.dart';
import 'package:didvan/views/home/statistic/statistic.dart'; import 'package:didvan/views/home/statistic/statistic.dart';
import 'package:didvan/views/home/studio/studio.dart'; import 'package:didvan/views/home/studio/studio.dart';
import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart';
import 'package:didvan/views/widgets/didvan/bnb.dart'; import 'package:didvan/views/widgets/didvan/bnb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -31,25 +26,6 @@ class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
_tabController.addListener(() { _tabController.addListener(() {
context.read<HomeState>().currentPageIndex = _tabController.index; context.read<HomeState>().currentPageIndex = _tabController.index;
}); });
// if (AppInitializer.clickAction != null) {
// final clickAction = AppInitializer.clickAction!;
// String routeName = '';
// if (clickAction.contains('podcast')) {
// context.read<StudioDetailsState>().getStudioDetails();
// return;
// }
// Navigator.of(context).pushNamed(
// clickAction.split('-').first,
// arguments: {
// 'id': clickAction.split('-')[1],
// 'args': clickAction.contains('radar')
// ? const RadarRequestArgs(page: 0)
// : clickAction.contains('news')
// ? const NewsRequestArgs(page: 0)
// : const StudioRequestArgs(page: 0),
// },
// );
// }
super.initState(); super.initState();
} }

View File

@ -104,6 +104,7 @@ class NewsDetailsState extends CoreProvier {
); );
service.put(); service.put();
_trackingTimerCounter = 0; _trackingTimerCounter = 0;
_trackingTimer.cancel();
} }
Future<void> getRelatedContents() async { Future<void> getRelatedContents() async {

View File

@ -137,6 +137,7 @@ class RadarDetailsState extends CoreProvier {
); );
service.put(); service.put();
_trackingTimerCounter = 0; _trackingTimerCounter = 0;
_trackingTimer.cancel();
} }
@override @override

View File

@ -63,6 +63,7 @@ class _StudioDetailsState extends State<StudioDetails> {
if (MediaService.currentPodcast != null) { if (MediaService.currentPodcast != null) {
state.studio = MediaService.currentPodcast!; state.studio = MediaService.currentPodcast!;
} }
state.handleTracking(id: state.studio.id);
return true; return true;
}, },
child: SafeArea( child: SafeArea(

View File

@ -57,6 +57,7 @@ class _StudioDetailsState extends State<StudioDetails> {
if (MediaService.currentPodcast != null) { if (MediaService.currentPodcast != null) {
state.studio = MediaService.currentPodcast!; state.studio = MediaService.currentPodcast!;
} }
state.handleTracking(id: state.studio.id);
return true; return true;
}, },
child: SafeArea( child: SafeArea(

View File

@ -19,6 +19,8 @@ class StudioDetailsState extends CoreProvier {
final List<int> relatedQueue = []; final List<int> relatedQueue = [];
bool _positionListenerActivated = false; bool _positionListenerActivated = false;
AppState alongSideState = AppState.idle; AppState alongSideState = AppState.idle;
int _trackingTimerCounter = 0;
late Timer _trackingTimer;
int _selectedDetailsIndex = 0; int _selectedDetailsIndex = 0;
Timer? timer; Timer? timer;
@ -84,6 +86,9 @@ class StudioDetailsState extends CoreProvier {
} }
stopOnPodcastEnds = false; stopOnPodcastEnds = false;
if (service.isSuccess) { if (service.isSuccess) {
if (args?.type == 'video') {
handleTracking(id: id, sendRequest: false);
}
final result = service.result; final result = service.result;
studio = StudioDetailsData.fromJson(result['studio']); studio = StudioDetailsData.fromJson(result['studio']);
if (result['nextStudio'].isNotEmpty && this.args.page != 0) { if (result['nextStudio'].isNotEmpty && this.args.page != 0) {
@ -167,4 +172,32 @@ class StudioDetailsState extends CoreProvier {
studio.comments = count; studio.comments = count;
notifyListeners(); notifyListeners();
} }
Future<void> handleTracking({
required int id,
bool sendRequest = true,
}) async {
if (!sendRequest) {
_trackingTimerCounter = 0;
_trackingTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
_trackingTimerCounter++;
});
return;
}
final service = RequestService(
RequestHelper.tracking(id, 'studio'),
body: {
'sec': _trackingTimerCounter,
},
);
service.put();
_trackingTimerCounter = 0;
_trackingTimer.cancel();
}
@override
void dispose() {
_trackingTimer.cancel();
super.dispose();
}
} }

View File

@ -64,7 +64,7 @@ class StudioState extends CoreProvier {
Future<void> _getSliders() async { Future<void> _getSliders() async {
final service = RequestService( final service = RequestService(
RequestHelper.sudioSlider(type), RequestHelper.studioSlider(type),
); );
await service.httpGet(); await service.httpGet();
if (service.isSuccess) { if (service.isSuccess) {

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'package:assets_audio_player/assets_audio_player.dart';
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
@ -125,12 +126,20 @@ class AudioPlayerWidget extends StatelessWidget {
), ),
Expanded( Expanded(
child: Center( child: Center(
child: StreamBuilder<bool>( child: StreamBuilder<PlayingAudio?>(
stream: MediaService.audioPlayer.isPlaying, stream: MediaService.audioPlayer.onReadyToPlay,
builder: (context, snapshot) { builder: (context, snapshot) {
return _PlayPouseAnimatedIcon( if (snapshot.data == null) {
audioSource: podcast.link, return const CircularProgressIndicator();
id: podcast.id, }
return StreamBuilder<bool>(
stream: MediaService.audioPlayer.isPlaying,
builder: (context, snapshot) {
return _PlayPouseAnimatedIcon(
audioSource: podcast.link,
id: podcast.id,
);
},
); );
}, },
), ),

View File

@ -166,7 +166,7 @@ class MultitypeOverview extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: const [ children: const [
ShimmerPlaceholder(height: 18, width: 200), ShimmerPlaceholder(height: 18, width: 150),
SizedBox(height: 8), SizedBox(height: 8),
ShimmerPlaceholder(height: 18, width: 100), ShimmerPlaceholder(height: 18, width: 100),
Spacer(), Spacer(),

View File

@ -105,7 +105,7 @@ class _SplashState extends State<Splash> {
_isGettingThemeData = false; _isGettingThemeData = false;
}), }),
); );
await AppInitializer.setupServices(); await AppInitializer.setupServices(context);
final userProvider = context.read<UserProvider>(); final userProvider = context.read<UserProvider>();
final String? token = await userProvider.setAndGetToken(); final String? token = await userProvider.setAndGetToken();
if (token != null) { if (token != null) {

View File

@ -70,9 +70,12 @@ class DidvanButton extends StatelessWidget {
Widget? _childBuilder(Color color, context) { Widget? _childBuilder(Color color, context) {
if (title != null) { if (title != null) {
return DidvanText( return FittedBox(
title!, fit: BoxFit.scaleDown,
color: enabled ? color : Theme.of(context).colorScheme.disabledText, child: DidvanText(
title!,
color: enabled ? color : Theme.of(context).colorScheme.disabledText,
),
); );
} }
return null; return null;

View File

@ -160,11 +160,7 @@ class _DidvanPageViewState extends State<DidvanPageView> {
i < item.relatedContents.length; i < item.relatedContents.length;
i++) i++)
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(bottom: 8),
bottom: 8,
left: 16,
right: 16,
),
child: MultitypeOverview( child: MultitypeOverview(
item: item.relatedContents[i], item: item.relatedContents[i],
onMarkChanged: (id, value) {}, onMarkChanged: (id, value) {},

View File

@ -168,7 +168,7 @@ packages:
name: ffi name: ffi
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.1"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -182,42 +182,42 @@ packages:
name: firebase_core name: firebase_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.17.1" version: "1.18.0"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_platform_interface name: firebase_core_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.4.0" version: "4.4.1"
firebase_core_web: firebase_core_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_web name: firebase_core_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.4" version: "1.6.5"
firebase_messaging: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_messaging name: firebase_messaging
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "11.4.1" version: "11.4.2"
firebase_messaging_platform_interface: firebase_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_platform_interface name: firebase_messaging_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.5.1" version: "3.5.2"
firebase_messaging_web: firebase_messaging_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_web name: firebase_messaging_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.4.1" version: "2.4.2"
fl_chart: fl_chart:
dependency: "direct main" dependency: "direct main"
description: description:
@ -250,7 +250,7 @@ packages:
name: flutter_html name: flutter_html
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0-alpha.3" version: "3.0.0-alpha.5"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -405,7 +405,7 @@ packages:
name: image_picker_android name: image_picker_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.5" version: "0.8.5+1"
image_picker_for_web: image_picker_for_web:
dependency: transitive dependency: transitive
description: description:
@ -524,14 +524,14 @@ packages:
name: path_provider_android name: path_provider_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.14" version: "2.0.15"
path_provider_ios: path_provider_ios:
dependency: transitive dependency: transitive
description: description:
name: path_provider_ios name: path_provider_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9" version: "2.0.10"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
@ -830,14 +830,14 @@ packages:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.1.0"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.11" version: "2.0.12"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:

View File

@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 2.2.1+19 version: 2.2.2+20
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"