home_page.dart 8.63 KB
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:wow_english/common/core/user_util.dart';
import 'package:wow_english/common/extension/string_extension.dart';
import 'package:wow_english/models/course_entity.dart';
import 'package:wow_english/pages/home/widgets/home_bouns_item.dart';
import 'package:wow_english/pages/home/widgets/home_tab_header_widget.dart';
import 'package:wow_english/pages/home/widgets/home_video_item.dart';
import 'package:wow_english/route/route.dart';
import 'package:wow_english/utils/toast_util.dart';

import 'bloc/home_bloc.dart';
import 'courese_module_model.dart';

class HomePage extends StatelessWidget {
  const HomePage({super.key, this.moduleId});

  /// 模块id
  final int? moduleId;

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => HomeBloc(moduleId)..add(RequestDataEvent()),
      child: _HomePageView(context),
    );
  }
}

class _HomePageView extends StatelessWidget {

  const _HomePageView(this.context);

  final BuildContext context;

  void _headerActionEvent(HeaderActionType type) {
    if (type == HeaderActionType.video) {
      pushNamed(AppRouteName.reAfter);
    } else if (type == HeaderActionType.phase) {
      pushNamed(AppRouteName.lesson);
    } else if (type == HeaderActionType.listen) {
      pushNamed(AppRouteName.listen);
    } else if (type == HeaderActionType.shop) {
      pushNamed(AppRouteName.shop);
    } else if (type == HeaderActionType.user) {
      pushNamed(AppRouteName.user);
    } else if (type == HeaderActionType.home) {
      Navigator.pop(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    final bloc = BlocProvider.of<HomeBloc>(context);
    return BlocListener<HomeBloc, HomeState>(
      listener: (context, state) {
        if (state is RequestVideoLessonState) {
          final videoUrl = bloc.processEntity?.videos?.videoUrl??'';
          var title = '';
          if (state.type == 1) {
            title = 'song';
          }

          if (state.type == 2) {
            title = 'video';
          }

          if (state.type == 5) {
            title = 'bonus';
          }

          if (videoUrl.isEmpty || !videoUrl.contains('http')) {
            return;
          }
          pushNamed(AppRouteName.lookVideo,arguments: {'videoUrl':videoUrl,'title':title,'courseLessonId':state.courseLessonId}).then((value) {
            if (value != null) {
              Map<String,String> dataMap = value as Map<String,String>;
              bloc.add(RequestExitClassEvent(
                dataMap['courseLessonId']!,
                '0',
                dataMap['currentTime']!,
              ));
            }
          });
          return;
        }

        if (state is RequestEnterClassState) {
          if (state.courseType != 3 && state.courseType != 4) {///视频类型
            ///获取视频课程内容
            bloc.add(RequestVideoLessonEvent(state.courseLessonId,state.courseType));
            return;
          }

          if (state.courseType == 4) {//绘本
            pushNamed(AppRouteName.reading, arguments: {'courseLessonId':state.courseLessonId}).then((value) {
              if (value != null) {
                Map<String,String> dataMap = value as Map<String,String>;
                bloc.add(RequestExitClassEvent(
                    dataMap['courseLessonId']!,
                    dataMap['currentStep']!,
                    '0'
                ));
              }
            });
            return;
          }

          if (state.courseType == 3) {//练习
            pushNamed(AppRouteName.topicPic,arguments: {'courseLessonId':state.courseLessonId}).then((value) {
              if (value != null) {
                Map<String,String> dataMap = value as Map<String,String>;
                bloc.add(RequestExitClassEvent(
                    dataMap['courseLessonId']!,
                    dataMap['currentStep']!,
                    '0'
                ));
              }
            });
            return;
          }
        }
      },
      child: _homeView(),
    );
  }

  Widget _homeView() => BlocBuilder<HomeBloc, HomeState>(
      builder: (context, state) {
        final bloc = BlocProvider.of<HomeBloc>(context);
        return Scaffold(
          body: Container(
            color: Colors.white,
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  HomeTabHeaderWidget(
                    entity: bloc.modelData,
                    actionTap: (HeaderActionType type) {
                      _headerActionEvent(type);
                    },
                  ),
                  Expanded(
                      child: ListView.builder(
                          itemCount: bloc.modelData?.totalCourseLesson??0,
                          scrollDirection: Axis.horizontal,
                          itemBuilder: (BuildContext context, int index) {
                            CourseCourseLessons? data = bloc.modelData?.courseLessons?[index];
                            if (data?.courseType == 5) {
                              //彩蛋
                              return GestureDetector(
                                onTap: () {
                                  if (!UserUtil.isLogined()) {
                                    pushNamed(AppRouteName.login);
                                    return;
                                  }
                                  if (data!.lock!) {
                                    showToast('当前课程暂未解锁');
                                    return;
                                  }
                                  ///进入课堂
                                  bloc.add(RequestEnterClassEvent(data.id!,data.courseType!));
                                },
                                child: HomeBoundsItem(
                                  imageUrl: data?.coverUrl,
                                ),
                              );
                            } else {
                              return GestureDetector(
                                onTap: () {
                                  if (!UserUtil.isLogined()) {
                                    pushNamed(AppRouteName.login);
                                    return;
                                  }
                                  if (data!.lock!) {
                                    showToast('当前课程暂未解锁');
                                    return;
                                  }
                                  ///进入课堂
                                  bloc.add(RequestEnterClassEvent(data.id!,data.courseType!));
                                },
                                child: HomeVideoItem(
                                  entity: bloc.modelData,
                                  lessons: data,
                                ),
                              );
                            }
                          })),
                  SafeArea(
                    child: Padding(
                      padding: EdgeInsets.symmetric(horizontal: 13.w),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          SizedBox(
                            height: 47.h,
                            width: 80.w,
                          ),
                          Container(
                            decoration: BoxDecoration(
                              color: CourseModuleModel(bloc.modelData?.courseModuleCode??'Phase-1').color,
                              borderRadius: BorderRadius.circular(14.5.r),
                            ),
                            padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 24.w),
                            child: Text(
                              '${(bloc.modelData?.nowCourseLesson??0)}/${bloc.modelData?.totalCourseLesson??0}',
                              style: TextStyle(color: Colors.white, fontSize: 12.sp),
                            ),
                          ),
                          Image.asset(
                            CourseModuleModel(bloc.modelData?.courseModuleCode??'Phase-1').courseModuleLogo.assetPng,
                            height: 47.h,
                            width: 80.w,
                            // color: Colors.red,
                          ),
                        ],
                      ),
                    ),
                  )
                ],
              ),
            ),
          ),
        );
      });
}