This commit is contained in:
Venba Team 2025-04-10 18:16:05 +05:30
commit 5ec46974a8
10 changed files with 203 additions and 61 deletions

View File

@ -20,12 +20,12 @@ if (project.hasProperty('google-services.json')) {
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "48"
flutterVersionCode = "49"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0.47"
flutterVersionName = "1.0.48"
}
def keystorePropertiesFile = rootProject.file("key.properties")

View File

@ -504,14 +504,12 @@ final GoRouter router = GoRouter(
),
),
GoRoute(
path: '/terms&conditions',
path: '/termsandconditions',
builder: (context, state) => TermsOfUse(),
//builder: (context, state) => LoginRoute(),
),
GoRoute(
path: '/privacy_policy',
builder: (context, state) => PrivacyPolicy(),
//builder: (context, state) => LoginRoute(),
),
// Drawer Routers
@ -668,7 +666,10 @@ final GoRouter router = GoRouter(
if (state.uri.path == '/SessionCheckScreen' ||
state.uri.path == '/login' ||
state.uri.path == '/register' ||
state.uri.path == '/forgot-password/:email') {
state.uri.path == '/forgot-password/:email'||
state.uri.path == '/termsandconditions'||
state.uri.path == '/privacy_policy'
) {
return null;
}

View File

@ -427,10 +427,10 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
// print(data_set);
final encodedMainTopic = Uri.encodeComponent(mainTopic);
final encodedTitle = Uri.encodeComponent(title);
final encodedKey = Uri.encodeQueryComponent('uaenumbers');
// Pass mainTopic and title as query parameters
context.push(
'/chartScreen/$data_set?bgColor=$colorPattern&mainTopic=$encodedMainTopic&title=$encodedTitle');
'/chartScreen/$data_set?bgColor=$colorPattern&mainTopic=$encodedMainTopic&title=$encodedTitle&key=$encodedKey');
// context.go('/chartScreen/$data_set');
},
child: Card(

View File

@ -1087,7 +1087,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
TapGestureRecognizer()
..onTap = () =>
context.push(
'/terms&conditions'),
'/termsandconditions'),
text: AppLocalizations
.of(context)!
.terms_conditions,

View File

@ -2096,6 +2096,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
Widget build(BuildContext context) {
final locale = ref.watch(localeProvider);
final localeNotifier = ref.read(localeProvider.notifier);
String url=GoRouterState.of(context).uri.toString();
final uri = Uri.parse(url);
final pageTitle = uri.queryParameters['key'] ?? '';
final isConnected = ref.watch(connectivityProvider);
@ -2184,7 +2187,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
child: BaseScaffold(
key: _scaffoldKey,
title: Text(
title: (pageTitle == 'home')
? Text(AppLocalizations.of(context)!.nav_home)
: Text(
context.translate(
'UAE Numbers',
'أرقام الإمارات',

View File

@ -1616,7 +1616,7 @@ class ChartWidget extends StatelessWidget {
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
physics: xAxisData.length < 7
physics: xAxisData.length > 4
? const NeverScrollableScrollPhysics() // Disable scrolling
: const AlwaysScrollableScrollPhysics(), // Enable scrolling
padding: const EdgeInsets.only(top: 10, left: 5),
@ -1680,7 +1680,19 @@ class ChartWidget extends StatelessWidget {
// String unitMsrLabel = yAxisLabels.isNotEmpty && groupIndex < yAxisLabels.length
// ? yAxisLabels[groupIndex]
// : '';
if (rod.toY == 0) return null;
// if (rod.toY == 0) return null;
if (rod.toY == 0) {
return BarTooltipItem(
'0', // Display "0" instead of hiding
const TextStyle(
color: Colors.black,
fontSize: 12,
fontWeight: FontWeight.w400,
),
);
}
return BarTooltipItem(
(chartConversion != null &&
@ -1830,7 +1842,18 @@ class ChartWidget extends StatelessWidget {
barsSpace: 10,
barRods: [
BarChartRodData(
toY: yAxisData[index],
// toY: yAxisData[index],
toY: yAxisData[index] == 0
? 0.1
: yAxisData[index],
// toY: yAxisData[index] == 0
// ? 0.001
// : yAxisData[
// index], // gives a slight visible bar
// color: yAxisData[index] == 0
// ? Colors.grey
// : bodyColor,
color: bodyColor,
borderRadius: BorderRadius.circular(4),
width: 20,
@ -1938,7 +1961,7 @@ class ChartWidget extends StatelessWidget {
tooltipMargin: 12,
getTooltipColor: (group) => Colors.transparent,
getTooltipItem: (group, groupIndex, rod, rodIndex) {
if (rod.toY == 0) return null;
// if (rod.toY == 0) return null;
return BarTooltipItem(
// formatNumber(rod.toY),
@ -3705,6 +3728,7 @@ class ChartWidget extends StatelessWidget {
return BarChartRodData(
// toY: value,
toY: value == 0 ? minBarHeight : value, // Use the parsed value
color: barColor, // Dynamic color
width: 20,

View File

@ -8,6 +8,7 @@ import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/enquiry_a
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:url_launcher/url_launcher.dart';
class Contact extends ConsumerStatefulWidget {
const Contact({super.key});
@ -57,43 +58,43 @@ class _ContactState extends ConsumerState<Contact> {
children: [
buildContactCard(
context,
title: 'DUBAI - EMIRATES TOWER -32ND FLOOR',
title: 'DUBAI - EMIRATES TOWER - 32ND FLOOR',
titleAr: 'دبي - أبراج الإمارات - الطابق 32',
details: [
{
'icon': EnquiryAssetIconPath.building,
'text': 'Office : Dubai - Emirates Tower -32nd Floor',
'textAr': 'المقر الرئيسي : دبي - أبراج الإمارات - الطابق 32'
'text': 'Office: Dubai - Emirates Tower - 32nd Floor',
'textAr': 'المقر الرئيسي: دبي - أبراج الإمارات - الطابق 32'
},
{
'icon': EnquiryAssetIconPath.phone,
'text': 'Tel : 00971 46080000',
'textAr': 'الهاتف : 0097146080000'
'text': 'Tel: 00971 4608 0000',
'textAr': 'الهاتف: 0097146080000'
},
{
'icon': EnquiryAssetIconPath.fax,
'text': 'Fax : 0097143273535',
'textAr': 'فاكس : 0097143273535'
'text': 'Fax: 00971 4327 3535',
'textAr': 'فاكس: 0097143273535'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'P.O.Box : 127000 Dubai',
'textAr': 'ص.ب: : 127000 دبي'
'text': 'P.O.Box: 127000 Dubai',
'textAr': 'ص.ب: 127000 دبي'
},
{
'icon': EnquiryAssetIconPath.at,
'text': 'Email Address : info@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني : info@fcsc.gov.ae'
'text': 'Email Address: info@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني: info@fcsc.gov.ae'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Latitude : 25.223926',
'textAr': 'خط العرض : 25.223926'
'text': 'Latitude: 25.223926',
'textAr': 'خط العرض: 25.223926'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Longitude : 55.350526',
'textAr': 'خط الطول : 55.350526'
'text': 'Longitude: 55.350526',
'textAr': 'خط الطول: 55.350526'
},
],
),
@ -105,38 +106,38 @@ class _ContactState extends ConsumerState<Contact> {
details: [
{
'icon': EnquiryAssetIconPath.building,
'text': 'Office : Media Section',
'textAr': 'المقر الرئيسي : قسم الاعلام'
'text': 'Office: Media Section',
'textAr': 'المقر الرئيسي: قسم الاعلام'
},
{
'icon': EnquiryAssetIconPath.phone,
'text': 'Tel : 00971 46080000',
'textAr': 'الهاتف : 0097146080000'
'text': 'Tel: 00971 4608 0000',
'textAr': 'الهاتف: 0097146080000'
},
{
'icon': EnquiryAssetIconPath.fax,
'text': 'Fax : 0097143273535',
'textAr': 'فاكس : 0097143273535'
'text': 'Fax: 00971 4327 3535',
'textAr': 'فاكس: 0097143273535'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'P.O.Box : 127000 Dubai',
'textAr': 'ص.ب: : 127000 دبي'
'text': 'P.O.Box: 127000 Dubai',
'textAr': 'ص.ب: 127000 دبي'
},
{
'icon': EnquiryAssetIconPath.at,
'text': 'Email Address : GCO@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني : GCO@fcsc.gov.ae'
'text': 'Email Address: GCO@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني: GCO@fcsc.gov.ae'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Latitude : 25.223926',
'textAr': 'خط العرض : 25.223926'
'text': 'Latitude: 25.223926',
'textAr': 'خط العرض: 25.223926'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Longitude : 55.350526',
'textAr': 'خط الطول : 55.350526'
'text': 'Longitude: 55.350526',
'textAr': 'خط الطول: 55.350526'
},
],
),
@ -148,38 +149,38 @@ class _ContactState extends ConsumerState<Contact> {
details: [
{
'icon': EnquiryAssetIconPath.building,
'text': 'Office : SDGs',
'textAr': 'المقر الرئيسي : أهداف التنمية المستدامة'
'text': 'Office: SDGs',
'textAr': 'المقر الرئيسي: أهداف التنمية المستدامة'
},
{
'icon': EnquiryAssetIconPath.phone,
'text': 'Tel : 00971 46080000',
'textAr': 'الهاتف : 0097146080000'
'text': 'Tel: 00971 4608 0000',
'textAr': 'الهاتف: 0097146080000'
},
{
'icon': EnquiryAssetIconPath.fax,
'text': 'Fax : 0097143273535',
'text': 'Fax: 00971 4327 3535',
'textAr': 'فاكس : 0097143273535'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'P.O.Box : 127000 Dubai',
'textAr': 'ص.ب: : 127000 دبي'
'text': 'P.O.Box: 127000 Dubai',
'textAr': 'ص.ب: 127000 دبي'
},
{
'icon': EnquiryAssetIconPath.at,
'text': 'Email Address : sdgs@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني : sdgs@fcsc.gov.ae'
'text': 'Email Address: sdgs@fcsc.gov.ae',
'textAr': 'البريد الإلكتروني: sdgs@fcsc.gov.ae'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Latitude : 25.223926',
'textAr': 'خط العرض : 25.223926'
'text': 'Latitude: 25.223926',
'textAr': 'خط العرض: 25.223926'
},
{
'icon': EnquiryAssetIconPath.map,
'text': 'Longitude : 55.350526',
'textAr': 'خط الطول : 55.350526'
'text': 'Longitude: 55.350526',
'textAr': 'خط الطول: 55.350526'
},
],
),
@ -229,6 +230,34 @@ class _ContactState extends ConsumerState<Contact> {
}
Widget buildTextRow(String iconName, String text) {
List<String> values = List.filled(2, '');
String cleanText = '';
if (text.toLowerCase().contains('tel:') || text.toLowerCase().contains('الهاتف:')) {
values = text.split(':');
print ('List of values----- :$values');
print ('value 1 ${values[0]}');
cleanText=values[1].replaceAll(' ', '');
} else if(text.toLowerCase().contains('email address:') || text.toLowerCase().contains('البريد الإلكتروني:')){
values = text.split(':');
cleanText = values[1].replaceAll(' ', '');
} else{
cleanText = text;
}
Future<void> sendEmail(String emailAddress) async {
print ('before email : $emailAddress');
final uri = Uri(
scheme: 'mailto',
path: emailAddress,
);
if (await canLaunchUrl(uri)) {
await launchUrl(uri);
} else {
debugPrint('Could not launch $uri');
}
}
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0),
child: Row(
@ -240,7 +269,54 @@ class _ContactState extends ConsumerState<Contact> {
height: 20,
),
const SizedBox(width: 10),
Expanded(
iconName == EnquiryAssetIconPath.phone
? InkWell(
onTap: () async{
print('clean test : $cleanText');
final uri = Uri(scheme: 'tel', path: cleanText);
if (await canLaunchUrl(uri)) {
await launchUrl(uri);
} else {
debugPrint('Could not launch $uri');
}
},
child: RichText(
text: TextSpan(
text: values[0],
style: const TextStyle(fontSize: 14, color: Color(0xFF5F5F5F)),
children: <TextSpan>[
TextSpan(text: ':',),
TextSpan(text: values[1],
style: TextStyle(fontSize: 14, color:Color(0xFF985400))
),
],
),
),
// child: Text(
// text,
// style: const TextStyle(
// fontSize: 14,
// color: Color(0xFF5F5F5F),
// ),
// ),
)
: iconName == EnquiryAssetIconPath.at
? InkWell(
onTap: () => sendEmail(cleanText),
child: RichText(
text: TextSpan(
text: values[0],
style: const TextStyle(fontSize: 14, color: Color(0xFF5F5F5F)),
children: <TextSpan>[
TextSpan(text: ':',),
TextSpan(text: values[1],
style: TextStyle(fontSize: 14, color:Color(0xFF985400))
),
],
),
),
)
:Expanded(
child: Text(
text,
style: const TextStyle(

View File

@ -26,6 +26,7 @@ class _NotificationPageState extends ConsumerState<NotificationPage> {
bool isLoading = true;
List<Map<String, dynamic>> notifications = [];
List<String> userReadedNotiOrNot = [];
String notificationCount='';
// Current selected tab index
int selectedTabIndex = 0;
@ -48,7 +49,30 @@ class _NotificationPageState extends ConsumerState<NotificationPage> {
super.initState();
locale = ref.read(localeProvider) ?? const Locale('en');
_userService = UserService();
fetchNotifications(locale?.languageCode ?? 'en');
_initializePage();
}
Future<void> _initializePage() async {
_userService = UserService();
await _fetchUserData();();
await fetchNotifications(locale?.languageCode ?? 'en');
_processNotifications(notifications , userReadedNotiOrNot);
}
void _processNotifications( List<Map<String, dynamic>> notification ,List<String> push ){
print ('inside last function ${notification.length}');
print('inside last function ${push.length}');
int count = 0;
for (var product in notification) {
if (push.contains(product['id'])) {
count++;
}
}
print('count is $count');
if(count>0){
notificationCount='{$count}';}
else{notificationCount='';}
}
Future<String?> getUserId() async {
@ -188,8 +212,8 @@ class _NotificationPageState extends ConsumerState<NotificationPage> {
child: BaseScaffold(
title: Text(
context.translate(
'Notification',
'إشعار',
'Notification $notificationCount',
'$notificationCount إشعار ',
),
),
body: isLoading

View File

@ -95,6 +95,7 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
locale = ref.read(localeProvider) ?? const Locale('en');
WidgetsBinding.instance.addPostFrameCallback((_) {
_startAppbarTour();
_routeToIndex();
});
}
@ -697,6 +698,17 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
// }
final PAuthRepo _authRepo = PAuthRepo();
void _routeToIndex() {
String url=GoRouterState.of(context).uri.toString();
final uri = Uri.parse(url);
final fromValue = uri.queryParameters['key'] ?? '';
if (fromValue=='home'){
ref.read(selectedIndexProvider.notifier).state= 0;
}else if (fromValue=='uaenumbers'){
ref.read(selectedIndexProvider.notifier).state= 1;
}
}
Future<void> logout(BuildContext context) async {
final prefs = await SharedPreferences.getInstance();
await _authRepo.logout();

View File

@ -1,7 +1,7 @@
name: uae_stat
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
publish_to: "none"
version: 1.0.47+48
version: 1.0.48+49
environment:
sdk: ">=3.2.3 <4.0.0"