You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

138 lines
4.8 KiB

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<IntroEvent, IntroState> {
/// ------------constructor------------
IntroBloc() : super(const IntroState()) {
initVideos();
listenController();
on<InitVideosEvent>(_initVideosEvent);
on<ChangeVideosEvent>(_changeVideosEvent);
}
@override
Future<void> close() {
podController1.dispose();
podController2.dispose();
podController3.dispose();
podController4.dispose();
podController5.dispose();
return super.close();
}
/// ------------UseCases------------
/// ------------Variables------------
final List<Widget> 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<void> 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<void> _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<void> initVideos() async {
await Future.wait([
podController1.initialise(),
podController2.initialise(),
podController3.initialise(),
podController4.initialise(),
podController5.initialise(),
]);
podController1.play();
add(InitVideosEvent());
}
FutureOr<void> _initVideosEvent(
InitVideosEvent event,
Emitter<IntroState> emit,
) async {
emit(state.copyWith(currentIntro: 0));
}
}