From 1cd1febf991e17ec1db98772e9dd79691c485a14 Mon Sep 17 00:00:00 2001 From: IronJam11 Date: Sun, 24 Aug 2025 01:58:28 +0530 Subject: [PATCH 1/2] add: github workflow for maintaining structure and build checks --- .env.stencil | 3 +- .github/workflows/flutter.yaml | 35 +++ lib/components/universal_navbar.dart | 25 +- lib/components/wallet_connect_dialog.dart | 5 + lib/models/wallet_chain_option.dart | 10 +- lib/pages/home_page.dart | 2 - lib/pages/mint_nft/mint_nft_coordinates.dart | 3 +- lib/pages/mint_nft/mint_nft_details.dart | 24 +- lib/pages/mint_nft/mint_nft_images.dart | 7 +- lib/pages/register_user_page.dart | 12 +- lib/providers/mint_nft_provider.dart | 1 - lib/providers/wallet_provider.dart | 1 + lib/utils/constants/contractDetails.dart | 6 - .../contract_abis/tree_nft_contract_abi.dart | 8 +- .../services/contract_read_services.dart | 14 +- .../services/contract_write_functions.dart | 10 +- lib/utils/services/ipfs_services.dart | 8 +- lib/utils/services/switch_chain_utils.dart | 2 +- .../map_widgets/flutter_map_widget.dart | 49 ++-- .../tree_nft_view_details_with_map.dart | 4 +- ..._widget.dart => tree_nft_view_widget.dart} | 1 + .../nft_display_utils/user_nfts_widget.dart | 69 +++--- .../profile_section_widget.dart | 215 +++++++++--------- lib/widgets/wallet_not_connected_widget.dart | 1 + 24 files changed, 270 insertions(+), 245 deletions(-) create mode 100644 .github/workflows/flutter.yaml delete mode 100644 lib/utils/constants/contractDetails.dart rename lib/widgets/nft_display_utils/{tree_NFT_view_widget.dart => tree_nft_view_widget.dart} (98%) diff --git a/.env.stencil b/.env.stencil index f7081d9..a81de8d 100644 --- a/.env.stencil +++ b/.env.stencil @@ -2,4 +2,5 @@ WALLETCONNECT_PROJECT_ID= API_KEY= API_SECRET= ALCHEMY_API_KEY= -CONTRACT_ADDRESS= \ No newline at end of file +CONTRACT_ADDRESS= +APPLICATION_ID= \ No newline at end of file diff --git a/.github/workflows/flutter.yaml b/.github/workflows/flutter.yaml new file mode 100644 index 0000000..36ee323 --- /dev/null +++ b/.github/workflows/flutter.yaml @@ -0,0 +1,35 @@ +name: Flutter CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup environment file from template + run: cp .env.stencil .env + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: 'stable' + + - name: Install dependencies + run: flutter pub get + + - name: Dart analyze + run: flutter analyze + + - name: Check formatting + run: dart format --output=none --set-exit-if-changed . + + - name: Flutter build (apk) + run: flutter build apk --release --no-tree-shake-icons 2>/dev/null | grep -v "deprecated" diff --git a/lib/components/universal_navbar.dart b/lib/components/universal_navbar.dart index b44169d..b73d52f 100644 --- a/lib/components/universal_navbar.dart +++ b/lib/components/universal_navbar.dart @@ -33,7 +33,7 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { bottom: 0, left: 0, right: 0, - child: Container( + child: SizedBox( height: 40, child: _buildPlantIllustrations(), ), @@ -54,7 +54,7 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { color: Colors.white, borderRadius: BorderRadius.circular(8), border: Border.all( - color: Colors.white.withOpacity(0.3), + color: Colors.white, width: 1, ), ), @@ -151,14 +151,13 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { Widget _buildPlantIllustrations() { return Container( decoration: BoxDecoration( - color: const Color.fromARGB(255, 251, 251, 99) - .withOpacity(0.9), // Beige background + color: const Color.fromARGB(255, 251, 251, 99), borderRadius: const BorderRadius.only( topLeft: Radius.circular(40), topRight: Radius.circular(40), ), border: Border.all( - color: Colors.black.withOpacity(0.2), + color: Colors.black, width: 1, ), ), @@ -183,7 +182,7 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: treeImages.map((imagePath) { - return Container( + return SizedBox( width: plantWidth, height: plantWidth, child: Image.asset( @@ -241,15 +240,15 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { constraints: const BoxConstraints(maxWidth: 100, minHeight: 20), // Limit max width decoration: BoxDecoration( - color: Colors.white.withOpacity(0.95), + color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all( - color: Colors.green.withOpacity(0.3), + color: Colors.green, width: 1, ), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: Colors.black, blurRadius: 4, offset: const Offset(0, 2), ), @@ -267,7 +266,7 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { color: Colors.green[700], ), const SizedBox(width: 4), - Container( + SizedBox( width: 10, child: Flexible( child: Text( @@ -366,15 +365,15 @@ class UniversalNavbar extends StatelessWidget implements PreferredSizeWidget { return Container( constraints: const BoxConstraints(maxWidth: 80), // Limit max width decoration: BoxDecoration( - color: Colors.white.withOpacity(0.95), + color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all( - color: Colors.green.withOpacity(0.3), + color: Colors.green, width: 1, ), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: Colors.black, blurRadius: 4, offset: const Offset(0, 2), ), diff --git a/lib/components/wallet_connect_dialog.dart b/lib/components/wallet_connect_dialog.dart index 7bedf61..4dc8082 100644 --- a/lib/components/wallet_connect_dialog.dart +++ b/lib/components/wallet_connect_dialog.dart @@ -40,9 +40,12 @@ class WalletConnectDialog extends StatelessWidget { onPressed: () async { try { await walletProvider.openWallet(wallet, uri); + // ignore: use_build_context_synchronously Navigator.of(context).pop(); } catch (e) { + // ignore: use_build_context_synchronously Navigator.of(context).pop(); + // ignore: use_build_context_synchronously ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(e.toString()), @@ -75,7 +78,9 @@ class WalletConnectDialog extends StatelessWidget { child: OutlinedButton.icon( onPressed: () async { await Clipboard.setData(ClipboardData(text: uri)); + // ignore: use_build_context_synchronously Navigator.of(context).pop(); + // ignore: use_build_context_synchronously ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('URI copied to clipboard!'), diff --git a/lib/models/wallet_chain_option.dart b/lib/models/wallet_chain_option.dart index bc419b3..fa1a6bd 100644 --- a/lib/models/wallet_chain_option.dart +++ b/lib/models/wallet_chain_option.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -final String ALCHEMY_API_KEY = dotenv.env['ALCHEMY_API_KEY'] ?? ''; +final String alchemyApiKey = dotenv.env['ALCHEMY_API_KEY'] ?? ''; class WalletOption { final String name; @@ -30,14 +30,14 @@ final List walletOptionsList = [ ]; final Map rpcUrls = { - '11155111': 'https://eth-sepolia.g.alchemy.com/v2/$ALCHEMY_API_KEY', - '1': 'https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY', + '11155111': 'https://eth-sepolia.g.alchemy.com/v2/$alchemyApiKey', + '1': 'https://eth-mainnet.g.alchemy.com/v2/$alchemyApiKey', }; final Map> chainInfoList = { '1': { 'name': 'Ethereum Mainnet', - 'rpcUrl': 'https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY', + 'rpcUrl': 'https://eth-mainnet.g.alchemy.com/v2/$alchemyApiKey', 'nativeCurrency': { 'name': 'Ether', 'symbol': 'ETH', @@ -47,7 +47,7 @@ final Map> chainInfoList = { }, '11155111': { 'name': 'Sepolia Testnet', - 'rpcUrl': 'https://eth-sepolia.g.alchemy.com/v2/$ALCHEMY_API_KEY', + 'rpcUrl': 'https://eth-sepolia.g.alchemy.com/v2/$alchemyApiKey', 'nativeCurrency': { 'name': 'Sepolia Ether', 'symbol': 'SEP', diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index a01f3e9..55e6c8a 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tree_planting_protocol/providers/wallet_provider.dart'; import 'package:tree_planting_protocol/utils/constants/navbar_constants.dart'; -import 'package:tree_planting_protocol/utils/constants/route_constants.dart'; import 'package:tree_planting_protocol/widgets/basic_scaffold.dart'; import 'package:tree_planting_protocol/widgets/profile_widgets/profile_section_widget.dart'; diff --git a/lib/pages/mint_nft/mint_nft_coordinates.dart b/lib/pages/mint_nft/mint_nft_coordinates.dart index edb4532..d7fdcd6 100644 --- a/lib/pages/mint_nft/mint_nft_coordinates.dart +++ b/lib/pages/mint_nft/mint_nft_coordinates.dart @@ -6,7 +6,7 @@ import 'package:tree_planting_protocol/providers/mint_nft_provider.dart'; import 'package:tree_planting_protocol/utils/constants/route_constants.dart'; import 'package:tree_planting_protocol/widgets/basic_scaffold.dart'; import 'package:tree_planting_protocol/widgets/map_widgets/flutter_map_widget.dart'; -import 'package:tree_planting_protocol/widgets/nft_display_utils/tree_NFT_view_widget.dart'; +import 'package:tree_planting_protocol/widgets/nft_display_utils/tree_nft_view_widget.dart'; import 'package:tree_planting_protocol/utils/services/get_current_location.dart'; import 'package:dart_geohash/dart_geohash.dart'; @@ -618,6 +618,7 @@ class _MintNftCoordinatesPageState extends State { ); } + // ignore: unused_element Widget _buildPreviewSection() { return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/mint_nft/mint_nft_details.dart b/lib/pages/mint_nft/mint_nft_details.dart index 886ec74..17e4778 100644 --- a/lib/pages/mint_nft/mint_nft_details.dart +++ b/lib/pages/mint_nft/mint_nft_details.dart @@ -4,8 +4,6 @@ import 'package:provider/provider.dart'; import 'package:tree_planting_protocol/providers/mint_nft_provider.dart'; import 'package:tree_planting_protocol/utils/constants/route_constants.dart'; import 'package:tree_planting_protocol/widgets/basic_scaffold.dart'; -import 'package:tree_planting_protocol/widgets/map_widgets/flutter_map_widget.dart'; -import 'package:tree_planting_protocol/widgets/nft_display_utils/tree_NFT_view_widget.dart'; import 'package:tree_planting_protocol/widgets/nft_display_utils/tree_nft_view_details_with_map.dart'; class MintNftDetailsPage extends StatefulWidget { @@ -103,14 +101,14 @@ class _MintNftCoordinatesPageState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - const Color(0xFF1CD381).withOpacity(0.05), - const Color(0xFFFAEB96).withOpacity(0.1), + const Color(0xFF1CD381), + const Color(0xFFFAEB96), ], ), borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( - color: const Color(0xFF1CD381).withOpacity(0.15), + color: const Color(0xFF1CD381), blurRadius: 20, offset: const Offset(0, 8), ), @@ -126,7 +124,7 @@ class _MintNftCoordinatesPageState extends State { gradient: LinearGradient( colors: [ const Color(0xFF1CD381), - const Color(0xFF1CD381).withOpacity(0.8), + const Color(0xFF1CD381), ], ), borderRadius: const BorderRadius.only( @@ -139,7 +137,7 @@ class _MintNftCoordinatesPageState extends State { Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), + color: Colors.white, borderRadius: BorderRadius.circular(14), ), child: const Icon( @@ -208,7 +206,7 @@ class _MintNftCoordinatesPageState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), - shadowColor: const Color(0xFF1CD381).withOpacity(0.3), + shadowColor: const Color(0xFF1CD381), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -224,7 +222,7 @@ class _MintNftCoordinatesPageState extends State { Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), + color: Colors.white, borderRadius: BorderRadius.circular(6), ), child: const Icon( @@ -260,7 +258,7 @@ class _MintNftCoordinatesPageState extends State { Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( - color: const Color(0xFF1CD381).withOpacity(0.1), + color: const Color(0xFF1CD381), borderRadius: BorderRadius.circular(8), ), child: Icon( @@ -286,12 +284,12 @@ class _MintNftCoordinatesPageState extends State { color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all( - color: const Color(0xFFFAEB96).withOpacity(0.5), + color: const Color(0xFFFAEB96), width: 2, ), boxShadow: [ BoxShadow( - color: const Color(0xFF1CD381).withOpacity(0.05), + color: const Color(0xFF1CD381), blurRadius: 8, offset: const Offset(0, 2), ), @@ -337,7 +335,7 @@ class _MintNftCoordinatesPageState extends State { Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: const Color(0xFFFAEB96).withOpacity(0.3), + color: const Color(0xFFFAEB96), borderRadius: BorderRadius.circular(10), ), child: Icon( diff --git a/lib/pages/mint_nft/mint_nft_images.dart b/lib/pages/mint_nft/mint_nft_images.dart index e535349..22397cd 100644 --- a/lib/pages/mint_nft/mint_nft_images.dart +++ b/lib/pages/mint_nft/mint_nft_images.dart @@ -42,12 +42,15 @@ class _MultipleImageUploadPageState extends State { if (images.isEmpty) return; logger.d('Selected ${images.length} images for upload'); + + // ignore: use_build_context_synchronously + final provider = Provider.of(context, listen: false); + setState(() { _processingImages = images.map((image) => File(image.path)).toList(); _isUploading = true; }); - final provider = Provider.of(context, listen: false); List newHashes = []; for (int i = 0; i < images.length; i++) { @@ -252,7 +255,7 @@ class _MultipleImageUploadPageState extends State { width: 120, height: 120, decoration: BoxDecoration( - color: Colors.green.withOpacity(0.8), + color: Colors.green, borderRadius: BorderRadius.circular(8), ), diff --git a/lib/pages/register_user_page.dart b/lib/pages/register_user_page.dart index f6d19ef..357c338 100644 --- a/lib/pages/register_user_page.dart +++ b/lib/pages/register_user_page.dart @@ -278,7 +278,7 @@ class _RegisterUserPageState extends State { Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( - color: const Color(0xFF1CD381).withOpacity(0.1), + color: const Color(0xFF1CD381), borderRadius: BorderRadius.circular(8), ), child: const Icon( @@ -308,12 +308,12 @@ class _RegisterUserPageState extends State { color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all( - color: const Color(0xFFFAEB96).withOpacity(0.5), + color: const Color(0xFFFAEB96), width: 2, ), boxShadow: [ BoxShadow( - color: const Color(0xFF1CD381).withOpacity(0.05), + color: const Color(0xFF1CD381), blurRadius: 8, offset: const Offset(0, 2), ), @@ -444,7 +444,7 @@ Widget _buildFormField({ Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( - color: const Color(0xFF1CD381).withOpacity(0.1), + color: const Color(0xFF1CD381), borderRadius: BorderRadius.circular(8), ), child: Icon( @@ -470,12 +470,12 @@ Widget _buildFormField({ color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all( - color: const Color(0xFFFAEB96).withOpacity(0.5), + color: const Color(0xFFFAEB96), width: 2, ), boxShadow: [ BoxShadow( - color: const Color(0xFF1CD381).withOpacity(0.05), + color: const Color(0xFF1CD381), blurRadius: 8, offset: const Offset(0, 2), ), diff --git a/lib/providers/mint_nft_provider.dart b/lib/providers/mint_nft_provider.dart index 810be43..6b6b722 100644 --- a/lib/providers/mint_nft_provider.dart +++ b/lib/providers/mint_nft_provider.dart @@ -5,7 +5,6 @@ class MintNftProvider extends ChangeNotifier { double _longitude = 0; String _species = ""; String _details = ""; - String _detailsHash = ""; String _imageUri = ""; String _qrIpfsHash = ""; String _geoHash = ""; diff --git a/lib/providers/wallet_provider.dart b/lib/providers/wallet_provider.dart index 4ee1e65..7150bb4 100644 --- a/lib/providers/wallet_provider.dart +++ b/lib/providers/wallet_provider.dart @@ -366,6 +366,7 @@ class WalletProvider extends ChangeNotifier { } } + // ignore: unused_element String _getCurrentSessionChainId() { final sessions = _web3App!.sessions.getAll(); if (!sessions.isNotEmpty) { diff --git a/lib/utils/constants/contractDetails.dart b/lib/utils/constants/contractDetails.dart deleted file mode 100644 index f2baf0f..0000000 --- a/lib/utils/constants/contractDetails.dart +++ /dev/null @@ -1,6 +0,0 @@ -// CareToken Address: 0x63bBFf441E7b4369ae7F8f8e21CC57e80A9B34fc -// PlanterToken Address: 0x86e63aad461b6C1FE175254b723b4A0e4fd61779 -// VerifierToken Address: 0xFF98f5DA63D5f4e148266273464BbB8537107cE2 -// LegacyToken Address: 0x72A04057221C7e24B447A608a3815E1C5A1823b2 -// TreeNft Address: 0xD0B9957663a7d6bA29638Ef3067d54f832E0f0ED -// OrganisationFactory: 0xB4601651c2882de08049527F323E38e0E568BB63 diff --git a/lib/utils/constants/contract_abis/tree_nft_contract_abi.dart b/lib/utils/constants/contract_abis/tree_nft_contract_abi.dart index bd05e11..a096e72 100644 --- a/lib/utils/constants/contract_abis/tree_nft_contract_abi.dart +++ b/lib/utils/constants/contract_abis/tree_nft_contract_abi.dart @@ -1,5 +1,7 @@ // ignore: constant_identifier_names -const String TreeNftContractABI = '''[ +import 'package:flutter_dotenv/flutter_dotenv.dart'; + +const String treeNftContractABI = '''[ { "type": "constructor", "inputs": [ @@ -1709,5 +1711,5 @@ const String TreeNftContractABI = '''[ } ]'''; -const String TreeNFtContractAddress = - "0xD0B9957663a7d6bA29638Ef3067d54f832E0f0ED"; +final String treeNFtContractAddress = + dotenv.env['TREE_NFT_CONTRACT_ADDRESS'] ?? ''; diff --git a/lib/utils/services/contract_read_services.dart b/lib/utils/services/contract_read_services.dart index 1b82124..d34c575 100644 --- a/lib/utils/services/contract_read_services.dart +++ b/lib/utils/services/contract_read_services.dart @@ -1,7 +1,7 @@ -import 'package:web3dart/web3dart.dart'; import 'package:tree_planting_protocol/providers/wallet_provider.dart'; import 'package:tree_planting_protocol/utils/logger.dart'; import 'package:tree_planting_protocol/utils/constants/contract_abis/tree_nft_contract_abi.dart'; +import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart'; class ContractReadResult { final bool success; @@ -69,10 +69,10 @@ class ContractReadFunctions { ]; final result = await walletProvider.readContract( - contractAddress: TreeNFtContractAddress, + contractAddress: treeNFtContractAddress, functionName: 'getNFTsByUserPaginated', params: args, - abi: TreeNftContractABI, + abi: treeNftContractABI, ); logger.i("NFTs read successfully: $result"); if (result == null || result.isEmpty) { @@ -117,9 +117,9 @@ class ContractReadFunctions { ); } final result = await walletProvider.readContract( - contractAddress: TreeNFtContractAddress, + contractAddress: treeNFtContractAddress, functionName: 'ping', - abi: TreeNftContractABI, + abi: treeNftContractABI, params: [], ); String pingResponse; @@ -172,9 +172,9 @@ class ContractReadFunctions { EthereumAddress.fromHex(currentAddress); final List args = [userAddress]; final result = await walletProvider.readContract( - contractAddress: TreeNFtContractAddress, + contractAddress: treeNFtContractAddress, functionName: 'getUserProfile', - abi: TreeNftContractABI, + abi: treeNftContractABI, params: args, ); final profile = result.length > 0 ? result[0] ?? [] : []; diff --git a/lib/utils/services/contract_write_functions.dart b/lib/utils/services/contract_write_functions.dart index 9fb0780..fb50c54 100644 --- a/lib/utils/services/contract_write_functions.dart +++ b/lib/utils/services/contract_write_functions.dart @@ -1,5 +1,3 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:tree_planting_protocol/providers/wallet_provider.dart'; import 'package:tree_planting_protocol/utils/logger.dart'; import 'package:tree_planting_protocol/utils/constants/contract_abis/tree_nft_contract_abi.dart'; @@ -79,10 +77,10 @@ class ContractWriteFunctions { photos, ]; final txHash = await walletProvider.writeContract( - contractAddress: TreeNFtContractAddress, + contractAddress: treeNFtContractAddress, functionName: 'mintNft', params: args, - abi: TreeNftContractABI, + abi: treeNftContractABI, chainId: walletProvider.currentChainId, ); @@ -120,10 +118,10 @@ class ContractWriteFunctions { } final List args = [name, profilePhotoHash]; final txHash = await walletProvider.writeContract( - contractAddress: TreeNFtContractAddress, + contractAddress: treeNFtContractAddress, functionName: 'registerUserProfile', params: args, - abi: TreeNftContractABI, + abi: treeNftContractABI, chainId: walletProvider.currentChainId, ); diff --git a/lib/utils/services/ipfs_services.dart b/lib/utils/services/ipfs_services.dart index 1c41d52..d216ea5 100644 --- a/lib/utils/services/ipfs_services.dart +++ b/lib/utils/services/ipfs_services.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'package:http/http.dart' as http; import 'package:flutter_dotenv/flutter_dotenv.dart'; -String API_KEY = dotenv.get('API_KEY', fallback: ""); -String API_SECRET = dotenv.get('API_SECRET', fallback: ""); +String apiKey = dotenv.get('API_KEY', fallback: ""); +String apiSecret = dotenv.get('API_SECRET', fallback: ""); Future uploadToIPFS( File imageFile, Function(bool) setUploadingState) async { @@ -13,8 +13,8 @@ Future uploadToIPFS( var url = Uri.parse("https://api.pinata.cloud/pinning/pinFileToIPFS"); var request = http.MultipartRequest("POST", url); request.headers.addAll({ - "pinata_api_key": API_KEY, - "pinata_secret_api_key": API_SECRET, + "pinata_api_key": apiKey, + "pinata_secret_api_key": apiSecret, }); request.files.add(await http.MultipartFile.fromPath("file", imageFile.path)); diff --git a/lib/utils/services/switch_chain_utils.dart b/lib/utils/services/switch_chain_utils.dart index 1a13346..3e16a54 100644 --- a/lib/utils/services/switch_chain_utils.dart +++ b/lib/utils/services/switch_chain_utils.dart @@ -54,7 +54,7 @@ void showChainSelector(BuildContext context, WalletProvider walletProvider) { }, ), ); - }).toList(), + }), const SizedBox(height: 16), ], ), diff --git a/lib/widgets/map_widgets/flutter_map_widget.dart b/lib/widgets/map_widgets/flutter_map_widget.dart index 6e72585..ce2011d 100644 --- a/lib/widgets/map_widgets/flutter_map_widget.dart +++ b/lib/widgets/map_widgets/flutter_map_widget.dart @@ -9,11 +9,10 @@ class CoordinatesMap extends StatefulWidget { final Function(double lat, double lng)? onLocationSelected; const CoordinatesMap( - {Key? key, + {super.key, this.onLocationSelected, required double lat, - required double lng}) - : super(key: key); + required double lng}); @override State createState() => _CoordinatesMapState(); @@ -23,10 +22,6 @@ class _CoordinatesMapState extends State { late MapController _mapController; bool _mapLoaded = false; bool _hasError = false; - String? _errorMessage; - static const double _defaultLat = 28.9845; - static const double _defaultLng = 77.8956; - @override void initState() { super.initState(); @@ -37,8 +32,8 @@ class _CoordinatesMapState extends State { Widget build(BuildContext context) { return Consumer( builder: (context, provider, _) { - final double latitude = provider.getLatitude() ?? _defaultLat; - final double longitude = provider.getLongitude() ?? _defaultLng; + final double latitude = provider.getLatitude(); + final double longitude = provider.getLongitude(); return Container( decoration: BoxDecoration( @@ -91,7 +86,6 @@ class _CoordinatesMapState extends State { onPressed: () { setState(() { _hasError = false; - _errorMessage = null; }); }, child: const Text("Retry"), @@ -138,7 +132,6 @@ class _CoordinatesMapState extends State { if (mounted) { setState(() { _hasError = true; - _errorMessage = 'Network connection issue'; }); } }, @@ -161,7 +154,7 @@ class _CoordinatesMapState extends State { ), if (!_mapLoaded) Container( - color: Colors.white.withOpacity(0.8), + color: Colors.white, child: const Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -179,7 +172,7 @@ class _CoordinatesMapState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.black.withOpacity(0.7), + color: Colors.black, borderRadius: BorderRadius.circular(4), ), child: Text( @@ -202,7 +195,7 @@ class _CoordinatesMapState extends State { borderRadius: BorderRadius.circular(4), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.2), + color: Colors.black, blurRadius: 4, offset: const Offset(0, 2), ), @@ -226,7 +219,7 @@ class _CoordinatesMapState extends State { topLeft: Radius.circular(4), topRight: Radius.circular(4), ), - child: Container( + child: SizedBox( width: 40, height: 40, child: const Icon( @@ -257,7 +250,7 @@ class _CoordinatesMapState extends State { bottomLeft: Radius.circular(4), bottomRight: Radius.circular(4), ), - child: Container( + child: SizedBox( width: 40, height: 40, child: const Icon( @@ -281,7 +274,7 @@ class _CoordinatesMapState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.blue.withOpacity(0.8), + color: Colors.blue, borderRadius: BorderRadius.circular(4), ), child: const Text( @@ -311,8 +304,10 @@ class StaticDisplayMap extends StatefulWidget { final double lng; const StaticDisplayMap( - {Key? key, this.onLocationSelected, required this.lat, required this.lng}) - : super(key: key); + {super.key, + this.onLocationSelected, + required this.lat, + required this.lng}); @override State createState() => _StaticDisplayMapState(); @@ -322,7 +317,6 @@ class _StaticDisplayMapState extends State { late MapController _mapController; bool _mapLoaded = false; bool _hasError = false; - String? _errorMessage; static const double _defaultLat = 28.9845; // Example: Roorkee, India static const double _defaultLng = 77.8956; @@ -400,7 +394,6 @@ class _StaticDisplayMapState extends State { onPressed: () { setState(() { _hasError = false; - _errorMessage = null; }); }, child: const Text("Retry"), @@ -440,7 +433,6 @@ class _StaticDisplayMapState extends State { }); }, onTap: (tapPosition, point) { - // For static display, you might want to disable tap or handle differently if (widget.onLocationSelected != null) { widget.onLocationSelected!(point.latitude, point.longitude); } @@ -454,7 +446,6 @@ class _StaticDisplayMapState extends State { if (mounted) { setState(() { _hasError = true; - _errorMessage = 'Network connection issue'; }); } }, @@ -477,7 +468,7 @@ class _StaticDisplayMapState extends State { ), if (!_mapLoaded) Container( - color: Colors.white.withOpacity(0.8), + color: Colors.white, child: const Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -495,7 +486,7 @@ class _StaticDisplayMapState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.black.withOpacity(0.7), + color: Colors.black, borderRadius: BorderRadius.circular(4), ), child: Text( @@ -518,7 +509,7 @@ class _StaticDisplayMapState extends State { borderRadius: BorderRadius.circular(4), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.2), + color: Colors.black, blurRadius: 4, offset: const Offset(0, 2), ), @@ -542,7 +533,7 @@ class _StaticDisplayMapState extends State { topLeft: Radius.circular(4), topRight: Radius.circular(4), ), - child: Container( + child: SizedBox( width: 40, height: 40, child: const Icon( @@ -573,7 +564,7 @@ class _StaticDisplayMapState extends State { bottomLeft: Radius.circular(4), bottomRight: Radius.circular(4), ), - child: Container( + child: SizedBox( width: 40, height: 40, child: const Icon( @@ -597,7 +588,7 @@ class _StaticDisplayMapState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.blue.withOpacity(0.8), + color: Colors.blue, borderRadius: BorderRadius.circular(4), ), child: const Text( diff --git a/lib/widgets/nft_display_utils/tree_nft_view_details_with_map.dart b/lib/widgets/nft_display_utils/tree_nft_view_details_with_map.dart index c4a73d3..bb9e6cb 100644 --- a/lib/widgets/nft_display_utils/tree_nft_view_details_with_map.dart +++ b/lib/widgets/nft_display_utils/tree_nft_view_details_with_map.dart @@ -34,7 +34,7 @@ class _NewNFTMapWidgetState extends State { borderRadius: BorderRadius.circular(12.0), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: Colors.black, blurRadius: 8, offset: const Offset(0, 2), ), @@ -64,7 +64,7 @@ class _NewNFTMapWidgetState extends State { color: Colors.white, boxShadow: [ BoxShadow( - color: Colors.green.withOpacity(0.1), + color: Colors.green, blurRadius: 8, offset: const Offset(0, 2), ), diff --git a/lib/widgets/nft_display_utils/tree_NFT_view_widget.dart b/lib/widgets/nft_display_utils/tree_nft_view_widget.dart similarity index 98% rename from lib/widgets/nft_display_utils/tree_NFT_view_widget.dart rename to lib/widgets/nft_display_utils/tree_nft_view_widget.dart index 4353a64..b8fff3f 100644 --- a/lib/widgets/nft_display_utils/tree_NFT_view_widget.dart +++ b/lib/widgets/nft_display_utils/tree_nft_view_widget.dart @@ -1,3 +1,4 @@ +// ignore: file_names import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tree_planting_protocol/providers/mint_nft_provider.dart'; diff --git a/lib/widgets/nft_display_utils/user_nfts_widget.dart b/lib/widgets/nft_display_utils/user_nfts_widget.dart index 69d6559..4bd0bc2 100644 --- a/lib/widgets/nft_display_utils/user_nfts_widget.dart +++ b/lib/widgets/nft_display_utils/user_nfts_widget.dart @@ -105,10 +105,10 @@ class UserNftsWidget extends StatefulWidget { final String userAddress; const UserNftsWidget({ - Key? key, + super.key, required this.isOwnerCalling, required this.userAddress, - }) : super(key: key); + }); @override State createState() => _UserNftsWidgetState(); @@ -118,7 +118,9 @@ class _UserNftsWidgetState extends State { List _nfts = []; bool _isLoading = false; String? _errorMessage; + // ignore: unused_field int _currentPage = 0; + // ignore: unused_field final int _itemsPerPage = 10; int _totalCount = 0; bool _hasMore = true; @@ -193,7 +195,7 @@ class _UserNftsWidgetState extends State { return Card( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), elevation: 8, - shadowColor: Colors.black.withOpacity(0.5), + shadowColor: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: const BorderSide( @@ -338,44 +340,41 @@ class _UserNftsWidgetState extends State { @override Widget build(BuildContext context) { - return Container( - child: Column( - children: [ - // Header - Padding( - padding: const EdgeInsets.all(16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.isOwnerCalling ? "Your NFTs" : "User NFTs", + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + if (_totalCount > 0) Text( - widget.isOwnerCalling ? "Your NFTs" : "User NFTs", + '$_totalCount trees', style: const TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, + fontSize: 16, + color: Colors.grey, ), ), - if (_totalCount > 0) - Text( - '$_totalCount trees', - style: const TextStyle( - fontSize: 16, - color: Colors.grey, - ), - ), - ], - ), + ], ), + ), - // Content - Expanded( - child: _errorMessage != null - ? _buildErrorWidget() - : _nfts.isEmpty && !_isLoading - ? _buildEmptyWidget() - : _buildNFTsList(), - ), - ], - ), + // Content + Expanded( + child: _errorMessage != null + ? _buildErrorWidget() + : _nfts.isEmpty && !_isLoading + ? _buildEmptyWidget() + : _buildNFTsList(), + ), + ], ); } diff --git a/lib/widgets/profile_widgets/profile_section_widget.dart b/lib/widgets/profile_widgets/profile_section_widget.dart index f8b7320..82aeeb1 100644 --- a/lib/widgets/profile_widgets/profile_section_widget.dart +++ b/lib/widgets/profile_widgets/profile_section_widget.dart @@ -34,9 +34,9 @@ class UserProfileData { try { dynamic actualData = data; return UserProfileData( - name: actualData[2].toString() ?? '', - userAddress: actualData[0].toString() ?? '', - profilePhotoIpfs: actualData[1].toString() ?? '', + name: actualData[2].toString(), + userAddress: actualData[0].toString(), + profilePhotoIpfs: actualData[1].toString(), dateJoined: _toInt(actualData[3]), verificationsRevoked: _toInt(actualData[4]), reportedSpam: _toInt(actualData[5]), @@ -46,9 +46,9 @@ class UserProfileData { legacyTokens: _toInt(actualData[8]), ); } catch (e) { - debugPrint("Error parsing Tree data: $e"); - debugPrint("Data received: $data"); - debugPrint("Data type: ${data.runtimeType}"); + logger.d("Error parsing Tree data: $e"); + logger.d("Data received: $data"); + logger.d("Data type: ${data.runtimeType}"); return UserProfileData( name: '', @@ -244,119 +244,118 @@ class _ProfileSectionWidgetState extends State { } Widget _tokenWidget() { - return Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(4.0), - child: SizedBox( - height: 40, - width: 150, - child: Container( - decoration: BoxDecoration( - color: const Color.fromARGB(255, 251, 251, 99), - border: Border.all( - color: Colors.black, - width: 2, - ), - borderRadius: BorderRadius.circular(12), - boxShadow: [ - BoxShadow( - color: Colors.black12, // shadow color - blurRadius: 6, // shadow softness - offset: Offset(0, 3), // shadow position - ), - ], + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: SizedBox( + height: 40, + width: 150, + child: Container( + decoration: BoxDecoration( + color: const Color.fromARGB(255, 251, 251, 99), + border: Border.all( + color: Colors.black, + width: 2, ), - child: Center( - child: Text( - 'Planter Tokens : ${_userProfileData!.planterTokens}'))), - ), - ), - Padding( - padding: const EdgeInsets.all(4.0), - child: SizedBox( - height: 40, - width: 150, - child: Container( - decoration: BoxDecoration( - color: const Color.fromARGB(255, 28, 211, 129), - border: Border.all( - color: Colors.black, - width: 2, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black12, // shadow color + blurRadius: 6, // shadow softness + offset: Offset(0, 3), // shadow position ), - borderRadius: BorderRadius.circular(12), - boxShadow: [ - BoxShadow( - color: Colors.black12, - blurRadius: 6, - offset: Offset(0, 3), - ), - ], - ), - child: Center( - child: Text( - 'Care Tokens : ${_userProfileData!.careTokens}'))), - ), + ], + ), + child: Center( + child: Text( + 'Planter Tokens : ${_userProfileData!.planterTokens}'))), ), - Padding( - padding: const EdgeInsets.all(4.0), - child: SizedBox( - height: 40, - width: 150, - child: Container( - decoration: BoxDecoration( - color: const Color.fromARGB(255, 251, 251, 99), - border: Border.all( - color: Colors.black, - width: 2, - ), - borderRadius: BorderRadius.circular(12), - boxShadow: [ - BoxShadow( - color: Colors.black12, - blurRadius: 6, - offset: Offset(0, 3), - ), - ], + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: SizedBox( + height: 40, + width: 150, + child: Container( + decoration: BoxDecoration( + color: const Color.fromARGB(255, 28, 211, 129), + border: Border.all( + color: Colors.black, + width: 2, ), - child: Center( - child: Text( - 'Verifier Tokens : ${_userProfileData!.verifierTokens}'))), - ), + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 6, + offset: Offset(0, 3), + ), + ], + ), + child: Center( + child: + Text('Care Tokens : ${_userProfileData!.careTokens}'))), ), - Padding( - padding: const EdgeInsets.all(4.0), - child: SizedBox( - height: 40, - width: 150, - child: Container( - decoration: BoxDecoration( - color: const Color.fromARGB(255, 28, 211, 129), - border: Border.all( - color: Colors.black, - width: 2, + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: SizedBox( + height: 40, + width: 150, + child: Container( + decoration: BoxDecoration( + color: const Color.fromARGB(255, 251, 251, 99), + border: Border.all( + color: Colors.black, + width: 2, + ), + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 6, + offset: Offset(0, 3), ), - borderRadius: BorderRadius.circular(12), - boxShadow: [ - BoxShadow( - color: Colors.black12, - blurRadius: 6, - offset: Offset(0, 3), - ), - ], + ], + ), + child: Center( + child: Text( + 'Verifier Tokens : ${_userProfileData!.verifierTokens}'))), + ), + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: SizedBox( + height: 40, + width: 150, + child: Container( + decoration: BoxDecoration( + color: const Color.fromARGB(255, 28, 211, 129), + border: Border.all( + color: Colors.black, + width: 2, ), - child: Center( - child: Text( - 'Legacy Tokens : ${_userProfileData!.legacyTokens}'))), - ), + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 6, + offset: Offset(0, 3), + ), + ], + ), + child: Center( + child: Text( + 'Legacy Tokens : ${_userProfileData!.legacyTokens}'))), ), - ], - ), + ), + ], ); } + // ignore: unused_element Widget _buildErrorState() { return Container( padding: const EdgeInsets.all(20), diff --git a/lib/widgets/wallet_not_connected_widget.dart b/lib/widgets/wallet_not_connected_widget.dart index 6a8ecec..ad78ed8 100644 --- a/lib/widgets/wallet_not_connected_widget.dart +++ b/lib/widgets/wallet_not_connected_widget.dart @@ -26,6 +26,7 @@ Widget buildWalletNotConnectedWidget(BuildContext context) { onPressed: () { final walletProvider = Provider.of(context, listen: false); + walletProvider.connectWallet(); }, child: const Text('Connect Wallet'), ), From ab84dd5df060c9e085790aa5e67062b13812314d Mon Sep 17 00:00:00 2001 From: IronJam11 Date: Sun, 24 Aug 2025 05:09:38 +0530 Subject: [PATCH 2/2] fix: remove error handling in the build comman --- .github/workflows/flutter.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter.yaml b/.github/workflows/flutter.yaml index 36ee323..38da893 100644 --- a/.github/workflows/flutter.yaml +++ b/.github/workflows/flutter.yaml @@ -32,4 +32,4 @@ jobs: run: dart format --output=none --set-exit-if-changed . - name: Flutter build (apk) - run: flutter build apk --release --no-tree-shake-icons 2>/dev/null | grep -v "deprecated" + run: flutter build apk --release --no-tree-shake-icons | grep -v "deprecated"