diff --git a/assets/images/academy_screen/vd_bg.jpg b/assets/images/academy_screen/vd_bg.jpg new file mode 100644 index 0000000..801cfa6 Binary files /dev/null and b/assets/images/academy_screen/vd_bg.jpg differ diff --git a/lib/core/routes/route_name.dart b/lib/core/routes/route_name.dart index 5b0ea03..13b4df3 100644 --- a/lib/core/routes/route_name.dart +++ b/lib/core/routes/route_name.dart @@ -29,6 +29,9 @@ class RouteName { //Portfolio details static const String porfolioDetails = 'porfolioDetails'; + //Portfolio details + static const String academyDetails = 'academyDetails'; + //Biometric static const String biometricScreen = 'biometricScreen'; diff --git a/lib/core/routes/routes.dart b/lib/core/routes/routes.dart index 010caf2..a62f732 100644 --- a/lib/core/routes/routes.dart +++ b/lib/core/routes/routes.dart @@ -2,6 +2,7 @@ import 'package:go_router/go_router.dart'; import 'package:tanami_app/core/routes/route_name.dart'; +import 'package:tanami_app/features/MainScreens/Academy/presentation/pages/detailsScreen.dart'; import 'package:tanami_app/features/MainScreens/MainScreen.dart'; import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/detailsScreen.dart'; @@ -30,104 +31,104 @@ final goRouter = GoRouter( //errorBuilder: (context, state) => ErrorScreen(state.error), routes: [ GoRoute( - name: "splash", - path: RouteName.splashScreen, - builder: (context, state) { - return const SplashScreen(); - }, - routes: [ - GoRoute( - name: RouteName.loginScreen, - path: "${RouteName.loginScreen}/:fromScreen", - builder: (context, state) { - return LoginScreen( - fromScreen: state.pathParameters["fromScreen"]!, - ); - }, - ), - GoRoute( - name: RouteName.registerStepScreen, - path: "${RouteName.registerStepScreen}/:fromScreentype", - builder: (context, state) { - return RegisterStepScreen( - fromScreen: state.pathParameters["fromScreentype"]!, - ); - }, - ), - GoRoute( - name: RouteName.welcomeScreen, - path: RouteName.welcomeScreen, - builder: (context, state) { - return const WelcomeScreen(); - }, - ), - GoRoute( - name: RouteName.chooseCountryScreen, - path: RouteName.chooseCountryScreen, - builder: (context, state) { - return const ChooseCountryScreen(); - }, - ), - GoRoute( - name: RouteName.mainScreen, - path: RouteName.mainScreen, - builder: (context, state) { - return const MainScreen(); - }, - ), - GoRoute( - name: RouteName.biometricScreen, - path: RouteName.biometricScreen, - builder: (context, state) { - return const BiometricScreen(); - }, - ), - GoRoute( - name: RouteName.registerScreen, - path: RouteName.registerScreen, - builder: (context, state) { - return const RegisterScreen(); - }, - ), - GoRoute( - name: RouteName.otpScreen, - path: RouteName.otpScreen, - builder: (context, state) { - return const OtpScreen(); - }, - ), - GoRoute( - name: RouteName.porfolioDetails, - path: RouteName.porfolioDetails, - builder: (context, state) { - return const DetailsScreen(); - }, - ), - GoRoute( - name: RouteName.registerUserDetailsScreen, - path: RouteName.registerUserDetailsScreen, - builder: (context, state) { - return const RegisterUserDetailsScreen(); - }, - ), - GoRoute( - name: RouteName.pinScreen, - path: "${RouteName.pinScreen}/:fromScreen", - builder: (context, state) { - return PinScreen( - fromScreen: state.pathParameters["fromScreen"]!, - ); - }, - ), - GoRoute( - name: RouteName.confirmPinScreen, - path: RouteName.confirmPinScreen, - builder: (context, state) { - return const ConfirmPinScreen(); - }, - ), - ]), - + name: "splash", + path: RouteName.splashScreen, + builder: (context, state) { + return const SplashScreen(); + }, + routes: [ + GoRoute( + name: RouteName.loginScreen, + path: "${RouteName.loginScreen}/:fromScreen", + builder: (context, state) { + return LoginScreen( + fromScreen: state.pathParameters["fromScreen"]!, + ); + }, + ), + GoRoute( + name: RouteName.registerStepScreen, + path: "${RouteName.registerStepScreen}/:fromScreentype", + builder: (context, state) { + return RegisterStepScreen( + fromScreen: state.pathParameters["fromScreentype"]!, + ); + }, + ), + GoRoute( + name: RouteName.welcomeScreen, + path: RouteName.welcomeScreen, + builder: (context, state) { + return const WelcomeScreen(); + }, + ), + GoRoute( + name: RouteName.chooseCountryScreen, + path: RouteName.chooseCountryScreen, + builder: (context, state) { + return const ChooseCountryScreen(); + }, + ), + GoRoute( + name: RouteName.mainScreen, + path: RouteName.mainScreen, + builder: (context, state) { + return const MainScreen(); + }, + ), + GoRoute( + name: RouteName.biometricScreen, + path: RouteName.biometricScreen, + builder: (context, state) { + return const BiometricScreen(); + }, + ), + GoRoute( + name: RouteName.registerScreen, + path: RouteName.registerScreen, + builder: (context, state) { + return const RegisterScreen(); + }, + ), + GoRoute( + name: RouteName.otpScreen, + path: RouteName.otpScreen, + builder: (context, state) { + return const OtpScreen(); + }, + ), + GoRoute( + name: RouteName.porfolioDetails, + path: RouteName.porfolioDetails, + builder: (context, state) { + return const DetailsScreen(); + }, + ), + GoRoute( + name: RouteName.academyDetails, + path: RouteName.academyDetails, + builder: (context, state) { + return const AcademyDetailsScreen(); + }, + ), + GoRoute( + name: RouteName.pinScreen, + path: "${RouteName.pinScreen}/:fromScreen", + builder: (context, state) { + return PinScreen( + fromScreen: state.pathParameters["fromScreen"]!, + ); + }, + ), + GoRoute( + name: RouteName.confirmPinScreen, + path: RouteName.confirmPinScreen, + builder: (context, state) { + return const ConfirmPinScreen(); + }, + ), + ], + ), // GoRoute( // path: '/profile/:userId', // builder: (context, state) { diff --git a/lib/core/styles/app_text.dart b/lib/core/styles/app_text.dart index eca753b..802d964 100644 --- a/lib/core/styles/app_text.dart +++ b/lib/core/styles/app_text.dart @@ -83,6 +83,10 @@ class AppText { static const String disttodate = "Distributions to date"; static const String includeddocs = "Included Documents"; + //Academy + static const String videosTitle = "Videos"; + + //Dialog static const String exitText = "Exit"; static const String cancelText = "Cancel"; diff --git a/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart b/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart index 80d2ffb..ad343c5 100644 --- a/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart +++ b/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:tanami_app/core/routes/route_name.dart'; +import 'package:tanami_app/core/routes/routes.dart'; class AcademyScreen extends StatefulWidget { const AcademyScreen({super.key}); @@ -101,128 +103,133 @@ class _AcademyScreenState extends State { return Padding( padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0), - child: Container( - height: 140.h, - width: double.infinity, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(20.0)), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.15), - spreadRadius: 2, - blurRadius: 10, - offset: const Offset(0, 3), // changes position of shadow - ), - ], - ), - child: Row( - children: [ - Container( - height: 140.h, - width: 164.w, - decoration: const BoxDecoration( - color: Color(0xFFF8F8F8), - borderRadius: BorderRadius.all( - Radius.circular(20.0), - ), + child: GestureDetector( + onTap: () { + goRouter.goNamed(RouteName.academyDetails); + }, + child: Container( + height: 140.h, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: Offset(0, 3), // changes position of shadow ), - child: Stack( - children: [ - ClipRRect( - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20.0), - bottomLeft: Radius.circular(20.0), - ), - child: Image.asset( - data[index]['img_path'], - fit: BoxFit.cover, - height: double.infinity, - alignment: Alignment.topCenter, - ), + ], + ), + child: Row( + children: [ + Container( + height: 140.h, + width: 164.w, + decoration: const BoxDecoration( + color: Color(0xFFF8F8F8), + borderRadius: BorderRadius.all( + Radius.circular(20.0), ), - Positioned( - bottom: 0.0, - child: ClipRRect( + ), + child: Stack( + children: [ + ClipRRect( borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20.0), bottomLeft: Radius.circular(20.0), ), child: Image.asset( - 'assets/images/academy_screen/dark_overlay.png', + data[index]['img_path'], + fit: BoxFit.cover, + height: double.infinity, + alignment: Alignment.topCenter, ), ), - ), - Positioned( - bottom: 8.0, left: 12.0, - // alignment: Alignment.bottomLeft, - child: Row( - children: [ - Image.asset( - 'assets/images/academy_screen/video.png', - height: 15.sp, + Positioned( + bottom: 0.0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(20.0), ), - SizedBox( - width: 5.w, + child: Image.asset( + 'assets/images/academy_screen/dark_overlay.png', ), - Text( - '${data[index]['videos']} videos', - style: GoogleFonts.dmSans( - color: const Color(0xFFD8D8D8), - fontSize: 12.sp, - fontWeight: FontWeight.w700, + ), + ), + Positioned( + bottom: 8.0, left: 12.0, + // alignment: Alignment.bottomLeft, + child: Row( + children: [ + Image.asset( + 'assets/images/academy_screen/video.png', + height: 15.sp, ), - ), - ], + SizedBox( + width: 5.w, + ), + Text( + '${data[index]['videos']} videos', + style: GoogleFonts.dmSans( + color: const Color(0xFFD8D8D8), + fontSize: 12.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), ), - ), - ], + ], + ), ), - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 20.0, horizontal: 16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - data[index]['date'], - style: GoogleFonts.dmSans( - color: const Color(0xFF8D8D8D), - fontSize: 11.sp, - fontWeight: FontWeight.w500, - ), - ), - SizedBox( - height: 4.h, - ), - Text( - data[index]['title'], - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 17.sp, - fontWeight: FontWeight.w700, - ), - ), - SizedBox( - height: 12.h, - ), - SizedBox( - width: 158.w, - child: Text( - data[index]['desc'], - maxLines: 2, - overflow: TextOverflow.ellipsis, + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20.0, horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data[index]['date'], style: GoogleFonts.dmSans( color: const Color(0xFF8D8D8D), fontSize: 11.sp, fontWeight: FontWeight.w500, ), ), - ), - ], - ), - ) - ], + SizedBox( + height: 4.h, + ), + Text( + data[index]['title'], + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 17.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 12.h, + ), + SizedBox( + width: 158.w, + child: Text( + data[index]['desc'], + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: GoogleFonts.dmSans( + color: const Color(0xFF8D8D8D), + fontSize: 11.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ) + ], + ), ), ), ); diff --git a/lib/features/MainScreens/Academy/presentation/pages/detailsScreen.dart b/lib/features/MainScreens/Academy/presentation/pages/detailsScreen.dart new file mode 100644 index 0000000..3d28bc4 --- /dev/null +++ b/lib/features/MainScreens/Academy/presentation/pages/detailsScreen.dart @@ -0,0 +1,200 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:tanami_app/core/styles/app_text.dart'; + +class AcademyDetailsScreen extends StatefulWidget { + const AcademyDetailsScreen({super.key}); + + @override + State createState() => _AcademyDetailsScreenState(); +} + +class _AcademyDetailsScreenState extends State { + List videos = [ + 'assets/images/academy_screen/vd_bg.jpg', + 'assets/images/academy_screen/vd_bg.jpg', + 'assets/images/academy_screen/vd_bg.jpg' + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + elevation: 0, + scrolledUnderElevation: 0.0, + backgroundColor: Colors.white, + centerTitle: true, + title: Text( + 'Article name', + style: GoogleFonts.dmSans( + color: const Color(0xFF272727), // Text color similar to your image + fontSize: 20.sp, + fontWeight: FontWeight.w700, + ), + ), + ), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(20.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: const Offset(0, 3), // changes position of shadow + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20.0), + topRight: Radius.circular(20.0), + ), + child: Image.asset( + 'assets/images/academy_screen/bg2.jpg', + fit: BoxFit.cover, + width: double.infinity, + height: 190.h, + alignment: Alignment.center, + ), + ), + Positioned( + bottom: 0.0, + child: Image.asset( + 'assets/images/academy_screen/dark_overlay.png', + ), + ), + Positioned( + bottom: 8.0, + left: 12.0, + child: Row( + children: [ + Image.asset( + 'assets/images/academy_screen/video.png', + height: 15.sp, + ), + SizedBox( + width: 5.w, + ), + Text( + '3 videos', + style: GoogleFonts.dmSans( + color: const Color(0xFFD8D8D8), + fontSize: 12.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Jul / 10 / 2025', + style: GoogleFonts.dmSans( + color: const Color(0xFF8D8D8D), + fontSize: 11.sp, + fontWeight: FontWeight.w500, + ), + ), + SizedBox( + height: 12.h, + ), + Text( + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + style: GoogleFonts.dmSans( + color: Colors.grey, + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox( + height: 12.h, + ), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(20.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: const Offset(0, 3), // changes position of shadow + ), + ], + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 20.0, horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppText.videosTitle, + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 15.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 12.h, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: videos.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.only(bottom: 18.0), + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(18.0), + ), + child: Image.asset( + videos[index], + fit: BoxFit.cover, + height: 160.h, + // alignment: Alignment.topCenter, + ), + ), + ); + }, + ) + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +}