Nottification and charts changes added
This commit is contained in:
parent
de820662f7
commit
802a80a549
@ -3,6 +3,7 @@ plugins {
|
|||||||
id "kotlin-android"
|
id "kotlin-android"
|
||||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||||
id "dev.flutter.flutter-gradle-plugin"
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
|
id "com.google.gms.google-services"
|
||||||
}
|
}
|
||||||
|
|
||||||
def localProperties = new Properties()
|
def localProperties = new Properties()
|
||||||
@ -13,14 +14,18 @@ if (localPropertiesFile.exists()) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (project.hasProperty('google-services.json')) {
|
||||||
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
}
|
||||||
|
|
||||||
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
|
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
|
||||||
if (flutterVersionCode == null) {
|
if (flutterVersionCode == null) {
|
||||||
flutterVersionCode = "28"
|
flutterVersionCode = "31"
|
||||||
}
|
}
|
||||||
|
|
||||||
def flutterVersionName = localProperties.getProperty("flutter.versionName")
|
def flutterVersionName = localProperties.getProperty("flutter.versionName")
|
||||||
if (flutterVersionName == null) {
|
if (flutterVersionName == null) {
|
||||||
flutterVersionName = "1.0.27"
|
flutterVersionName = "1.0.30"
|
||||||
}
|
}
|
||||||
|
|
||||||
def keystorePropertiesFile = rootProject.file("key.properties")
|
def keystorePropertiesFile = rootProject.file("key.properties")
|
||||||
@ -46,7 +51,7 @@ android {
|
|||||||
applicationId = "ae.gov.fcsc.frontend"
|
applicationId = "ae.gov.fcsc.frontend"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
minSdk = flutter.minSdkVersion
|
minSdk = 23
|
||||||
targetSdk = flutter.targetSdkVersion
|
targetSdk = flutter.targetSdkVersion
|
||||||
versionCode = flutterVersionCode.toInteger()
|
versionCode = flutterVersionCode.toInteger()
|
||||||
versionName = flutterVersionName
|
versionName = flutterVersionName
|
||||||
@ -75,3 +80,9 @@ android {
|
|||||||
flutter {
|
flutter {
|
||||||
source = "../.."
|
source = "../.."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
|
||||||
|
implementation 'com.google.firebase:firebase-messaging:22.0.0'
|
||||||
|
implementation("com.google.firebase:firebase-auth:23.0.0")
|
||||||
|
}
|
||||||
|
|||||||
29
android/app/google-services.json
Normal file
29
android/app/google-services.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "62132243005",
|
||||||
|
"project_id": "fcsc-a161c",
|
||||||
|
"storage_bucket": "fcsc-a161c.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:62132243005:android:18b7ca94608afaeb7c7854",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "ae.gov.fcsc.frontend"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyB-QQbnq366f7rrKLVVFJKnSZgR9LcDWFI"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
@ -63,4 +63,4 @@
|
|||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@ -1,3 +1,14 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:8.1.0' // Update this if needed
|
||||||
|
classpath 'com.google.gms:google-services:4.3.10' // ✅ Required for Firebase
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
|
|||||||
@ -20,7 +20,7 @@ plugins {
|
|||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version "8.2.1" apply false
|
id "com.android.application" version "8.2.1" apply false
|
||||||
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
|
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
|
||||||
|
id("com.google.gms.google-services") version "4.4.2" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
include ":app"
|
include ":app"
|
||||||
|
|||||||
BIN
assets/FCSC-GIF.gif
Normal file
BIN
assets/FCSC-GIF.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
@ -1,3 +1,4 @@
|
|||||||
// api_config.dart
|
// api_config.dart
|
||||||
// const String apiUrl = 'http://192.168.1.26:8090';
|
// const String apiUrl = 'http://192.168.1.26:8090';
|
||||||
const String apiUrl = 'https://pbdev.venbait.in/';
|
// const String apiUrl = 'https://pbdev.venbait.in/';
|
||||||
|
const String apiUrl = 'https://pb.venbait.in/';
|
||||||
|
|||||||
36
lib/config/loading_overlay.dart
Normal file
36
lib/config/loading_overlay.dart
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class LoadingOverlay {
|
||||||
|
static final ValueNotifier<bool> _isLoading = ValueNotifier<bool>(false);
|
||||||
|
|
||||||
|
static void show() {
|
||||||
|
_isLoading.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hide() {
|
||||||
|
_isLoading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget buildLoader() {
|
||||||
|
return ValueListenableBuilder<bool>(
|
||||||
|
valueListenable: _isLoading,
|
||||||
|
builder: (context, isLoading, child) {
|
||||||
|
return isLoading
|
||||||
|
? Stack(
|
||||||
|
children: [
|
||||||
|
ModalBarrier(
|
||||||
|
color: Colors.black.withOpacity(0.5), dismissible: false),
|
||||||
|
Center(
|
||||||
|
child: Image.asset(
|
||||||
|
"assets/images/loading.gif", // Make sure to add the GIF in assets
|
||||||
|
width: 100,
|
||||||
|
height: 100,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: const SizedBox.shrink();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -307,6 +307,7 @@ 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/demo_home2.dart';
|
||||||
import 'package:uae_stat/presentation/Screens/online_offline_verification/internet_check.dart';
|
import 'package:uae_stat/presentation/Screens/online_offline_verification/internet_check.dart';
|
||||||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/notification/notification.dart';
|
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/notification/notification.dart';
|
||||||
|
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/notification/notification_details.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/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/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/AppFeatures.dart';
|
||||||
@ -366,7 +367,6 @@ final GoRouter router = GoRouter(
|
|||||||
path: '/',
|
path: '/',
|
||||||
//builder: (context, state) => LoginRoute(),
|
//builder: (context, state) => LoginRoute(),
|
||||||
builder: (context, state) => SessionCheckScreen(),
|
builder: (context, state) => SessionCheckScreen(),
|
||||||
|
|
||||||
),
|
),
|
||||||
// GoRoute(
|
// GoRoute(
|
||||||
// path: '/',
|
// path: '/',
|
||||||
@ -426,8 +426,7 @@ final GoRouter router = GoRouter(
|
|||||||
state.uri.queryParameters['filter_data']!.isNotEmpty) {
|
state.uri.queryParameters['filter_data']!.isNotEmpty) {
|
||||||
try {
|
try {
|
||||||
filterData = List<Map<String, dynamic>>.from(
|
filterData = List<Map<String, dynamic>>.from(
|
||||||
jsonDecode(state.uri.queryParameters['filter_data']!)
|
jsonDecode(state.uri.queryParameters['filter_data']!));
|
||||||
);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Error parsing filter_data: $e');
|
print('Error parsing filter_data: $e');
|
||||||
filterData = []; // Assign an empty list to prevent null issues
|
filterData = []; // Assign an empty list to prevent null issues
|
||||||
@ -436,8 +435,6 @@ final GoRouter router = GoRouter(
|
|||||||
filterData = []; // Ensure it's a valid list
|
filterData = []; // Ensure it's a valid list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print('Router dataSets: $dataSets');
|
print('Router dataSets: $dataSets');
|
||||||
print('Router bgColor: $bgColor');
|
print('Router bgColor: $bgColor');
|
||||||
print('Router mainTopic: $mainTopic');
|
print('Router mainTopic: $mainTopic');
|
||||||
@ -521,6 +518,18 @@ final GoRouter router = GoRouter(
|
|||||||
return NotificationPage();
|
return NotificationPage();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: '/notification_details',
|
||||||
|
builder: (context, state) {
|
||||||
|
final Map<String, dynamic> data = state.extra as Map<String, dynamic>;
|
||||||
|
return NotificationDetails(
|
||||||
|
title: data['title'] ?? '',
|
||||||
|
message: data['message'] ?? '',
|
||||||
|
date: data['date'] ?? '',
|
||||||
|
category: data['category'] ?? '',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: '/user-guide',
|
path: '/user-guide',
|
||||||
builder: (context, state) => Userguide(),
|
builder: (context, state) => Userguide(),
|
||||||
|
|||||||
@ -51,6 +51,7 @@
|
|||||||
"full_name": "الاسم الكامل",
|
"full_name": "الاسم الكامل",
|
||||||
"dob": "تاريخ الميلاد",
|
"dob": "تاريخ الميلاد",
|
||||||
"region": "الدولة/المنطقة",
|
"region": "الدولة/المنطقة",
|
||||||
|
"preferredLang": "اللغة المفضلة",
|
||||||
"cancel": "إلغاء",
|
"cancel": "إلغاء",
|
||||||
"confirm": "تأكيد",
|
"confirm": "تأكيد",
|
||||||
"change_password": "تغيير كلمة المرور",
|
"change_password": "تغيير كلمة المرور",
|
||||||
|
|||||||
@ -49,6 +49,7 @@
|
|||||||
"full_name": "Full Name*",
|
"full_name": "Full Name*",
|
||||||
"dob": "Date of Birth*",
|
"dob": "Date of Birth*",
|
||||||
"region": "Country/Region",
|
"region": "Country/Region",
|
||||||
|
"preferredLang": "Preferred Language",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"confirm": "Confirm",
|
"confirm": "Confirm",
|
||||||
"change_password": "Change Password",
|
"change_password": "Change Password",
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import 'package:external_repos/external_repos.dart';
|
import 'package:external_repos/external_repos.dart';
|
||||||
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
@ -16,8 +18,6 @@ import 'package:uae_stat/presentation/Screens/auth_verification/registration.dar
|
|||||||
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// void main() async {
|
// void main() async {
|
||||||
// WidgetsFlutterBinding.ensureInitialized();
|
// WidgetsFlutterBinding.ensureInitialized();
|
||||||
// // await (await SharedPreferences.getInstance()).clear();
|
// // await (await SharedPreferences.getInstance()).clear();
|
||||||
@ -46,8 +46,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// void main() async {
|
// void main() async {
|
||||||
// WidgetsFlutterBinding.ensureInitialized();
|
// WidgetsFlutterBinding.ensureInitialized();
|
||||||
// // await (await SharedPreferences.getInstance()).clear();
|
// // await (await SharedPreferences.getInstance()).clear();
|
||||||
@ -91,10 +89,31 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||||
|
// Handle background messages
|
||||||
|
print("Handling background message: ${message.messageId}");
|
||||||
|
}
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
await Firebase.initializeApp(
|
||||||
|
options: const FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyB-QQbnq366f7rrKLVVFJKnSZgR9LcDWFI',
|
||||||
|
appId: '1:62132243005:android:18b7ca94608afaeb7c7854',
|
||||||
|
messagingSenderId: '62132243005',
|
||||||
|
projectId: 'fcsc-a161c'));
|
||||||
|
|
||||||
|
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||||
|
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
|
||||||
|
|
||||||
|
// Request permission for notifications
|
||||||
|
NotificationSettings settings = await messaging.requestPermission(
|
||||||
|
alert: true,
|
||||||
|
badge: true,
|
||||||
|
sound: true,
|
||||||
|
);
|
||||||
|
|
||||||
|
print('User granted permission: ${settings.authorizationStatus}');
|
||||||
configureDependencies();
|
configureDependencies();
|
||||||
runApp(
|
runApp(
|
||||||
const ProviderScope(
|
const ProviderScope(
|
||||||
@ -106,9 +125,6 @@ void main() async {
|
|||||||
class MainApp extends ConsumerWidget {
|
class MainApp extends ConsumerWidget {
|
||||||
const MainApp({super.key});
|
const MainApp({super.key});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final locale = ref.watch(localeProvider);
|
final locale = ref.watch(localeProvider);
|
||||||
@ -117,14 +133,13 @@ class MainApp extends ConsumerWidget {
|
|||||||
return true; // Replace with actual logic
|
return true; // Replace with actual logic
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ref.listen<bool>(connectivityProvider, (previous, hasInternet) {
|
||||||
// ref.listen<bool>(connectivityProvider, (previous, hasInternet) {
|
print('Previous Internet Status: $previous');
|
||||||
// print('Previous Internet Status: $previous');
|
print('Current Internet Status: $hasInternet');
|
||||||
// print('Current Internet Status: $hasInternet');
|
if (previous != null && hasInternet != previous) {
|
||||||
// if (previous != null && hasInternet != previous) {
|
handleConnectivityChange(context, hasInternet);
|
||||||
// handleConnectivityChange(context, hasInternet);
|
}
|
||||||
// }
|
});
|
||||||
// });
|
|
||||||
|
|
||||||
return MaterialApp.router(
|
return MaterialApp.router(
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
@ -137,7 +152,8 @@ class MainApp extends ConsumerWidget {
|
|||||||
|
|
||||||
void handleConnectivityChange(BuildContext context, bool hasInternet) {
|
void handleConnectivityChange(BuildContext context, bool hasInternet) {
|
||||||
//final currentPath = GoRouter.of(context).location;
|
//final currentPath = GoRouter.of(context).location;
|
||||||
final currentPath = GoRouter.of(context).routerDelegate.currentConfiguration.fullPath;
|
final currentPath =
|
||||||
|
GoRouter.of(context).routerDelegate.currentConfiguration.fullPath;
|
||||||
if (!hasInternet && currentPath != '/internetcheck') {
|
if (!hasInternet && currentPath != '/internetcheck') {
|
||||||
print("Status : Not connected");
|
print("Status : Not connected");
|
||||||
context.go('/internetcheck');
|
context.go('/internetcheck');
|
||||||
@ -147,6 +163,3 @@ class MainApp extends ConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.
|
|||||||
import 'package:uae_stat/presentation/components/constant/constant.dart';
|
import 'package:uae_stat/presentation/components/constant/constant.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:uae_stat/config/api_config.dart';
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
class UaeNumbers extends StatelessWidget {
|
class UaeNumbers extends StatelessWidget {
|
||||||
const UaeNumbers({super.key});
|
const UaeNumbers({super.key});
|
||||||
@ -198,14 +198,17 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
|
|||||||
value); // Call filter function directly on input change
|
value); // Call filter function directly on input change
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: "Search",
|
hintText: AppLocalizations.of(context)!.search,
|
||||||
hintStyle: TextStyle(color: Color(0xFF898C81)),
|
hintStyle: TextStyle(color: Color(0xFFAA8E83)),
|
||||||
prefixIconConstraints: BoxConstraints(maxWidth: 42, maxHeight: 42),
|
prefixIconConstraints:
|
||||||
|
BoxConstraints(maxWidth: 42, maxHeight: 42),
|
||||||
prefixIcon: Container(
|
prefixIcon: Container(
|
||||||
padding: EdgeInsets.only(right: 5),
|
padding: EdgeInsets.only(right: 5, left: 5),
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
MiscIconAssetPath.Search,
|
MiscIconAssetPath.Search,
|
||||||
semanticsLabel: 'Search',
|
semanticsLabel: 'Search',
|
||||||
|
colorFilter:
|
||||||
|
ColorFilter.mode(Color(0xFFAA8E83), BlendMode.srcIn),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -215,7 +218,7 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
|
|||||||
// ),
|
// ),
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
contentPadding:
|
contentPadding:
|
||||||
EdgeInsets.symmetric(vertical: 8.0, horizontal: 18.0),
|
EdgeInsets.symmetric(vertical: 0.5, horizontal: 18.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -54,7 +54,7 @@ class ChartScreen1 extends ConsumerStatefulWidget {
|
|||||||
class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
||||||
// final _pb = PocketBase('https://pb.venbait.in');
|
// final _pb = PocketBase('https://pb.venbait.in');
|
||||||
final _pb = PocketBase(apiUrl);
|
final _pb = PocketBase(apiUrl);
|
||||||
List<Map<String, dynamic>> selectedFiltersStorage = [];
|
|
||||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
final ApiService apiService = ApiService();
|
final ApiService apiService = ApiService();
|
||||||
bool isLoading = true;
|
bool isLoading = true;
|
||||||
@ -68,6 +68,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
List<dynamic> tabFilteredCardData = [];
|
List<dynamic> tabFilteredCardData = [];
|
||||||
List<dynamic> cardData = [];
|
List<dynamic> cardData = [];
|
||||||
List<Map<String, dynamic>> filteredAndSortedData = [];
|
List<Map<String, dynamic>> filteredAndSortedData = [];
|
||||||
|
List<Map<String, dynamic>> selectedFiltersStorage = [];
|
||||||
|
List<Map<String, dynamic>> selectedFiltersApi = [];
|
||||||
List<dynamic> originalChartsData = [];
|
List<dynamic> originalChartsData = [];
|
||||||
List<dynamic> originalCardData = [];
|
List<dynamic> originalCardData = [];
|
||||||
List<dynamic> originalTabCardData = [];
|
List<dynamic> originalTabCardData = [];
|
||||||
@ -75,11 +77,12 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
late Color backgroundColor;
|
late Color backgroundColor;
|
||||||
final ScrollController _scrollController = ScrollController();
|
final ScrollController _scrollController = ScrollController();
|
||||||
int _activeTabIndex = 0;
|
int _activeTabIndex = 0;
|
||||||
dynamic tabWiseKpi=[];
|
dynamic tabWiseKpi = [];
|
||||||
dynamic tabFilteredKpi=[];
|
dynamic tabFilteredKpi = [];
|
||||||
List<Map<String, dynamic>> formattedFilters=[];
|
List<Map<String, dynamic>> formattedFilters = [];
|
||||||
|
|
||||||
dynamic _tabsData = [];
|
dynamic _tabsData = [];
|
||||||
|
dynamic currentTab = [];
|
||||||
// List<Map<String, dynamic>> _tabsData = [];
|
// List<Map<String, dynamic>> _tabsData = [];
|
||||||
late List<TargetFocus> marriageTargets;
|
late List<TargetFocus> marriageTargets;
|
||||||
late List<TargetFocus> previousMarriageTargets;
|
late List<TargetFocus> previousMarriageTargets;
|
||||||
@ -90,6 +93,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
bool isBookmarked = false; // Track bookmark state
|
bool isBookmarked = false; // Track bookmark state
|
||||||
String? bookmarkId; // Stores the ID of the bookmark record in PocketBase
|
String? bookmarkId; // Stores the ID of the bookmark record in PocketBase
|
||||||
late final Locale locale;
|
late final Locale locale;
|
||||||
|
late String mainTopic;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@ -98,10 +102,12 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
print(' bgColor $bgColor');
|
print(' bgColor $bgColor');
|
||||||
checkIfBookmarked();
|
checkIfBookmarked();
|
||||||
locale = ref.read(localeProvider) ?? const Locale('en');
|
locale = ref.read(localeProvider) ?? const Locale('en');
|
||||||
|
print('locale-$locale');
|
||||||
|
|
||||||
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi, widget.filter_data)
|
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi,
|
||||||
.then((_) {
|
widget.filter_data)
|
||||||
if(_tabsData.isNotEmpty) {
|
.then((_) {
|
||||||
|
if (_tabsData.isNotEmpty) {
|
||||||
// Call onTabSelected for the first tab
|
// Call onTabSelected for the first tab
|
||||||
onTabSelected(_tabsData[0]['id']);
|
onTabSelected(_tabsData[0]['id']);
|
||||||
}
|
}
|
||||||
@ -313,7 +319,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
backgroundColor: Color(0xFFAA8E83), // Set background color
|
backgroundColor: Color(0xFFAA8E83), // Set background color
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(10.0), // Set text color
|
borderRadius:
|
||||||
|
BorderRadius.circular(10.0), // Set text color
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -324,7 +331,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -371,29 +377,30 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
children: [ SizedBox(
|
children: [
|
||||||
width: 100, // Set the desired width
|
SizedBox(
|
||||||
child: TextButton(
|
width: 100, // Set the desired width
|
||||||
onPressed: () => Navigator.pop(context),
|
child: TextButton(
|
||||||
style: TextButton.styleFrom(
|
onPressed: () => Navigator.pop(context),
|
||||||
shape: RoundedRectangleBorder(
|
style: TextButton.styleFrom(
|
||||||
borderRadius: BorderRadius.circular(
|
shape: RoundedRectangleBorder(
|
||||||
10.0), // Adjust the radius as needed
|
borderRadius: BorderRadius.circular(
|
||||||
|
10.0), // Adjust the radius as needed
|
||||||
|
),
|
||||||
|
side: BorderSide(
|
||||||
|
color: Color(0xFFAA8E83), // Set the outline color
|
||||||
|
width: 1, // Set the border width
|
||||||
|
),
|
||||||
),
|
),
|
||||||
side: BorderSide(
|
child: Text(
|
||||||
color: Color(0xFFAA8E83), // Set the outline color
|
context.translate('No', 'لا'),
|
||||||
width: 1, // Set the border width
|
style: TextStyle(
|
||||||
),
|
color: Color(0xFFAA8E83),
|
||||||
),
|
fontSize: 16,
|
||||||
child: Text(
|
),
|
||||||
context.translate('No', 'لا'),
|
|
||||||
style: TextStyle(
|
|
||||||
color: Color(0xFFAA8E83),
|
|
||||||
fontSize: 16,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 100, // Set the desired width
|
width: 100, // Set the desired width
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
@ -405,7 +412,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
backgroundColor: Color(0xFFAA8E83), // Set background color
|
backgroundColor: Color(0xFFAA8E83), // Set background color
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(10.0), // Set text color
|
borderRadius:
|
||||||
|
BorderRadius.circular(10.0), // Set text color
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -413,7 +421,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
style: TextStyle(color: Colors.white, fontSize: 16),
|
style: TextStyle(color: Colors.white, fontSize: 16),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),],
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -1268,13 +1277,28 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchChartData(String dataSets, locale, kpi, filter_data ) async {
|
Future<void> fetchChartData(String dataSets, locale, kpi, filter_data) async {
|
||||||
var data = await apiService.fetchChartData(dataSets, locale,kpi,filter_data);
|
var data =
|
||||||
|
await apiService.fetchChartData(dataSets, locale, kpi, filter_data);
|
||||||
|
|
||||||
tabFilteredKpi = kpi;
|
tabFilteredKpi = kpi;
|
||||||
print('FETCH KPI- $kpi');
|
print('FETCH KPI- $kpi');
|
||||||
print('FETCH KFilter- $filter_data');
|
print('FETCH KFilter- $filter_data');
|
||||||
|
print('locale1 - $locale');
|
||||||
|
// print('locale11 - $loacleData');
|
||||||
|
|
||||||
|
// Store filter_data if it has a value
|
||||||
|
if (filter_data != null && filter_data is List && filter_data.isNotEmpty) {
|
||||||
|
selectedFiltersApi = filter_data.map<Map<String, dynamic>>((entry) {
|
||||||
|
if (entry is Map<dynamic, dynamic>) {
|
||||||
|
return entry.map<String, dynamic>(
|
||||||
|
(key, value) => MapEntry(key.toString(), value));
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
print('FETVCFILTEr: $selectedFiltersApi');
|
||||||
|
}
|
||||||
|
|
||||||
if (data.containsKey('filterData')) {
|
if (data.containsKey('filterData')) {
|
||||||
var filterData = data['filterData'];
|
var filterData = data['filterData'];
|
||||||
@ -1316,7 +1340,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
|
|
||||||
void applyFilters(BuildContext context, List filters, List data,
|
void applyFilters(BuildContext context, List filters, List data,
|
||||||
List dataCard, List selectedFilters) {
|
List dataCard, List selectedFilters) {
|
||||||
|
|
||||||
print('applyFilters called');
|
print('applyFilters called');
|
||||||
print('Selected ApplyFilters: $selectedFilters');
|
print('Selected ApplyFilters: $selectedFilters');
|
||||||
|
|
||||||
@ -1332,37 +1355,38 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Transform the selectedFilters list into the required format
|
// Transform the selectedFilters list into the required format
|
||||||
formattedFilters = selectedFilters
|
formattedFilters = selectedFilters
|
||||||
.where((filter) => filter['filter_data'] != null && filter['filter_data'].isNotEmpty)
|
// .where((filter) => filter['filter_data'] != null && filter['filter_data'].isNotEmpty)
|
||||||
.map((filter){
|
.map((filter) {
|
||||||
return{
|
return {
|
||||||
'filter_key': filter['filter_key'],
|
'filter_key': filter['filter_key'],
|
||||||
'filter_data':filter['filter_data'].map((item)=> item.toString()).toList()
|
'filter_data':
|
||||||
|
filter['filter_data'].map((item) => item.toString()).toList()
|
||||||
};
|
};
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
print('Formatted Filters1: $formattedFilters');
|
print('Formatted Filters1: $formattedFilters');
|
||||||
|
|
||||||
// Convert to JSON format
|
// Convert to JSON format
|
||||||
String selectedFormatFilters = jsonEncode({
|
String selectedFormatFilters =
|
||||||
'kpi': tabWiseKpi,
|
jsonEncode({'kpi': tabWiseKpi, 'filter_data': formattedFilters});
|
||||||
'filter_data': formattedFilters
|
|
||||||
});
|
|
||||||
|
|
||||||
print('Formatted Filters2: $selectedFormatFilters');
|
print('Formatted Filters2: $selectedFormatFilters');
|
||||||
|
final locale = ref.watch(localeProvider)?.languageCode ?? 'en';
|
||||||
|
|
||||||
// Call fetchChartData with correct parameters
|
print('locale2- $locale');
|
||||||
|
|
||||||
|
// Call fetchChartData with correct parameters
|
||||||
fetchChartData(
|
fetchChartData(
|
||||||
widget.dataSets,
|
widget.dataSets,
|
||||||
locale.languageCode ?? 'en',
|
locale,
|
||||||
tabWiseKpi, // Ensure you are passing the correct KPI here
|
tabWiseKpi, // Ensure you are passing the correct KPI here
|
||||||
formattedFilters // Pass the formatted filter data here
|
formattedFilters // Pass the formatted filter data here
|
||||||
);
|
);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
|
||||||
selectedFiltersStorage = List.from(selectedFilters);
|
selectedFiltersStorage = List.from(selectedFilters);
|
||||||
print('selectedFiltersStoraged- $selectedFiltersStorage');
|
print('selectedFiltersStoraged- $selectedFiltersStorage');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyFilters1(BuildContext context, List filters, List data,
|
void applyFilters1(BuildContext context, List filters, List data,
|
||||||
@ -1503,7 +1527,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void showRightSideModal(BuildContext context, List filters, List data) {
|
void showRightSideModal(BuildContext context, List filters, List data) {
|
||||||
|
|
||||||
print('selectedFiltersStoraged1- $selectedFiltersStorage');
|
print('selectedFiltersStoraged1- $selectedFiltersStorage');
|
||||||
|
|
||||||
// Initialize selected filters structure from the stored value, if exists
|
// Initialize selected filters structure from the stored value, if exists
|
||||||
@ -1532,7 +1555,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
// Header Section
|
// Header Section
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
top: 16.0, bottom: 0.0, left: 16.0, right: 16.0),
|
top: 26.0, bottom: 0.0, left: 16.0, right: 16.0),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@ -1541,7 +1564,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
SvgPicture.asset(
|
SvgPicture.asset(
|
||||||
UaeNumbersAssetPath.filterCharts,
|
UaeNumbersAssetPath.filterCharts,
|
||||||
semanticsLabel: 'Filter',
|
semanticsLabel: 'Filter',
|
||||||
colorFilter:ColorFilter.mode(Color(0xFF8E8E8E),BlendMode.srcIn),
|
colorFilter: ColorFilter.mode(
|
||||||
|
Color(0xFF8E8E8E), BlendMode.srcIn),
|
||||||
width: 25,
|
width: 25,
|
||||||
height: 25,
|
height: 25,
|
||||||
),
|
),
|
||||||
@ -1617,6 +1641,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
builder: (context, dialogSetState) {
|
builder: (context, dialogSetState) {
|
||||||
final locale =
|
final locale =
|
||||||
ref.watch(localeProvider);
|
ref.watch(localeProvider);
|
||||||
|
|
||||||
print('localelocale $locale');
|
print('localelocale $locale');
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
title: Text(
|
title: Text(
|
||||||
@ -1786,13 +1811,13 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
cardData = List.from(originalTabCardData);
|
cardData = List.from(originalTabCardData);
|
||||||
});
|
});
|
||||||
selectedFiltersStorage.clear();
|
selectedFiltersStorage.clear();
|
||||||
formattedFilters = [];
|
formattedFilters = [];
|
||||||
fetchChartData(
|
fetchChartData(
|
||||||
widget.dataSets,
|
widget.dataSets,
|
||||||
locale.languageCode ?? 'en',
|
locale.languageCode ?? 'en',
|
||||||
tabWiseKpi, // Ensure you are passing the correct KPI here
|
tabWiseKpi, // Ensure you are passing the correct KPI here
|
||||||
formattedFilters // Pass the formatted filter data here
|
formattedFilters // Pass the formatted filter data here
|
||||||
);
|
);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
@ -1877,9 +1902,14 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
void onTabSelected(String tabId) {
|
void onTabSelected(String tabId) {
|
||||||
print('Selected Tab on: $tabId');
|
print('Selected Tab on: $tabId');
|
||||||
tabWiseKpi = tabId;
|
tabWiseKpi = tabId;
|
||||||
|
print('Selected Tab tabWiseKpi: $tabWiseKpi');
|
||||||
|
|
||||||
|
selectedFiltersStorage.clear();
|
||||||
|
|
||||||
|
if (selectedFiltersApi.isNotEmpty && tabWiseKpi == tabFilteredKpi) {
|
||||||
|
selectedFiltersStorage = List.from(selectedFiltersApi);
|
||||||
|
}
|
||||||
|
|
||||||
// selectedFiltersStorage.clear();
|
|
||||||
// Filter the filterDataSet
|
|
||||||
filterData = filterDataSet
|
filterData = filterDataSet
|
||||||
.where((item) => item['key'] == tabId)
|
.where((item) => item['key'] == tabId)
|
||||||
.map((item) => item['value'])
|
.map((item) => item['value'])
|
||||||
@ -1887,9 +1917,63 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
.expand((item) => item)
|
.expand((item) => item)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
print("FilteringDAtss START1 - $filterData");
|
print("FilteringDAtss START1d - $filterData");
|
||||||
print('TABId1 - $tabId');
|
print('TABId1 - $tabId');
|
||||||
|
|
||||||
|
Map<String, int> monthMap = {
|
||||||
|
'jan': 1,
|
||||||
|
'feb': 2,
|
||||||
|
'mar': 3,
|
||||||
|
'apr': 4,
|
||||||
|
'may': 5,
|
||||||
|
'jun': 6,
|
||||||
|
'jul': 7,
|
||||||
|
'aug': 8,
|
||||||
|
'sep': 9,
|
||||||
|
'oct': 10,
|
||||||
|
'nov': 11,
|
||||||
|
'dec': 12
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var item in filterData) {
|
||||||
|
if (item['filter_key'] == 'TIME_PERIOD') {
|
||||||
|
List<String> timePeriods = List<String>.from(item['filter_data']);
|
||||||
|
|
||||||
|
timePeriods.sort((a, b) {
|
||||||
|
List<String> aParts = a.split(RegExp(r'[-_]'));
|
||||||
|
List<String> bParts = b.split(RegExp(r'[-_]'));
|
||||||
|
|
||||||
|
int yearA = int.parse(aParts[0]);
|
||||||
|
int yearB = int.parse(bParts[0]);
|
||||||
|
|
||||||
|
// if (yearA != yearB) return yearA.compareTo(yearB);
|
||||||
|
if (yearA != yearB)
|
||||||
|
return yearB.compareTo(yearA); // Sort years in descending order
|
||||||
|
|
||||||
|
if (aParts.length == 1) return -1; // Year-only comes first
|
||||||
|
if (bParts.length == 1) return 1; // Year-only comes first
|
||||||
|
|
||||||
|
int monthA =
|
||||||
|
int.tryParse(aParts[1]) ?? monthMap[aParts[1].toLowerCase()] ?? 0;
|
||||||
|
int monthB =
|
||||||
|
int.tryParse(bParts[1]) ?? monthMap[bParts[1].toLowerCase()] ?? 0;
|
||||||
|
|
||||||
|
return monthB.compareTo(
|
||||||
|
monthA); // Sort months in descending order within the same year
|
||||||
|
// return monthA.compareTo(monthB);
|
||||||
|
});
|
||||||
|
|
||||||
|
item['filter_data'] = timePeriods;
|
||||||
|
} else if (item['filter_key'] == 'REF_AREA') {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
// Sort alphabetically for all other cases
|
||||||
|
List<String> otherFilters = List<String>.from(item['filter_data']);
|
||||||
|
otherFilters.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));
|
||||||
|
item['filter_data'] = otherFilters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// for (var item in filterData) {
|
// for (var item in filterData) {
|
||||||
// if (item['filter_key'] == 'TIME_PERIOD') {
|
// if (item['filter_key'] == 'TIME_PERIOD') {
|
||||||
// // Convert the values to integers, sort them, and convert back to strings
|
// // Convert the values to integers, sort them, and convert back to strings
|
||||||
@ -1914,7 +1998,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void performActionForTab(String tabId) {
|
void performActionForTab(String tabId) {
|
||||||
|
|
||||||
print('Selected Tab perform: $tabId');
|
print('Selected Tab perform: $tabId');
|
||||||
|
|
||||||
// Filter the chartsData array based on the tabId
|
// Filter the chartsData array based on the tabId
|
||||||
@ -2007,25 +2090,39 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final locale = ref.watch(localeProvider);
|
final locale = ref.watch(localeProvider);
|
||||||
final localeNotifier = ref.read(localeProvider.notifier);
|
final localeNotifier = ref.read(localeProvider.notifier);
|
||||||
|
|
||||||
ref.listen<Locale?>(localeProvider, (previous, next) {
|
ref.listen<Locale?>(localeProvider, (previous, next) {
|
||||||
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
|
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
|
||||||
|
|
||||||
// fetchChartData(widget.dataSets, localeCode);
|
// fetchChartData(widget.dataSets, localeCode);
|
||||||
|
print('Saving currentTab: $tabWiseKpi before locale change');
|
||||||
|
print('localeCodeWgt- $localeCode');
|
||||||
|
currentTab = tabWiseKpi;
|
||||||
|
print('Saving currentTab: $currentTab After locale change');
|
||||||
|
|
||||||
|
final List<Map<String, dynamic>> safeFilterData =
|
||||||
final List<Map<String, dynamic>> safeFilterData = widget.filter_data ?? [];
|
widget.filter_data ?? [];
|
||||||
final String safeKpi = widget.kpi ?? '';
|
final String safeKpi = widget.kpi ?? '';
|
||||||
fetchChartData(widget.dataSets,localeCode, safeKpi, safeFilterData).then((_) {
|
fetchChartData(widget.dataSets, localeCode, safeKpi, safeFilterData)
|
||||||
|
.then((_) {
|
||||||
print('DEBUG KPI: $safeKpi');
|
print('DEBUG KPI: $safeKpi');
|
||||||
if (_tabsData.isNotEmpty) {
|
|
||||||
|
print('TAB11: $currentTab');
|
||||||
|
|
||||||
|
if (currentTab.isNotEmpty) {
|
||||||
// Call onTabSelected for the first tab
|
// Call onTabSelected for the first tab
|
||||||
|
onTabSelected(currentTab);
|
||||||
|
print('TAB1: $currentTab');
|
||||||
|
} else if (_tabsData.isNotEmpty) {
|
||||||
|
// Call onTabSelected for the first tab
|
||||||
|
print('TAB2: $_tabsData');
|
||||||
onTabSelected(_tabsData[0]['id']);
|
onTabSelected(_tabsData[0]['id']);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
double myheight = MediaQuery.of(context).size.height;
|
double myheight = MediaQuery.of(context).size.height;
|
||||||
double mywidth = MediaQuery.of(context).size.width;
|
double mywidth = MediaQuery.of(context).size.width;
|
||||||
|
mainTopic = chartScreenData['main_topic'] ?? '';
|
||||||
|
|
||||||
int crossAxisCount =
|
int crossAxisCount =
|
||||||
cardData.isNotEmpty ? (cardData.length / 2).ceil().clamp(1, 2) : 1;
|
cardData.isNotEmpty ? (cardData.length / 2).ceil().clamp(1, 2) : 1;
|
||||||
@ -2046,8 +2143,10 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
(chartScreenData['body_color'] ?? '#898C81').replaceFirst('#', '0xff'),
|
(chartScreenData['body_color'] ?? '#898C81').replaceFirst('#', '0xff'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
final chartHeader = chartScreenData['main_topic'] ?? '';
|
||||||
|
|
||||||
print('ChartScrnBodyColor');
|
print('ChartScrnBodyColor');
|
||||||
|
print('chartHeader - $chartHeader');
|
||||||
print(chartScreenData['body_color']);
|
print(chartScreenData['body_color']);
|
||||||
print(
|
print(
|
||||||
Color(int.parse((chartScreenData['body_color'] ?? '#898C81')
|
Color(int.parse((chartScreenData['body_color'] ?? '#898C81')
|
||||||
@ -2098,7 +2197,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
// widget.mainTopic ?? '',
|
// widget.mainTopic ?? '',
|
||||||
chartScreenData['main_topic'] ?? '',
|
// chartScreenData['main_topic'] ?? '',
|
||||||
|
mainTopic,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 26,
|
fontSize: 26,
|
||||||
@ -2223,28 +2323,29 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () => shareCurrentPage(context),
|
onTap: () => shareCurrentPage(context),
|
||||||
|
child: Row(
|
||||||
child: Row(
|
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
context.translate(
|
context.translate(
|
||||||
'Share',
|
'Share',
|
||||||
'يشارك',
|
'يشارك',
|
||||||
|
),
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
style: const TextStyle(
|
SizedBox(width: 5),
|
||||||
fontSize: 16,
|
SvgPicture.asset(
|
||||||
color: Colors.white,
|
UaeNumbersAssetPath.share,
|
||||||
),
|
semanticsLabel: 'share',
|
||||||
),
|
width: 24,
|
||||||
SizedBox(width: 5),
|
height: 24,
|
||||||
SvgPicture.asset(
|
)
|
||||||
UaeNumbersAssetPath.share,
|
],
|
||||||
semanticsLabel: 'share',
|
),
|
||||||
width: 24,
|
),
|
||||||
height: 24,
|
|
||||||
)
|
|
||||||
],),),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
@ -2353,7 +2454,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
// ),
|
// ),
|
||||||
// nonChartData Cards
|
// nonChartData Cards
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.only(
|
||||||
|
top: 8.0, left: 1.0, right: 1.0),
|
||||||
child: LayoutBuilder(
|
child: LayoutBuilder(
|
||||||
builder: (context, constraints) {
|
builder: (context, constraints) {
|
||||||
List<Widget> rows = [];
|
List<Widget> rows = [];
|
||||||
@ -2431,23 +2533,32 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
children: [
|
children: [
|
||||||
// ConstrainedBox
|
// ConstrainedBox
|
||||||
Container(
|
Container(
|
||||||
height: (chartsData[index]
|
height: (chartsData[index]
|
||||||
['chart_type'] ==
|
['chart_type'] ==
|
||||||
'pie_chart')
|
'pie_chart')
|
||||||
? 500
|
? 500
|
||||||
: (chartsData[index][
|
: (chartsData[index][
|
||||||
'chart_type'] ==
|
'chart_type'] ==
|
||||||
'bar_chart_horizontal')
|
'bar_chart_horizontal')
|
||||||
? 370
|
? 370
|
||||||
: (chartsData[index]['chart_type'] == 'fl_stacked_bar')
|
: (chartsData[index][
|
||||||
? 390
|
'chart_type'] ==
|
||||||
: 350,
|
'horizontal_rotate')
|
||||||
|
? 385
|
||||||
|
: (chartsData[index]
|
||||||
|
[
|
||||||
|
'chart_type'] ==
|
||||||
|
'fl_stacked_bar')
|
||||||
|
? 390
|
||||||
|
: 350,
|
||||||
|
|
||||||
// child: buildChart(chartsData[index]),
|
// child: buildChart(chartsData[index]),
|
||||||
child: ChartWidget(
|
child: ChartWidget(
|
||||||
chartData:
|
chartData:
|
||||||
chartsData[index],
|
chartsData[index],
|
||||||
bodyColor: bodyColor))
|
bodyColor: bodyColor,
|
||||||
|
chartHeader: chartHeader),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -2595,16 +2706,14 @@ class CardWidget extends StatelessWidget {
|
|||||||
|
|
||||||
final bodyColor = Color(
|
final bodyColor = Color(
|
||||||
int.parse(
|
int.parse(
|
||||||
(chartScreenData['body_color'] ?? '#898C81').replaceFirst('#', '0xff'),
|
(chartScreenData['border_color'] ?? '#898C81')
|
||||||
|
.replaceFirst('#', '0xff'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (response.isEmpty) {
|
||||||
if(response.isEmpty)
|
return SizedBox.shrink();
|
||||||
{
|
} else if (response.length == 1) {
|
||||||
return SizedBox.shrink();
|
|
||||||
}
|
|
||||||
else if (response.length == 1) {
|
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.all(10),
|
margin: const EdgeInsets.all(10),
|
||||||
// width: card_full_length ? double.infinity : null,
|
// width: card_full_length ? double.infinity : null,
|
||||||
@ -2626,7 +2735,7 @@ class CardWidget extends StatelessWidget {
|
|||||||
elevation: 2,
|
elevation: 2,
|
||||||
child: Container(
|
child: Container(
|
||||||
// height: cardHeight,
|
// height: cardHeight,
|
||||||
height: 160,
|
height: 175,
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
left: 16.0, right: 16.0, bottom: 2.0, top: 1.0),
|
left: 16.0, right: 16.0, bottom: 2.0, top: 1.0),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -2757,7 +2866,7 @@ class CardWidget extends StatelessWidget {
|
|||||||
elevation: 0, // Remove shadow to keep only the outli
|
elevation: 0, // Remove shadow to keep only the outli
|
||||||
|
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 160,
|
height: 175,
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(10.0),
|
||||||
// padding: const EdgeInsets.only(
|
// padding: const EdgeInsets.only(
|
||||||
// left: 10.0, right: 10.0, bottom: 5.0, top: 1.0),
|
// left: 10.0, right: 10.0, bottom: 5.0, top: 1.0),
|
||||||
@ -2767,7 +2876,8 @@ class CardWidget extends StatelessWidget {
|
|||||||
BorderRadius.circular(12), // Ensure border radius is applied
|
BorderRadius.circular(12), // Ensure border radius is applied
|
||||||
),
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min, // Adjust card height based on content
|
mainAxisSize:
|
||||||
|
MainAxisSize.min, // Adjust card height based on content
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
// const Icon(Icons.public,
|
// const Icon(Icons.public,
|
||||||
@ -2840,8 +2950,6 @@ class CardWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 1),
|
const SizedBox(height: 1),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment
|
mainAxisAlignment: MainAxisAlignment
|
||||||
.center, // Center-aligns the row contents
|
.center, // Center-aligns the row contents
|
||||||
@ -2870,19 +2978,15 @@ class CardWidget extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 2, // Height of the divider
|
height: 2, // Height of the divider
|
||||||
width: 100,
|
width: 100,
|
||||||
child: Divider(
|
child: Divider(
|
||||||
color: Color(0xFFBBBCBD),
|
color: Color(0xFFBBBCBD),
|
||||||
thickness: 1, // Divider line thickness
|
thickness: 1, // Divider line thickness
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment
|
mainAxisAlignment: MainAxisAlignment
|
||||||
.center, // Center-aligns the row contents
|
.center, // Center-aligns the row contents
|
||||||
@ -2897,7 +3001,8 @@ class CardWidget extends StatelessWidget {
|
|||||||
: _getColorFromHex(response[1]['font_color']),
|
: _getColorFromHex(response[1]['font_color']),
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center, // Ensure proper alignment
|
textAlign: TextAlign.center, // Ensure proper alignment
|
||||||
overflow: TextOverflow.ellipsis, // Truncate if text overflows
|
overflow:
|
||||||
|
TextOverflow.ellipsis, // Truncate if text overflows
|
||||||
),
|
),
|
||||||
const SizedBox(width: 1), // Space between text and icon
|
const SizedBox(width: 1), // Space between text and icon
|
||||||
if (response[1]['font_color'] != '') ...[
|
if (response[1]['font_color'] != '') ...[
|
||||||
@ -2911,7 +3016,6 @@ class CardWidget extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
// '(${response[1]['display_value'] ?? 'NA'})',
|
// '(${response[1]['display_value'] ?? 'NA'})',
|
||||||
RegExp(r'\d').hasMatch(response[1]['display_value'] ?? '')
|
RegExp(r'\d').hasMatch(response[1]['display_value'] ?? '')
|
||||||
|
|||||||
@ -16,7 +16,7 @@ class ApiService {
|
|||||||
// static const String baseUrl = 'https://pb.venbait.in/api/getDataSet';
|
// static const String baseUrl = 'https://pb.venbait.in/api/getDataSet';
|
||||||
static const String baseUrl = '$apiUrl/api/getDataSet';
|
static const String baseUrl = '$apiUrl/api/getDataSet';
|
||||||
|
|
||||||
Future<Map<String, dynamic>> fetchChartData(String dataSets, locale,kpi,
|
Future<Map<String, dynamic>> fetchChartData(String dataSets, locale, kpi,
|
||||||
List<Map<String, dynamic>> filterData) async {
|
List<Map<String, dynamic>> filterData) async {
|
||||||
List<dynamic> isChartData = [];
|
List<dynamic> isChartData = [];
|
||||||
List<dynamic> nonChartData = [];
|
List<dynamic> nonChartData = [];
|
||||||
@ -28,14 +28,14 @@ class ApiService {
|
|||||||
// '$baseUrl?dataset=$dataSets&language=$locale&kpi=$kpi&filter_data=${Uri.encodeComponent(jsonEncode(filterData))}'
|
// '$baseUrl?dataset=$dataSets&language=$locale&kpi=$kpi&filter_data=${Uri.encodeComponent(jsonEncode(filterData))}'
|
||||||
// );
|
// );
|
||||||
|
|
||||||
|
|
||||||
final url = Uri.parse(baseUrl); // No query parameters in URL for POST
|
final url = Uri.parse(baseUrl); // No query parameters in URL for POST
|
||||||
|
|
||||||
final Map<String, dynamic> requestBody = {
|
final Map<String, dynamic> requestBody = {
|
||||||
'dataset': dataSets,
|
'dataset': dataSets,
|
||||||
'language': locale,
|
'language': locale,
|
||||||
'kpi': kpi.isNotEmpty ? kpi : null, // Avoid sending empty kpi
|
'kpi': kpi.isNotEmpty ? kpi : null, // Avoid sending empty kpi
|
||||||
'filter_data': filterData.isNotEmpty ? filterData : null, // Avoid empty list
|
'filter_data':
|
||||||
|
filterData.isNotEmpty ? filterData : [], // Avoid empty list
|
||||||
};
|
};
|
||||||
|
|
||||||
// final url = Uri.https('$baseUrl?dataset=$dataSets&language=$locale');
|
// final url = Uri.https('$baseUrl?dataset=$dataSets&language=$locale');
|
||||||
@ -66,8 +66,9 @@ class ApiService {
|
|||||||
nonChartData.add(item);
|
nonChartData.add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Map<String, dynamic> chartScreenData = jsonData['screen_heading_and_color'];
|
final Map<String, dynamic> chartScreenData =
|
||||||
|
jsonData['screen_heading_and_color'];
|
||||||
|
|
||||||
// Save original data for reset
|
// Save original data for reset
|
||||||
// originalChartsData = List.from(isChartData); // Store original data
|
// originalChartsData = List.from(isChartData); // Store original data
|
||||||
// originalCardData = List.from(nonChartData); // Store original data
|
// originalCardData = List.from(nonChartData); // Store original data
|
||||||
@ -77,7 +78,7 @@ class ApiService {
|
|||||||
'isChartData': isChartData,
|
'isChartData': isChartData,
|
||||||
'nonChartData': nonChartData,
|
'nonChartData': nonChartData,
|
||||||
'filterData': jsonData['new_filter_data'],
|
'filterData': jsonData['new_filter_data'],
|
||||||
'chartScreenData' :chartScreenData
|
'chartScreenData': chartScreenData
|
||||||
// 'filterData': jsonData['filter_data']
|
// 'filterData': jsonData['filter_data']
|
||||||
// 'originalChartsData': originalChartsData,
|
// 'originalChartsData': originalChartsData,
|
||||||
// 'originalCardData': originalCardData,
|
// 'originalCardData': originalCardData,
|
||||||
@ -195,4 +196,4 @@ class ApiService {
|
|||||||
return '$amount';
|
return '$amount';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -75,7 +75,9 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
'India',
|
'India',
|
||||||
'Canada'
|
'Canada'
|
||||||
];
|
];
|
||||||
|
final List<String> preferred_language = ['English', 'Arabic'];
|
||||||
String? _selectedCountry;
|
String? _selectedCountry;
|
||||||
|
String? _selectedLanguage;
|
||||||
bool isChecked = false;
|
bool isChecked = false;
|
||||||
bool showError = false;
|
bool showError = false;
|
||||||
final _picker = ImagePicker();
|
final _picker = ImagePicker();
|
||||||
@ -86,6 +88,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
late Future<RecordModel> userDetails;
|
late Future<RecordModel> userDetails;
|
||||||
bool _isHoveringDate = false;
|
bool _isHoveringDate = false;
|
||||||
bool _isHoveringDropdown = false;
|
bool _isHoveringDropdown = false;
|
||||||
|
bool _isHoveringPreferredLang = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@ -187,10 +190,10 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
_isLoading = true; // Start loading
|
_isLoading = true; // Start loading
|
||||||
});
|
});
|
||||||
final XFile? pickedFile =
|
final XFile? pickedFile =
|
||||||
await _picker.pickImage(source: ImageSource.gallery);
|
await _picker.pickImage(source: ImageSource.gallery);
|
||||||
if (pickedFile != null) {
|
if (pickedFile != null) {
|
||||||
final String fileExtension =
|
final String fileExtension =
|
||||||
pickedFile.path.split('.').last.toLowerCase();
|
pickedFile.path.split('.').last.toLowerCase();
|
||||||
if (fileExtension == 'jpg' ||
|
if (fileExtension == 'jpg' ||
|
||||||
fileExtension == 'jpeg' ||
|
fileExtension == 'jpeg' ||
|
||||||
fileExtension == 'png' ||
|
fileExtension == 'png' ||
|
||||||
@ -227,7 +230,8 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
builder: (context, child) {
|
builder: (context, child) {
|
||||||
return Theme(
|
return Theme(
|
||||||
data: Theme.of(context).copyWith(
|
data: Theme.of(context).copyWith(
|
||||||
dialogBackgroundColor: Colors.white, // Background color of the date picker
|
dialogBackgroundColor:
|
||||||
|
Colors.white, // Background color of the date picker
|
||||||
textButtonTheme: TextButtonThemeData(
|
textButtonTheme: TextButtonThemeData(
|
||||||
style: ButtonStyle(
|
style: ButtonStyle(
|
||||||
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
||||||
@ -237,8 +241,10 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
),
|
),
|
||||||
datePickerTheme: DatePickerThemeData(
|
datePickerTheme: DatePickerThemeData(
|
||||||
confirmButtonStyle: ButtonStyle(
|
confirmButtonStyle: ButtonStyle(
|
||||||
backgroundColor: WidgetStateProperty.all(Color(0xFFAA8E83)), // OK button background color
|
backgroundColor: WidgetStateProperty.all(
|
||||||
foregroundColor: WidgetStateProperty.all(Colors.white), // OK button text color
|
Color(0xFFAA8E83)), // OK button background color
|
||||||
|
foregroundColor: WidgetStateProperty.all(
|
||||||
|
Colors.white), // OK button text color
|
||||||
// minimumSize: WidgetStateProperty.all(Size(150, 50)),
|
// minimumSize: WidgetStateProperty.all(Size(150, 50)),
|
||||||
minimumSize: WidgetStateProperty.all(Size(100, 40)),
|
minimumSize: WidgetStateProperty.all(Size(100, 40)),
|
||||||
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
||||||
@ -247,12 +253,14 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
),
|
),
|
||||||
cancelButtonStyle: ButtonStyle(
|
cancelButtonStyle: ButtonStyle(
|
||||||
// backgroundColor: WidgetStateProperty.all(Colors.white), // Cancel button background color
|
// backgroundColor: WidgetStateProperty.all(Colors.white), // Cancel button background color
|
||||||
foregroundColor: WidgetStateProperty.all(Color(0xFFAA8E83)), // Cancel button text color
|
foregroundColor: WidgetStateProperty.all(
|
||||||
|
Color(0xFFAA8E83)), // Cancel button text color
|
||||||
// minimumSize: WidgetStateProperty.all(Size(150, 50)),
|
// minimumSize: WidgetStateProperty.all(Size(150, 50)),
|
||||||
minimumSize: WidgetStateProperty.all(Size(100, 40)),
|
minimumSize: WidgetStateProperty.all(Size(100, 40)),
|
||||||
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
shape: WidgetStateProperty.all(RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(12.0), // Rounded corners
|
borderRadius: BorderRadius.circular(12.0), // Rounded corners
|
||||||
side: const BorderSide(color: Color(0xFFAA8E83), width: 2), // Outline color
|
side: const BorderSide(
|
||||||
|
color: Color(0xFFAA8E83), width: 2), // Outline color
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -262,7 +270,6 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
if (pickedDate != null && pickedDate != _selectedDate) {
|
if (pickedDate != null && pickedDate != _selectedDate) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_selectedDate = pickedDate;
|
_selectedDate = pickedDate;
|
||||||
@ -282,7 +289,8 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
|
|
||||||
// Check if the selected date is in the future
|
// Check if the selected date is in the future
|
||||||
if (selectedDate.isAfter(today)) {
|
if (selectedDate.isAfter(today)) {
|
||||||
return context.translate('Date of birth cannot be in the future','لا يمكن أن يكون تاريخ الميلاد في المستقبل');
|
return context.translate('Date of birth cannot be in the future',
|
||||||
|
'لا يمكن أن يكون تاريخ الميلاد في المستقبل');
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -315,6 +323,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
// String email = 'surendarsuri30@gmail.com';
|
// String email = 'surendarsuri30@gmail.com';
|
||||||
String dateOfBirth = _dateController.text; // in DD/MM/YYYY format
|
String dateOfBirth = _dateController.text; // in DD/MM/YYYY format
|
||||||
String countryRegion = _selectedCountry ?? '';
|
String countryRegion = _selectedCountry ?? '';
|
||||||
|
String preferredLang = _selectedLanguage == 'English' ? 'en' : 'ar';
|
||||||
bool termsAccepted = isChecked;
|
bool termsAccepted = isChecked;
|
||||||
|
|
||||||
// Parse the date from dd/MM/yyyy format and convert to yyyy-MM-dd
|
// Parse the date from dd/MM/yyyy format and convert to yyyy-MM-dd
|
||||||
@ -324,13 +333,14 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
|
|
||||||
// Create a multipart request
|
// Create a multipart request
|
||||||
final uri =
|
final uri =
|
||||||
Uri.parse('${_pb.baseUrl}/api/collections/users/records/$userID');
|
Uri.parse('${_pb.baseUrl}/api/collections/users/records/$userID');
|
||||||
final request = http.MultipartRequest('PATCH', uri);
|
final request = http.MultipartRequest('PATCH', uri);
|
||||||
|
|
||||||
// Add other fields
|
// Add other fields
|
||||||
request.fields['full_name'] = fullName;
|
request.fields['full_name'] = fullName;
|
||||||
request.fields['dob'] = formattedDob;
|
request.fields['dob'] = formattedDob;
|
||||||
request.fields['country_region'] = countryRegion;
|
request.fields['country_region'] = countryRegion;
|
||||||
|
request.fields['language'] = preferredLang;
|
||||||
request.fields['is_profile_completed'] = 'True';
|
request.fields['is_profile_completed'] = 'True';
|
||||||
|
|
||||||
// Add the file, if available
|
// Add the file, if available
|
||||||
@ -371,6 +381,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
_fullNameController.clear();
|
_fullNameController.clear();
|
||||||
_dateController.clear();
|
_dateController.clear();
|
||||||
_selectedCountry = null;
|
_selectedCountry = null;
|
||||||
|
_selectedLanguage = null;
|
||||||
isChecked = false;
|
isChecked = false;
|
||||||
|
|
||||||
// Reset profile image
|
// Reset profile image
|
||||||
@ -399,14 +410,15 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
'Logout',
|
'Logout',
|
||||||
'تسجيل الخروج',
|
'تسجيل الخروج',
|
||||||
),
|
),
|
||||||
style: TextStyle(color: Color(0xFF898C81),fontWeight: FontWeight.w700),
|
style:
|
||||||
|
TextStyle(color: Color(0xFF898C81), fontWeight: FontWeight.w700),
|
||||||
),
|
),
|
||||||
content: Text(
|
content: Text(
|
||||||
context.translate(
|
context.translate(
|
||||||
'Are you sure you want to logout?',
|
'Are you sure you want to logout?',
|
||||||
'هل أنت متأكد أنك تريد تسجيل الخروج؟',
|
'هل أنت متأكد أنك تريد تسجيل الخروج؟',
|
||||||
),
|
),
|
||||||
style: TextStyle(color:Color(0xFF898C81)),
|
style: TextStyle(color: Color(0xFF898C81)),
|
||||||
),
|
),
|
||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
@ -414,7 +426,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
style: TextButton.styleFrom(
|
style: TextButton.styleFrom(
|
||||||
// backgroundColor:
|
// backgroundColor:
|
||||||
// Color(0xFFAA8E83), // Set background color
|
// Color(0xFFAA8E83), // Set background color
|
||||||
side: BorderSide(color: Color(0xFFAA8E83), width: 2),
|
side: BorderSide(color: Color(0xFFAA8E83), width: 2),
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(10.0), // Set text color
|
borderRadius: BorderRadius.circular(10.0), // Set text color
|
||||||
),
|
),
|
||||||
@ -432,12 +444,10 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => logout(context), // Exit the app
|
onPressed: () => logout(context), // Exit the app
|
||||||
style: TextButton.styleFrom(
|
style: TextButton.styleFrom(
|
||||||
backgroundColor:
|
backgroundColor: Color(0xFFAA8E83), // Set background color
|
||||||
Color(0xFFAA8E83), // Set background color
|
|
||||||
// foregroundColor: Colors.white,
|
// foregroundColor: Colors.white,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius:
|
borderRadius: BorderRadius.circular(10.0), // Set text color
|
||||||
BorderRadius.circular(10.0), // Set text color
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -560,7 +570,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
backgroundImage: _profileImage != null
|
backgroundImage: _profileImage != null
|
||||||
? FileImage(_profileImage!)
|
? FileImage(_profileImage!)
|
||||||
: AssetImage("assets/edit_profile/profile.png")
|
: AssetImage("assets/edit_profile/profile.png")
|
||||||
as ImageProvider,
|
as ImageProvider,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.bottomRight,
|
alignment: Alignment.bottomRight,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
@ -584,7 +594,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
child: CircularProgressIndicator(
|
child: CircularProgressIndicator(
|
||||||
strokeWidth: 2,
|
strokeWidth: 2,
|
||||||
valueColor:
|
valueColor:
|
||||||
AlwaysStoppedAnimation<Color>(Colors.grey),
|
AlwaysStoppedAnimation<Color>(Colors.grey),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -673,19 +683,18 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$");
|
r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$");
|
||||||
|
|
||||||
if (!nameRegex.hasMatch(value)) {
|
if (!nameRegex.hasMatch(value)) {
|
||||||
return AppLocalizations.of(context)!.invalid_characters;
|
return AppLocalizations.of(context)!
|
||||||
|
.invalid_characters;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
controller: _fullNameController,
|
controller: _fullNameController,
|
||||||
focusNode: _focusNodes[2],
|
focusNode: _focusNodes[2],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
enabledBorder:OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
borderRadius:
|
borderRadius: BorderRadius.circular(10),
|
||||||
BorderRadius.circular(10),
|
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: MyTheme.topicColor(
|
color: MyTheme.topicColor(IndicatorTopic.economy)
|
||||||
IndicatorTopic.economy)
|
|
||||||
.shade400,
|
.shade400,
|
||||||
width: 1), // Enabled border
|
width: 1), // Enabled border
|
||||||
),
|
),
|
||||||
@ -695,7 +704,8 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderSide:BorderSide(color: Color(0xFF7296BE),
|
borderSide: BorderSide(
|
||||||
|
color: Color(0xFF7296BE),
|
||||||
),
|
),
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
),
|
),
|
||||||
@ -723,17 +733,17 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
controller: _dateController,
|
controller: _dateController,
|
||||||
focusNode: _focusNodes[3],
|
focusNode: _focusNodes[3],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
enabledBorder:OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
borderRadius:
|
borderRadius: BorderRadius.circular(10),
|
||||||
BorderRadius.circular(10),
|
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: MyTheme.topicColor(
|
color:
|
||||||
IndicatorTopic.economy)
|
MyTheme.topicColor(IndicatorTopic.economy)
|
||||||
.shade400,
|
.shade400,
|
||||||
width: 1), // Enabled border
|
width: 1), // Enabled border
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderSide:BorderSide(color: Color(0xFF7296BE),
|
borderSide: BorderSide(
|
||||||
|
color: Color(0xFF7296BE),
|
||||||
),
|
),
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
),
|
),
|
||||||
@ -748,10 +758,11 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
width: 45,
|
width: 45,
|
||||||
padding: EdgeInsets.only(right: 1),
|
padding: EdgeInsets.only(right: 1),
|
||||||
alignment:
|
alignment:
|
||||||
Alignment.center, // Center the icon vertically
|
Alignment.center, // Center the icon vertically
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.keyboard_arrow_down_sharp,
|
Icons.keyboard_arrow_down_sharp,
|
||||||
color: _isHoveringDate ? Colors.black : Colors.grey,
|
color:
|
||||||
|
_isHoveringDate ? Colors.black : Colors.grey,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -773,35 +784,37 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
MouseRegion(
|
MouseRegion(
|
||||||
onEnter: (_) => setState(() => _isHoveringDropdown = true),
|
onEnter: (_) =>
|
||||||
onExit: (_) => setState(() => _isHoveringDropdown = false),
|
setState(() => _isHoveringDropdown = true),
|
||||||
|
onExit: (_) =>
|
||||||
|
setState(() => _isHoveringDropdown = false),
|
||||||
child: DropdownButtonFormField<String>(
|
child: DropdownButtonFormField<String>(
|
||||||
value: _selectedCountry,
|
value: _selectedCountry,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
enabledBorder:OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
borderRadius:
|
borderRadius: BorderRadius.circular(10),
|
||||||
BorderRadius.circular(10),
|
borderSide: BorderSide(
|
||||||
borderSide: BorderSide(
|
color:
|
||||||
color: MyTheme.topicColor(
|
MyTheme.topicColor(IndicatorTopic.economy)
|
||||||
IndicatorTopic.economy)
|
.shade400,
|
||||||
.shade400,
|
width: 1), // Enabled border
|
||||||
width: 1), // Enabled border
|
|
||||||
),
|
|
||||||
border: OutlineInputBorder(
|
|
||||||
borderSide:BorderSide(color: Color(0xFF7296BE),
|
|
||||||
),
|
),
|
||||||
borderRadius: BorderRadius.circular(8),
|
border: OutlineInputBorder(
|
||||||
),
|
borderSide: BorderSide(
|
||||||
labelText: context.translate('Select',' اختيار')
|
color: Color(0xFF7296BE),
|
||||||
),
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
labelText: context.translate('Select', ' اختيار')),
|
||||||
icon: Icon(Icons.keyboard_arrow_down_sharp,
|
icon: Icon(Icons.keyboard_arrow_down_sharp,
|
||||||
color:
|
color: _isHoveringDropdown
|
||||||
_isHoveringDropdown ? Colors.black : Colors.grey),
|
? Colors.black
|
||||||
|
: Colors.grey),
|
||||||
items: _countries
|
items: _countries
|
||||||
.map((item) => DropdownMenuItem<String>(
|
.map((item) => DropdownMenuItem<String>(
|
||||||
value: item,
|
value: item,
|
||||||
child: Text(item),
|
child: Text(item),
|
||||||
))
|
))
|
||||||
.toList(),
|
.toList(),
|
||||||
onChanged: (String? newValue) {
|
onChanged: (String? newValue) {
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -811,6 +824,59 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
validator: _validateDropdown,
|
validator: _validateDropdown,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
SizedBox(height: 10),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
AppLocalizations.of(context)!.preferredLang,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16, fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 10),
|
||||||
|
MouseRegion(
|
||||||
|
onEnter: (_) =>
|
||||||
|
setState(() => _isHoveringPreferredLang = true),
|
||||||
|
onExit: (_) =>
|
||||||
|
setState(() => _isHoveringPreferredLang = false),
|
||||||
|
child: DropdownButtonFormField<String>(
|
||||||
|
value: _selectedLanguage,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
borderSide: BorderSide(
|
||||||
|
color:
|
||||||
|
MyTheme.topicColor(IndicatorTopic.economy)
|
||||||
|
.shade400,
|
||||||
|
width: 1), // Enabled border
|
||||||
|
),
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderSide: BorderSide(
|
||||||
|
color: Color(0xFF7296BE),
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
labelText: context.translate('Select', ' اختيار')),
|
||||||
|
icon: Icon(Icons.keyboard_arrow_down_sharp,
|
||||||
|
color: _isHoveringPreferredLang
|
||||||
|
? Colors.black
|
||||||
|
: Colors.grey),
|
||||||
|
items: preferred_language
|
||||||
|
.map((item) => DropdownMenuItem<String>(
|
||||||
|
value: item,
|
||||||
|
child: Text(item),
|
||||||
|
))
|
||||||
|
.toList(),
|
||||||
|
onChanged: (String? newValue) {
|
||||||
|
setState(() {
|
||||||
|
_selectedLanguage = newValue;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
validator: _validateDropdown,
|
||||||
|
),
|
||||||
|
),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
@ -823,53 +889,48 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
side: BorderSide(
|
side: BorderSide(
|
||||||
color:
|
color: showError
|
||||||
showError ? Color(0xFFb22222) : Color(0xFF7296BE),
|
? Color(0xFFb22222)
|
||||||
|
: Color(0xFF7296BE),
|
||||||
width: 1,
|
width: 1,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
top: 14.0,),
|
top: 14.0,
|
||||||
|
),
|
||||||
child: Text.rich(
|
child: Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations.of(
|
text: AppLocalizations.of(context)!.agree,
|
||||||
context)!
|
|
||||||
.agree,
|
|
||||||
// text: 'I agree to ',
|
// text: 'I agree to ',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
color: Color(
|
color: Color(
|
||||||
0xFF898C81,), // Change to your desired color
|
0xFF898C81,
|
||||||
|
), // Change to your desired color
|
||||||
),
|
),
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
recognizer:TapGestureRecognizer()
|
recognizer: TapGestureRecognizer()
|
||||||
..onTap = () => context.push('/terms&conditions'),
|
..onTap = () =>
|
||||||
text: AppLocalizations.of(
|
context.push('/terms&conditions'),
|
||||||
context)!
|
text: AppLocalizations.of(context)!
|
||||||
.terms_conditions,
|
.terms_conditions,
|
||||||
// text: 'Terms & Conditions',
|
// text: 'Terms & Conditions',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
fontWeight:
|
fontWeight: FontWeight.bold,
|
||||||
FontWeight.bold,
|
color: Color(0xFF985400),
|
||||||
color:
|
|
||||||
Color(0xFF985400),
|
|
||||||
// Makes the text bold
|
// Makes the text bold
|
||||||
// decoration:
|
// decoration:
|
||||||
// TextDecoration.underline,
|
// TextDecoration.underline,
|
||||||
decorationColor:
|
decorationColor: Color(0xFF985400),
|
||||||
Color(0xFF985400),
|
decorationThickness: 1),
|
||||||
decorationThickness:
|
|
||||||
1),
|
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations.of(
|
text: AppLocalizations.of(context)!.t_and,
|
||||||
context)!
|
|
||||||
.t_and,
|
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(
|
color: Color(
|
||||||
0xFF898C81), // Change to your desired color
|
0xFF898C81), // Change to your desired color
|
||||||
@ -877,31 +938,26 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
recognizer: TapGestureRecognizer()
|
recognizer: TapGestureRecognizer()
|
||||||
..onTap = () => context.push('/privacy_policy'),
|
..onTap =
|
||||||
text: AppLocalizations.of(
|
() => context.push('/privacy_policy'),
|
||||||
context)!
|
text: AppLocalizations.of(context)!
|
||||||
.privacy_policy,
|
.privacy_policy,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight:
|
fontWeight: FontWeight.bold,
|
||||||
FontWeight.bold,
|
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
fontFamily: 'Roboto',
|
fontFamily: 'Roboto',
|
||||||
color:
|
color: Color(0xFF985400),
|
||||||
Color(0xFF985400),
|
|
||||||
// decoration:
|
// decoration:
|
||||||
// TextDecoration.underline,
|
// TextDecoration.underline,
|
||||||
decorationColor:
|
decorationColor: Color(0xFF648CBA),
|
||||||
Color(0xFF648CBA),
|
decorationThickness: 1),
|
||||||
decorationThickness:
|
|
||||||
1),
|
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations.of(
|
text: AppLocalizations.of(context)!
|
||||||
context)!
|
|
||||||
.conditions,
|
.conditions,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
color: Color(
|
color: Color(
|
||||||
0xFF898C81), // Change to your desired color
|
0xFF898C81), // Change to your desired color
|
||||||
),
|
),
|
||||||
@ -918,13 +974,14 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.only(left: 10.0, right: profileLocale
|
padding: EdgeInsets.only(
|
||||||
?.languageCode ==
|
left: 10.0,
|
||||||
'ar'
|
right: profileLocale?.languageCode == 'ar'
|
||||||
? 15
|
? 15
|
||||||
: 0.0,),
|
: 0.0,
|
||||||
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
context.translate('Required', 'مطلوب'),
|
context.translate('Required', 'مطلوب'),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0xFFb22222),
|
color: Color(0xFFb22222),
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
@ -960,7 +1017,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
hasValidated = true;
|
hasValidated = true;
|
||||||
});
|
});
|
||||||
if ((_formKey.currentState?.validate() ?? false) &&
|
if ((_formKey.currentState?.validate() ?? false) &&
|
||||||
(isChecked)) {
|
(isChecked)) {
|
||||||
@ -969,7 +1026,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
} else {
|
} else {
|
||||||
setState(() {
|
setState(() {
|
||||||
showError =
|
showError =
|
||||||
!isChecked; // Show error if the checkbox is not checked
|
!isChecked; // Show error if the checkbox is not checked
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -982,7 +1039,7 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
|||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment:
|
mainAxisAlignment:
|
||||||
MainAxisAlignment.center, // Center the content
|
MainAxisAlignment.center, // Center the content
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
AppLocalizations.of(context)!.save,
|
AppLocalizations.of(context)!.save,
|
||||||
@ -1041,10 +1098,10 @@ class ConfirmationDialog extends StatelessWidget {
|
|||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations.of(context)!.name,
|
text: AppLocalizations.of(context)!.name,
|
||||||
style:
|
style:
|
||||||
TextStyle(fontWeight: FontWeight.w700), // Bold for "name"
|
TextStyle(fontWeight: FontWeight.w700), // Bold for "name"
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: context.translate(' or ','أو'),
|
text: context.translate(' or ', 'أو'),
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations.of(context)!.dob,
|
text: AppLocalizations.of(context)!.dob,
|
||||||
@ -1111,4 +1168,4 @@ class ConfirmationDialog extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,12 +7,14 @@ const Color environmentboldColor = Color(0xFF90B0D5);
|
|||||||
const TextStyle subtitleStyle = TextStyle(
|
const TextStyle subtitleStyle = TextStyle(
|
||||||
fontFamily: 'Roboto', // Font family set to Roboto
|
fontFamily: 'Roboto', // Font family set to Roboto
|
||||||
fontWeight: FontWeight.w400, // Regular weight (w400)
|
fontWeight: FontWeight.w400, // Regular weight (w400)
|
||||||
fontSize: 11,
|
// fontSize: 11,
|
||||||
|
fontSize: 11 * 1.2, // Increase by 20%
|
||||||
color: Color(0xFF8E8E8E) // Font size 11
|
color: Color(0xFF8E8E8E) // Font size 11
|
||||||
);
|
);
|
||||||
const TextStyle robotoRegular11 = TextStyle(
|
const TextStyle robotoRegular11 = TextStyle(
|
||||||
fontFamily: 'Roboto', // Font family set to Roboto
|
fontFamily: 'Roboto', // Font family set to Roboto
|
||||||
fontWeight: FontWeight.w400, // Regular weight (w400)
|
fontWeight: FontWeight.w400, // Regular weight (w400)
|
||||||
fontSize: 11,
|
fontSize: 11 * 1.1,
|
||||||
color: Color(0xFF000000) // Font size 11
|
color: Color(0xFF000000) // Font size 11
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:external_repos/external_repos.dart';
|
import 'package:external_repos/external_repos.dart';
|
||||||
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
@ -27,7 +28,6 @@ import 'package:pocketbase/pocketbase.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:uae_stat/config/api_config.dart';
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
|
|
||||||
import '../../components/indicators/locale_provider.dart';
|
import '../../components/indicators/locale_provider.dart';
|
||||||
import '../../components/my_toggle.dart';
|
import '../../components/my_toggle.dart';
|
||||||
|
|
||||||
@ -42,7 +42,8 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
dynamic userData;
|
dynamic userData;
|
||||||
String? role;
|
String? role;
|
||||||
int? loginCount;
|
int? loginCount;
|
||||||
|
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
|
||||||
|
// final FirebaseAuth _auth = FirebaseAuth.instance;
|
||||||
static final formKey = GlobalKey<FormState>();
|
static final formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
Future<bool> profileStatus(String userId) async {
|
Future<bool> profileStatus(String userId) async {
|
||||||
@ -97,6 +98,89 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
await prefs.setString('login_count', count.toString());
|
await prefs.setString('login_count', count.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Future<void> getDeviceToken() async {
|
||||||
|
// String? token = await FirebaseMessaging.instance.getToken();
|
||||||
|
// print("FCM Token: $token");
|
||||||
|
// }
|
||||||
|
|
||||||
|
Future<void> getDeviceToken(BuildContext context, String userId) async {
|
||||||
|
try {
|
||||||
|
// await _firebaseMessaging.requestPermission();
|
||||||
|
print("FCM Token Entry");
|
||||||
|
String? token = await FirebaseMessaging.instance.getToken();
|
||||||
|
print("FCM Token: $token");
|
||||||
|
|
||||||
|
if (token != null) {
|
||||||
|
await updateDeviceToken(userId, token);
|
||||||
|
|
||||||
|
// Automatically copy to clipboard
|
||||||
|
// Clipboard.setData(ClipboardData(text: token));
|
||||||
|
|
||||||
|
// Show token in Alert Dialog
|
||||||
|
// if (context.mounted) {
|
||||||
|
// showDialog(
|
||||||
|
// context: context,
|
||||||
|
// builder: (context) {
|
||||||
|
// return AlertDialog(
|
||||||
|
// title: Text("FCM Token"),
|
||||||
|
// content: Column(
|
||||||
|
// mainAxisSize: MainAxisSize.min,
|
||||||
|
// children: [
|
||||||
|
// SelectableText(token), // Allows manual selection
|
||||||
|
// SizedBox(height: 10),
|
||||||
|
// Text(
|
||||||
|
// "Token copied to clipboard ✅",
|
||||||
|
// style: TextStyle(color: Colors.green),
|
||||||
|
// ),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// actions: [
|
||||||
|
// TextButton(
|
||||||
|
// onPressed: () => Navigator.pop(context),
|
||||||
|
// child: Text("OK"),
|
||||||
|
// ),
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
|
// },
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print("Error getting FCM Token: $e");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateDeviceToken(String userId, String token) async {
|
||||||
|
final url = "${pb.baseUrl}/api/collections/users/records/$userId";
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Authenticate admin (Persist session globally instead)
|
||||||
|
await pb.admins.authWithPassword(
|
||||||
|
'pb@venbainfotech.com',
|
||||||
|
'pb@venbainfotech.com',
|
||||||
|
);
|
||||||
|
|
||||||
|
final response = await http.patch(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json', // Add this
|
||||||
|
'Authorization': pb.authStore.token, // Correct way to send auth token
|
||||||
|
},
|
||||||
|
body: jsonEncode({
|
||||||
|
"device_token": token,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
print("✅ Device token updated successfully!");
|
||||||
|
} else {
|
||||||
|
print("❌ Failed to update device token: ${response.body}");
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print("🚨 Error updating device token: $e");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Future<void> authenticateAndStoreData() async {
|
// Future<void> authenticateAndStoreData() async {
|
||||||
// try {
|
// try {
|
||||||
// // Perform authentication
|
// // Perform authentication
|
||||||
@ -244,15 +328,13 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
'تم إرسال بريد إلكتروني إلى $email يتضمن المزيد من التفاصيل.',
|
'تم إرسال بريد إلكتروني إلى $email يتضمن المزيد من التفاصيل.',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
},
|
},
|
||||||
style: TextButton.styleFrom(
|
style: TextButton.styleFrom(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
// maximumSize: Size.zero,
|
// maximumSize: Size.zero,
|
||||||
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
overlayColor: Colors.white
|
overlayColor: Colors.white),
|
||||||
),
|
|
||||||
child: Text(
|
child: Text(
|
||||||
context.translate(
|
context.translate(
|
||||||
'Forgot Password?',
|
'Forgot Password?',
|
||||||
@ -273,7 +355,7 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
hasValidated.value=true;
|
hasValidated.value = true;
|
||||||
final isValid = formKey.currentState!.validate();
|
final isValid = formKey.currentState!.validate();
|
||||||
if (!isValid) return;
|
if (!isValid) return;
|
||||||
final session = await context.loaderWithErrorDialog(
|
final session = await context.loaderWithErrorDialog(
|
||||||
@ -367,6 +449,7 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await saveUserId(userId, loginCount);
|
await saveUserId(userId, loginCount);
|
||||||
|
await getDeviceToken(context, userId);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
final bool isProfileComplete = await profileStatus(userId);
|
final bool isProfileComplete = await profileStatus(userId);
|
||||||
@ -451,14 +534,14 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
'Login',
|
'Login',
|
||||||
'تسجيل الدخول',
|
'تسجيل الدخول',
|
||||||
),
|
),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontFamily: context.translate(
|
fontFamily: context.translate(
|
||||||
'Roboto',
|
'Roboto',
|
||||||
'Roboto',
|
'Roboto',
|
||||||
),
|
|
||||||
fontSize: locale?.languageCode == 'ar' ? 12: 18,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
),
|
),
|
||||||
|
fontSize: locale?.languageCode == 'ar' ? 12 : 18,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
6.horizontalSpace,
|
6.horizontalSpace,
|
||||||
const Icon(
|
const Icon(
|
||||||
@ -478,16 +561,15 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
'Email',
|
'Email',
|
||||||
'بريد إلكتروني',
|
'بريد إلكتروني',
|
||||||
),
|
),
|
||||||
|
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
final emailRegex =
|
final emailRegex =
|
||||||
r'^[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+@[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+\.[a-zA-Z]{2,}$';
|
r'^[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+@[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+\.[a-zA-Z]{2,}$';
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return context.translate('Required', 'مطلوب');
|
return context.translate('Required', 'مطلوب');
|
||||||
}
|
} else if (!RegExp(emailRegex).hasMatch(value)) {
|
||||||
else if (!RegExp(emailRegex).hasMatch(value)) {
|
|
||||||
return AppLocalizations.of(context)!.invalid_email;
|
return AppLocalizations.of(context)!.invalid_email;
|
||||||
} return null;
|
}
|
||||||
|
return null;
|
||||||
},
|
},
|
||||||
imgPath: MiscIconAssetPath.person,
|
imgPath: MiscIconAssetPath.person,
|
||||||
controller: emailCtl,
|
controller: emailCtl,
|
||||||
@ -662,48 +744,47 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
final listViewHorizontalPadding =
|
final listViewHorizontalPadding =
|
||||||
screenWidth < 700 ? 30 : 30 + (screenWidth - 700) / 2;
|
screenWidth < 700 ? 30 : 30 + (screenWidth - 700) / 2;
|
||||||
final scaffoldBody = SingleChildScrollView(
|
final scaffoldBody = SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(children: [
|
||||||
children:[
|
Padding(
|
||||||
Padding(
|
padding: EdgeInsets.all(16),
|
||||||
padding: EdgeInsets.all(16),
|
child: Column(
|
||||||
child: Column(
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisSize: MainAxisSize.min,
|
children: [
|
||||||
children: [
|
3.verticalSpace,
|
||||||
3.verticalSpace,
|
Align(
|
||||||
Align(
|
alignment: AlignmentDirectional.topEnd,
|
||||||
alignment: AlignmentDirectional.topEnd,
|
child: MyToggle(
|
||||||
child: MyToggle(
|
isOn: locale?.languageCode == 'en',
|
||||||
isOn: locale?.languageCode == 'en',
|
knobTextWhenOn: 'ع',
|
||||||
knobTextWhenOn: 'ع',
|
knobTextWhenOff: 'EN',
|
||||||
knobTextWhenOff: 'EN',
|
pathColorWhenOn: Colors.grey.shade300,
|
||||||
pathColorWhenOn: Colors.grey.shade300,
|
pathColorWhenOff: Colors.grey.shade300,
|
||||||
pathColorWhenOff: Colors.grey.shade300,
|
onTap: () {
|
||||||
onTap: () {
|
final formState = formKey.currentState;
|
||||||
final formState = formKey.currentState;
|
ref.read(localeProvider.notifier).toggleLocale();
|
||||||
ref.read(localeProvider.notifier).toggleLocale();
|
Future.delayed(Duration(milliseconds: 100), () {
|
||||||
Future.delayed(Duration(milliseconds: 100), () {
|
if (hasValidated.value &&
|
||||||
if (hasValidated.value && formState?.validate() == false) {
|
formState?.validate() == false) {
|
||||||
formState?.validate();
|
formState?.validate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
|
||||||
34.verticalSpace,
|
|
||||||
helloAndPleaseLoginTexts,
|
|
||||||
40.verticalSpace,
|
|
||||||
form,
|
|
||||||
15.verticalSpace,
|
|
||||||
dontHaveAnAccountRegisterBtn,
|
|
||||||
// continueAsGuestBtn,
|
|
||||||
// Spacer(),
|
|
||||||
15.verticalSpace,
|
|
||||||
fcscBanner,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
)
|
34.verticalSpace,
|
||||||
]
|
helloAndPleaseLoginTexts,
|
||||||
),
|
40.verticalSpace,
|
||||||
|
form,
|
||||||
|
15.verticalSpace,
|
||||||
|
dontHaveAnAccountRegisterBtn,
|
||||||
|
// continueAsGuestBtn,
|
||||||
|
// Spacer(),
|
||||||
|
15.verticalSpace,
|
||||||
|
fcscBanner,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
]),
|
||||||
);
|
);
|
||||||
// final bgScaffold = Scaffold(
|
// final bgScaffold = Scaffold(
|
||||||
// backgroundColor: Colors.white,
|
// backgroundColor: Colors.white,
|
||||||
@ -783,4 +864,4 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
// ),
|
// ),
|
||||||
// );
|
// );
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1456,7 +1456,8 @@ class InfoCard extends StatelessWidget {
|
|||||||
child: Text(
|
child: Text(
|
||||||
title,
|
title,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 11,
|
// fontSize: 11,
|
||||||
|
fontSize: 11 * 1.1,
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
// color: Colors.black,
|
// color: Colors.black,
|
||||||
fontFamily: 'Roboto',
|
fontFamily: 'Roboto',
|
||||||
@ -1478,7 +1479,8 @@ class InfoCard extends StatelessWidget {
|
|||||||
subtitle,
|
subtitle,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 11,
|
// fontSize: 11,
|
||||||
|
fontSize: 11 * 1.1,
|
||||||
fontFamily: 'Roboto',
|
fontFamily: 'Roboto',
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
color: Color(0xFF8E8E8E),
|
color: Color(0xFF8E8E8E),
|
||||||
|
|||||||
@ -204,7 +204,7 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
|
|
||||||
if (avatarFilename.isNotEmpty && recordId.isNotEmpty) {
|
if (avatarFilename.isNotEmpty && recordId.isNotEmpty) {
|
||||||
_avatarUrl =
|
_avatarUrl =
|
||||||
'$apiUrl/$collectionId/$recordId/$avatarFilename';
|
'$apiUrl/api/files/$collectionId/$recordId/$avatarFilename';
|
||||||
} else {
|
} else {
|
||||||
_avatarUrl = ''; // Reset to default or empty
|
_avatarUrl = ''; // Reset to default or empty
|
||||||
}
|
}
|
||||||
@ -308,7 +308,8 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
|
|
||||||
// Check if the selected date is in the future
|
// Check if the selected date is in the future
|
||||||
if (selectedDate.isAfter(today)) {
|
if (selectedDate.isAfter(today)) {
|
||||||
return context.translate('Date of birth cannot be in the future','لا يمكن أن يكون تاريخ الميلاد في المستقبل');
|
return context.translate('Date of birth cannot be in the future',
|
||||||
|
'لا يمكن أن يكون تاريخ الميلاد في المستقبل');
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -691,7 +692,8 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return context.translate('Required', 'مطلوب');
|
return context.translate(
|
||||||
|
'Required', 'مطلوب');
|
||||||
}
|
}
|
||||||
|
|
||||||
//RegExp(r"^[a-zA-Z\s]+$");
|
//RegExp(r"^[a-zA-Z\s]+$");
|
||||||
@ -699,7 +701,8 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$",
|
r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$",
|
||||||
);
|
);
|
||||||
if (!nameRegex.hasMatch(value)) {
|
if (!nameRegex.hasMatch(value)) {
|
||||||
return AppLocalizations.of(context)!.invalid_characters;
|
return AppLocalizations.of(context)!
|
||||||
|
.invalid_characters;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
@ -787,18 +790,19 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
),
|
),
|
||||||
value: _selectedCountry,
|
value: _selectedCountry,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
enabledBorder:OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.circular(10),
|
BorderRadius.circular(10),
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: MyTheme.topicColor(
|
color: MyTheme.topicColor(
|
||||||
IndicatorTopic.economy)
|
IndicatorTopic.economy)
|
||||||
.shade400,
|
.shade400,
|
||||||
width: 1), // Enabled border
|
width: 1), // Enabled border
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderSide:BorderSide(color: Color(0xFF7296BE),
|
borderSide: BorderSide(
|
||||||
),
|
color: Color(0xFF7296BE),
|
||||||
|
),
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.circular(8),
|
BorderRadius.circular(8),
|
||||||
),
|
),
|
||||||
@ -845,8 +849,9 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
color: showError
|
color: showError
|
||||||
? Color(0xFFb22222)
|
? Color(0xFFb22222)
|
||||||
: MyTheme.topicColor(
|
: MyTheme.topicColor(
|
||||||
IndicatorTopic.economy)
|
IndicatorTopic
|
||||||
.shade400,
|
.economy)
|
||||||
|
.shade400,
|
||||||
width: 1.5,
|
width: 1.5,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -880,8 +885,11 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
TextDecoration
|
TextDecoration
|
||||||
.underline,
|
.underline,
|
||||||
),
|
),
|
||||||
recognizer:TapGestureRecognizer()
|
recognizer:
|
||||||
..onTap = () => context.push('/terms&conditions'),
|
TapGestureRecognizer()
|
||||||
|
..onTap = () =>
|
||||||
|
context.push(
|
||||||
|
'/terms&conditions'),
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations
|
text: AppLocalizations
|
||||||
@ -907,9 +915,11 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
TextDecoration
|
TextDecoration
|
||||||
.underline,
|
.underline,
|
||||||
),
|
),
|
||||||
recognizer: TapGestureRecognizer()
|
recognizer:
|
||||||
..onTap = () => context.push('/privacy_policy'),
|
TapGestureRecognizer()
|
||||||
|
..onTap = () =>
|
||||||
|
context.push(
|
||||||
|
'/privacy_policy'),
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: AppLocalizations
|
text: AppLocalizations
|
||||||
@ -1151,4 +1161,4 @@ class ConfirmationDialog extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -342,14 +342,18 @@ class _ManageUserRouterState extends State<ManageUserRouter> {
|
|||||||
padding: EdgeInsets.only(left: 12.0),
|
padding: EdgeInsets.only(left: 12.0),
|
||||||
child: TextField(
|
child: TextField(
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: "Search",
|
hintText: AppLocalizations.of(context)!.search,
|
||||||
hintStyle: TextStyle(color: Color(0xFF898C81)),
|
hintStyle: TextStyle(color: Color(0xFFAA8E83)),
|
||||||
prefixIconConstraints: BoxConstraints(maxWidth: 42, maxHeight: 42),
|
// hintStyle: TextStyle(color: Color(0xFFAA8E83)),
|
||||||
|
prefixIconConstraints:
|
||||||
|
BoxConstraints(maxWidth: 42, maxHeight: 42),
|
||||||
prefixIcon: Container(
|
prefixIcon: Container(
|
||||||
padding: EdgeInsets.only(right: 5),
|
padding: EdgeInsets.only(right: 5),
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
MiscIconAssetPath.Search,
|
MiscIconAssetPath.Search,
|
||||||
semanticsLabel: 'Search',
|
semanticsLabel: 'Search',
|
||||||
|
colorFilter: ColorFilter.mode(
|
||||||
|
Color(0xFFAA8E83), BlendMode.srcIn),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -359,7 +363,7 @@ class _ManageUserRouterState extends State<ManageUserRouter> {
|
|||||||
// ),
|
// ),
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
contentPadding: EdgeInsets.symmetric(
|
contentPadding: EdgeInsets.symmetric(
|
||||||
vertical: 8.0, horizontal: 18.0),
|
vertical: 0.5, horizontal: 18.0),
|
||||||
),
|
),
|
||||||
onChanged: filterUsers,
|
onChanged: filterUsers,
|
||||||
),
|
),
|
||||||
|
|||||||
@ -1,22 +1,29 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:uae_stat/config/api_config.dart';
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
|
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
||||||
import '../../custom_drawer_routes.dart';
|
import '../../custom_drawer_routes.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
class NotificationPage extends StatefulWidget {
|
class NotificationPage extends ConsumerStatefulWidget {
|
||||||
@override
|
@override
|
||||||
_NotificationPageState createState() => _NotificationPageState();
|
_NotificationPageState createState() => _NotificationPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _NotificationPageState extends State<NotificationPage> {
|
class _NotificationPageState extends ConsumerState<NotificationPage> {
|
||||||
// Example notification data
|
// Example notification data
|
||||||
final _pb = PocketBase(apiUrl);
|
final _pb = PocketBase(apiUrl);
|
||||||
List<Map<String, dynamic>> notifications = [];
|
List<Map<String, dynamic>> notifications = [];
|
||||||
|
|
||||||
// Current selected tab index
|
// Current selected tab index
|
||||||
int selectedTabIndex = 0;
|
int selectedTabIndex = 0;
|
||||||
|
late final Locale locale;
|
||||||
|
|
||||||
// Tab categories
|
// Tab categories
|
||||||
final List<String> tabs = [
|
final List<String> tabs = [
|
||||||
@ -28,6 +35,13 @@ class _NotificationPageState extends State<NotificationPage> {
|
|||||||
"Favourites"
|
"Favourites"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
locale = ref.read(localeProvider) ?? const Locale('en');
|
||||||
|
fetchNotifications(locale?.languageCode ?? 'en');
|
||||||
|
}
|
||||||
|
|
||||||
String formatDate(String dateString) {
|
String formatDate(String dateString) {
|
||||||
try {
|
try {
|
||||||
DateTime dateTime =
|
DateTime dateTime =
|
||||||
@ -39,36 +53,61 @@ class _NotificationPageState extends State<NotificationPage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchNotifications() async {
|
Future<void> fetchNotifications(locale) async {
|
||||||
|
final baseUrl = apiUrl + '/api/getNotification';
|
||||||
try {
|
try {
|
||||||
await _pb.admins
|
final response = await http.get(Uri.parse('$baseUrl?language=$locale'));
|
||||||
.authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com');
|
|
||||||
|
|
||||||
final result = await _pb.collection('notification').getFullList();
|
if (response.statusCode == 200) {
|
||||||
|
final Map<String, dynamic> jsonResponse =
|
||||||
|
jsonDecode(response.body); // Decode JSON
|
||||||
|
|
||||||
setState(() {
|
if (jsonResponse['message'] == 'Success') {
|
||||||
notifications = result.map((record) => record.toJson()).toList();
|
setState(() {
|
||||||
});
|
notifications = List<Map<String, dynamic>>.from(
|
||||||
|
jsonResponse['data']); // Assign decoded data
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw Exception('Failed to load data');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw Exception(
|
||||||
|
'Failed to load data with status code ${response.statusCode}');
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Error fetching notifications: $e');
|
print('Error fetching data: $e');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
// Future<void> fetchNotifications() async {/api/getNotification?language=ar
|
||||||
void initState() {
|
// try {
|
||||||
super.initState();
|
// await _pb.admins
|
||||||
fetchNotifications();
|
// .authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com');
|
||||||
}
|
//
|
||||||
|
// final result = await _pb.collection('notification').getFullList();
|
||||||
|
//
|
||||||
|
// setState(() {
|
||||||
|
// notifications = result.map((record) => record.toJson()).toList();
|
||||||
|
// });
|
||||||
|
// } catch (e) {
|
||||||
|
// print('Error fetching notifications: $e');
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
ref.listen<Locale?>(localeProvider, (previous, next) {
|
||||||
|
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
|
||||||
|
fetchNotifications(localeCode);
|
||||||
|
});
|
||||||
// Filter notifications based on the selected tab
|
// Filter notifications based on the selected tab
|
||||||
List<Map<String, dynamic>> filteredNotifications = selectedTabIndex == 0
|
List<Map<String, dynamic>> filteredNotifications = selectedTabIndex == 0
|
||||||
? notifications
|
? notifications
|
||||||
: notifications
|
: notifications.where((notification) {
|
||||||
.where((notification) =>
|
print(
|
||||||
notification["category"] == tabs[selectedTabIndex])
|
"Comparing: '${notification["category"]}' with '${tabs[selectedTabIndex]}'");
|
||||||
.toList();
|
return notification["category"] == tabs[selectedTabIndex];
|
||||||
|
}).toList();
|
||||||
|
|
||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: false,
|
canPop: false,
|
||||||
@ -77,7 +116,12 @@ class _NotificationPageState extends State<NotificationPage> {
|
|||||||
context.go('/myhomepage');
|
context.go('/myhomepage');
|
||||||
},
|
},
|
||||||
child: BaseScaffold(
|
child: BaseScaffold(
|
||||||
title: Text('Notification'),
|
title: Text(
|
||||||
|
context.translate(
|
||||||
|
'Notification',
|
||||||
|
'إشعار',
|
||||||
|
),
|
||||||
|
),
|
||||||
body: Column(
|
body: Column(
|
||||||
children: [
|
children: [
|
||||||
TabBarHeader(
|
TabBarHeader(
|
||||||
@ -90,53 +134,41 @@ class _NotificationPageState extends State<NotificationPage> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: selectedTabIndex == 1
|
child: filteredNotifications.isEmpty
|
||||||
? Center(
|
? Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Icon(Icons.info_outline,
|
||||||
'assets/backgrounds/Notification/Update_notific.png',
|
size: 100, color: Colors.grey[400]),
|
||||||
height: 200,
|
|
||||||
),
|
|
||||||
SizedBox(height: 16),
|
SizedBox(height: 16),
|
||||||
Text(
|
Text(
|
||||||
filteredNotifications.isNotEmpty
|
'No notifications available.',
|
||||||
? filteredNotifications[0]['title']
|
|
||||||
: 'No updates available.',
|
|
||||||
style: TextStyle(fontSize: 16, color: Colors.grey),
|
style: TextStyle(fontSize: 16, color: Colors.grey),
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: filteredNotifications.isEmpty
|
: ListView.builder(
|
||||||
? Center(
|
itemCount: filteredNotifications.length,
|
||||||
child: Column(
|
itemBuilder: (context, index) {
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
final notification = filteredNotifications[index];
|
||||||
children: [
|
return Container(
|
||||||
Icon(Icons.info_outline,
|
decoration: BoxDecoration(
|
||||||
size: 100, color: Colors.grey[400]),
|
border: Border(
|
||||||
SizedBox(height: 16),
|
bottom: BorderSide(
|
||||||
Text(
|
color: Color(0xFFDEDEDE),
|
||||||
'No notifications available.',
|
width: 1), // Bottom border only
|
||||||
style:
|
),
|
||||||
TextStyle(fontSize: 16, color: Colors.grey),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
)
|
child: NotificationTile(
|
||||||
: ListView.builder(
|
|
||||||
itemCount: filteredNotifications.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
final notification = filteredNotifications[index];
|
|
||||||
return NotificationTile(
|
|
||||||
title: notification['title'] ?? 'No Title',
|
title: notification['title'] ?? 'No Title',
|
||||||
date: formatDate(notification['created'] ?? ''),
|
date: formatDate(notification['created'] ?? ''),
|
||||||
category: notification['category'] ?? 'Unknown',
|
category: notification['category'] ?? 'Unknown',
|
||||||
);
|
message: notification['message'] ?? ''),
|
||||||
},
|
);
|
||||||
),
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -205,22 +237,43 @@ class TabBarHeader extends StatelessWidget {
|
|||||||
|
|
||||||
class NotificationTile extends StatelessWidget {
|
class NotificationTile extends StatelessWidget {
|
||||||
final String title;
|
final String title;
|
||||||
|
final String message;
|
||||||
final String date;
|
final String date;
|
||||||
final String category;
|
final String category;
|
||||||
|
|
||||||
const NotificationTile({
|
const NotificationTile({
|
||||||
required this.title,
|
required this.title,
|
||||||
|
required this.message,
|
||||||
required this.date,
|
required this.date,
|
||||||
required this.category,
|
required this.category,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListTile(
|
return GestureDetector(
|
||||||
leading: Icon(Icons.circle,
|
onTap: () {
|
||||||
size: 12, color: category == "Social" ? Colors.red : Colors.grey),
|
context.go('/notification_details', extra: {
|
||||||
title: Text(title, style: const TextStyle(fontWeight: FontWeight.bold)),
|
'title': title,
|
||||||
subtitle: Text(date),
|
'message': message,
|
||||||
|
'date': date,
|
||||||
|
'category': category,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: ListTile(
|
||||||
|
// leading: Icon(Icons.circle,
|
||||||
|
// size: 12, color: category == "Social" ? Colors.red : Colors.grey),
|
||||||
|
leading: Icon(Icons.circle, size: 12, color: Colors.red),
|
||||||
|
title: Text(title, style: const TextStyle(fontWeight: FontWeight.bold)),
|
||||||
|
subtitle: Text(
|
||||||
|
date,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Color(0xFF8E8E8E),
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w400),
|
||||||
|
),
|
||||||
|
trailing: const Icon(Icons.arrow_forward_ios,
|
||||||
|
size: 16, color: Color(0xFF898C81)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,86 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
|
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
|
||||||
|
|
||||||
|
class NotificationDetails extends ConsumerWidget {
|
||||||
|
final String title;
|
||||||
|
final String message;
|
||||||
|
final String date;
|
||||||
|
final String category;
|
||||||
|
|
||||||
|
const NotificationDetails({
|
||||||
|
super.key,
|
||||||
|
required this.title,
|
||||||
|
required this.message,
|
||||||
|
required this.date,
|
||||||
|
required this.category,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
return PopScope(
|
||||||
|
canPop: false,
|
||||||
|
onPopInvokedWithResult: (didPop, result) {
|
||||||
|
if (didPop) return;
|
||||||
|
context.go('/notification');
|
||||||
|
},
|
||||||
|
child: BaseScaffold(
|
||||||
|
title: Text(
|
||||||
|
context.translate(
|
||||||
|
'Notification',
|
||||||
|
'إشعار',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
showBackButton: true,
|
||||||
|
body: Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
color: Color(0xFF414042)),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
category == 'App updates'
|
||||||
|
? 'assets/backgrounds/Notification/App-Update.png'
|
||||||
|
: 'assets/backgrounds/Notification/Update_notific.png',
|
||||||
|
height: 200,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
Text(
|
||||||
|
message.isNotEmpty
|
||||||
|
? message
|
||||||
|
: "No additional details available.",
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
color: Color(0xFF414042)),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Text(
|
||||||
|
"Date: $date",
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
color: Color(0xFF8E8E8E)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,7 +8,8 @@ import Foundation
|
|||||||
import connectivity_plus
|
import connectivity_plus
|
||||||
import file_selector_macos
|
import file_selector_macos
|
||||||
import firebase_core
|
import firebase_core
|
||||||
import flutter_secure_storage_macos
|
import firebase_messaging
|
||||||
|
import flutter_secure_storage_darwin
|
||||||
import package_info_plus
|
import package_info_plus
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import share_plus
|
import share_plus
|
||||||
@ -21,12 +22,13 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
|
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
|
||||||
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
|
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
|
||||||
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
|
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
|
||||||
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
|
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
|
||||||
|
FlutterSecureStorageDarwinPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageDarwinPlugin"))
|
||||||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
||||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
|
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
|
||||||
FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin"))
|
WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin"))
|
||||||
}
|
}
|
||||||
|
|||||||
383
pubspec.lock
383
pubspec.lock
@ -5,31 +5,34 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: _fe_analyzer_shared
|
name: _fe_analyzer_shared
|
||||||
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
|
sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "76.0.0"
|
version: "80.0.0"
|
||||||
_macros:
|
_flutterfire_internals:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: dart
|
description:
|
||||||
source: sdk
|
name: _flutterfire_internals
|
||||||
version: "0.3.3"
|
sha256: "7fd72d77a7487c26faab1d274af23fb008763ddc10800261abbfb2c067f183d5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.53"
|
||||||
analyzer:
|
analyzer:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: analyzer
|
name: analyzer
|
||||||
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
|
sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.11.0"
|
version: "7.3.0"
|
||||||
analyzer_plugin:
|
analyzer_plugin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: analyzer_plugin
|
name: analyzer_plugin
|
||||||
sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161"
|
sha256: "1d460d14e3c2ae36dc2b32cef847c4479198cf87704f63c3c3c8150ee50c3916"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.11.3"
|
version: "0.12.0"
|
||||||
ansicolor:
|
ansicolor:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -58,18 +61,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.11.0"
|
version: "2.12.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: boolean_selector
|
name: boolean_selector
|
||||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
boxy:
|
boxy:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -82,50 +85,50 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build
|
name: build
|
||||||
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
|
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.1"
|
version: "2.4.2"
|
||||||
build_config:
|
build_config:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_config
|
name: build_config
|
||||||
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
|
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
build_daemon:
|
build_daemon:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_daemon
|
name: build_daemon
|
||||||
sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
|
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.4"
|
||||||
build_resolvers:
|
build_resolvers:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_resolvers
|
name: build_resolvers
|
||||||
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
|
sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.4"
|
||||||
build_runner:
|
build_runner:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: build_runner
|
name: build_runner
|
||||||
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
|
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.13"
|
version: "2.4.15"
|
||||||
build_runner_core:
|
build_runner_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_runner_core
|
name: build_runner_core
|
||||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.3.2"
|
version: "8.0.0"
|
||||||
built_collection:
|
built_collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -138,18 +141,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: built_value
|
name: built_value
|
||||||
sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2"
|
sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.9.3"
|
version: "8.9.4"
|
||||||
characters:
|
characters:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: characters
|
name: characters
|
||||||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.4.0"
|
||||||
checked_yaml:
|
checked_yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -178,10 +181,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: clock
|
name: clock
|
||||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
code_builder:
|
code_builder:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -194,18 +197,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.19.0"
|
version: "1.19.1"
|
||||||
connectivity_plus:
|
connectivity_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus
|
name: connectivity_plus
|
||||||
sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412"
|
sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.2"
|
version: "6.1.3"
|
||||||
connectivity_plus_platform_interface:
|
connectivity_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -266,42 +269,42 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: custom_lint
|
name: custom_lint
|
||||||
sha256: "3486c470bb93313a9417f926c7dd694a2e349220992d7b9d14534dc49c15bba9"
|
sha256: "021897cce2b6c783b2521543e362e7fe1a2eaab17bf80514d8de37f99942ed9e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.0"
|
version: "0.7.3"
|
||||||
custom_lint_builder:
|
custom_lint_builder:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: custom_lint_builder
|
name: custom_lint_builder
|
||||||
sha256: "42cdc41994eeeddab0d7a722c7093ec52bd0761921eeb2cbdbf33d192a234759"
|
sha256: e4235b9d8cef59afe621eba086d245205c8a0a6c70cd470be7cb17494d6df32d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.0"
|
version: "0.7.3"
|
||||||
custom_lint_core:
|
custom_lint_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: custom_lint_core
|
name: custom_lint_core
|
||||||
sha256: "02450c3e45e2a6e8b26c4d16687596ab3c4644dd5792e3313aa9ceba5a49b7f5"
|
sha256: "6dcee8a017181941c51a110da7e267c1d104dc74bec8862eeb8c85b5c8759a9e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.0"
|
version: "0.7.1"
|
||||||
custom_lint_visitor:
|
custom_lint_visitor:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: custom_lint_visitor
|
name: custom_lint_visitor
|
||||||
sha256: bfe9b7a09c4775a587b58d10ebb871d4fe618237639b1e84d5ec62d7dfef25f9
|
sha256: "36282d85714af494ee2d7da8c8913630aa6694da99f104fb2ed4afcf8fc857d8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0+6.11.0"
|
version: "1.0.0+7.3.0"
|
||||||
dart_style:
|
dart_style:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: dart_style
|
name: dart_style
|
||||||
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
|
sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.7"
|
version: "3.0.1"
|
||||||
dartz:
|
dartz:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -330,10 +333,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: dio_web_adapter
|
name: dio_web_adapter
|
||||||
sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a
|
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.1"
|
||||||
equatable:
|
equatable:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -369,26 +372,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fake_async
|
name: fake_async
|
||||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.1"
|
version: "1.3.2"
|
||||||
fast_immutable_collections:
|
fast_immutable_collections:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fast_immutable_collections
|
name: fast_immutable_collections
|
||||||
sha256: c3c73f4f989d3302066e4ec94e6ec73b5dc872592d02194f49f1352d64126b8c
|
sha256: "95a69b9380483dff49ae2c12c9eb92e2b4e1aeff481a33c2a20883471771598a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.2.4"
|
version: "11.0.3"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: ffi
|
name: ffi
|
||||||
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
|
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.4"
|
||||||
file:
|
file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -425,18 +428,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_windows
|
name: file_selector_windows
|
||||||
sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4"
|
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.3+3"
|
version: "0.9.3+4"
|
||||||
firebase_core:
|
firebase_core:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: firebase_core
|
name: firebase_core
|
||||||
sha256: "26de145bb9688a90962faec6f838247377b0b0d32cc0abecd9a4e43525fc856c"
|
sha256: f4d8f49574a4e396f34567f3eec4d38ab9c3910818dec22ca42b2a467c685d8b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.32.0"
|
version: "3.12.1"
|
||||||
firebase_core_platform_interface:
|
firebase_core_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -449,10 +452,34 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_core_web
|
name: firebase_core_web
|
||||||
sha256: e47f5c2776de018fa19bc9f6f723df136bc75cdb164d64b65305babd715c8e41
|
sha256: faa5a76f6380a9b90b53bc3bdcb85bc7926a382e0709b9b5edac9f7746651493
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.21.0"
|
version: "2.21.1"
|
||||||
|
firebase_messaging:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: firebase_messaging
|
||||||
|
sha256: "5fc345c6341f9dc69fd0ffcbf508c784fd6d1b9e9f249587f30434dd8b6aa281"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "15.2.4"
|
||||||
|
firebase_messaging_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: firebase_messaging_platform_interface
|
||||||
|
sha256: a935924cf40925985c8049df4968b1dde5c704f570f3ce380b31d3de6990dd94
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.6.4"
|
||||||
|
firebase_messaging_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: firebase_messaging_web
|
||||||
|
sha256: fafebf6a1921931334f3f10edb5037a5712288efdd022881e2d093e5654a2fd4
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.10.4"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -486,10 +513,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_hooks
|
name: flutter_hooks
|
||||||
sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70
|
sha256: b772e710d16d7a20c0740c4f855095026b31c7eb5ba3ab67d2bd52021cd9461d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.20.5"
|
version: "0.21.2"
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
@ -523,10 +550,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e"
|
sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.24"
|
version: "2.0.27"
|
||||||
flutter_rating_bar:
|
flutter_rating_bar:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -547,50 +574,50 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage
|
name: flutter_secure_storage
|
||||||
sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea"
|
sha256: f7eceb0bc6f4fd0441e29d43cab9ac2a1c5ffd7ea7b64075136b718c46954874
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.2.4"
|
version: "10.0.0-beta.4"
|
||||||
|
flutter_secure_storage_darwin:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_secure_storage_darwin
|
||||||
|
sha256: f226f2a572bed96bc6542198ebaec227150786e34311d455a7e2d3d06d951845
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.0"
|
||||||
flutter_secure_storage_linux:
|
flutter_secure_storage_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage_linux
|
name: flutter_secure_storage_linux
|
||||||
sha256: bf7404619d7ab5c0a1151d7c4e802edad8f33535abfbeff2f9e1fe1274e2d705
|
sha256: "9b4b73127e857cd3117d43a70fa3dddadb6e0b253be62e6a6ab85caa0742182c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.2"
|
version: "2.0.1"
|
||||||
flutter_secure_storage_macos:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: flutter_secure_storage_macos
|
|
||||||
sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.1.3"
|
|
||||||
flutter_secure_storage_platform_interface:
|
flutter_secure_storage_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage_platform_interface
|
name: flutter_secure_storage_platform_interface
|
||||||
sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8
|
sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.2"
|
version: "2.0.1"
|
||||||
flutter_secure_storage_web:
|
flutter_secure_storage_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage_web
|
name: flutter_secure_storage_web
|
||||||
sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9
|
sha256: "4c3f233e739545c6cb09286eeec1cc4744138372b985113acc904f7263bef517"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "2.0.0"
|
||||||
flutter_secure_storage_windows:
|
flutter_secure_storage_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage_windows
|
name: flutter_secure_storage_windows
|
||||||
sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709
|
sha256: ff32af20f70a8d0e59b2938fc92de35b54a74671041c814275afd80e27df9f21
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "4.0.0"
|
||||||
flutter_staggered_grid_view:
|
flutter_staggered_grid_view:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -621,18 +648,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fluttertoast
|
name: fluttertoast
|
||||||
sha256: "8971efe7e59585e9149052e33718d84bca51e806f063d1467622b3dcb2878b6c"
|
sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.11"
|
version: "8.2.12"
|
||||||
freezed:
|
freezed:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: freezed
|
name: freezed
|
||||||
sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e"
|
sha256: "59a584c24b3acdc5250bb856d0d3e9c0b798ed14a4af1ddb7dc1c7b41df91c9c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.7"
|
version: "2.5.8"
|
||||||
freezed_annotation:
|
freezed_annotation:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -669,10 +696,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: go_router
|
name: go_router
|
||||||
sha256: daf3ff5570f55396b2d2c9bf8136d7db3a8acf208ac0cef92a3ae2beb9a81550
|
sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.7.1"
|
version: "14.8.1"
|
||||||
graphs:
|
graphs:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -725,10 +752,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: http_parser
|
name: http_parser
|
||||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.1.2"
|
||||||
iconify_design:
|
iconify_design:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -757,10 +784,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image_picker_android
|
name: image_picker_android
|
||||||
sha256: b62d34a506e12bb965e824b6db4fbf709ee4589cf5d3e99b45ab2287b008ee0c
|
sha256: "82652a75e3dd667a91187769a6a2cc81bd8c111bbead698d8e938d2b63e5e89a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.12+20"
|
version: "0.8.12+21"
|
||||||
image_picker_for_web:
|
image_picker_for_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -821,10 +848,10 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: injectable_generator
|
name: injectable_generator
|
||||||
sha256: af403d76c7b18b4217335e0075e950cd0579fd7f8d7bd47ee7c85ada31680ba1
|
sha256: b04673a4c88b3a848c0c77bf58b8309f9b9e064d9fe1df5450c8ee1675eaea1a
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.6.2"
|
version: "2.7.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -845,10 +872,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: js
|
name: js
|
||||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.7"
|
version: "0.7.2"
|
||||||
json_annotation:
|
json_annotation:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -861,10 +888,10 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: json_serializable
|
name: json_serializable
|
||||||
sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c
|
sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.9.0"
|
version: "6.9.4"
|
||||||
jwt_decoder:
|
jwt_decoder:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -877,18 +904,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
|
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.7"
|
version: "10.0.8"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
|
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.8"
|
version: "3.0.9"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -901,10 +928,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: lints
|
name: lints
|
||||||
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
|
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.0"
|
version: "5.1.1"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -913,14 +940,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.3.0"
|
||||||
macros:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: macros
|
|
||||||
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.1.3-main.0"
|
|
||||||
mailer:
|
mailer:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -941,10 +960,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.16+1"
|
version: "0.12.17"
|
||||||
material_charts:
|
material_charts:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -965,10 +984,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.15.0"
|
version: "1.16.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1005,26 +1024,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: package_info_plus
|
name: package_info_plus
|
||||||
sha256: c447a3c3e7be4addf129b8f9ab6a4bd5d166b78918223e223b61fddf4d07e254
|
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.0"
|
version: "8.3.0"
|
||||||
package_info_plus_platform_interface:
|
package_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: package_info_plus_platform_interface
|
name: package_info_plus_platform_interface
|
||||||
sha256: "205ec83335c2ab9107bbba3f8997f9356d72ca3c715d2f038fc773d0366b4c76"
|
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.2.0"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.0"
|
version: "1.9.1"
|
||||||
path_parsing:
|
path_parsing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1085,10 +1104,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: petitparser
|
name: petitparser
|
||||||
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
|
sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.2"
|
version: "6.1.0"
|
||||||
platform:
|
platform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1141,10 +1160,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pubspec_parse
|
name: pubspec_parse
|
||||||
sha256: "81876843eb50dc2e1e5b151792c9a985c5ed2536914115ed04e9c8528f6647b0"
|
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.5.0"
|
||||||
recase:
|
recase:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1173,10 +1192,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: riverpod_analyzer_utils
|
name: riverpod_analyzer_utils
|
||||||
sha256: c6b8222b2b483cb87ae77ad147d6408f400c64f060df7a225b127f4afef4f8c8
|
sha256: "837a6dc33f490706c7f4632c516bcd10804ee4d9ccc8046124ca56388715fdf3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.8"
|
version: "0.5.9"
|
||||||
riverpod_annotation:
|
riverpod_annotation:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1189,18 +1208,18 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: riverpod_generator
|
name: riverpod_generator
|
||||||
sha256: "63546d70952015f0981361636bf8f356d9cfd9d7f6f0815e3c07789a41233188"
|
sha256: "120d3310f687f43e7011bb213b90a436f1bbc300f0e4b251a72c39bccb017a4f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.6.3"
|
version: "2.6.4"
|
||||||
riverpod_lint:
|
riverpod_lint:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: riverpod_lint
|
name: riverpod_lint
|
||||||
sha256: "83e4caa337a9840469b7b9bd8c2351ce85abad80f570d84146911b32086fbd99"
|
sha256: b05408412b0f75dec954e032c855bc28349eeed2d2187f94519e1ddfdf8b3693
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.6.3"
|
version: "2.6.4"
|
||||||
rxdart:
|
rxdart:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1244,18 +1263,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a"
|
sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.1"
|
version: "2.5.2"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f"
|
sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.4"
|
version: "2.4.6"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1284,10 +1303,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_web
|
name: shared_preferences_web
|
||||||
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
|
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.3"
|
||||||
shared_preferences_windows:
|
shared_preferences_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1300,18 +1319,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shelf
|
name: shelf
|
||||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.1"
|
version: "1.4.2"
|
||||||
shelf_web_socket:
|
shelf_web_socket:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shelf_web_socket
|
name: shelf_web_socket
|
||||||
sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
|
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.0"
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -1328,10 +1347,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_gen
|
name: source_gen
|
||||||
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
|
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.0"
|
version: "2.0.0"
|
||||||
source_helper:
|
source_helper:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1344,10 +1363,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_span
|
name: source_span
|
||||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.0"
|
version: "1.10.1"
|
||||||
sprintf:
|
sprintf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1360,10 +1379,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
|
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.12.0"
|
version: "1.12.1"
|
||||||
state_notifier:
|
state_notifier:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1376,10 +1395,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stream_channel
|
name: stream_channel
|
||||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.4"
|
||||||
stream_transform:
|
stream_transform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1392,42 +1411,42 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
|
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.4.1"
|
||||||
syncfusion_flutter_charts:
|
syncfusion_flutter_charts:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: syncfusion_flutter_charts
|
name: syncfusion_flutter_charts
|
||||||
sha256: "672c17a7f4cb3020c06bb6a28d2d033623007b8e2a19704ad34b412e9bdd2dab"
|
sha256: c53e8616368c1a88397b7b180d0ded7d9e960564cdba01509cc5fa2d503ed727
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "28.2.4+1"
|
version: "28.2.9"
|
||||||
syncfusion_flutter_core:
|
syncfusion_flutter_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: syncfusion_flutter_core
|
name: syncfusion_flutter_core
|
||||||
sha256: "3c1876b0a245de23de3b17a19e3106fed57d88f4fd2c8dc9bc1976705b1c31d5"
|
sha256: "5a1a76eef118e511443b299925d4a802eb8259388d6a580e0ad6413d1a70f987"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "28.2.4"
|
version: "28.2.9"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: term_glyph
|
name: term_glyph
|
||||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.2"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
|
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.3"
|
version: "0.7.4"
|
||||||
the_validator:
|
the_validator:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1448,10 +1467,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: tutorial_coach_mark
|
name: tutorial_coach_mark
|
||||||
sha256: df450c88d4c812bc221afd3ff948da3dc0f44c0b4fa5dbc046d6d86f2cfc9e71
|
sha256: "2c77c0b00bbe7d5b8a6d31cb9e03d44bf77dfe7ba6514cc2b546886d024a9945"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.12"
|
version: "1.2.13"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1520,10 +1539,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.3"
|
version: "2.4.0"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1576,26 +1595,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: video_player
|
name: video_player
|
||||||
sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17"
|
sha256: "48941c8b05732f9582116b1c01850b74dbee1d8520cd7e34ad4609d6df666845"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.9.2"
|
version: "2.9.3"
|
||||||
video_player_android:
|
video_player_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: video_player_android
|
name: video_player_android
|
||||||
sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898"
|
sha256: "7018dbcb395e2bca0b9a898e73989e67c0c4a5db269528e1b036ca38bcca0d0b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.7.16"
|
version: "2.7.17"
|
||||||
video_player_avfoundation:
|
video_player_avfoundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: video_player_avfoundation
|
name: video_player_avfoundation
|
||||||
sha256: "8a4e73a3faf2b13512978a43cf1cdda66feeeb900a0527f1fbfd7b19cf3458d3"
|
sha256: "84b4752745eeccb6e75865c9aab39b3d28eb27ba5726d352d45db8297fbd75bc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.6.7"
|
version: "2.7.0"
|
||||||
video_player_platform_interface:
|
video_player_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1616,10 +1635,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
|
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.3.0"
|
version: "14.3.1"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1632,10 +1651,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: web
|
name: web
|
||||||
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
|
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.1"
|
||||||
web_socket:
|
web_socket:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1664,10 +1683,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: d1ee28f44894cbabb1d94cc42f9980297f689ff844d067ec50ff88d86e27d63f
|
sha256: "512c26ccc5b8a571fd5d13ec994b7509f142ff6faf85835e243dde3538fdc713"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.3.0"
|
version: "4.3.2"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1680,18 +1699,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7"
|
sha256: c49a98510080378b1525132f407a92c3dcd3b7145bef04fb8137724aadcf1cf0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.17.0"
|
version: "3.18.4"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e
|
sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.10.1"
|
version: "5.11.0"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1717,5 +1736,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.3"
|
version: "3.1.3"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.5.2 <4.0.0"
|
dart: ">=3.7.0 <4.0.0"
|
||||||
flutter: ">=3.24.0"
|
flutter: ">=3.27.0"
|
||||||
|
|||||||
12
pubspec.yaml
12
pubspec.yaml
@ -1,7 +1,7 @@
|
|||||||
name: uae_stat
|
name: uae_stat
|
||||||
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
|
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 1.0.27+28
|
version: 1.0.30+31
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.2.3 <4.0.0"
|
sdk: ">=3.2.3 <4.0.0"
|
||||||
@ -9,9 +9,9 @@ environment:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
fast_immutable_collections: ^10.1.0
|
fast_immutable_collections: ^11.0.3
|
||||||
# flutter_cache_manager: ^3.3.1
|
# flutter_cache_manager: ^3.3.1
|
||||||
flutter_hooks: ^0.20.4
|
flutter_hooks: ^0.21.2
|
||||||
flutter_riverpod: ^2.4.0
|
flutter_riverpod: ^2.4.0
|
||||||
get_it: ^8.0.1
|
get_it: ^8.0.1
|
||||||
go_router: ^14.1.3
|
go_router: ^14.1.3
|
||||||
@ -33,10 +33,10 @@ dependencies:
|
|||||||
csv: ^6.0.0
|
csv: ^6.0.0
|
||||||
excel: ^4.0.2
|
excel: ^4.0.2
|
||||||
intl: ^0.19.0
|
intl: ^0.19.0
|
||||||
firebase_core: ^2.27.0
|
firebase_core: ^3.12.1
|
||||||
the_validator: ^2.0.0
|
the_validator: ^2.0.0
|
||||||
pocketbase: ^0.18.1
|
pocketbase: ^0.18.1
|
||||||
flutter_secure_storage: ^9.0.0
|
flutter_secure_storage: ^10.0.0-beta.4
|
||||||
jwt_decoder: ^2.0.1
|
jwt_decoder: ^2.0.1
|
||||||
fluttertoast: ^8.2.11
|
fluttertoast: ^8.2.11
|
||||||
webview_flutter: ^4.5.0
|
webview_flutter: ^4.5.0
|
||||||
@ -66,6 +66,7 @@ dependencies:
|
|||||||
package_info_plus: ^8.2.0
|
package_info_plus: ^8.2.0
|
||||||
flutter_svg: ^2.0.17
|
flutter_svg: ^2.0.17
|
||||||
boxy: ^2.2.1
|
boxy: ^2.2.1
|
||||||
|
firebase_messaging: ^15.2.4
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
fading_edge_scrollview: ^4.1.1
|
fading_edge_scrollview: ^4.1.1
|
||||||
@ -139,6 +140,7 @@ flutter:
|
|||||||
- assets/icons/misc/group.png
|
- assets/icons/misc/group.png
|
||||||
- assets/icons/misc/search.png
|
- assets/icons/misc/search.png
|
||||||
- assets/icons/bookmark/
|
- assets/icons/bookmark/
|
||||||
|
- assets/FCSC-GIF.gif
|
||||||
|
|
||||||
fonts:
|
fonts:
|
||||||
- family: Segoe
|
- family: Segoe
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user