import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:io'; import 'ItemMenu.dart'; import '../classes/events.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; // Import dotenv import 'dart:math'; import '../variable/globals.dart' as globals; class SearchDelegateExample extends SearchDelegate { SearchDelegateExample(); @override List buildActions(BuildContext context) { return [ IconButton( icon: const Icon(Icons.clear), onPressed: () { query = ''; }, ), ]; } @override Widget buildLeading(BuildContext context) { return IconButton( icon: const Icon(Icons.arrow_back), onPressed: () { close(context, null); }, ); } @override Widget buildResults(BuildContext context) { // Perform the search and return the results return FutureBuilder>( future: searchPosts(query), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } else if (snapshot.hasData) { final posts = snapshot.data!; return ListView.builder( itemCount: posts.length, itemBuilder: (context, index) { final post = posts[index]; return ListTile( title: Text(post.name!), subtitle: Text(post.place!), onTap: () { Navigator.push( context, MaterialPageRoute( builder: (_) => ItemMenu(title: post.id!), ), ); }, ); }, ); } else { return const Center(child: Text("No results found")); } }, ); } @override Widget buildSuggestions(BuildContext context) { return Container(); // Implement suggestions if needed } Future> searchPosts(String query) async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; var latitude = prefs.getDouble("city_lat") ?? 0.0; var longitude = prefs.getDouble("city_long") ?? 0.0; final List body = []; if (accessToken.isNotEmpty) { DateTime currentDate = DateTime.now(); var url = Uri.parse( "${globals.api}/events/search?item=${query}¤t_dateime=${currentDate.toString()}"); if ((latitude != 0.0) && (longitude != 0.0)) { // Now use the latitude and longitude to get events within a 50km radius double radiusInKm = 50; double latDistance = radiusInKm / 111.0; double lonDistance = radiusInKm / (111.0 * cos(latitude * pi / 180)); double minLat = latitude - latDistance; double maxLat = latitude + latDistance; double minLon = longitude - lonDistance; double maxLon = longitude + lonDistance; // Construct the search URL with the item query and latitude/longitude bounds url = Uri.parse( "${globals.api}/events/search?item=${query}&min_lat=${minLat}&max_lat=${maxLat}&min_lon=${minLon}&max_lon=${maxLon}¤t_dateime=${currentDate.toString()}"); } final response = await http.get(url, headers: { "Content-Type": "application/json", HttpHeaders.cookieHeader: "access_token=${accessToken}" }); final List body = json.decode(utf8.decode(response.bodyBytes)); return body.map((e) => Events.fromJson(e)).toList(); } return body; } }