user guide added

This commit is contained in:
venbaittech 2025-02-06 20:08:46 +05:30
parent 5eb973c6fc
commit b275b1a9f3
29 changed files with 2646 additions and 1393 deletions

BIN
assets/user_guide/AboutFCSC.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
assets/user_guide/appFeatures.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
assets/user_guide/editProfile.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/user_guide/getStarted.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
assets/user_guide/howUse.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
assets/user_guide/purpose.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
assets/user_guide/stayUpdate.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
assets/user_guide/whoUse.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -302,7 +302,17 @@ import 'package:uae_stat/presentation/Screens/charts/screens/chart_screen.dart';
import 'package:uae_stat/presentation/Screens/demo_home2.dart';
import 'package:uae_stat/presentation/Screens/online_offline_verification/internet_check.dart';
import 'package:uae_stat/presentation/routes/auth_routes/pocketbase_service.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/getting_started.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/AboutTheApp/AboutFCSC.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/AboutTheApp/getStarted.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/AppFeatures.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/ChangeMyPassword.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/EditMyProfile.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/howUseTheApp.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/purpose.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/stayUpdate.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/useTheApp.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/aboutApp.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/userguide.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart';
@ -323,7 +333,6 @@ import '../presentation/routes/drawer_routes/Drawer Items/edit_profile.dart';
import '../presentation/routes/drawer_routes/Drawer Items/feedback.dart';
import '../presentation/routes/drawer_routes/Drawer Items/user_guide/faq_page.dart';
import '../presentation/routes/drawer_routes/Drawer Items/user_guide/features.dart';
import '../presentation/routes/drawer_routes/Drawer Items/user_guide/user_guide.dart';
import '../presentation/routes/drawer_routes/Drawer Items/manage_users.dart';
final pbService = PocketBaseService();
@ -465,27 +474,75 @@ final GoRouter router = GoRouter(
return ProfileScreen(userId: userId);
},
),
GoRoute(
path: '/user-guide',
builder: (context, state) => Userguide(),
routes: <RouteBase>[
GoRoute(
path: '/user-guide',
builder: (context, state) => UserGuide(),
path: '/features',
name: 'features',
builder: (context, state) => UsingFeatures(),
routes: <RouteBase>[
GoRoute(
path: '/features',
name: 'features',
builder: (context, state) => UsingFeatures(),
path: 'whoUseApp',
name: 'whoUseApp',
builder: (context, state) => WhoUseTheApp(),
),
GoRoute(
path: '/faq',
name: 'faq',
builder: (context, state) => FAQPage(),
path: 'howUseApp',
name: 'howUseApp',
builder: (context, state) => HowUseTheApp(),
),
GoRoute(
path: '/gettingStarted',
name: 'gettingStarted',
builder: (context, state) => GettingStarted(),
path: 'purpose',
name: 'purpose',
builder: (context, state) => Purpose(),
),
GoRoute(
path: 'stayUpdated',
name: 'stayUpdated',
builder: (context, state) => StayUpdate(),
),
GoRoute(
path: 'changeMyPassword',
name: 'changeMyPassword',
builder: (context, state) => ChangeMyPassword(),
),
GoRoute(
path: 'appFeatures',
name: 'appFeatures',
builder: (context, state) => AppFeatures(),
),
GoRoute(
path: 'editMyProfile',
name: 'editMyProfile',
builder: (context, state) => EditMyProfile(),
),
],
),
GoRoute(
path: 'aboutApp',
builder: (context, state) => aboutTheApp(),
routes: <RouteBase>[
GoRoute(
path: 'aboutFCSC',
name: 'aboutFCSC',
builder: (context, state) => aboutFCSC(),
),
GoRoute(
path: 'getStarted',
name: 'getStarted',
builder: (context, state) => GetStarted(),
),
]
),
GoRoute(
path: '/faq',
name: 'faq',
builder: (context, state) => FAQPage(),
),
],
),
// GoRoute(
// path: '/manageuser',
// builder: (context, state) {

View File

@ -0,0 +1,89 @@
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
class aboutFCSC extends StatelessWidget {
const aboutFCSC({super.key});
@override
Widget build(BuildContext context) {
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
return BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Getting Started',
style: TextStyle(
fontFamily: 'Roboto',
fontSize: 22,
color: Color(0xFF7DAFBC),
// fontWeight: FontWeight.normal,
fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: Column(
children: [
Align(
alignment: Alignment.topLeft,
child: Text('About FCSC',
style: TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
fontFamily: 'Roboto',
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/AboutFCSC.png',
fit: BoxFit.contain,
),
),
SizedBox(height: 5,),
RichText(
text: TextSpan(
text: 'The ',
style: TextStyle(
color:Colors.grey,
fontSize: 16,
fontFamily: 'Roboto'
),
children: const <TextSpan>[
TextSpan(text: ' Federal Competitiveness and Statistics Centre (FCSC),',
style: TextStyle(
fontWeight: FontWeight.bold,
color:Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text: ' in your App is designed to provide registered and approved users with access to accurate and comprehensive statistics about the UAE. The app serves as a centralized platform for exploring key datasets, trends, and insights across various sectors.'),
],
),
),
Spacer(),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
]
),
),);
}
}

View File

@ -0,0 +1,133 @@
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
class GetStarted extends StatelessWidget {
const GetStarted({super.key});
@override
Widget build(BuildContext context) {
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Getting Started',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
height: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('How to Get Started',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/getStarted.png',
fit: BoxFit.contain,
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'1. Download the app from the App Store or Google Play Store.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'2. Log in to unlock advanced features or continue as a guest.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'3. Log in to unlock advanced features or continue as a guest.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(
height:MediaQuery.of(context).size.height * 0.1,
),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
),);
}
}

View File

@ -0,0 +1,193 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class AppFeatures extends StatelessWidget {
AppFeatures({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
bottomColor:Colors.white,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('App Features',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/appFeatures.png',
fit: BoxFit.contain,
),
),
Text('1.Comprehensive Statistics:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 6.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'Access detailed datasets across categories such as Economy, Environment, Social, ',
style: TextStyle(
color:Color(0xFF898C81),
fontSize: 16,
fontFamily: 'Roboto'
),
children: const <TextSpan>[
TextSpan(text: 'Economy, Environment, Social, ',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text: 'and more.'),
],
),
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Explore statistics presented as smart metrics, graphs, and charts for better understanding.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text(' 2. Drilldown Navigation:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Start with high-level categories and drill down to specific KPIs and metrics for deeper insights.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('3. Interactive Visualizations:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'View trends and relationships with interactive graphs and charts, including bar graphs, line charts, and more.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 25,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,305 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class ChangeMyPassword extends StatelessWidget {
ChangeMyPassword({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
bottomColor: Colors.white,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('App Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('How to Change My Password',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/changePassword.png',
fit: BoxFit.contain,
),
),
Text(
'Changing your password helps keep your account secure. Follow these steps to update your password:',
),
SizedBox(height: 12),
Text('Steps to Change Password',
style:TextStyle(
fontSize:22,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Text('1. Access the Change Password Page:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'From the Profile page, tap on the ',
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: '"Change Password"',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' link at the bottom.',)
],
),
),
),
],
),
SizedBox(height: 8),
Text('2. Enter Old Password:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Enter your current password in the first field.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('3. Set a New Password:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Enter your new password in the second field.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Re-enter the new password in the third field for confirmation.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('4. Password Requirements:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Your new password must be different from the previously used password.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('5. Save Your Password:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'Tap the ',
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Save ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:'button',)
],
),
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'A confirmation message will appear: “Password has been successfully updated.”',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('6. Re-Login:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Log in again using your new password to continue using the app',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 25,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,404 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class EditMyProfile extends StatelessWidget {
EditMyProfile({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
bottomColor: Colors.white,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('App Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('How to Edit My Profile',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/editProfile.png',
fit: BoxFit.contain,
),
),
Text(
'Editing your profile allows you to update specific information while ensuring that critical details remain secure. Follow the steps below to update your profile:',
),
SizedBox(height: 12),
Text('Steps to Edit Profile',
style:TextStyle(
fontSize:22,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Text('1. Access the Profile Page:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'Tap on the ',
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: '"Profile"',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' option from the navigation bar at the top left corner of the screen.',)
],
),
)
),
],
),
SizedBox(height: 8),
Text('2. Editable Fields:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Full Name:',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' Tap the text box to enter your name (up to 40 alphanumeric characters).',)
],
),
)
),
],
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Date of Birth: ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' Use the calendar dropdown to select your date of birth.',)
],
),
)
),
],
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Country/Region: ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' Choose your current location from the dropdown menu.',),
],
),
)
),
],
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'User Image: ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:'Tap on the avatar icon to upload or change your profile picture.',),
],
),
)
),
],
),
SizedBox(height: 8),
Text('3. Non-Editable Fields:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Username ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:'and ',),
TextSpan(text: 'Email Id: ',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:'These fields cannot be edited to ensure the integrity of your account.',),
],
),
)
),
],
),
SizedBox(height: 8),
Text('4. Agree to Terms and Conditions:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Ensure that the checkbox for "I agree to Terms & Conditions and Privacy Policy" is selected before saving changes.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('4. Save Your Changes:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'Tap the ',
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Save',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' button at the bottom of the screen.',)
],
),
),
),
],
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'A confirmation dialog will appear with the message: “Are you sure you want to save this page? Once saved, you will not be able to change your name or date of birth.”',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child:RichText(
text: TextSpan(
text: 'Select ',
style: TextStyle(fontSize: 16, color: Color(0xFF898C81), fontFamily: 'Roboto'),
children: const <TextSpan>[
TextSpan(text: 'Confirm',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' to save the changes',),
TextSpan(text: ' Cancel',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text:' to go back.',),
],
),
),
),
],
),
SizedBox(height: 25,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,187 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class HowUseTheApp extends StatelessWidget {
HowUseTheApp({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('How to Use the App',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/howUse.png',
fit: BoxFit.contain,
),
),
Text('1. Registration and Approval:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Sign up for the app and wait for admin approval.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('2. Login and Navigation:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Once approved, log in to access the app. Navigate through the categories on the home screen.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('3. Access Data:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Drill down into specific categories like "Economy" or "Environment" to view detailed KPIs and visual insights.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 8),
Text('4. Bookmark Metrics:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Drill down into specific categories like "Economy" or "Environment" to view detailed KPIs and visual insights.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 25,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,150 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class Purpose extends StatelessWidget {
Purpose({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color:Color(0xFF898C81),),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
height: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('Purpose of the App',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/purpose.png',
fit: BoxFit.contain,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: RichText(
text: TextSpan(
text: 'Provide ',
style: TextStyle(
color:Color(0xFF898C81),
fontSize: 16,
fontFamily: 'Roboto'
),
children: const <TextSpan>[
TextSpan(text: 'official statistics ',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Color(0xFF414042),
fontFamily: 'Roboto'
),),
TextSpan(text: 'on the UAE in an accessible format.'),
],
),
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Support decision-making and research with reliable, up-to-date data.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Enable users to interact with data visually through graphs and metrics.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 40,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,103 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class StayUpdate extends StatelessWidget {
StayUpdate({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color:Color(0xFF898C81),),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
height: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('Stay Updated',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/stayUpdate.png',
fit: BoxFit.contain,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'The app regularly updates datasets and features to reflect the latest information. Notifications will alertyou about new data or improvements.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 150,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,143 @@
import 'package:flutter/material.dart';
import '../../../../../../infrastructure/services/img_asset_paths/banner_asset_path.dart';
import '../../../custom_drawer_routes.dart';
class WhoUseTheApp extends StatelessWidget {
WhoUseTheApp({super.key});
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
return Theme(
data: ThemeData(
fontFamily: 'Roboto', // Set default font family for this page
textTheme: TextTheme(
bodyMedium: TextStyle(fontSize: 16, color: Color(0xFF898C81)),
),
),
child: BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
height: double.infinity,
color: Colors.white,
padding: EdgeInsets.all(16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.topLeft,
child: Text('Who Use the App',
style:
TextStyle(
fontSize:20,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),),
),
SizedBox(
width:MediaQuery.of(context).size.width,
height:MediaQuery.of(context).size.height * 0.36,
child: Image.asset(
'assets/user_guide/whoUse.png',
fit: BoxFit.contain,
),
),
Text('This app is intended for:',
style:TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
),
),
SizedBox(height: 8),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Government officials requiring UAE statistics for decision-making.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Business professionals and researchers analyzing market trends.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top : 8.0),
child: Icon(Icons.brightness_1, size: 5, color: Color(0xFF414042),),
), // Bullet point
SizedBox(width: 8), // Space between bullet and text
Expanded(
child: Text(
'Students and educators needing reliable data for study and teaching.',
textAlign: TextAlign.justify, // Align the text
softWrap: true,
),
),
],
),
SizedBox(height: 50,),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),
),
)
,);
}
}

View File

@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
class aboutTheApp extends StatelessWidget {
const aboutTheApp({super.key});
@override
Widget build(BuildContext context) {
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
return BaseScaffold( showDivider: true,
showBackButton: true,
bottomColor: Colors.white,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Getting Started',
style: TextStyle(
fontSize:22,
fontFamily: 'Roboto',
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
child: Column(
children: [
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/aboutApp/aboutFCSC');
},
tileColor: Colors.white,
title: Text('About FCSC',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),),
trailing: Icon(Icons.keyboard_arrow_right),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/aboutApp/getStarted');
},
// tileColor: Colors.white,
title: Text('How to Get Started?',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Spacer(),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 25,),
],
),
),);
}
}

View File

@ -1,57 +0,0 @@
import 'package:flutter/material.dart';
class CustomTextRich extends StatelessWidget {
const CustomTextRich({
super.key,
required this.textSpans,
this.padding = const EdgeInsets.all(8.0),
this.textAlign = TextAlign.left,
});
final List<TextSpan> textSpans;
final EdgeInsetsGeometry padding;
final TextAlign textAlign;
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child :Padding(
padding: padding,
child: Text.rich(
TextSpan(children: textSpans),
textAlign: textAlign,
),
),
);
}
static TextSpan createTextSpan(
String text, {
double? fontSize,
Color color = const Color(0xFF898C81),
FontWeight fontWeight = FontWeight.w500,
double? height,
double defaultFontSize = 14,
TextDecoration textDecoration = TextDecoration.none,
Color? decorationColor,
double spacingTop = 0.0,
double spacingBottom = 0.0,
}) {
String spacedText = (spacingTop > 0.0 || spacingBottom > 0.0)
? '${'\n' * spacingTop.toInt()}$text${'\n' * spacingBottom.toInt()}'
: text;
return TextSpan(
text: spacedText,
style: TextStyle(
fontSize: fontSize ?? defaultFontSize,
color: color,
fontWeight: fontWeight,
height: height,
decoration: textDecoration,
decorationColor: decorationColor ?? color,
),
);
}
}

View File

@ -1,360 +1,272 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import '../../../../components/indicators/locale_provider.dart';
import '../../../../components/my_toggle.dart';
class FAQPage extends StatefulWidget {
const FAQPage({super.key});
@override
State<FAQPage> createState() => _FAQPageState();
}
class _FAQPageState extends State<FAQPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 3,
shadowColor: Colors.black,
title: Text('Key Features',),
leading: IconButton(
onPressed: (){
context.go('/user-guide');
},
color: Colors.black,
icon: const Icon(Icons.arrow_back_ios_new),),
actions: [
Consumer(
builder: (context, ref, _) {
final locale = ref.watch(localeProvider); // Current locale
return MyToggle(
isOn: locale?.languageCode == 'en',
knobTextWhenOn: 'ع',
knobTextWhenOff: 'EN',
pathColorWhenOn: Colors.grey.shade300,
pathColorWhenOff: Colors.grey.shade300,
onTap: () {
ref.read(localeProvider.notifier).toggleLocale();
},
);
},
),
],
),
body: SafeArea(
child: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container
(
color: Colors.white,
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Text.rich(
TextSpan(
text: 'Here are some common questions about the ',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
children: [
TextSpan(
text:' Federal Competitiveness and Statistics Centre (FCSC),',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.black87,
),
),
TextSpan(
text: 'mobile application:',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
),
],
),
),
),
Container(
padding: const EdgeInsets.all(0.0),
color: Colors.grey[50],
child: QuestionAnswerScrollView(),
),
],
),
),
),
),
);
}
}
class QuestionAnswerScrollView extends StatelessWidget {
const QuestionAnswerScrollView({super.key});
@override
Widget build(BuildContext context) {
final List<Map<String, dynamic>> questionsAndAnswers = [
{'question':'What is the purpose of this app?', 'answer': 'The app provides official UAE statistics across categories like Economy, Environment, and Social. It allows users to explore datasets, view trends, and access detailed metrics to make informed decisions.'},
{'question':'Do I need to create an account to use the app?', 'answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, the app is strictly for registered and approved users. To access the data:\n\n',
style: TextStyle(fontWeight: FontWeight.normal, color: Colors.grey),
),
TextSpan(
text: ' 1. You need to sign up using the Register Now option on the login screen.\n',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' 2. Your registration must be approved by the admin.\n',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: " 3. Once approved, you can log in to access the app's features and datasets.\n\nGuest access is not available for this application.\n ",
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'How can I navigate through the app?','answer':'• Use the main categories on the homepage (e.g., Economy, Environment) to access subcategories and detailed KPIs.\n• Drill down into specific metrics or graphical views by tapping on a KPI.\n• Access additional features like Bookmarks or Profile through the navigation bar.\n'},
{'question':'What types of data are available?', 'answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'The app offers data on:\n\n',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' • Economy',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: ' GDP, growth rates, and economic trends\n',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' • Environment:',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: ' Electricity production, water consumption, and more.\n',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' • Social:',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: ' Labor force distribution, participation rates, and demographic data.\n',
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'How do I bookmark a metric?', 'answer': RichText(
text: TextSpan(
children: [
TextSpan(
text: 'When viewing a metric, tap on the',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' Bookmark ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'icon. Your bookmarks are accessible from the',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'My Bookmarks',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'section in the navigation bar.\n',
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'Can I view the app in another language?', 'answer': RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, the app supports both ',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'English ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'and',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: ' Arabic ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: '. You can toggle the language using the switch in the top-right corner of the app.\n',
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'What happens if I forget my password?','answer':'Tap on the Forgot Password? link on the login page. Follow the steps to reset your password via your registered email address.\n'},
{'question':'Can I edit my profile details?','answer': 'Yes, you can edit specific fields such as Date of Birth and User Image. However, certain fields like Username and Email are non-editable for security reasons.\n'},
{'question':'How often is the data updated?','answer':'The app updates its datasets regularly to ensure users have access to the latest statistics. Notifications are sent whenever significant updates are made.\n'},
{'question':'What types of graphs and charts are available?','answer':'The app provides a variety of visualizations, including:\n • Line charts for trends.\n • Bar and column charts for comparisons.\n • Stacked charts for multi-layered data views.\n'},
{'question':'Can I share the data or charts?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, you can share data or charts directly from the app by tapping the ',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'Share ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'button available on most pages.\n',
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'What should I do if I encounter an issue?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'For technical support or feedback, navigate to the ',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'Help ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'section in the app and contact the support team.\n',
style: TextStyle(color: Colors.grey),
),
],
),
),},
{'question':'How do I log out of the app?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Go to the ',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'Profile ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'section and tap the ',
style: TextStyle(color: Colors.grey),
),
TextSpan(
text: 'Logout ',
style: TextStyle(color: Colors.black87,fontWeight: FontWeight.w500),
),
TextSpan(
text: 'option in the top-right corner.\n',
style: TextStyle(color: Colors.grey), ),
],
),
),},
];
return SingleChildScrollView(
child: Column(
children: questionsAndAnswers.map((qa) => QuestionAnswerCard(qa: qa)).toList(),
),
);
}
}
class QuestionAnswerCard extends StatefulWidget { // Use dynamic to accommodate RichText
const QuestionAnswerCard({super.key, required this.qa});
final Map<String, dynamic> qa;
@override
_QuestionAnswerCardState createState() => _QuestionAnswerCardState();
}
class _QuestionAnswerCardState extends State<QuestionAnswerCard> {
bool isExpanded = false;
@override
Widget build(BuildContext context) {
return Card(
color: Colors.grey[50],
elevation: 1,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.zero, // No rounding, it's a rectangle
),
margin: EdgeInsets.symmetric(vertical: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
dense: true,
textColor: Color(0xFF414042),
title: Text(
widget.qa['question']!,
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 15),
),
trailing: Icon(isExpanded ? Icons.remove : Icons.add),
onTap: () {
setState(() {
isExpanded = !isExpanded;
});
},
),
if (isExpanded)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: widget.qa['answer'] is RichText
? widget.qa['answer']
: Text(
widget.qa['answer'] ?? '',
style: TextStyle(color: Colors.grey),
),
),
],
),
);
}
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
class FAQPage extends StatefulWidget {
const FAQPage({super.key});
@override
State<FAQPage> createState() => _FAQPageState();
}
class _FAQPageState extends State<FAQPage> {
@override
Widget build(BuildContext context) {
return BaseScaffold(
showBackButton: true,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
bottomColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text(' FAQs',
style: TextStyle(
fontSize:22,
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: SafeArea(
child: Container(
height: double.infinity,
color: Colors.white,
child: Scrollbar(
thumbVisibility: true,
thickness: 8,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child: QuestionAnswerScrollView(),
),
),
),
),
);
}
}
class QuestionAnswerScrollView extends StatelessWidget {
const QuestionAnswerScrollView({super.key});
@override
Widget build(BuildContext context) {
final List<Map<String, dynamic>> questionsAndAnswers = [
{'question':'What is the purpose of this app?', 'answer': 'The app provides official UAE statistics across categories like Economy, Environment, and Social. It allows users to explore datasets, view trends, and access detailed metrics to make informed decisions.'},
{'question':'Do I need to create an account to use the app?', 'answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, the app is strictly for registered and approved users. To access the data:\n\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' 1. You need to sign up using the Register Now option on the login screen.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' 2. Your registration must be approved by the admin.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: " 3. Once approved, you can log in to access the app's features and datasets.\n\nGuest access is not available for this application.\n ",
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'How can I navigate through the app?','answer':'• Use the main categories on the homepage (e.g., Economy, Environment) to access subcategories and detailed KPIs.\n• Drill down into specific metrics or graphical views by tapping on a KPI.\n• Access additional features like Bookmarks or Profile through the navigation bar.\n'},
{'question':'What types of data are available?', 'answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'The app offers data on:\n\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' • Economy',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: ' GDP, growth rates, and economic trends\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' • Environment:',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: ' Electricity production, water consumption, and more.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' • Social:',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: ' Labor force distribution, participation rates, and demographic data.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'How do I bookmark a metric?', 'answer': RichText(
text: TextSpan(
children: [
TextSpan(
text: 'When viewing a metric, tap on the',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' Bookmark ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'icon. Your bookmarks are accessible from the',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'My Bookmarks',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'section in the navigation bar.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'Can I view the app in another language?', 'answer': RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, the app supports both ',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'English ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'and',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: ' Arabic ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: '. You can toggle the language using the switch in the top-right corner of the app.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'What happens if I forget my password?','answer':'Tap on the Forgot Password? link on the login page. Follow the steps to reset your password via your registered email address.\n'},
{'question':'Can I edit my profile details?','answer': 'Yes, you can edit specific fields such as Date of Birth and User Image. However, certain fields like Username and Email are non-editable for security reasons.\n'},
{'question':'How often is the data updated?','answer':'The app updates its datasets regularly to ensure users have access to the latest statistics. Notifications are sent whenever significant updates are made.\n'},
{'question':'What types of graphs and charts are available?','answer':'The app provides a variety of visualizations, including:\n • Line charts for trends.\n • Bar and column charts for comparisons.\n • Stacked charts for multi-layered data views.\n'},
{'question':'Can I share the data or charts?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Yes, you can share data or charts directly from the app by tapping the ',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'Share ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'button available on most pages.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'What should I do if I encounter an issue?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'For technical support or feedback, navigate to the ',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'Help ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'section in the app and contact the support team.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
],
),
),},
{'question':'How do I log out of the app?','answer':RichText(
text: TextSpan(
children: [
TextSpan(
text: 'Go to the ',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'Profile ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16), ),
TextSpan(
text: 'section and tap the ',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ),
TextSpan(
text: 'Logout ',
style: TextStyle(color: Color(0xFF414042),fontWeight: FontWeight.w500, fontSize: 16),
),
TextSpan(
text: 'option in the top-right corner.\n',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'), ) ],
),
),},
];
return SingleChildScrollView(
child: Column(
children: questionsAndAnswers.map((qa) => QuestionAnswerCard(qa: qa)).toList(),
),
);
}
}
class QuestionAnswerCard extends StatefulWidget { // Use dynamic to accommodate RichText
const QuestionAnswerCard({super.key, required this.qa});
final Map<String, dynamic> qa;
@override
_QuestionAnswerCardState createState() => _QuestionAnswerCardState();
}
class _QuestionAnswerCardState extends State<QuestionAnswerCard> {
bool isExpanded = false;
@override
Widget build(BuildContext context) {
return Card(
color: Colors.white,
shape: Border(
bottom: BorderSide(width: 0.5,color: Colors.grey.shade300),
),
margin: EdgeInsets.symmetric(vertical: 0, ),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
dense: true,
textColor: Color(0xFF414042),
title: Text(
widget.qa['question']!,
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 16),
),
trailing: Icon(isExpanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down),
onTap: () {
setState(() {
isExpanded = !isExpanded;
});
},
),
if (isExpanded)
Padding(
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16,top: 0),
child: widget.qa['answer'] is RichText
? widget.qa['answer']
: Text(
widget.qa['answer'] ?? '',
style: TextStyle(color: Colors.grey, fontSize: 16, fontFamily: 'Roboto'),
),
),
],
),
);
}
}

View File

@ -1,595 +1,234 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/custom_text.dart';
import '../../../../components/indicators/locale_provider.dart';
import '../../../../components/my_toggle.dart';
class UsingFeatures extends StatelessWidget {
const UsingFeatures({super.key});
@override
Widget build(BuildContext context) {
List<TextSpan> textSpans = [
CustomTextRich.createTextSpan('1.Data-Driven Insights:',
fontSize: 15,
color: Colors.black87,
fontWeight: FontWeight.bold,
height: 2,
),
CustomTextRich.createTextSpan(
'Access detailed datasets across categories such as Economy, Environment, Social, ',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
spacingTop: 1.9,),
CustomTextRich.createTextSpan(
' Economy, Environment, Social ',
fontSize: 13, color:Colors.black,
fontWeight: FontWeight.w600 ,
),
CustomTextRich.createTextSpan(
'and more.Explore statistics presented as smart metrics, graphs, and charts for better understanding.',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
),
CustomTextRich.createTextSpan('\n2.Drilldown Navigation:', fontSize: 15,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2
),
CustomTextRich.createTextSpan(
'\nStart with high-level categories and drill down to specific KPIs and metrics for deeper insights.',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
),
CustomTextRich.createTextSpan('\n3.Interactive Visualizations:', fontSize: 15,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2
),
CustomTextRich.createTextSpan(
'\nStart with high-level categories and drill down to specific KPIs and metrics for deeper insights.',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
),
CustomTextRich.createTextSpan(
'View trends and relationships with interactive graphs and charts, including bar graphs, line charts, and more.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n4.Secure User Access:',
fontSize: 14.0,
color: Colors.black87,
fontWeight: FontWeight.bold,
height: 2,
),
CustomTextRich.createTextSpan(
'\nAvailable only to registered users whose accounts have been approved by an admin. Login ensures secure access to sensitive statistical information.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n5.Profile Customization:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2
),
CustomTextRich.createTextSpan(
'\nUpdate your profile details, such as name, password, and region, to personalize your experience.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n6.Bookmark:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
),
CustomTextRich.createTextSpan(
'\nSave frequently accessed metrics and datasets for quick reference via the Bookmarks section.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n7.Bilingual Support:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2
),
CustomTextRich.createTextSpan(
'\nToggle between English and Arabic for ease of use.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\nWho Can Use the App?',
fontSize: 18.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
height: 2.5
),
CustomTextRich.createTextSpan(
'\nThis app is intended for:',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n\n • Government officials requiring UAE statistics for decision-making.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n •Business professionals and researchers analyzing market trends.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n •Students and educators needing reliable data for study and teaching.\n\n',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'Purpose of the App\n',
fontSize: 16.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
height: 2.0
),
CustomTextRich.createTextSpan(
' • Provide official statistics on the UAE in an accessible format.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • Support decision-making and research with reliable, up-to-date data.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • Enable users to interact with data visually through graphs and metrics.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\nHow to Use the App',
fontSize: 18.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
height: 2.3
),
CustomTextRich.createTextSpan(
'\n1.Registration and Approval:',
fontSize: 15.0,
color: Colors.black87,
fontWeight: FontWeight.bold,
height: 2.0
),
CustomTextRich.createTextSpan(
'\nSign up for the app and wait for admin approval.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n2.Login and Navigation:',
fontSize: 15.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2.0,
),
CustomTextRich.createTextSpan(
'\nOnce approved, log in to access the app. Navigate through the categories on the home screen.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n3.Access Data:',
fontSize: 15.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2.0,
),
CustomTextRich.createTextSpan(
'\nDrill down into specific categories like "Economy" or "Environment" to view detailed KPIs and visual insights.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n4.Bookmark Metrics:',
fontSize: 15.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2.0,
),
CustomTextRich.createTextSpan(
'\nSave important statistics for easy reference.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\nStay Updated',
fontSize: 18.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
height: 3,
),
CustomTextRich.createTextSpan(
'\nThe app is regularly updated with the latest datasets and features to ensure users have access to the most current information.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\nHow to Change My Password',
fontSize: 18.0,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 3,
),
CustomTextRich.createTextSpan(
'\nChanging your password helps keep your account secure. Follow these steps to update your password:\n \n',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'Steps to Change Password',
fontSize: 16.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2.5
),
CustomTextRich.createTextSpan(
'\n1.Access the Change Password Page:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 1.5,
),
CustomTextRich.createTextSpan(
'\nFrom the Profile page, tap on the "Change Password" link at the bottom.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n2.Enter Old Password:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 1.5,
),
CustomTextRich.createTextSpan(
'\nEnter your current password in the first field.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n3.Set a New Password:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 1.5,
),
CustomTextRich.createTextSpan(
'\n• Enter your new password in the second field.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n• Re-enter the new password in the third field for confirmation.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n4.Password Requirements:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
),
CustomTextRich.createTextSpan(
'\nYour new password must be different from the previously used password.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n5.Save Your Password:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
),
CustomTextRich.createTextSpan(
'\n• Tap the Save button.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n• A confirmation message will appear: “Password has been successfully updated.”',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n6.Re-Login:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
),
CustomTextRich.createTextSpan(
'\nLog in again using your new password to continue using the app.\n\n',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'How to Edit My Profile',
fontSize: 18.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w600,
height: 2.5,
),
CustomTextRich.createTextSpan(
'\nEditing your profile allows you to update specific information while ensuring that critical details remain secure. Follow the steps below to update your profile:\n',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\nSteps to Edit Profile',
fontSize: 17.0,
color: Color(0xFF414042),
fontWeight: FontWeight.bold,
height: 2,
),
CustomTextRich.createTextSpan(
'\n 1.Access the Profile Page:',
fontSize: 14.0,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2,
),
CustomTextRich.createTextSpan(
'\nTap on the "Profile" option from the navigation bar at the top left corner of the screen.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n 2. Editable Fields:',
fontSize: 14.0,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2,
),
CustomTextRich.createTextSpan(
'\n • Full Name:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
' Tap the text box to enter your name (up to 40 alphanumeric characters).',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • Date of Birth:',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
' Use the calendar dropdown to select your date of birth.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • Country/Region: ',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
'Choose your current location from the dropdown menu.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n •User Image: ',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
'Tap on the avatar icon to upload or change your profile picture.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n 3. Non-Editable Fields:',
fontSize: 14.0,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2,
),
CustomTextRich.createTextSpan(
'\nUsername ',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
'and ',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'Email ID: ',
fontSize: 14.0,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
),
CustomTextRich.createTextSpan(
'These fields cannot be edited to ensure the integrity of your account.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n 4.Agree to Terms and Conditions:',
fontSize: 14.0,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2,
),
CustomTextRich.createTextSpan(
'\nEnsure that the checkbox for "I agree to Terms & Conditions and Privacy Policy" is selected before saving changes.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n 5. Save Your Changes:',
fontSize: 15.0,
color: Colors.black87,
fontWeight: FontWeight.bold,
height: 2,
),
CustomTextRich.createTextSpan(
'\n • Tap the Save button at the bottom of the screen.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • A confirmation dialog will appear with the message:',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'“Are you sure you want to save this page? Once saved, you will not be able to change your name or date of birth.”',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
CustomTextRich.createTextSpan(
'\n • Select Confirm to save the changes or Cancel to go back.',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
];
return
Scaffold(
appBar: AppBar(
elevation: 3,
shadowColor: Colors.black,
title: Text('Key Features',),
leading: IconButton(
onPressed: (){
context.go('/user-guide');
},
color: Colors.black,
icon: const Icon(Icons.arrow_back_ios_new),),
actions: [
Consumer(
builder: (context, ref, _) {
final locale = ref.watch(localeProvider); // Current locale
return MyToggle(
isOn: locale?.languageCode == 'en',
knobTextWhenOn: 'ع',
knobTextWhenOff: 'EN',
pathColorWhenOn: Colors.grey.shade300,
pathColorWhenOff: Colors.grey.shade300,
onTap: () {
ref.read(localeProvider.notifier).toggleLocale();
},
);
},
),
],
),
body:SafeArea(
child: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Colors.white,
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Text(
'FEATURES',
style: TextStyle(
color: Colors.black,// Text color
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
color: Colors.grey[50], // Set the background color here
// child: SingleChildScrollView(
child: CustomTextRich(
textSpans: textSpans,
padding: const EdgeInsets.all(16.0),
textAlign: TextAlign.start,
),
),
],
),
)
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
class UsingFeatures extends StatelessWidget {
const UsingFeatures({super.key});
@override
Widget build(BuildContext context) {
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
return BaseScaffold( showDivider: true,
showBackButton: true,
dividerColor: Colors.grey[300],
bottomColor: Colors.white,
appbarColor: Colors.white,
mycenterTitle: true,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('Key Features',
style: TextStyle(
fontSize:22,
fontFamily: 'Roboto',
color: Color(0xFF7DAFBC),
fontWeight: FontWeight.w500,
// fontWeight: FontWeight.w500,
),
),
) ,
body: Container(
width: double.infinity,
color: Colors.white,
child: Column(
children: [
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/appFeatures');
},
tileColor: Colors.white,
title: Text('App Features',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),),
trailing: Icon(Icons.keyboard_arrow_right),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/whoUseApp');
},
// tileColor: Colors.white,
title: Text('Who can use The App',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/purpose');
},
// tileColor: Colors.white,
title: Text('Purpose of the App ?',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/howUseApp');
},
// tileColor: Colors.white,
title: Text('How to Use the App',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/stayUpdated');
},
// tileColor: Colors.white,
title: Text('Stay Updated',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/changeMyPassword');
},
// tileColor: Colors.white,
title: Text('How to Change My Password',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), // Grey bottom line
),
),
child: ListTile(
onTap: (){
context.push('/user-guide/features/editMyProfile');
},
// tileColor: Colors.white,
title: Text('How to Edit My Profile',
style: TextStyle(
fontSize:16,
color: Color(0xFF414042),
fontWeight: FontWeight.w500,
fontFamily: 'Roboto',
),
),
trailing: Icon(Icons.keyboard_arrow_right),
shape: Border(
bottom: BorderSide(color: Colors.black, width: 3), // Grey bottom line
),
),
),
Spacer(),
Align(
alignment: Alignment.bottomCenter,
child: fcscBanner,
),
SizedBox(height: 30,),
],
),
),);
}
}

View File

@ -1,219 +0,0 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/custom_text.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../../components/indicators/locale_provider.dart';
import '../../../../components/my_toggle.dart';
class GettingStarted extends StatelessWidget {
GettingStarted({super.key});
final String url = 'https://fcsc.gov.ae/en-us/Pages/home.aspx';
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 56,
alignment:Alignment.center,
);
@override
Widget build(BuildContext context) {
List<TextSpan> textSpans = [
CustomTextRich.createTextSpan('How to Get Started\n', fontSize: 17,
color: Colors.black87,
fontWeight: FontWeight.bold,
),
CustomTextRich.createTextSpan('1.Download the app from the App Store or Google Play Store.',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
spacingTop: 1.9,
),
CustomTextRich.createTextSpan(
'2.Log in to unlock advanced features or continue as a guest.\n',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
spacingTop: 1.9,),
CustomTextRich.createTextSpan(
'3.Navigate through categories, explore metrics, and bookmark essential information.\n',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
),
CustomTextRich.createTextSpan('\nStay Updated', fontSize: 15,
color: Colors.black87,
fontWeight: FontWeight.w600,
height: 2,
),
CustomTextRich.createTextSpan(
'\nThe app regularly updates datasets and features to reflect the latest information. Notifications will alert you about new data or improvements.',
fontSize: 13, color:Color(0xFF898C81),
fontWeight: FontWeight.normal ,
),
CustomTextRich.createTextSpan(
'Support decision-making and research with reliable, up-to-date data.\n \n ',
fontSize: 14.0,
color: Color(0xFF898C81),
fontWeight: FontWeight.normal,
),
];
return Scaffold(
appBar: AppBar(
elevation: 3,
shadowColor: Colors.black,
title: Text('About the App',),
leading: IconButton(
onPressed: (){
context.go('/user-guide');
},
color: Colors.black,
icon: const Icon(Icons.arrow_back_ios_new),),
actions: [
Consumer(
builder: (context, ref, _) {
final locale = ref.watch(localeProvider); // Current locale
return MyToggle(
isOn: locale?.languageCode == 'en',
knobTextWhenOn: 'ع',
knobTextWhenOff: 'EN',
pathColorWhenOn: Colors.grey.shade300,
pathColorWhenOff: Colors.grey.shade300,
onTap: () {
ref.read(localeProvider.notifier).toggleLocale();
},
);
// IconButton(
// icon: Icon(locale?.languageCode == 'en'
// ? Icons.toggle_off_outlined
// : Icons.toggle_on_outlined,),
// onPressed: () {
// ref.read(localeProvider.notifier).toggleLocale();
// },
// );
},
),
],
),
// title: Text('About the App',),
// showBackButton: true,
body:SafeArea(
child: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Colors.white,
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Text.rich(
TextSpan(
text: 'The',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
children: [
TextSpan(
text:' Federal Competitiveness and Statistics Centre (FCSC),',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.black87,
),
),
TextSpan(
text:' in your App is designed to provide registered and approved users with access to accurate and comprehensive statistics about the UAE. The app serves as a centralized platform for exploring key datasets, trends, and insights across various sectors.',
style: TextStyle(
fontSize: 19,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
),
],
),
),
),
Column(
children: [
Container(
color: Colors.grey[50], // Set the background color here
// child: SingleChildScrollView(
child: CustomTextRich(
textSpans: textSpans,
padding: const EdgeInsets.all(16.0),
textAlign: TextAlign.start,
),
),
Container(
color: Colors.grey[50],
padding: EdgeInsets.only(bottom: 26.0),
child:Text.rich(
TextSpan(
text: 'For more information please visit ',
style: TextStyle(
fontSize: 16.0,
color: Color(0xFF265E84),
fontWeight: FontWeight.normal,),
children: [
TextSpan(
text: 'www.fcsc.gov.ae',
style: TextStyle(
fontSize: 16.0,
color: Color(0xFF568898),
fontWeight: FontWeight.normal,
decoration: TextDecoration.underline,
decorationColor:Color(0xFF568898),
),
recognizer: TapGestureRecognizer()
..onTap = () async {
final Uri uri = Uri.parse(url);
if (await launchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
} else {
throw 'Could not launch $url';
}
},
),
],
),
),
),
Container(
color: Colors.grey[50],
padding: EdgeInsets.only(bottom: 26.0),
width: MediaQuery.of(context).size.width,
child: Center(
child: fcscBanner,
),
),
],
),
],
),
),
),
),
);
}
}

View File

@ -1,148 +0,0 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
class UserGuide extends StatefulWidget {
const UserGuide({super.key});
@override
State<UserGuide> createState() => _UserGuideState();
}
class _UserGuideState extends State<UserGuide> {
@override
Widget build(BuildContext context) {
List<Widget> createRows(List<List<Map<String, dynamic>>> items) {
return items.map((pair) {
return Padding(
padding: const EdgeInsets.only(bottom: 20),
child: Row(
mainAxisAlignment: pair.length == 1
? MainAxisAlignment.center
: MainAxisAlignment.spaceEvenly,
children: pair.map((item) {
return userGuides(
color: item['color'] as Color,
text: item['text'] as String,
dynamicIcon: item['icon'],
routePath:item['routePath']as String,
);
}).toList(),
),
);
}).toList();
}
return BaseScaffold(
title: Text('User Guide'),
body: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(16.0), // Padding around content
child: Column(
children: createRows([
// Each pair defines a row of (Color, Text) pairs
[
{'routePath':'gettingStarted','color': Color(0xFF90B0D5), 'text': 'Getting Started', 'icon': 'START',},
{'routePath':'features','color': Color(0xFFAA8E83), 'text': 'Using Features', 'icon': Icons.stars_outlined,},
],
[
{'routePath':'faq','color': Color(0xFF7296BE), 'text': 'FAQs', 'icon': Icons.question_answer_sharp,},
// {'routePath':'features','color': Color(0xFF7DAFBC), 'text': 'Advanced Settings', 'icon': Icons.settings_outlined, 'index': '6'},
],
]),
),
),
), );
}
}
class userGuides extends StatelessWidget {
const userGuides({super.key, required this.routePath ,required this.color, required this.text,required this.dynamicIcon});
final Color color;
final String text;
final dynamic dynamicIcon;
final String routePath;
Widget buildDynamicWidget(dynamic icons, Color iconColor) {
if (dynamicIcon is IconData) {
return Icon(
icons,
size: 38,
color: iconColor,
);
} else if (dynamicIcon is String) {
// Create a Text widget if variable is a String
return Text(
icons,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 20,
color: iconColor,
),
);
} else {
// Handle unsupported types
return Text(
'Unsupported type',
style: TextStyle(color: Colors.red),
);
}
}
@override
Widget build(BuildContext context) {
final double screenWidth= MediaQuery.of(context).size.width;
final double screenHeight= MediaQuery.of(context).size.height;
return InkWell(
onTap: (){
context.push('/user-guide/$routePath');
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 4),
height: 110,
width: screenWidth * 0.40,
margin: EdgeInsets.all(1),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border.all(color: color,
width: 2.0)
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Icon(
// size:38,
// icons, // Home icon
// color: Colors.white,
// ),
buildDynamicWidget(dynamicIcon, color),
SizedBox(width: 10,height: 10,), // Space between icon and text
Container(
width: double.infinity,
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 5), // Padding inside the text background
decoration: BoxDecoration(
color: color, // Background color for text
borderRadius: BorderRadius.circular(5),
),
child: Text(
text,
style: TextStyle(
color: Colors.white, // Text color
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
],
),
),
);
}
}

View File

@ -0,0 +1,175 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:iconify_design/iconify_design.dart';
class Userguide extends StatefulWidget {
Userguide({super.key});
@override
State<Userguide> createState() => _UserguideState();
}
class _UserguideState extends State<Userguide> {
final List<Map<String, dynamic>> guideList = [
{'routePath':'aboutApp','color': Color(0xFF90B0D5), 'text': 'Getting Started', 'icon': 'cbi:start-tv', },
{'routePath':'features','color': Color(0xFFAA8E83), 'text': 'Using Features', 'icon': 'pajamas:issue-type-feature',},
{'routePath':'faq','color': Color(0xFF7296BE), 'text': 'FAQs', 'icon': 'mdi:faq',},
];
@override
Widget buildDynamicWidget(dynamic icons, Color color) {
if (icons is IconData) {
return Icon(
icons,
size: 38,
color: color, // Apply color dynamically
);
} else if (icons is String) {
return Text(
icons,
style: TextStyle(
// fontFamily: 'Handel',
fontWeight: FontWeight.w700,
fontSize: 20,
letterSpacing: 1.6,
color: color, // Apply color dynamically
),
);
} else {
return Text(
'Unsupported type',
style: TextStyle(color: Colors.red),
);
}
}
Widget build(BuildContext context) {
return BaseScaffold(
showDivider: true,
bottomColor: Colors.white,
dividerColor: Colors.grey[300],
appbarColor: Colors.white,
title: Padding(
padding:EdgeInsets.only(bottom:8.0),
child: Text('User Guide'),
) ,
body: Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 16 , vertical: 20),
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // Two columns
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
mainAxisExtent:MediaQuery.of(context).size.height* 0.15 ,
),
itemCount: guideList.length,
itemBuilder: (context, index) {
return HoverContainer(
iconName: guideList[index]['icon'],
title: guideList[index]['text'],
routePath: guideList[index]['routePath'],
);
},
),
),
);
}
}
class HoverContainer extends StatefulWidget {
final String iconName;
final String title;
final String routePath;
const HoverContainer({Key? key, required this.iconName, required this.title, required this.routePath}) : super(key: key);
@override
_HoverContainerState createState() => _HoverContainerState();
}
class _HoverContainerState extends State<HoverContainer> {
bool isHovered = true;
@override
Widget build(BuildContext context) {
final double screenWidth= MediaQuery.of(context).size.width;
final double screenHeight= MediaQuery.of(context).size.height;
return GestureDetector(
onTap: () { context.push('/user-guide/${widget.routePath}');},
child: MouseRegion(
onEnter: (_) => setState(() => isHovered = true),
onExit: (_) => setState(() => isHovered = true),
child : Container(
padding: EdgeInsets.only(top: 4, right: 4, left: 4, bottom: 6),
height: screenHeight* 0.23 ,
width: screenWidth*0.30,
margin: EdgeInsets.all(1),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: isHovered
? [
BoxShadow(
color: Colors.black.withOpacity(0.2),
blurRadius:2,
spreadRadius: 1,
offset: Offset(0, 4),
),
]
: [],
border: Border.all(
color: Color(0xFF7DAFBC),
width: 1.0
),
),
alignment: Alignment.center,
// duration: Duration(milliseconds: 200),
child: LayoutBuilder(builder: (context, constraints){
double containerWidth = constraints.maxWidth;
// double containerHeight = constraints.maxHeight;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconifyIcon(icon: widget.iconName,
color: Color((0xFF7DAFBC)),
size: containerWidth * 0.25,),
// buildDynamicWidget(data['icon'], Color(0xFF7DAFBC)),
SizedBox(width: 10,height: containerWidth * 0.04,), // Space between icon and text
Container(
width: containerWidth* 0.85,
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4),
margin: EdgeInsets.only(bottom: 3),
decoration: BoxDecoration(
color: Color(0xFF7DAFBC),
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Color(0xFF7DAFBC))
),
child: Text(
widget.title,
style: TextStyle(
color: Colors.white, // Text color
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
],
);
})
),
),
);
}
}

View File

@ -28,16 +28,22 @@ class BaseScaffold extends ConsumerStatefulWidget {
required this.body,
required this.title,
this.actions,
this.showDivider =false,
this.dividerColor ,
this.showBackButton = false,
this.mycenterTitle = false,
this.appbarColor,
this.mytitleColor,
this.bottomColor=null,
});
final Widget body;
final Widget title;
final bool? showBackButton;
final Color? dividerColor;
final bool showDivider;
final bool showBackButton;
final bool? mycenterTitle;
final List<Widget>? actions;
final Color? bottomColor;
final Color? appbarColor, mytitleColor;
@override
@ -619,6 +625,15 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
appBar: AppBar(
title: widget.title,
backgroundColor: widget.appbarColor,
leadingWidth: widget.showBackButton ? mywidth * 0.25 : null,
bottom: widget.showDivider
? PreferredSize(
preferredSize: Size.fromHeight(1), // Height of the line
child: Container(
color: widget.dividerColor, // Line color
height: 1, // Line thickness
),
): null,
actions: widget.actions ??
[
// IconButton(
@ -838,6 +853,7 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
),
])),
bottomNavigationBar: BottomNavigationBar(
backgroundColor: widget.bottomColor ?? null,
currentIndex: _getSelectedIndex(currentRoute),
onTap: (index) => _onItemTapped(context, index),
type: BottomNavigationBarType.fixed,

View File

@ -294,6 +294,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.1"
dartz:
dependency: transitive
description:
name: dartz
sha256: e6acf34ad2e31b1eb00948692468c30ab48ac8250e0f0df661e29f12dd252168
url: "https://pub.dev"
source: hosted
version: "0.10.1"
dbus:
dependency: transitive
description:
@ -302,6 +310,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.11"
dio:
dependency: transitive
description:
name: dio
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
url: "https://pub.dev"
source: hosted
version: "5.8.0+1"
dio_web_adapter:
dependency: transitive
description:
name: dio_web_adapter
sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a
url: "https://pub.dev"
source: hosted
version: "2.1.0"
equatable:
dependency: transitive
description:
@ -543,6 +567,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_svg:
dependency: transitive
description:
name: flutter_svg
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
url: "https://pub.dev"
source: hosted
version: "2.0.17"
flutter_test:
dependency: "direct dev"
description: flutter
@ -665,6 +697,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.1.2"
iconify_design:
dependency: "direct main"
description:
name: iconify_design
sha256: "4e8593d994b94f2be6942fafa7392042df457a970763b5bed1bc0eb37ca6e776"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
image:
dependency: transitive
description:
@ -953,6 +993,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
path_provider:
dependency: transitive
description:
@ -1452,6 +1500,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.5.1"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
url: "https://pub.dev"
source: hosted
version: "1.1.18"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
url: "https://pub.dev"
source: hosted
version: "1.1.13"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
url: "https://pub.dev"
source: hosted
version: "1.1.16"
vector_math:
dependency: transitive
description:

View File

@ -22,7 +22,7 @@ dependencies:
cupertino_icons: ^1.0.6
fl_chart: ^0.70.2
iconify_design: ^1.0.1
marquee: ^2.2.3
url_launcher: ^6.3.1
# dynamic_layouts: