import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; import 'package:hadi_hoda_flutter/core/utils/local_storage.dart'; import 'package:hadi_hoda_flutter/core/utils/my_context.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_1_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_2_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_3_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_4_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_5_screen.dart'; import 'package:pod_player/pod_player.dart'; class IntroBloc extends Bloc { /// ------------constructor------------ IntroBloc() : super(const IntroState()) { initVideos(); listenController(); on(_initVideosEvent); on(_changeVideosEvent); } @override Future close() { podController1.dispose(); podController2.dispose(); podController3.dispose(); podController4.dispose(); podController5.dispose(); return super.close(); } /// ------------UseCases------------ /// ------------Variables------------ final List intros = const [ Intro1Screen(key: Key('0')), Intro2Screen(key: Key('1')), Intro3Screen(key: Key('2')), Intro4Screen(key: Key('3')), Intro5Screen(key: Key('4')), ]; /// ------------Controllers------------ final PodPlayerController podController1 = PodPlayerController( playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_1.mp4'), ); final PodPlayerController podController2 = PodPlayerController( playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_2.mp4'), ); final PodPlayerController podController3 = PodPlayerController( playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_3.mp4'), ); final PodPlayerController podController4 = PodPlayerController( playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_4.mp4'), ); final PodPlayerController podController5 = PodPlayerController( playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_5.mp4'), ); /// ------------Functions------------ Future goToHomePage() async { await LocalStorage.saveData(key: MyConstants.firstIntro, value: 'true'); if (MyContext.get.mounted) { MyContext.get.goNamed(Routes.homePage); } } void listenController() { // A helper function to check for video completion void _onVideoEnd(PodPlayerController controller, int controllerIndex) { final position = controller.videoPlayerValue?.position; final duration = controller.videoPlayerValue?.duration; if (position != null && duration != null && position >= duration) { // Only trigger the change if the completed video is the current one if (state.currentIntro == controllerIndex) { add(ChangeVideosEvent()); } } } podController1.addListener(() => _onVideoEnd(podController1, 0)); podController2.addListener(() => _onVideoEnd(podController2, 1)); podController3.addListener(() => _onVideoEnd(podController3, 2)); podController4.addListener(() => _onVideoEnd(podController4, 3)); podController5.addListener(() => _onVideoEnd(podController5, 4)); } /// ------------Api Calls------------ FutureOr _changeVideosEvent(ChangeVideosEvent event, Emitter emit) async { switch (state.currentIntro) { case 0: podController2.play(); emit(state.copyWith(currentIntro: 1)); break; case 1: podController3.play(); emit(state.copyWith(currentIntro: 2)); break; case 2: podController4.play(); emit(state.copyWith(currentIntro: 3)); break; case 3: podController5.play(); emit(state.copyWith(currentIntro: 4)); break; case 4: goToHomePage(); break; } } Future initVideos() async { await Future.wait([ podController1.initialise(), podController2.initialise(), podController3.initialise(), podController4.initialise(), podController5.initialise(), ]); podController1.play(); add(InitVideosEvent()); } FutureOr _initVideosEvent( InitVideosEvent event, Emitter emit, ) async { emit(state.copyWith(currentIntro: 0)); } }