|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/app_state.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/cache_consts.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/extensions/int_extensions.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
|
|
|
|
|
import 'package:lottie/lottie.dart';
|
|
|
|
|
|
|
|
|
|
import '../../core/dependencies.dart';
|
|
|
|
|
|
|
|
|
|
class OnboardingScreen extends StatefulWidget {
|
|
|
|
|
OnboardingScreen({Key? key}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
_OnboardingScreenState createState() {
|
|
|
|
|
return _OnboardingScreenState();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _OnboardingScreenState extends State<OnboardingScreen> {
|
|
|
|
|
int selectedIndex = 0;
|
|
|
|
|
|
|
|
|
|
late PageController pageController;
|
|
|
|
|
|
|
|
|
|
void goToHomePage() {
|
|
|
|
|
Utils.saveBoolFromPrefs(CacheConst.firstLaunch, false);
|
|
|
|
|
Navigator.of(context).pushReplacement(FadePage(page: LandingNavigation()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
|
pageController = PageController();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void dispose() {
|
|
|
|
|
super.dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
backgroundColor: AppColors.whiteColor,
|
|
|
|
|
body: SafeArea(
|
|
|
|
|
top: false,
|
|
|
|
|
left: false,
|
|
|
|
|
right: false,
|
|
|
|
|
child: Column(
|
|
|
|
|
spacing: 24,
|
|
|
|
|
children: [
|
|
|
|
|
PageView(
|
|
|
|
|
controller: pageController,
|
|
|
|
|
children: [
|
|
|
|
|
onboardingView(
|
|
|
|
|
AppAnimations.onboarding_1,
|
|
|
|
|
"Booking appointment has never been easy".needTranslation,
|
|
|
|
|
"In few clicks find yourself having consultation with the doctor of your choice.".needTranslation,
|
|
|
|
|
),
|
|
|
|
|
onboardingView(
|
|
|
|
|
AppAnimations.onboarding_2,
|
|
|
|
|
"Access the medical history on finger tips".needTranslation,
|
|
|
|
|
"Keep track on your medical history including labs, prescription, insurance, etc".needTranslation,
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
onPageChanged: (int index) {
|
|
|
|
|
selectedIndex = index;
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
).expanded,
|
|
|
|
|
Row(
|
|
|
|
|
spacing: 4.h,
|
|
|
|
|
children: [
|
|
|
|
|
AnimatedContainer(
|
|
|
|
|
duration: const Duration(milliseconds: 250),
|
|
|
|
|
height: 6.h,
|
|
|
|
|
width: selectedIndex == 0 ? 18.h : 6.h,
|
|
|
|
|
decoration: BoxDecoration(color: selectedIndex == 0 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)),
|
|
|
|
|
),
|
|
|
|
|
AnimatedContainer(
|
|
|
|
|
duration: const Duration(milliseconds: 250),
|
|
|
|
|
height: 6.h,
|
|
|
|
|
width: selectedIndex == 1 ? 18.h : 6.h,
|
|
|
|
|
decoration: BoxDecoration(color: selectedIndex == 1 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
).paddingOnly(left: 24, right: 24),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
AnimatedSwitcher(
|
|
|
|
|
duration: const Duration(milliseconds: 250),
|
|
|
|
|
transitionBuilder: (child, anim) => FadeTransition(opacity: anim, child: child),
|
|
|
|
|
child: selectedIndex == 0
|
|
|
|
|
? CustomButton(
|
|
|
|
|
text: "Skip".needTranslation,
|
|
|
|
|
onPressed: () => goToHomePage(),
|
|
|
|
|
width: 86.h,
|
|
|
|
|
height: 56.h,
|
|
|
|
|
borderRadius: 12.h,
|
|
|
|
|
backgroundColor: Color(0xffFEE9EA),
|
|
|
|
|
textColor: AppColors.primaryRedColor,
|
|
|
|
|
borderWidth: 0,
|
|
|
|
|
borderColor: Colors.transparent,
|
|
|
|
|
).paddingOnly(left: 24)
|
|
|
|
|
: const SizedBox.shrink(),
|
|
|
|
|
),
|
|
|
|
|
const Spacer(),
|
|
|
|
|
AnimatedContainer(
|
|
|
|
|
duration: const Duration(milliseconds: 400),
|
|
|
|
|
curve: Curves.easeInOut,
|
|
|
|
|
width: selectedIndex == 0 ? 86 : MediaQuery.of(context).size.width - 48,
|
|
|
|
|
margin: EdgeInsets.only(left: 24, right: 24),
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
color: AppColors.primaryRedColor,
|
|
|
|
|
borderRadius: BorderRadius.circular(12),
|
|
|
|
|
),
|
|
|
|
|
child: AnimatedSwitcher(
|
|
|
|
|
duration: const Duration(milliseconds: 250),
|
|
|
|
|
transitionBuilder: (child, anim) => FadeTransition(opacity: anim, child: child),
|
|
|
|
|
child: selectedIndex == 0
|
|
|
|
|
? CustomButton(
|
|
|
|
|
icon: getIt.get<AppState>().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward,
|
|
|
|
|
iconSize: 32.h,
|
|
|
|
|
width: 86.h,
|
|
|
|
|
height: 56.h,
|
|
|
|
|
borderRadius: 12.h,
|
|
|
|
|
text: "".needTranslation,
|
|
|
|
|
backgroundColor: Colors.transparent,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
pageController.animateToPage(1, duration: Duration(milliseconds: 400), curve: Curves.easeInOut);
|
|
|
|
|
})
|
|
|
|
|
: CustomButton(
|
|
|
|
|
text: "Get Started".needTranslation,
|
|
|
|
|
fontWeight: FontWeight.w500,
|
|
|
|
|
fontSize: 16.h,
|
|
|
|
|
height: 56.h,
|
|
|
|
|
borderRadius: 16.h,
|
|
|
|
|
textOverflow: TextOverflow.ellipsis,
|
|
|
|
|
backgroundColor: Colors.transparent,
|
|
|
|
|
onPressed: () => goToHomePage(),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget onboardingView(String icon, String heading, String body) {
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
spacing: 12,
|
|
|
|
|
children: [
|
|
|
|
|
Align(
|
|
|
|
|
alignment: Alignment.bottomCenter,
|
|
|
|
|
child: Transform.flip(
|
|
|
|
|
flipX: getIt.get<AppState>().isArabic() ? true : false,
|
|
|
|
|
child: Lottie.asset(icon, repeat: true, reverse: false, frameRate: FrameRate(60), width: MediaQuery.sizeOf(context).width - 50, height: MediaQuery.sizeOf(context).width - 50)))
|
|
|
|
|
.expanded,
|
|
|
|
|
// 12.height,
|
|
|
|
|
Text(
|
|
|
|
|
heading,
|
|
|
|
|
style: TextStyle(fontSize: 36.h, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -0.4, height: 1),
|
|
|
|
|
),
|
|
|
|
|
Text(
|
|
|
|
|
body,
|
|
|
|
|
style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: 0, height: 26 / 16),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
).paddingOnly(left: 24, right: 24);
|
|
|
|
|
}
|
|
|
|
|
}
|