diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ecc7e6a..7c59885 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -30,6 +30,10 @@ + + + + diff --git a/lib/assets/images/placeholder.png b/lib/assets/images/placeholder.png new file mode 100644 index 0000000..bdd8aea Binary files /dev/null and b/lib/assets/images/placeholder.png differ diff --git a/lib/assets/images/profile_picture.png b/lib/assets/images/profile_picture.png new file mode 100644 index 0000000..fb03def Binary files /dev/null and b/lib/assets/images/profile_picture.png differ diff --git a/lib/presentation/screens/dialogs/add_event_dialog.dart b/lib/presentation/screens/dialogs/add_event_dialog.dart new file mode 100644 index 0000000..e895438 --- /dev/null +++ b/lib/presentation/screens/dialogs/add_event_dialog.dart @@ -0,0 +1,304 @@ +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +class AddEventDialog extends StatefulWidget { + const AddEventDialog({super.key}); + + @override + _AddEventDialogState createState() => _AddEventDialogState(); +} + +class _AddEventDialogState extends State { + final _formKey = GlobalKey(); + String _title = ''; + String _description = ''; + DateTime? _selectedDate; + String? _imagePath; + String _location = ''; + String _category = ''; + String _link = ''; + LatLng? _selectedLatLng; + + @override + Widget build(BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15.0), + ), + backgroundColor: const Color(0xFF2C2C3E), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildTitleField(), + const SizedBox(height: 10), + _buildDescriptionField(), + const SizedBox(height: 10), + _buildDatePicker(), + const SizedBox(height: 10), + _buildLocationField(context), + const SizedBox(height: 10), + _buildCategoryField(), + const SizedBox(height: 10), + _buildImagePicker(), + const SizedBox(height: 10), + _buildLinkField(), + const SizedBox(height: 20), + _buildSubmitButton(), + ], + ), + ), + ), + ); + } + + Widget _buildTitleField() { + return TextFormField( + decoration: InputDecoration( + labelText: 'Titre', + labelStyle: const TextStyle(color: Colors.white70), + filled: true, + fillColor: Colors.white.withOpacity(0.1), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: BorderSide.none, + ), + prefixIcon: const Icon(Icons.title, color: Colors.white70), + ), + style: const TextStyle(color: Colors.white), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Veuillez entrer un titre'; + } + return null; + }, + onSaved: (value) { + _title = value ?? ''; + }, + ); + } + + Widget _buildDescriptionField() { + return TextFormField( + decoration: InputDecoration( + labelText: 'Description', + labelStyle: const TextStyle(color: Colors.white70), + filled: true, + fillColor: Colors.white.withOpacity(0.1), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: BorderSide.none, + ), + prefixIcon: const Icon(Icons.description, color: Colors.white70), + ), + style: const TextStyle(color: Colors.white), + maxLines: 3, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Veuillez entrer une description'; + } + return null; + }, + onSaved: (value) { + _description = value ?? ''; + }, + ); + } + + Widget _buildDatePicker() { + return GestureDetector( + onTap: () async { + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now(), + lastDate: DateTime(2101), + ); + if (picked != null && picked != _selectedDate) { + setState(() { + _selectedDate = picked; + }); + } + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(10.0), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _selectedDate == null + ? 'Sélectionnez une date' + : '${_selectedDate!.day}/${_selectedDate!.month}/${_selectedDate!.year}', + style: const TextStyle(color: Colors.white70), + ), + const Icon(Icons.calendar_today, color: Colors.white70), + ], + ), + ), + ); + } + + Widget _buildLocationField(BuildContext context) { + return GestureDetector( + onTap: () async { + final LatLng? pickedLocation = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const LocationPickerScreen(), + ), + ); + if (pickedLocation != null) { + setState(() { + _selectedLatLng = pickedLocation; + _location = '${pickedLocation.latitude}, ${pickedLocation.longitude}'; + }); + } + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(10.0), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _selectedLatLng == null + ? 'Sélectionnez une localisation' + : 'Localisation: $_location', + style: const TextStyle(color: Colors.white70), + ), + const Icon(Icons.location_on, color: Colors.white70), + ], + ), + ), + ); + } + + Widget _buildCategoryField() { + return TextFormField( + decoration: InputDecoration( + labelText: 'Catégorie', + labelStyle: const TextStyle(color: Colors.white70), + filled: true, + fillColor: Colors.white.withOpacity(0.1), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: BorderSide.none, + ), + prefixIcon: const Icon(Icons.category, color: Colors.white70), + ), + style: const TextStyle(color: Colors.white), + onSaved: (value) { + _category = value ?? ''; + }, + ); + } + + Widget _buildImagePicker() { + return GestureDetector( + onTap: () { + // Logique pour sélectionner une image + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(10.0), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _imagePath == null ? 'Sélectionnez une image' : 'Image sélectionnée', + style: const TextStyle(color: Colors.white70), + ), + const Icon(Icons.image, color: Colors.white70), + ], + ), + ), + ); + } + + Widget _buildLinkField() { + return TextFormField( + decoration: InputDecoration( + labelText: 'Lien (optionnel)', + labelStyle: const TextStyle(color: Colors.white70), + filled: true, + fillColor: Colors.white.withOpacity(0.1), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: BorderSide.none, + ), + prefixIcon: const Icon(Icons.link, color: Colors.white70), + ), + style: const TextStyle(color: Colors.white), + onSaved: (value) { + _link = value ?? ''; + }, + ); + } + + Widget _buildSubmitButton() { + return ElevatedButton( + onPressed: () { + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + // Logique pour soumettre les données + Navigator.of(context).pop(); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF1DBF73), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + padding: const EdgeInsets.symmetric(vertical: 12.0), + minimumSize: const Size(double.infinity, 40), + ), + child: const Text('Ajouter l\'événement', style: TextStyle(color: Colors.white)), + ); + } +} + +class LocationPickerScreen extends StatelessWidget { + const LocationPickerScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Sélectionnez une localisation'), + backgroundColor: const Color(0xFF1E1E2C), + ), + body: GoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(48.8566, 2.3522), // Paris par défaut + zoom: 12.0, + ), + markers: Set.of([ + Marker( + markerId: const MarkerId('selectedLocation'), + position: LatLng(48.8566, 2.3522), // Position par défaut + draggable: true, + onDragEnd: (newPosition) { + Navigator.of(context).pop(newPosition); + }, + ) + ]), + onTap: (position) { + Navigator.of(context).pop(position); + }, + ), + ); + } +} diff --git a/lib/presentation/screens/event/event_card.dart b/lib/presentation/screens/event/event_card.dart new file mode 100644 index 0000000..e727dce --- /dev/null +++ b/lib/presentation/screens/event/event_card.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; + +class EventCard extends StatelessWidget { + final String profileImage; + final String name; + final String datePosted; + final String eventTitle; + final String eventDescription; + final String eventImageUrl; + final int reactionsCount; + final int commentsCount; + final int sharesCount; + final VoidCallback onReact; + final VoidCallback onComment; + final VoidCallback onShare; + final VoidCallback onParticipate; + final VoidCallback onCloseEvent; + final VoidCallback onMoreOptions; + + const EventCard({ + Key? key, + required this.profileImage, + required this.name, + required this.datePosted, + required this.eventTitle, + required this.eventDescription, + required this.eventImageUrl, + required this.reactionsCount, + required this.commentsCount, + required this.sharesCount, + required this.onReact, + required this.onComment, + required this.onShare, + required this.onParticipate, + required this.onCloseEvent, + required this.onMoreOptions, required String assetImage, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + color: const Color(0xFF2C2C3E), + margin: const EdgeInsets.symmetric(vertical: 10.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15.0), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(), + const SizedBox(height: 10), + _buildEventDetails(), + const SizedBox(height: 10), + _buildEventImage(), + const SizedBox(height: 10), + Divider(color: Colors.white.withOpacity(0.2)), + _buildInteractionRow(), + const SizedBox(height: 10), + _buildParticipateButton(), + ], + ), + ), + ); + } + + Widget _buildHeader() { + return Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage(profileImage), + radius: 25, + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + Text( + datePosted, + style: const TextStyle(color: Colors.white70, fontSize: 14), + ), + ], + ), + ), + IconButton( + icon: const Icon(Icons.more_vert, color: Colors.white), + onPressed: onMoreOptions, + ), + IconButton( + icon: const Icon(Icons.close, color: Colors.white), + onPressed: onCloseEvent, + ), + ], + ); + } + + Widget _buildEventDetails() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + eventTitle, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 5), + Text( + eventDescription, + style: const TextStyle(color: Colors.white70, fontSize: 14), + ), + ], + ); + } + + Widget _buildEventImage() { + return ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: Image.network( + eventImageUrl, + height: 180, + width: double.infinity, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Image.asset( + 'lib/assets/images/placeholder.png', + height: 180, + width: double.infinity, + fit: BoxFit.cover, + ); + }, + ), + ); + } + + Widget _buildInteractionRow() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildIconButton( + icon: Icons.thumb_up_alt_outlined, + label: 'Réagir', + count: reactionsCount, + onPressed: onReact, + ), + _buildIconButton( + icon: Icons.comment_outlined, + label: 'Commenter', + count: commentsCount, + onPressed: onComment, + ), + _buildIconButton( + icon: Icons.share_outlined, + label: 'Partager', + count: sharesCount, + onPressed: onShare, + ), + ], + ), + ); + } + + Widget _buildIconButton({ + required IconData icon, + required String label, + required int count, + required VoidCallback onPressed, + }) { + return Expanded( + child: TextButton.icon( + onPressed: onPressed, + icon: Icon(icon, color: const Color(0xFF1DBF73), size: 20), + label: Text( + '$label ($count)', + style: const TextStyle(color: Colors.white70, fontSize: 12), + ), + ), + ); + } + + Widget _buildParticipateButton() { + return ElevatedButton( + onPressed: onParticipate, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF1DBF73), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + padding: const EdgeInsets.symmetric(vertical: 12.0), + minimumSize: const Size(double.infinity, 40), + ), + child: const Text('Participer', style: TextStyle(color: Colors.white)), + ); + } +} diff --git a/lib/presentation/screens/event/event_screen.dart b/lib/presentation/screens/event/event_screen.dart index a881064..f04b97e 100644 --- a/lib/presentation/screens/event/event_screen.dart +++ b/lib/presentation/screens/event/event_screen.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import '../dialogs/add_event_dialog.dart'; +import 'event_card.dart'; class EventScreen extends StatelessWidget { const EventScreen({super.key}); @@ -13,130 +15,44 @@ class EventScreen extends StatelessWidget { IconButton( icon: const Icon(Icons.add_circle_outline, size: 28, color: Color(0xFF1DBF73)), onPressed: () { - // Logique pour ajouter un nouvel événement + _showAddEventDialog(context); }, ), ], ), body: ListView.builder( padding: const EdgeInsets.all(16.0), - itemCount: 10, // Remplacez par le nombre réel d'événements + itemCount: 10, itemBuilder: (context, index) { - return Card( - color: const Color(0xFF2C2C3E), - margin: const EdgeInsets.symmetric(vertical: 10.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.0), - ), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Row( - children: [ - CircleAvatar( - backgroundImage: NetworkImage( - 'https://example.com/profile_picture.png', // Remplacez par l'URL réelle de l'image de profil - ), - radius: 25, - ), - SizedBox(width: 10), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Nom Prénom', // Remplacez par le nom réel - style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold), - ), - Text( - 'Posté le 24/08/2024', // Remplacez par la date réelle - style: TextStyle(color: Colors.white70, fontSize: 14), - ), - ], - ), - ], - ), - const SizedBox(height: 10), - const Text( - 'Titre de l\'événement', // Remplacez par le titre réel - style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 5), - const Text( - 'Description détaillée de l\'événement...', // Remplacez par la description réelle - style: TextStyle(color: Colors.white70, fontSize: 14), - ), - const SizedBox(height: 10), - ClipRRect( - borderRadius: BorderRadius.circular(10.0), - child: Image.network( - 'https://example.com/event_image.png', // Remplacez par l'URL réelle de l'image de l'événement - height: 180, - width: double.infinity, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Image.asset( - 'lib/assets/images/placeholder.png', // Chemin vers une image de remplacement locale - height: 180, - width: double.infinity, - fit: BoxFit.cover, - ); - }, - ), - ), - const SizedBox(height: 10), - Divider(color: Colors.white.withOpacity(0.2)), // Ligne de séparation discrète - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildIconButton( - icon: Icons.thumb_up_alt_outlined, - label: 'Réagir', - count: 120, // Remplacez par le nombre réel de j'aimes - onPressed: () { - // Logique pour réagir à l'événement - }, - ), - _buildIconButton( - icon: Icons.comment_outlined, - label: 'Commenter', - count: 45, // Remplacez par le nombre réel de commentaires - onPressed: () { - // Logique pour commenter l'événement - }, - ), - _buildIconButton( - icon: Icons.share_outlined, - label: 'Partager', - count: 30, // Remplacez par le nombre réel de partages - onPressed: () { - // Logique pour partager l'événement - }, - ), - ], - ), - ), - const SizedBox(height: 10), - ElevatedButton( - onPressed: () { - // Logique pour participer à l'événement - }, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF1DBF73), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - padding: const EdgeInsets.symmetric(vertical: 12.0), - minimumSize: const Size(double.infinity, 40), - ), - child: const Text('Participer', style: TextStyle(color: Colors.white)), - ), - ], - ), - ), + return EventCard( + profileImage: 'lib/assets/images/profile_picture.png', + name: 'Nom Prénom', + datePosted: 'Posté le 24/08/2024', + eventTitle: 'Titre de l\'événement', + eventDescription: 'Description détaillée de l\'événement...', + eventImageUrl: 'lib/assets/images/profile_picture.png', + reactionsCount: 120, + commentsCount: 45, + sharesCount: 30, + onReact: () { + // Logique pour réagir à l'événement + }, + onComment: () { + // Logique pour commenter l'événement + }, + onShare: () { + // Logique pour partager l'événement + }, + onParticipate: () { + // Logique pour participer à l'événement + }, + onCloseEvent: () { + // Logique pour fermer l'événement + }, + onMoreOptions: () { + // Logique pour afficher plus d'options + }, + assetImage: 'lib/assets/images/placeholder.png', // Ajoutez ce paramètre requis ); }, ), @@ -144,26 +60,12 @@ class EventScreen extends StatelessWidget { ); } - Widget _buildIconButton({ - required IconData icon, - required String label, - required int count, - required VoidCallback onPressed, - }) { - return Container( - margin: const EdgeInsets.only(right: 8.0), // Espacement entre les boutons - child: Column( - children: [ - IconButton( - icon: Icon(icon, color: const Color(0xFF1DBF73), size: 20), - onPressed: onPressed, - ), - Text( - '$label ($count)', - style: const TextStyle(color: Colors.white70, fontSize: 12), - ), - ], - ), + void _showAddEventDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return const AddEventDialog(); + }, ); } } diff --git a/lib/presentation/screens/profile/profile_screen.dart b/lib/presentation/screens/profile/profile_screen.dart index 61e9cb9..031825f 100644 --- a/lib/presentation/screens/profile/profile_screen.dart +++ b/lib/presentation/screens/profile/profile_screen.dart @@ -50,25 +50,25 @@ class ProfileScreen extends StatelessWidget { } Widget _buildUserInfoSection(BuildContext context) { - return Column( + return const Column( children: [ - const CircleAvatar( + CircleAvatar( radius: 50, - backgroundImage: AssetImage('lib/assets/images/profile_picture.png'), // Remplacer par la photo de profil + backgroundImage: AssetImage('lib/assets/images/profile_picture.png'), //Photo de profil ), - const SizedBox(height: 10), - const Text( - 'Nom Prénom', + SizedBox(height: 10), + Text( + 'GBANE Dahoud', style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold, color: Colors.white), ), - const SizedBox(height: 5), - const Text( + SizedBox(height: 5), + Text( 'pseudo', style: TextStyle(fontSize: 16, color: Colors.grey), ), - const SizedBox(height: 5), - const Text( - 'email@example.com', + SizedBox(height: 5), + Text( + 'gbanedahoud@lions.dev', style: TextStyle(fontSize: 14, color: Colors.grey), ), ], diff --git a/pubspec.lock b/pubspec.lock index 781db0c..2856321 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" cupertino_icons: dependency: "direct main" description: @@ -102,11 +110,24 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" + url: "https://pub.dev" + source: hosted + version: "2.0.22" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" get_it: dependency: "direct main" description: @@ -115,6 +136,62 @@ packages: url: "https://pub.dev" source: hosted version: "7.7.0" + google_maps: + dependency: transitive + description: + name: google_maps + sha256: "463b38e5a92a05cde41220a11fd5eef3847031fef3e8cf295ac76ec453246907" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + google_maps_flutter: + dependency: "direct main" + description: + name: google_maps_flutter + sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7" + url: "https://pub.dev" + source: hosted + version: "2.9.0" + google_maps_flutter_android: + dependency: transitive + description: + name: google_maps_flutter_android + sha256: "60a005bf1ba8d178144e442f6e2d734b0ffc2cc800a05415388472f934ad6d6a" + url: "https://pub.dev" + source: hosted + version: "2.14.4" + google_maps_flutter_ios: + dependency: transitive + description: + name: google_maps_flutter_ios + sha256: "3a484846fc56f15e47e3de1f5ea80a7ff2b31721d2faa88f390f3b3cf580c953" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + google_maps_flutter_platform_interface: + dependency: transitive + description: + name: google_maps_flutter_platform_interface + sha256: "4f6930fd668bf5d40feb2695d5695dbc0c35e5542b557a34ad35be491686d2ba" + url: "https://pub.dev" + source: hosted + version: "2.9.0" + google_maps_flutter_web: + dependency: transitive + description: + name: google_maps_flutter_web + sha256: ff39211bd25d7fad125d19f757eba85bd154460907cd4d135e07e3d0f98a4130 + url: "https://pub.dev" + source: hosted + version: "0.5.10" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" http: dependency: "direct main" description: @@ -203,6 +280,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" provider: dependency: transitive description: @@ -211,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.2" + sanitize_html: + dependency: transitive + description: + name: sanitize_html + sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" + url: "https://pub.dev" + source: hosted + version: "2.1.0" sky_engine: dependency: transitive description: flutter @@ -240,6 +333,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" string_scanner: dependency: transitive description: @@ -288,6 +389,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + url: "https://pub.dev" + source: hosted + version: "1.0.0" sdks: dart: ">=3.5.1 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8376ad8..a33fd2d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,6 +11,7 @@ dependencies: flutter: sdk: flutter + google_maps_flutter: ^2.0.10 cupertino_icons: ^1.0.8 # State management with flutter_bloc @@ -40,6 +41,8 @@ flutter: assets: - lib/assets/images/logo.png - lib/assets/images/background.webp + - lib/assets/images/profile_picture.png + - lib/assets/images/placeholder.png # To add assets to your application, add an assets section, like this: # assets: