2024-09-16 15:33:37 +01:00
|
|
|
import 'dart:convert';
|
2024-09-13 08:59:21 +01:00
|
|
|
import 'package:dropdown_search/dropdown_search.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:mobile/base/sidemenu.dart';
|
|
|
|
import 'services/openaiservice.dart' as api;
|
|
|
|
|
|
|
|
class TouristGuideBookPage extends StatefulWidget {
|
|
|
|
const TouristGuideBookPage({super.key});
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<TouristGuideBookPage> createState() => _TouristGuideBookPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _TouristGuideBookPageState extends State<TouristGuideBookPage> {
|
|
|
|
String? _selectedCountry;
|
2024-09-16 15:33:37 +01:00
|
|
|
bool _isLoading = false;
|
|
|
|
Map<String, dynamic> _touristbook = {};
|
|
|
|
final List<String> countries = [
|
|
|
|
"Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Argentina",
|
|
|
|
"Armenia", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain",
|
|
|
|
"Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin",
|
|
|
|
"Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil",
|
|
|
|
"Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cabo Verde", "Cambodia",
|
|
|
|
"Cameroon", "Canada", "Central African Republic", "Chad", "Chile", "China",
|
|
|
|
"Colombia", "Comoros", "Congo (Congo-Brazzaville)", "Congo (Democratic Republic)",
|
|
|
|
"Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic", "Denmark",
|
|
|
|
"Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador",
|
|
|
|
"Equatorial Guinea", "Eritrea", "Estonia", "Eswatini", "Ethiopia", "Fiji",
|
|
|
|
"Finland", "France", "Gabon", "Gambia", "Georgia", "Germany", "Ghana",
|
|
|
|
"Greece", "Grenada", "Guatemala", "Guinea", "Guinea-Bissau", "Guyana",
|
|
|
|
"Haiti", "Honduras", "Hungary", "Iceland", "India", "Indonesia", "Iran",
|
|
|
|
"Iraq", "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan", "Kazakhstan",
|
|
|
|
"Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon",
|
|
|
|
"Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
|
|
|
|
"Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands",
|
|
|
|
"Mauritania", "Mauritius", "Mexico", "Micronesia", "Moldova", "Monaco",
|
|
|
|
"Mongolia", "Montenegro", "Morocco", "Mozambique", "Myanmar", "Namibia",
|
|
|
|
"Nauru", "Nepal", "Netherlands", "New Zealand", "Nicaragua", "Niger",
|
|
|
|
"Nigeria", "North Korea", "North Macedonia", "Norway", "Oman", "Pakistan",
|
|
|
|
"Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines",
|
|
|
|
"Poland", "Portugal", "Qatar", "Romania", "Russia", "Rwanda", "Saint Kitts and Nevis",
|
|
|
|
"Saint Lucia", "Saint Vincent and the Grenadines", "Samoa", "San Marino",
|
|
|
|
"Sao Tome and Principe", "Saudi Arabia", "Senegal", "Serbia", "Seychelles",
|
|
|
|
"Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
|
|
|
|
"Somalia", "South Africa", "South Korea", "South Sudan", "Spain", "Sri Lanka",
|
|
|
|
"Sudan", "Suriname", "Sweden", "Switzerland", "Syria", "Taiwan", "Tajikistan",
|
|
|
|
"Tanzania", "Thailand", "Timor-Leste", "Togo", "Tonga", "Trinidad and Tobago",
|
|
|
|
"Tunisia", "Turkey", "Turkmenistan", "Tuvalu", "Uganda", "Ukraine",
|
|
|
|
"United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan",
|
|
|
|
"Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Yemen", "Zambia", "Zimbabwe"
|
|
|
|
];
|
2024-09-13 08:59:21 +01:00
|
|
|
|
|
|
|
Future<void> getBook() async {
|
|
|
|
if (_selectedCountry != null) {
|
2024-09-16 15:33:37 +01:00
|
|
|
setState(() {
|
|
|
|
_isLoading = true;
|
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
final response = await api.OpenAIService.getGuideBook(_selectedCountry!);
|
|
|
|
print(response);
|
|
|
|
final jsonData = jsonDecode(response);
|
|
|
|
setState(() {
|
|
|
|
_touristbook = jsonData[_selectedCountry!];
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
print('Error fetching guidebook: $e');
|
|
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
|
|
SnackBar(content: Text('Failed to load guidebook')),
|
|
|
|
);
|
|
|
|
} finally {
|
|
|
|
setState(() {
|
|
|
|
_isLoading = false;
|
|
|
|
});
|
|
|
|
}
|
2024-09-13 08:59:21 +01:00
|
|
|
} else {
|
|
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
|
|
const SnackBar(content: Text('Choose a country')),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-16 15:33:37 +01:00
|
|
|
Widget _buildTouristBookSection(String title, String content) {
|
|
|
|
return Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
2024-09-17 08:14:31 +01:00
|
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
2024-09-16 15:33:37 +01:00
|
|
|
children: [
|
|
|
|
Text(title, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
|
|
|
SizedBox(height: 5),
|
|
|
|
Text(content, style: TextStyle(fontSize: 16)),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return SideMenu(
|
|
|
|
selectedIndex: 5,
|
|
|
|
body: Scaffold(
|
|
|
|
appBar: AppBar(
|
|
|
|
title: Text('Select Country'),
|
|
|
|
),
|
|
|
|
body: _isLoading
|
|
|
|
? Center(child: CircularProgressIndicator())
|
|
|
|
: SingleChildScrollView( // Added SingleChildScrollView here
|
|
|
|
padding: const EdgeInsets.all(16.0),
|
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
DropdownSearch<String>(
|
|
|
|
items: countries,
|
|
|
|
popupProps: const PopupProps.menu(
|
|
|
|
showSearchBox: true,
|
|
|
|
searchFieldProps: TextFieldProps(
|
|
|
|
decoration: InputDecoration(
|
|
|
|
labelText: "Search a country",
|
|
|
|
border: OutlineInputBorder(),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
dropdownDecoratorProps: const DropDownDecoratorProps(
|
|
|
|
dropdownSearchDecoration: InputDecoration(
|
|
|
|
labelText: "Select a country",
|
|
|
|
hintText: "Search a country",
|
2024-09-13 08:59:21 +01:00
|
|
|
border: OutlineInputBorder(),
|
|
|
|
),
|
|
|
|
),
|
2024-09-16 15:33:37 +01:00
|
|
|
onChanged: (String? country) {
|
|
|
|
setState(() {
|
|
|
|
_selectedCountry = country;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
selectedItem: "Select a country you want a touristbook for",
|
2024-09-13 08:59:21 +01:00
|
|
|
),
|
2024-09-16 15:33:37 +01:00
|
|
|
SizedBox(height: 20),
|
|
|
|
ElevatedButton(
|
|
|
|
onPressed: getBook,
|
|
|
|
child: Text('Get Guidebook'),
|
2024-09-13 08:59:21 +01:00
|
|
|
),
|
2024-09-16 15:33:37 +01:00
|
|
|
if (_touristbook.isNotEmpty) ...[
|
2024-09-17 08:14:31 +01:00
|
|
|
_buildTouristBookSection(
|
|
|
|
_selectedCountry!,""
|
|
|
|
),
|
2024-09-16 15:33:37 +01:00
|
|
|
_buildTouristBookSection(
|
|
|
|
"Introduction - People",
|
|
|
|
_touristbook['introduction']?['people'] ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Introduction - Environment",
|
|
|
|
_touristbook['introduction']?['environment'] ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Famous Sites",
|
|
|
|
_touristbook['tourist_attractions']?['famous_sites']?.map((site) => site['name'] + ':\n' + site['description']).join('\n') ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Basic Language - Greetings",
|
|
|
|
_touristbook['basic_words']?.entries.map((e) => '${e.key}: ${e.value}').join('\n') ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Transportation Overview",
|
|
|
|
_touristbook['transportation']?['overview'] ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Public Transport - Buses",
|
|
|
|
_touristbook['transportation']?['public_transport']?['buses'] ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Public Transport - Trains",
|
|
|
|
_touristbook['transportation']?['public_transport']?['trains'] ?? 'No data',
|
|
|
|
),
|
|
|
|
_buildTouristBookSection(
|
|
|
|
"Public Transport - Taxis",
|
|
|
|
_touristbook['transportation']?['public_transport']?['taxis'] ?? 'No data',
|
|
|
|
),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
2024-09-13 08:59:21 +01:00
|
|
|
),
|
2024-09-16 15:33:37 +01:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
2024-09-13 08:59:21 +01:00
|
|
|
}
|