chart code merged

This commit is contained in:
venbaittech 2025-01-10 10:21:23 +05:30
commit d77725601e
18 changed files with 1661 additions and 1135 deletions

View File

@ -1,6 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="main.dart" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="filePath" value="$PROJECT_DIR$/frontend/lib/main.dart" />
<option name="filePath" value="$PROJECT_DIR$/lib/main.dart" />
<method v="2" />
</configuration>
</component>

View File

@ -26,8 +26,8 @@ if (flutterVersionName == null) {
android {
namespace = "ae.gov.fcsc.frontend"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
// ndkVersion = flutter.ndkVersion
ndkVersion = "25.1.8937393"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21

View File

@ -294,9 +294,7 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/competitiveness.dart';
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/country_profile.dart';
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/uae_numbers.dart';
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/UAE_Numbers/Social/marriages.dart';
import 'package:uae_stat/presentation/Screens/auth_verification/registration.dart';
import 'package:uae_stat/presentation/Screens/charts/chart.dart';
import 'package:uae_stat/presentation/Screens/charts/screens/chart_screen.dart';
@ -304,6 +302,10 @@ import 'package:uae_stat/presentation/Screens/demo_home2.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/getting_started.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';
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/Competitiveness/competitiveness.dart';
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/Country_Profile/country_profile.dart';
import '../domain/use_cases/preferences_use_case.dart';
import '../presentation/Screens/auth_verification/changepassword.dart';
import '../presentation/Screens/auth_verification/confirm_password.dart';
@ -324,8 +326,8 @@ final GoRouter router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => LoginRoute(),
// builder: (context, state) => MyHomePage(),
//builder: (context, state) => LoginRoute(),
builder: (context, state) => MyHomePage(),
),
GoRoute(
path: '/login',
@ -415,24 +417,30 @@ final GoRouter router = GoRouter(
path: '/user-guide',
builder: (context, state) => UserGuide(),
routes: <RouteBase>[
GoRoute(
path: '/features',
name: 'features',
builder: (context, state) => UsingFeatures(),
GoRoute(path: '/features',
name: 'features',
builder: (context, state) => UsingFeatures(),
),
GoRoute(
path: '/faq',
name: 'faq',
builder: (context, state) => FAQPage(),
GoRoute(path: '/faq',
name: 'faq',
builder: (context, state) => FAQPage(),
),
GoRoute(
path: '/gettingStarted',
name: 'gettingStarted',
builder: (context, state) => GettingStarted(),
GoRoute(path: '/gettingStarted',
name: 'gettingStarted',
builder: (context, state) => GettingStarted(),
),
],
),
// GoRoute(
// path: '/manageuser',
// builder: (context, state) {
// // Retrieve the title from extra or query params
// final title = state.extra as String? ?? 'Manage users';
// return ManageUserRouter(title: title);
// },
// ),
GoRoute(
path: '/editProfile',
builder: (context, state) => EditProfile(),
@ -443,9 +451,13 @@ final GoRouter router = GoRouter(
),
// Bottom Navigation Routes
// GoRoute(
// path: '/uaenumbers',
// builder: (context, state) => UaeNumbers(),
// ),
GoRoute(
path: '/uaenumbers',
builder: (context, state) => UaeNumbers(),
path: '/uaenumbers',
builder: (context,state) => UaeNumbers()
),
GoRoute(
@ -457,5 +469,10 @@ final GoRouter router = GoRouter(
path: '/countryprofile',
builder: (context, state) => CountryProfile(),
),
GoRoute(
path: '/marriages',
builder: (context, state) => Marriages(),
),
],
);

View File

@ -0,0 +1,142 @@
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:fl_chart/fl_chart.dart';
class CountryProfile extends StatelessWidget {
const CountryProfile({super.key});
@override
Widget build(BuildContext context) {
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
return BaseScaffold(
title: Center(
child: SizedBox(
height: myheight / 5,
width: mywidth / 3,
child: Image(image: AssetImage('assets/logos/uae_stat.png')))),
body: CountryProfileWidget(),
);
}
}
class CountryProfileWidget extends StatelessWidget {
const CountryProfileWidget({super.key});
@override
Widget build(BuildContext context) {
return HorizontalBarChart();
}
}
class HorizontalBarChart extends StatelessWidget {
final List<String> xAxisData = ['2019', '2020', '2021', '2022', '2023'];
final List<double> yAxisData = [2, 4, 1, 5, 3];
@override
Widget build(BuildContext context) {
double myheight = MediaQuery.of(context).size.height;
return Scaffold(
appBar: AppBar(title: Text('Horizontal Bar Chart')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child:
Container(
height: myheight/4,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 8,
offset: Offset(0, 4),
),
],
),
child:
Padding(
padding: const EdgeInsets.only(top: 16,left: 8.0,right: 8.0,bottom: 8.0),
child: BarChart(
BarChartData(
alignment: BarChartAlignment.spaceAround,
maxY: 8,
barTouchData: BarTouchData(enabled: false),
titlesData: FlTitlesData(
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
interval: 2,
getTitlesWidget: (value, meta) {
return Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Text('${value.toInt()}K'),
);
},
reservedSize: 60,
),
),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, meta) {
return Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(xAxisData[value.toInt()]),
);
},
reservedSize: 40,
),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false), // Hides top titles
),
rightTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false), // Hides right titles
),
),
gridData: FlGridData(show: false),
borderData: FlBorderData(show: false),
barGroups: List.generate(
xAxisData.length,
(index) => BarChartGroupData(
x: index,
barRods: [
BarChartRodData(
toY: yAxisData[index],
color: Colors.blueAccent,
//colors: [Colors.blueAccent],
borderRadius: BorderRadius.circular(4),
width: 20,
),
],
),
),
),
),
),
),
),
);
}
}
void main() {
runApp(MaterialApp(home: HorizontalBarChart()));
}
// void main() {
// runApp(MaterialApp(home: HorizontalBarChart()));
// }

View File

@ -0,0 +1,265 @@
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/components/constant/constant.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:fl_chart/fl_chart.dart';
class Marriages extends StatelessWidget {
const Marriages({super.key});
@override
Widget build(BuildContext context) {
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
final List<String> xAxisData = ['2019', '2020', '2021', '2022', '2023'];
final List<double> yAxisData = [2, 4, 1, 5, 3];
return BaseScaffold(
appbarColor: Color(0xFFC6BEB2),
title: Text("UAE Numbers",style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold),),
showBackButton: true,
body: SingleChildScrollView(
child: Column(
children : [
Container(
height: myheight/4.5,
width: double.infinity,
color: Color(0xFFC6BEB2),
child: Padding(padding: EdgeInsets.only(left: 30,right: 30,top: 20,bottom: 10),child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("SOCIAL",style: TextStyle(color: Colors.white,fontSize: 30),),
Container(width: mywidth/5,child: Divider(thickness: 10,color: Colors.white,)),
Text("Marriages",style: TextStyle(color: Colors.white,fontSize: 20),),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(onPressed: (){}, icon: Icon(Icons.bookmark_add_outlined,color: Colors.white,size: 40,)),
IconButton(onPressed: (){}, icon: Icon(Icons.share,color: Colors.white,size: 30,)),
],),
],
),)
),
SingleChildScrollView(child: Container(
height: myheight,
color: Color(0xFFC6BEB2),
child: Padding(
padding: const EdgeInsets.only(top: 0.0,left: 10,right: 10,bottom: 20),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Container(height: myheight/3.5,width: mywidth/2.5,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10))
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/icons/indicator/social/marriage.png',
height: myheight / 10, // This ensures the image fits within the container's height
width: myheight / 10, // You can adjust the size as needed
),
Text("Total",style: TextStyle(fontWeight: FontWeight.bold,fontSize: 26),),
Text("2022",style: TextStyle(fontSize: 15,color: Colors.grey),),
Text("16759",style: TextStyle(fontSize: 26,fontWeight: FontWeight.bold,color: socialColor),),
],
),
),
Container(height: myheight/3.5,width: mywidth/2.5,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10))
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/icons/indicator/social/marriage.png',
height: myheight / 10, // This ensures the image fits within the container's height
width: myheight / 10, // You can adjust the size as needed
),
Text("Average",style: TextStyle(fontWeight: FontWeight.bold,fontSize: 26),),
Text("(2021 - 2022)",style: TextStyle(fontSize: 15,color: Colors.grey),),
Text("15987",style: TextStyle(fontSize: 26,fontWeight: FontWeight.bold,color: socialColor),),
],
),
),
],
),
SizedBox(height: myheight/20,),
Container(
height: myheight/2.5,
width: mywidth/1.2,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10))
),
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
children: [
SizedBox(height: myheight/30,),
Center(child: Text("Total Marriages by Marriage Type",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),),
),
SizedBox(height: myheight/30,),
Container(
height: myheight/4,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 8,
offset: Offset(0, 4),
),
],
),
child:
Padding(
padding: const EdgeInsets.only(top: 16,left: 8.0,right: 8.0,bottom: 8.0),
child: BarChart(
BarChartData(
alignment: BarChartAlignment.spaceAround,
maxY: 8,
barTouchData: BarTouchData(enabled: false),
titlesData: FlTitlesData(
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
interval: 2,
getTitlesWidget: (value, meta) {
return Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Text('${value.toInt()}K'),
);
},
reservedSize: 60,
),
),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, meta) {
return Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(xAxisData[value.toInt()]),
);
},
reservedSize: 40,
),
),
topTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false), // Hides top titles
),
rightTitles: AxisTitles(
sideTitles: SideTitles(showTitles: false), // Hides right titles
),
),
gridData: FlGridData(show: false),
borderData: FlBorderData(show: false),
barGroups: List.generate(
xAxisData.length,
(index) => BarChartGroupData(
x: index,
barRods: [
BarChartRodData(
toY: yAxisData[index],
color: Colors.blueAccent,
//colors: [Colors.blueAccent],
borderRadius: BorderRadius.circular(4),
width: 20,
),
],
),
),
),
),
),
),
// Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(12),
// boxShadow: [
// BoxShadow(
// color: Colors.black12,
// blurRadius: 8,
// offset: Offset(0, 4),
// ),
// ],
// ),
// child:
// BarChart(
// BarChartData(
// alignment: BarChartAlignment.spaceAround,
// maxY: 20,
// barTouchData: BarTouchData(enabled: false),
// titlesData: FlTitlesData(
// leftTitles: AxisTitles(
// sideTitles: SideTitles(
// showTitles: true,
// getTitlesWidget: (value, meta) {
// return Padding(
// padding: const EdgeInsets.only(right: 8.0),
// child: Text('${value.toInt()}K'),
// );
// },
// reservedSize: 40,
// ),
// ),
// bottomTitles: AxisTitles(
// sideTitles: SideTitles(
// showTitles: true,
// getTitlesWidget: (value, meta) {
// return Padding(
// padding: const EdgeInsets.only(top: 8.0),
// child: Text(xAxisData[value.toInt()]),
// );
// },
// reservedSize: 40,
// ),
// ),
// ),
// gridData: FlGridData(show: false),
// borderData: FlBorderData(show: false),
// barGroups: List.generate(
// xAxisData.length,
// (index) => BarChartGroupData(
// x: index,
// barRods: [
// BarChartRodData(
// toY: yAxisData[index],
// color: Colors.blueAccent,
// //colors: [Colors.blueAccent],
// borderRadius: BorderRadius.circular(4),
// width: 20,
// ),
// ],
// ),
// ),
// ),
// ),
// ),
],
),
),
)
],
),
),
),)
]
),
), mycenterTitle: false,
);
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:uae_stat/presentation/components/constant/constant.dart';
@ -124,10 +125,10 @@ class uaenumberWidget extends StatelessWidget {
]),
buildCategoryTitle('Vital Statistics', socialColor),
buildCardRow([
buildCard(context, 'Marriages', '96%', '2023', socialColor,
socialColor, mywidth / 2.5),
buildCard(context, 'Divorces', '1.2K', '2024', socialColor,
socialColor, mywidth / 2.5),
InkWell(onTap : (){
context.go('/marriages');
},child: buildCard(context,'Marriages', '96%', '2023',socialColor,socialColor,mywidth/2.5)),
InkWell(onTap : (){},child: buildCard(context,'Divorces', '1.2K', '2024',socialColor,socialColor,mywidth/2.5)),
]),
buildCategoryTitle('Education', socialColor),
buildCardRow([
@ -316,7 +317,6 @@ class _CustomExpandableTileState extends State<CustomExpandableTile> {
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
width: double.infinity,
height: isExpanded ? myheight : 0,
child: isExpanded
? SingleChildScrollView(
child: Container(

View File

@ -1,31 +0,0 @@
import 'package:flutter/material.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
class CountryProfile extends StatelessWidget {
const CountryProfile({super.key});
@override
Widget build(BuildContext context) {
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
return BaseScaffold(
title: Center(
child: SizedBox(
height: myheight / 5,
width: mywidth / 3,
child: Image(image: AssetImage('assets/logos/uae_stat.png')))),
body: CountryProfileWidget()
);
}
}
class CountryProfileWidget extends StatelessWidget {
const CountryProfileWidget({super.key});
@override
Widget build(BuildContext context) {
return Center(child: Text("COuntry Profile"),);
}
}

View File

@ -191,11 +191,11 @@ class _MyHomePageState extends State<MyHomePage> {
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
return BaseScaffold(
title: Center(
child: SizedBox(
height: myheight / 5,
width: mywidth / 3,
child: Image(image: AssetImage('assets/logos/uae_stat.png')))),
mycenterTitle: true,
title: SizedBox(
height: myheight / 5,
width: mywidth / 3,
child: Image(image: AssetImage('assets/logos/uae_stat.png'))),
body: EconomyStats(),
);
}

View File

@ -1,64 +1,56 @@
import 'package:flutter/material.dart';
class CustomContainer extends StatelessWidget {
final String text;
final EdgeInsetsGeometry padding;
final bool isBulletPoint;
final TextStyle? textStyle;
final double? fontSize;
final double? height;
final double defaultFontSize ;
final TextDecoration textDecoration ;
final Color? decorationColor;
final FontWeight fontWeight;
final Color color;
class CustomTextRich extends StatelessWidget {
const CustomContainer({
const CustomTextRich({
super.key,
required this.text,
required this.textSpans,
this.padding = const EdgeInsets.all(8.0),
this.isBulletPoint = false,
this.textStyle,
this.fontSize,
this.defaultFontSize=14,
this.height,
this.textDecoration = TextDecoration.none,
this.fontWeight =FontWeight.w500,
this.decorationColor,
this.color=const Color(0xFF898C81),
this.textAlign = TextAlign.left,
});
final List<TextSpan> textSpans;
final EdgeInsetsGeometry padding;
final TextAlign textAlign;
@override
Widget build(BuildContext context) {
return Padding(
padding: padding,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (isBulletPoint)
Text(
"",
return SingleChildScrollView(
child :Padding(
padding: padding,
child: Text.rich(
TextSpan(children: textSpans),
textAlign: textAlign,
),
),
);
style: TextStyle(fontSize: fontSize ?? defaultFontSize,
color: color,
fontWeight: fontWeight,
height: height,),
),
Expanded(
child: Text(
text,
style: TextStyle(
fontSize: fontSize ?? defaultFontSize,
color: color,
fontWeight: fontWeight,
height: height,
decoration: textDecoration,
decorationColor: decorationColor ?? color,
),
),
),
],
}
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,6 +1,6 @@
import 'package:flutter/material.dart';
import '../../custom_drawer_routes.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
class FAQPage extends StatefulWidget {
const FAQPage({super.key});
@ -13,38 +13,63 @@ class _FAQPageState extends State<FAQPage> {
@override
Widget build(BuildContext context) {
return BaseScaffold(
title: Text('FAQs'),
body: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
title: Text('FAQs',
style: TextStyle(
color:Color(0xFF7296BE),
fontWeight: FontWeight.w500,
),),
showBackButton: true,
body: SafeArea(child:Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
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: [
Container(
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Text(
'HERE ARE SOME COMMON QUESTIONS ABOUT THE FEDERAL COMPETITIVENESS AND STATISTICS CENTRE (FCSC) MOBILE APPLICATION:',
style: TextStyle(
color: Color(0xFF265E84), // Text color
fontSize: 18,
fontWeight: FontWeight.w600
),
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,
child: QuestionAnswerScrollView()
)
],
),
),
),
Expanded(child: Scrollbar(
thumbVisibility: true,
thickness: 8,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child:Container(
padding: const EdgeInsets.all(0.0),
color: Colors.grey[50],
child: QuestionAnswerScrollView(),
),
),
),),
],
),
),
);
}
@ -52,24 +77,194 @@ class _FAQPageState extends State<FAQPage> {
}
class QuestionAnswerScrollView extends StatelessWidget {
final List<Map<String, String>> questionsAndAnswers = [
{'question': '1. 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': '2. How do I bookmark a metric?',
'answer': 'When viewing a metric, tap on the Bookmark icon. Your bookmarks are accessible from the My Bookmarks section in the navigation bar.'},
{'question': '3.Can I view the app in another language?', 'answer': 'Yes, the app supports both English and Arabic. You can toggle the language using the switch in the top-right corner of the app.'},
{'question': '4.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.'},
{'question':'5. 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.'},
{'question':'6.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.'},
{'question':'7.Do I need to create an account to use the app?',
'answer':"Yes, the app is strictly for registered and approved users. To access the data:You need to sign up using the Register Now option on the login screen .Your registration must be approved by the admin.Once approved, you can log in to access the app's features and datasets.Guest access is not available for this application."},
{'question':'8.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.Drill down into specific metrics or graphical views by tapping on a KPI.Access additional features like Bookmarks or Profile through the navigation bar.'},
{'question':'9.What types of data are available?','answer':'The app offers data on:Economy: GDP, growth rates, and economic trends.Environment: Electricity production, water consumption, and more.Social: Labor force distribution, participation rates, and demographic data.'},
{'question':'10.What types of graphs and charts are available?','answer':'The app provides a variety of visualizations, including:Line charts for trends.Bar and column charts for comparisons.Stacked charts for multi-layered data views.'},
];
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(),
@ -78,9 +273,10 @@ class QuestionAnswerScrollView extends StatelessWidget {
}
}
class QuestionAnswerCard extends StatefulWidget {
final Map<String, String> qa;
QuestionAnswerCard({required this.qa});
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();
@ -92,18 +288,18 @@ class _QuestionAnswerCardState extends State<QuestionAnswerCard> {
@override
Widget build(BuildContext context) {
return Card(
color: Colors.white,
color: Colors.grey[50],
elevation: 1,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.zero, // No rounding, it's a rectangle
),
margin: EdgeInsets.symmetric(vertical: 0,),
margin: EdgeInsets.symmetric(vertical: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
dense: true,
textColor:Color(0xFF414042),
textColor: Color(0xFF414042),
title: Text(
widget.qa['question']!,
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 15),
@ -118,8 +314,10 @@ class _QuestionAnswerCardState extends State<QuestionAnswerCard> {
if (isExpanded)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
widget.qa["answer"]!,
child: widget.qa['answer'] is RichText
? widget.qa['answer']
: Text(
widget.qa['answer'] ?? '',
style: TextStyle(color: Colors.grey),
),
),

View File

@ -1,3 +1,4 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
@ -5,152 +6,174 @@ import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_g
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';
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,
);
final List<Map<String, dynamic>> contentList = [
{
'text': 'This app provides a centralized platform to access key statistical data and insights about the UAE, empoweringusers with accurate and up-to-date information on various sectors.',
'fontSize': 16.0,
'color': Color(0xFF898C81),
'fontWeight': FontWeight.normal,
'isBulletPoint': false,
},
{
'text': 'How to Get Started',
'fontSize': 18.0,
'color': Color(0xFF414042),
'fontWeight': FontWeight.w600,
'isBulletPoint': false,
},
{
'text': '1.Download the app from the App Store or Google Play Store.',
'fontSize': 14.0,
'color': Color(0xFF898C81),
'fontWeight': FontWeight.normal,
'isBulletPoint': false,
},
{
'text': '2.Log in to unlock advanced features or continue as a guest.',
'fontSize': 14.0,
'color': Color(0xFF898C81),
'fontWeight': FontWeight.normal,
'isBulletPoint': false,
},
{
'text': '3.Navigate through categories, explore metrics, and bookmark essential information.',
'fontSize': 14.0,
'color': Color(0xFF898C81),
'fontWeight': FontWeight.normal,
'isBulletPoint': false,
},
{
'text': 'Stay Updated',
'fontSize': 18.0,
'color': Color(0xFF414042),
'fontWeight': FontWeight.bold,
'isBulletPoint': false,
},
{
'text': 'The app regularly updates datasets and features to reflect the latest information. Notifications will alert you about new data or improvements.',
'fontSize': 14.0,
'color': Color(0xFF898C81),
'fontWeight': FontWeight.normal,
'isBulletPoint': false,
},
];
@override
Widget build(BuildContext context) {
return BaseScaffold(title: Text ('Getting Started'),
body: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child:SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Text(
'WELCOME TO THE FEDERAL COMPETITIVENESS AND STATISTICS CENTRE (FCSC) MOBILE APPLICATION.',
style: TextStyle(
color: Color(0xFF265E84), // Text color
fontSize: 18,
fontWeight: FontWeight.w600
),
),
),
Container(
padding: const EdgeInsets.all(16.0),
color: Color(0xFFD9D9D9),
child:ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: contentList.length,
itemBuilder: (context, index) {
final item = contentList[index];
return CustomContainer(
text: item['text'],
fontSize: item['fontSize']?? 20,
color: item['color'],
fontWeight: item['fontWeight'],
height:item['height'],
isBulletPoint: item['isBulletPoint'] ?? false,
textDecoration: item['textDecoration'] ?? TextDecoration.none,
decorationColor: item['decorationColor'],
);
},
),
),
Container(
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
color: Color(0xFFD9D9D9),
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: 'For more information please visit ',
style: TextStyle(
fontSize: 16.0,
color: Color(0xFF265E84),
fontWeight: FontWeight.normal,
),
),
List<TextSpan> textSpans = [
TextSpan(
text: 'www.fcsc.gov.ae',
style: TextStyle(
fontSize: 16.0,
color: Color(0xFF568898),
fontWeight: FontWeight.normal,
decoration: TextDecoration.underline,
decorationColor:Color(0xFF568898),
),
),
],
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 BaseScaffold( title: Text('About the App',
style: TextStyle(
color:Color(0xFF265E84),
fontWeight: FontWeight.w500,
),
),
showBackButton: true,
body:SafeArea(child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
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,
),
),
),
Container(
color: Color(0xFFD9D9D9),
padding: const EdgeInsets.all(16.0),
width: MediaQuery.of(context).size.width,
child: Center( child: fcscBanner,),
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,
),
),
],
),
),
),
Expanded(child: Scrollbar(
thumbVisibility: true,
thickness: 6,
radius: Radius.circular(10),
interactive: true,
child: SingleChildScrollView(
child: 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

@ -43,14 +43,10 @@ class _UserGuideState extends State<UserGuide> {
// Each pair defines a row of (Color, Text) pairs
[
{'routePath':'gettingStarted','color': Color(0xFF90B0D5), 'text': 'Getting Started', 'icon': 'START', 'index': '1'},
{'routePath':'features','color': Color(0xFF497B8C), 'text': 'Account & Profile', 'icon': Icons.person_outline_rounded, 'index': '2'},
{'routePath':'features','color': Color(0xFFAA8E83), 'text': 'Using Features', 'icon': Icons.stars_outlined, 'index': '2'},
],
[
{'routePath':'features','color': Color(0xFFAA8E83), 'text': 'Using Features', 'icon': Icons.stars_outlined, 'index': '3'},
{'routePath':'features','color': Color(0xFF265E84), 'text': 'Contact', 'icon': Icons.local_phone_outlined, 'index': '4'},
],
[
{'routePath':'faq','color': Color(0xFF7296BE), 'text': 'FAQs', 'icon': Icons.question_answer_sharp, 'index': '5'},
{'routePath':'faq','color': Color(0xFF7296BE), 'text': 'FAQs', 'icon': Icons.question_answer_sharp, 'index': '3'},
// {'routePath':'features','color': Color(0xFF7DAFBC), 'text': 'Advanced Settings', 'icon': Icons.settings_outlined, 'index': '6'},
],
]),

View File

@ -1,95 +1,25 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:pocketbase/pocketbase.dart';
import 'package:share_plus/share_plus.dart';
import 'package:shared_preferences/shared_preferences.dart';
class BaseScaffold extends StatefulWidget {
class BaseScaffold extends StatelessWidget {
final Widget body;
final Widget title;
final bool ? showBackButton;
final bool ? mycenterTitle;
final List<Widget>? actions;
final Color? appbarColor, mytitleColor;
const BaseScaffold({
Key? key,
required this.body,
required this.title,
this.actions,
this.showBackButton = false,
this.mycenterTitle = false, this.appbarColor, this.mytitleColor
}) : super(key: key);
@override
_BaseScaffoldState createState() => _BaseScaffoldState();
}
class _BaseScaffoldState extends State<BaseScaffold> {
final _pb = PocketBase('https://pb.venbait.in');
String _avatarUrl = '';
dynamic userId;
String? userName;
String? userEmail;
String? userAvatar;
String? role;
@override
void initState() {
super.initState();
_checkUserId();
}
// Method to retrieve userId from SharedPreferences
Future<String?> getUserId() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('userId'); // Retrieve the userId
}
// Method to check if userId exists and update state
Future<void> _checkUserId() async {
String? fetchedUserId = await getUserId();
if (fetchedUserId != null && fetchedUserId.isNotEmpty) {
setState(() {
userId = fetchedUserId;
});
//print('NAVUser ID: $userId');
_fetchUserData();
} else {
print('No userId found');
// Handle the case where userId is not available
}
}
Future<void> _fetchUserData() async {
try {
final adminAuth = await _pb.admins
.authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com');
final adminToken = adminAuth.token;
//print('adminToken- ${adminToken}');
final userDetailsResponse = await _pb.collection('users').getOne(
userId!,
headers: {
'Authorization': 'Bearer $adminToken',
},
);
print('NAVuserDetails: $userDetailsResponse');
setState(() {
userName = userDetailsResponse.data['username'] ?? '';
userEmail = userDetailsResponse.data['email'] ?? '';
userAvatar = userDetailsResponse.data['avatar'] ?? '';
role = userDetailsResponse.data['role'] ?? '';
String recordId = userId;
String collectionId =
userDetailsResponse.data['collectionId'] ?? '_pb_users_auth_';
if (userAvatar!.isNotEmpty && recordId.isNotEmpty) {
_avatarUrl =
'https://pb.venbait.in/api/files/$collectionId/$recordId/$userAvatar';
} else {
_avatarUrl = ''; // Reset to default or empty
}
});
} catch (e) {
print('Error fetching user details: $e');
}
}
// final Widget body;
//
// const BaseScaffold({required this.body});
@override
Widget build(BuildContext context) {
@ -97,29 +27,79 @@ class _BaseScaffoldState extends State<BaseScaffold> {
String currentRoute = GoRouterState.of(context).matchedLocation;
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
return Scaffold(
appBar: AppBar(
title: widget.title,
actions: [
// IconButton(
// onPressed: () {
// // Share logic here
// print("Share icon pressed");
// Share.share(
// 'Open the app: fcscapp://home\n\n'
// 'If you dont have the app installed, '
// 'visit: http://localhost:65493');
// },
// icon: Icon(Icons.share),
// ),
IconButton(onPressed: () {}, icon: Icon(Icons.toggle_off_outlined)),
],
appBar: AppBar(title: title, backgroundColor : appbarColor,actions: [
IconButton(onPressed: () {}, icon: Icon(Icons.toggle_off_outlined)),
],
leading:
// Stack(
// children: [
// // Show the back button if showBackButton is true, otherwise show the drawer menu
// if (showBackButton == true)
// Positioned(
// left: 0,
// child: IconButton(
// color: Colors.white,
// icon: Icon(Icons.arrow_back_ios_new),
// onPressed: () {
// Navigator.of(context).pop();
// },
// ),
// ),
// // Show the drawer icon in all cases
// Positioned(
// right: 0,
// child: IconButton(
// color: (showBackButton == true)? Colors.white : Colors.black,
// icon: Icon(Icons.menu),
// onPressed: () {
// // Open the drawer using the Scaffold context
// Scaffold.of(context).openDrawer();
// },
// ),
// ),
// ],
// ),
Stack(
children: [
// Show the back button if showBackButton is true
if (showBackButton == true)
Positioned(
left: 15,
child: IconButton(
color: Colors.white,
icon: Icon(Icons.arrow_back_ios_new),
onPressed: () {
Navigator.of(context).pop();
},
),
),
// Show the drawer icon in all cases
Positioned(
right: 10,
child: Builder(
builder: (BuildContext context) {
return IconButton(
color: (showBackButton == true) ? Colors.white : Colors.black,
icon: Icon(Icons.menu),
onPressed: () {
// Open the drawer using the Scaffold context
Scaffold.of(context).openDrawer();
},
);
},
),
),
],
)
),
drawer: Drawer(
child: ListView(
children: [
DrawerHeader(
//decoration: BoxDecoration(color: Colors.blue),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
@ -137,39 +117,18 @@ class _BaseScaffoldState extends State<BaseScaffold> {
child: Row(
children: [
SizedBox(
width: mywidth / 8,
height: mywidth / 8,
child: ClipOval(
child: _avatarUrl.isNotEmpty
? Image(
image: NetworkImage(_avatarUrl),
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
)
: Image(
image: AssetImage(
'assets/edit_profile/profile.png'),
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
),
),
//child: Image(image: AssetImage('assets/edit_profile/profile.png'))
),
width: mywidth / 8,
child: Image(
image: AssetImage(
'assets/edit_profile/profile.png'))),
SizedBox(
width: mywidth / 20,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Text(userId ?? 'Loading user...'), // Display userId here
// Text('Mohammad@fcsc.com')
Text(userName ?? 'Loading...'),
Text(
userEmail ?? 'Loading...',
style: TextStyle(fontSize: 12),
),
Text('Mohammad'),
Text('Mohammad@fcsc.com')
],
)
],
@ -178,44 +137,33 @@ class _BaseScaffoldState extends State<BaseScaffold> {
],
),
),
if (role != 'admin')
ListTile(
leading: SizedBox(
height: myheight / 15,
width: mywidth / 15,
child: Image(
image: AssetImage('assets/icons/drawer/message.png'))),
title: Text('Feedback'),
onTap: () => context.go('/feedback'),
),
if (role == 'admin')
ListTile(
leading: SizedBox(
height: myheight / 15,
width: mywidth / 15,
child: Image(
image:
AssetImage('assets/icons/drawer/manageuser.png'))),
title: Text('Manage User'),
onTap: () => context.go('/manageuser'),
),
ListTile(
leading: SizedBox(
height: myheight / 15,
width: mywidth / 15,
child:
Image(image: AssetImage('assets/icons/drawer/book.png'))),
title: Text('User Guide'),
onTap: () => context.go('/user-guide'),
child: Image(
image: AssetImage('assets/icons/drawer/message.png'))),
title: Text('Feedback'),
onTap: () => context.go('/feedback'),
),
ListTile(
leading: SizedBox(
height: myheight / 15,
width: mywidth / 15,
child: Image(
image: AssetImage('assets/icons/drawer/logout.png'))),
title: Text('Logout'),
onTap: () => context.go('/'),
image: AssetImage('assets/icons/drawer/manageuser.png'))),
title: Text('Manage User'),
onTap: () => context.go('/manageuser'),
),
ListTile(
leading: SizedBox(
height: myheight / 15,
width: mywidth / 15,
child: Image(
image: AssetImage('assets/icons/drawer/book.png'))),
title: Text('User Guide'),
onTap: () => context.go('/user-guide'),
),
],
),
@ -261,40 +209,40 @@ class _BaseScaffoldState extends State<BaseScaffold> {
unselectedItemColor: Colors.grey,
showUnselectedLabels: true,
),
body: widget.body,
body: body,
);
}
// Map the current route to the selected index
//Map the current route to the selected index
int _getSelectedIndex(String route) {
switch (route) {
case '/myhomepage':
case '/':
return 0;
case '/uaenumbers':
return 1;
case '/settings':
case '/competitiveness':
return 2;
case '/profile':
case '/countryprofile':
return 3;
default:
return 0;
}
}
// Handle navigation when an item is tapped
//Handle navigation when an item is tapped
void _onItemTapped(BuildContext context, int index) {
switch (index) {
case 0:
context.go('/myhomepage');
context.go('/');
break;
case 1:
context.go('/uaenumbers');
break;
case 2:
context.go('/settings');
context.go('/competitiveness');
break;
case 3:
context.go('/profile');
context.go('/countryprofile');
break;
}
}

View File

@ -10,6 +10,7 @@ import flutter_secure_storage_macos
import path_provider_foundation
import share_plus
import shared_preferences_foundation
import url_launcher_macos
import video_player_avfoundation
import webview_flutter_wkwebview
@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin"))
}

View File

@ -5,23 +5,23 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
url: "https://pub.dev"
source: hosted
version: "72.0.0"
version: "76.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.2"
version: "0.3.3"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
url: "https://pub.dev"
source: hosted
version: "6.7.0"
version: "6.11.0"
analyzer_plugin:
dependency: transitive
description:
@ -74,50 +74,50 @@ packages:
dependency: transitive
description:
name: build
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.2"
build_config:
dependency: transitive
description:
name: build_config
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
build_daemon:
dependency: transitive
description:
name: build_daemon
sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.0.3"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.4.3"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573"
url: "https://pub.dev"
source: hosted
version: "2.4.13"
version: "2.4.14"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
url: "https://pub.dev"
source: hosted
version: "7.3.2"
version: "8.0.0"
built_collection:
dependency: transitive
description:
@ -186,10 +186,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.0"
convert:
dependency: transitive
description:
@ -266,10 +266,10 @@ packages:
dependency: transitive
description:
name: custom_lint_visitor
sha256: "8aeb3b6ae2bb765e7716b93d1d10e8356d04e0ff6d7592de6ee04e0dd7d6587d"
sha256: bfe9b7a09c4775a587b58d10ebb871d4fe618237639b1e84d5ec62d7dfef25f9
url: "https://pub.dev"
source: hosted
version: "1.0.0+6.7.0"
version: "1.0.0+6.11.0"
dart_style:
dependency: transitive
description:
@ -385,10 +385,10 @@ packages:
dependency: "direct main"
description:
name: fl_chart
sha256: "74959b99b92b9eebeed1a4049426fd67c4abc3c5a0f4d12e2877097d6a11ae08"
sha256: "10ddaf334fe84d59333a12d153043e366f243e0bdfff2df0313e1e249f5bf926"
url: "https://pub.dev"
source: hosted
version: "0.69.2"
version: "0.70.1"
flutter:
dependency: "direct main"
description: flutter
@ -435,10 +435,10 @@ packages:
dependency: "direct dev"
description:
name: flutter_native_splash
sha256: "1152ab0067ca5a2ebeb862fe0a762057202cceb22b7e62692dcbabf6483891bb"
sha256: "7062602e0dbd29141fb8eb19220b5871ca650be5197ab9c1f193a28b17537bc7"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
version: "2.4.4"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
@ -467,26 +467,26 @@ packages:
dependency: "direct main"
description:
name: flutter_secure_storage
sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0"
sha256: "1913841ac4c7bf57cd2e05b717e1fbff7841b542962feff827b16525a781b3e4"
url: "https://pub.dev"
source: hosted
version: "9.2.2"
version: "9.2.3"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b"
sha256: bf7404619d7ab5c0a1151d7c4e802edad8f33535abfbeff2f9e1fe1274e2d705
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81"
sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
version: "3.1.3"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
@ -581,10 +581,10 @@ packages:
dependency: "direct main"
description:
name: go_router
sha256: "2fd11229f59e23e967b0775df8d5948a519cd7e1e8b6e849729e010587b46539"
sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d"
url: "https://pub.dev"
source: hosted
version: "14.6.2"
version: "14.6.3"
graphs:
dependency: transitive
description:
@ -637,10 +637,10 @@ packages:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.1.2"
image:
dependency: transitive
description:
@ -677,10 +677,10 @@ packages:
dependency: transitive
description:
name: image_picker_ios
sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b"
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
url: "https://pub.dev"
source: hosted
version: "0.8.12+1"
version: "0.8.12+2"
image_picker_linux:
dependency: transitive
description:
@ -701,10 +701,10 @@ packages:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.10.1"
image_picker_windows:
dependency: transitive
description:
@ -781,18 +781,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
@ -805,10 +805,10 @@ packages:
dependency: transitive
description:
name: lints
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
source: hosted
version: "5.0.0"
version: "5.1.1"
logging:
dependency: transitive
description:
@ -821,10 +821,10 @@ packages:
dependency: transitive
description:
name: macros
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.2-main.4"
version: "0.1.3-main.0"
mailer:
dependency: "direct main"
description:
@ -1013,10 +1013,10 @@ packages:
dependency: transitive
description:
name: pubspec_parse
sha256: "81876843eb50dc2e1e5b151792c9a985c5ed2536914115ed04e9c8528f6647b0"
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.5.0"
recase:
dependency: transitive
description:
@ -1108,10 +1108,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "3c7e73920c694a436afaf65ab60ce3453d91f84208d761fbd83fc21182134d93"
sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a
url: "https://pub.dev"
source: hosted
version: "2.3.4"
version: "2.3.5"
shared_preferences_android:
dependency: transitive
description:
@ -1164,10 +1164,10 @@ packages:
dependency: transitive
description:
name: shelf
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.dev"
source: hosted
version: "1.4.1"
version: "1.4.2"
shelf_web_socket:
dependency: transitive
description:
@ -1180,7 +1180,7 @@ packages:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
smart_api_client:
dependency: "direct main"
description:
@ -1224,10 +1224,10 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.0"
state_notifier:
dependency: transitive
description:
@ -1256,10 +1256,10 @@ packages:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.3.0"
syncfusion_flutter_charts:
dependency: "direct main"
description:
@ -1272,10 +1272,10 @@ packages:
dependency: transitive
description:
name: syncfusion_flutter_core
sha256: b1071c698b502e7d55f91352a8b82d42f49f4c96e523d43b6fade5d5af710048
sha256: "12735505d616320aebe39a6fc90b6608a09116378d66aee9636b0eddf7b75971"
url: "https://pub.dev"
source: hosted
version: "28.1.33"
version: "28.1.38"
term_glyph:
dependency: transitive
description:
@ -1288,10 +1288,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.3"
the_validator:
dependency: "direct main"
description:
@ -1324,6 +1324,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.2"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
url_launcher_linux:
dependency: transitive
description:
@ -1332,6 +1356,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
url: "https://pub.dev"
source: hosted
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
@ -1384,10 +1416,10 @@ packages:
dependency: transitive
description:
name: video_player_android
sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898"
sha256: "7018dbcb395e2bca0b9a898e73989e67c0c4a5db269528e1b036ca38bcca0d0b"
url: "https://pub.dev"
source: hosted
version: "2.7.16"
version: "2.7.17"
video_player_avfoundation:
dependency: transitive
description:
@ -1416,10 +1448,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.3.0"
watcher:
dependency: transitive
description:
@ -1480,18 +1512,18 @@ packages:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb
sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7"
url: "https://pub.dev"
source: hosted
version: "3.16.3"
version: "3.17.0"
win32:
dependency: transitive
description:
name: win32
sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69"
sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29"
url: "https://pub.dev"
source: hosted
version: "5.9.0"
version: "5.10.0"
xdg_directories:
dependency: transitive
description:
@ -1517,5 +1549,5 @@ packages:
source: hosted
version: "3.1.3"
sdks:
dart: ">=3.5.2 <4.0.0"
flutter: ">=3.24.0"
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.27.0"

View File

@ -20,8 +20,11 @@ dependencies:
injectable: ^2.3.2
riverpod_annotation: ^2.3.3
cupertino_icons: ^1.0.6
fl_chart: ^0.69.2
fl_chart: ^0.70.1
marquee: ^2.2.3
url_launcher: ^6.3.1
# dynamic_layouts:
# git:
# url: https://github.com/flutter/packages.git