diff --git a/assets/icons/bookmark/delete.svg b/assets/icons/bookmark/delete.svg new file mode 100644 index 00000000..daf0bcd5 --- /dev/null +++ b/assets/icons/bookmark/delete.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart b/lib/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart new file mode 100644 index 00000000..d6b59b45 --- /dev/null +++ b/lib/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart @@ -0,0 +1,4 @@ +abstract class BookmarkAssetPath { + static const _basePath = 'assets/icons/bookmark'; + static const delete = '$_basePath/delete.svg'; +} \ No newline at end of file diff --git a/lib/presentation/Screens/charts/screens/chart_screen.dart b/lib/presentation/Screens/charts/screens/chart_screen.dart index 2bab742c..17943f2f 100644 --- a/lib/presentation/Screens/charts/screens/chart_screen.dart +++ b/lib/presentation/Screens/charts/screens/chart_screen.dart @@ -319,103 +319,103 @@ class _ChartScreen1State extends ConsumerState { } //when the popup need for bookmark - // void showAddBookmarkDialog() { - // double myheight = MediaQuery.of(context).size.height; - // showDialog( - // context: context, - // barrierDismissible: false, // User must tap button to dismiss dialog - // builder: (context) => AlertDialog( - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(5.0), // Rounded corners - // ), - // contentPadding: EdgeInsets.zero, - // content: Stack( - // children: [ - // Padding( - // padding: const EdgeInsets.all(10.0), - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // SizedBox( - // height: myheight / 30, - // ), - // Text( - // context.translate( - // 'Do you want to add this to bookmarks?', - // 'هل تريد إضافة هذا إلى الإشارات المرجعية؟', - // ), - // textAlign: TextAlign.center, - // style: TextStyle( - // fontSize: 18, - // color: Color(0xFF898C81), - // ), - // ) - // ], - // ), - // ), - // ], - // ), - // actions: [ - // SizedBox(height: 20), - // SizedBox( - // width: 100, // Set the desired width - // child: TextButton( - // onPressed: () => Navigator.pop(context), - // style: TextButton.styleFrom( - // shape: RoundedRectangleBorder( - // 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 - // ), - // ), - // child: Text( - // context.translate('No', 'لا'), - // style: TextStyle( - // color: Color(0xFFAA8E83), - // fontSize: 16, - // ), - // ), - // ), - // ), - // SizedBox( - // width: 100, // Set the desired width - // child: TextButton( - // onPressed: () { - // Navigator.pop(context); - // addBookmark(); // Close dialog - // }, - // style: TextButton.styleFrom( - // backgroundColor: Color(0xFFAA8E83), // Set background color - // foregroundColor: Colors.white, - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(10.0), // Set text color - // ), - // ), - // child: Text( - // context.translate('Yes', 'نعم'), - // style: TextStyle(color: Colors.white, fontSize: 16), - // ), - // ), - // ), - // ], - // ), - // ); - // } void showAddBookmarkDialog() { - addBookmark(); - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text( - // 'The bookmark is added successfully', - // ), - // backgroundColor: Colors.green, - // duration: Duration(seconds: 2), - // ), - // ); + double myheight = MediaQuery.of(context).size.height; + showDialog( + context: context, + barrierDismissible: false, // User must tap button to dismiss dialog + builder: (context) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), // Rounded corners + ), + contentPadding: EdgeInsets.zero, + content: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: myheight / 30, + ), + Text( + context.translate( + 'Do you want to add this to bookmarks?', + 'هل تريد إضافة هذا إلى الإشارات المرجعية؟', + ), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Color(0xFF898C81), + ), + ) + ], + ), + ), + ], + ), + actions: [ + SizedBox(height: 20), + SizedBox( + width: 100, // Set the desired width + child: TextButton( + onPressed: () => Navigator.pop(context), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + 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 + ), + ), + child: Text( + context.translate('No', 'لا'), + style: TextStyle( + color: Color(0xFFAA8E83), + fontSize: 16, + ), + ), + ), + ), + SizedBox( + width: 100, // Set the desired width + child: TextButton( + onPressed: () { + Navigator.pop(context); + addBookmark(); // Close dialog + }, + style: TextButton.styleFrom( + backgroundColor: Color(0xFFAA8E83), // Set background color + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), // Set text color + ), + ), + child: Text( + context.translate('Yes', 'نعم'), + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ), + ), + ], + ), + ); } + // void showAddBookmarkDialog() { + // addBookmark(); + // // ScaffoldMessenger.of(context).showSnackBar( + // // SnackBar( + // // content: Text( + // // 'The bookmark is added successfully', + // // ), + // // backgroundColor: Colors.green, + // // duration: Duration(seconds: 2), + // // ), + // // ); + // } void handleSkip() { tutorialCoachMark.skip(); @@ -2048,45 +2048,67 @@ class _ChartScreen1State extends ConsumerState { showAddBookmarkDialog(); } }, - child: Row( - children: [ - Text( - context.translate( - 'Bookmark', - 'إشارة مرجعية', + child: Container( + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: isBookmarked ?Colors.white.withAlpha(90):null, // Background color + borderRadius: BorderRadius.circular(8), // Curved corners + ), + child: Row( + children: [ + isBookmarked? + Text( + context.translate( + 'Bookmarked', + 'إشارة مرجعية', + ), + style: TextStyle( + fontSize: 16, + color: Color(int.parse( + (chartScreenData['body_color'] ?? '#898C81') + .replaceFirst('#', '0xff'))), + ), + ): + Text( + context.translate( + 'Bookmark', + 'إشارة مرجعية', + ), + style: const TextStyle( + fontSize: 16, + color: Colors.white, + ), ), - style: const TextStyle( - fontSize: 16, - color: Colors.white, - ), - ), - SizedBox(width: 5), + SizedBox(width: 5), - // Text( - // "Bookmark", - // style: const TextStyle( - // fontSize: 16, - // color: Colors.white), - // ), - // const SizedBox(width: 5), - // Image.asset( - // isBookmarked - // ? UaeNumbersAssetPath - // .bookmarksSelectedUae // Filled bookmark image - // : UaeNumbersAssetPath - // .bookmarksUae, // Default bookmark image - // // color: Colors.white, - // width: 24, - // height: 24, - // ), - Icon( - Icons.bookmarks_rounded, - color: isBookmarked - ? Colors.black - : Colors.white, - size: 23, - ), - ], + // Text( + // "Bookmark", + // style: const TextStyle( + // fontSize: 16, + // color: Colors.white), + // ), + // const SizedBox(width: 5), + // Image.asset( + // isBookmarked + // ? UaeNumbersAssetPath + // .bookmarksSelectedUae // Filled bookmark image + // : UaeNumbersAssetPath + // .bookmarksUae, // Default bookmark image + // // color: Colors.white, + // width: 24, + // height: 24, + // ), + Icon( + size: 24, + Icons.bookmarks_rounded, + color: isBookmarked + ? Color(int.parse( + (chartScreenData['body_color'] ?? '#898C81') + .replaceFirst('#', '0xff'))) + : Colors.white, + ), + ], + ), ), ), ], @@ -2106,77 +2128,13 @@ class _ChartScreen1State extends ConsumerState { ), SizedBox(width: 5), GestureDetector( - onTap: () async { - try { - // Define share content - final String shareLink = - 'https://fcsc-da580.web.app'; // Your link - final String shareText = - 'Check this out!'; - final String svgAssetPath = - 'assets/logos/fcsc.png'; // Your SVG asset path - - // Create a controller to capture the SVG as an image - final screenshotController = - ScreenshotController(); - - // Render the SVG off-screen and capture it as PNG - final svgWidget = SvgPicture.asset( - svgAssetPath, - width: 200, // Adjust size as needed - height: 200, - ); - - // Capture the SVG as a PNG - final Uint8List? capturedImage = - await screenshotController - .captureFromWidget( - Material( - child: svgWidget, - ), - ); - - if (capturedImage == null) { - throw Exception( - 'Failed to capture SVG as image'); - } - - // Save the captured PNG to a temporary file - final directory = - await getTemporaryDirectory(); - final file = File( - '${directory.path}/shared_image.png'); - await file.writeAsBytes(capturedImage); - - // Share the PNG file with text and link - await Share.shareXFiles( - [XFile(file.path)], - text: '$shareText\n$shareLink', - subject: 'Shared Content', - ); - - // Clean up temporary file - await file.delete(); - } catch (e) { - print("Error sharing file: $e"); - ScaffoldMessenger.of(context) - .showSnackBar( - SnackBar( - content: - Text('Error sharing: $e')), - ); - } - }, - child: Container( + onTap: () => shareCurrentPage(context), + child: SvgPicture.asset( + UaeNumbersAssetPath.share, + semanticsLabel: 'share', width: 24, height: 24, - child: Icon( - Icons.share, - color: Colors.white, - size: 24, - semanticLabel: 'Share', - ), - ), + ) ), ], ), @@ -2825,7 +2783,47 @@ class _ChartScreen1State extends ConsumerState { ); } } +Future shareCurrentPage(BuildContext context) async { + try { + // Get current route from go_router + final String currentRoute = GoRouterState.of(context).uri.toString(); + final String baseAppLink = 'https://fcsc-da580.web.app'; + final String shareLink = '$baseAppLink$currentRoute'; + final String shareText = 'Check this out!'; + final String svgAssetPath = 'assets/logos/fcsc.png'; + final screenshotController = ScreenshotController(); + final svgWidget = SvgPicture.asset( + svgAssetPath, + width: 200, + height: 200, + ); + final Uint8List? capturedImage = await screenshotController.captureFromWidget( + Material(child: svgWidget), + ); + + if (capturedImage == null) { + throw Exception('Failed to capture SVG as image'); + } + + final directory = await getTemporaryDirectory(); + final file = File('${directory.path}/shared_image.png'); + await file.writeAsBytes(capturedImage); + + await Share.shareXFiles( + [XFile(file.path)], + text: '$shareText\n$shareLink', + subject: 'Shared Content', + ); + + await file.delete(); + } catch (e) { + print("Error sharing file: $e"); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error sharing: $e')), + ); + } +} // Function to convert hex color string to Color Color _getColorFromHex(String hexColor) { hexColor = hexColor.replaceFirst('#', ''); diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart b/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart index 4a192cac..68f06844 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:dio/dio.dart'; import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; +import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart'; +import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart'; @@ -20,6 +23,17 @@ class _BookMarkState extends ConsumerState { List> dataList = []; bool isLoading = true; + // Current selected tab index + int selectedTabIndex = 0; + + // Tab categories + final List tabs = [ + 'All Bookmarks', + 'Economy', + 'Social', + 'Environment', + ]; + @override void initState() { super.initState(); @@ -27,6 +41,11 @@ class _BookMarkState extends ConsumerState { fetchBookmarks(locale?.languageCode ?? 'en'); } + String colorToHex(Color color) { + return '0xFF${color.red.toRadixString(16).padLeft(2, '0').toUpperCase()}' + '${color.green.toRadixString(16).padLeft(2, '0').toUpperCase()}' + '${color.blue.toRadixString(16).padLeft(2, '0').toUpperCase()}'; + } // Function to convert hex color string to int Color _parseColor(String? colorString) { if (colorString == null || colorString.isEmpty) { @@ -98,7 +117,6 @@ class _BookMarkState extends ConsumerState { } } - /// Remove bookmark from PocketBase Future removeBookmark(bookmarkId) async { try { final adminAuth = await _pb.admins @@ -124,13 +142,25 @@ class _BookMarkState extends ConsumerState { fetchBookmarks(locale?.languageCode ?? 'en'); // ToastUtil.showSuccessToast("Removed from Bookmark."); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + 'Removed From Bookmark', + style: TextStyle(color: Color(0xFF2F692C), + fontWeight: FontWeight.w500), + ), + backgroundColor: Color(0xFFD6E9C6), + duration: Duration(seconds: 2), + ), + ); + print("Bookmark removed"); } catch (e) { SnackBar( content: Text( 'Unable to remove from bookmarks. Please try again', style: - TextStyle(color: Color(0xFFEB5F24), fontWeight: FontWeight.w600), + TextStyle(color: Color(0xFFEB5F24), fontWeight: FontWeight.w600), ), backgroundColor: Color(0xFFD6E9C6), duration: Duration(seconds: 2), @@ -139,7 +169,6 @@ class _BookMarkState extends ConsumerState { } } - /// Show confirmation dialog before removing bookmark void showRemoveBookmarkDialog(id) { double myheight = MediaQuery.of(context).size.height; showDialog( @@ -208,7 +237,7 @@ class _BookMarkState extends ConsumerState { child: TextButton( onPressed: () { Navigator.pop(context); - removeBookmark(id); // Close dialog + removeBookmark(id); }, style: TextButton.styleFrom( backgroundColor: Color(0xFFAA8E83), // Set background color @@ -231,55 +260,88 @@ class _BookMarkState extends ConsumerState { ); } - String colorToHex(Color color) { - return '0xFF${color.red.toRadixString(16).padLeft(2, '0').toUpperCase()}' - '${color.green.toRadixString(16).padLeft(2, '0').toUpperCase()}' - '${color.blue.toRadixString(16).padLeft(2, '0').toUpperCase()}'; - } - @override Widget build(BuildContext context) { - ref.listen(localeProvider, (previous, next) { - final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null - fetchBookmarks(localeCode); - }); - final filteredList = - dataList.where((item) => item['isBookmark'] == true).toList(); - return PopScope( - canPop: false, - onPopInvokedWithResult: (didPop, result) { - if (didPop) return; - context.go('/myhomepage'); - }, - child: BaseScaffold( - title: Text(context.translate('Bookmark', 'إشارة مرجعية')), - body: isLoading - ? const Center(child: CircularProgressIndicator()) - : filteredList.isEmpty + List> bookmarks = dataList.where((item) => item['isBookmark'] == true).toList(); + List> filteredBookmarks = dataList + .where((bookmark) => + bookmark['main_topic'].toString().trim().toLowerCase() == tabs[selectedTabIndex].toString().trim().toLowerCase()) + .toList(); + + print('filtered $filteredBookmarks'); + return BaseScaffold( + title: Text('Bookmarks'), + body: Column( + children: [ + TabBarHeader( + tabs: tabs, + selectedIndex: selectedTabIndex, + onTabSelected: (index) { + setState(() { + selectedTabIndex = index; + }); + }, + ), + Expanded( + child: selectedTabIndex == 0 + ? Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.builder( + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 10.0, + mainAxisSpacing: 10.0, + mainAxisExtent: 100, + ), + itemCount: bookmarks.length, + itemBuilder: (context, index) { + return _buildBox(bookmarks[index], context); + }, + ), + + ):filteredBookmarks.isEmpty ? Center( - child: Text(context.translate('No bookmarks found', - 'لم يتم العثور على إشارات مرجعية'))) - : Padding( - padding: const EdgeInsets.all(8.0), - child: GridView.builder( - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 10.0, - mainAxisSpacing: 10.0, - mainAxisExtent: 100, - ), - itemCount: filteredList.length, - itemBuilder: (context, index) { - return _buildBox(filteredList[index], context); - }, - ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.info_outline, + size: 100, color: Colors.grey[400]), + SizedBox(height: 16), + Text( + 'No Bookmark is added', + style: + TextStyle(fontSize: 16, color: Colors.grey), ), + ], + ), + ) + : Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.builder( + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 10.0, + mainAxisSpacing: 10.0, + mainAxisExtent: 100, + ), + itemCount: filteredBookmarks.length, + itemBuilder: (context, index) { + return _buildBox(filteredBookmarks[index], context); + }, + ), + + ), + ), + ], + ), + + ); } - Widget _buildBox(Map data, BuildContext context) { // Color borderColor = data['valueColor']; return GestureDetector( @@ -329,58 +391,30 @@ class _BookMarkState extends ConsumerState { ), ), GestureDetector( - onTap: () { - debugPrint("Icon clicked in: ${data['title']}"); - removeBookmark(data['id']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Removed from BookMark', - ), - backgroundColor: Colors.black, - duration: Duration(seconds: 2), - ), - ); - }, - child: const Icon( - Icons.bookmarks_rounded, - color: Colors.black, - size: 20, - ), + onTap: () { + debugPrint("Icon clicked in: ${data['title']}"); + showRemoveBookmarkDialog(data['id']); + // removeBookmark(data['id']); + }, + child: SvgPicture.asset( + BookmarkAssetPath.delete, + semanticsLabel: 'share', + width:23, + height: 20, + ) ), // GestureDetector( // onTap: () { // debugPrint("Icon clicked in: ${data['title']}"); - // removeBookmark(data['id']); - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text( - // 'The bookmark is removed successfully', - // ), - // backgroundColor: Colors.green, - // duration: Duration(seconds: 2), - // ), - // ); + // // showRemoveBookmarkDialog(data['id']); // }, // child: const Icon( - // Icons.delete, + // Icons.bookmarks_rounded, // color: Colors.black, // size: 20, // ), // ), - - GestureDetector( - onTap: () { - debugPrint("Icon clicked in: ${data['title']}"); - showRemoveBookmarkDialog(data['id']); - }, - child: const Icon( - Icons.bookmarks_rounded, - color: Colors.black, - size: 20, - ), - ), ], ), Text( @@ -407,3 +441,61 @@ class _BookMarkState extends ConsumerState { ); } } + +class TabBarHeader extends StatelessWidget { + final List tabs; + final int selectedIndex; + final ValueChanged onTabSelected; + + const TabBarHeader({ + required this.tabs, + required this.selectedIndex, + required this.onTabSelected, + }); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 8), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: tabs.asMap().entries.map((entry) { + int index = entry.key; + String text = entry.value; + return Row( + children: [ + TextButton( + onPressed: () => onTabSelected(index), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.resolveWith((states) { + return selectedIndex == index + ? Colors.black + : Colors.grey[700]; + }), + ), + child: Text(text), + ), + if (index < tabs.length - 1) buildDivider(), + ], + ); + }).toList(), + ), + ), + ); + } + + Widget buildDivider() { + return Container( + height: 20, + child: const VerticalDivider( + color: Colors.grey, + thickness: 1, + width: 16, + ), + ); + } +} diff --git a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart index 28f1152c..5e4b33a5 100644 --- a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart +++ b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart @@ -1078,12 +1078,12 @@ class _BaseScaffoldState extends ConsumerState { } } } -void _showLogoutConfirmationDialog(context) { +void _showLogoutConfirmationDialog(BuildContext context) { double myheight = MediaQuery.of(context).size.height; showDialog( context: context, barrierDismissible: false, // User must tap a button to dismiss dialog - builder: (context) => AlertDialog( + builder: (dialogContext) => AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), // Rounded corners ), @@ -1113,7 +1113,7 @@ void _showLogoutConfirmationDialog(context) { SizedBox( width: 120, // Set button width child: TextButton( - onPressed: () => Navigator.pop(context), + onPressed: () => Navigator.pop(dialogContext), style: TextButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), @@ -1135,9 +1135,9 @@ void _showLogoutConfirmationDialog(context) { SizedBox( width: 120, // Set button width child: TextButton( - onPressed: () { - Navigator.pop(context); - // Add logout function here + onPressed: () async { + await logout(dialogContext); // Pass dialogContext to logout + Navigator.pop(dialogContext); // Close the dialog }, style: TextButton.styleFrom( backgroundColor: Color(0xFFAA8E83), // Background color @@ -1160,3 +1160,10 @@ void _showLogoutConfirmationDialog(context) { ); } +Future logout(BuildContext context) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); // Clear shared preferences + context.go('/login'); // Navigate to the root route (e.g., login screen) +} + + diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 761e0b22..0c4642aa 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import connectivity_plus import file_selector_macos +import firebase_core import flutter_secure_storage_macos import package_info_plus import path_provider_foundation @@ -19,6 +20,7 @@ import webview_flutter_wkwebview func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 5bdff5a3..0b5097c2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -429,6 +429,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.3+3" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "26de145bb9688a90962faec6f838247377b0b0d32cc0abecd9a4e43525fc856c" + url: "https://pub.dev" + source: hosted + version: "2.32.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf + url: "https://pub.dev" + source: hosted + version: "5.4.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: e47f5c2776de018fa19bc9f6f723df136bc75cdb164d64b65305babd715c8e41 + url: "https://pub.dev" + source: hosted + version: "2.21.0" fixnum: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c25a09e3..c56c72f3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: csv: ^6.0.0 excel: ^4.0.2 intl: ^0.19.0 - # firebase_core: ^2.27.0 + firebase_core: ^2.27.0 the_validator: ^2.0.0 pocketbase: ^0.18.1 flutter_secure_storage: ^9.0.0 @@ -138,7 +138,7 @@ flutter: - assets/app_tour/ - assets/icons/misc/group.png - assets/icons/misc/search.png - + - assets/icons/bookmark/ fonts: - family: Segoe