import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; class ApiClient { static const String _defaultBaseUrl = 'http://localhost:3000'; // Use 10.0.2.2 for Android emulator to reach host localhost static const String _androidEmulatorUrl = 'http://10.0.2.2:3000'; late final Dio dio; ApiClient({String? baseUrl}) { final url = baseUrl ?? _resolveBaseUrl(); dio = Dio(BaseOptions( baseUrl: url, connectTimeout: const Duration(seconds: 5), receiveTimeout: const Duration(seconds: 10), headers: {'Content-Type': 'application/json'}, )); dio.interceptors.add(LogInterceptor( requestBody: true, responseBody: true, logPrint: (log) => debugPrint(log.toString()), )); } static String _resolveBaseUrl() { // Android emulator uses 10.0.2.2 to reach host machine if (defaultTargetPlatform == TargetPlatform.android) { return _androidEmulatorUrl; } return _defaultBaseUrl; } // Chain Future> getChainInfo() async { final response = await dio.get('/api/chain/info'); return response.data; } Future> validateChain() async { final response = await dio.post('/api/chain/validate'); return response.data; } // Blocks Future> getBlocks({int offset = 0, int limit = 10}) async { final response = await dio.get('/api/blocks', queryParameters: { 'offset': offset, 'limit': limit, }); return response.data; } Future> getBlock(String hash) async { final response = await dio.get('/api/blocks/$hash'); return response.data; } // Wallets Future> createWallet() async { final response = await dio.post('/api/wallets'); return response.data; } Future> getBalance(String address) async { final response = await dio.get('/api/wallets/$address/balance'); return response.data; } // Transactions Future> submitTransaction(Map tx) async { final response = await dio.post('/api/transactions', data: tx); return response.data; } Future> getPendingTransactions() async { final response = await dio.get('/api/transactions/pending'); return response.data; } // Mining Future> mine(String minerAddress) async { final response = await dio.post('/api/mine', data: { 'miner_address': minerAddress, }); return response.data; } Future> getMiningStatus() async { final response = await dio.get('/api/mining/status'); return response.data; } // Health Future healthCheck() async { try { await dio.get('/api/health'); return true; } catch (_) { return false; } } }