feat: Implement activity management feature with Firestore integration
- Added AddActivityBottomSheet for adding custom activities to trips. - Created Activity model to represent tourist activities. - Developed ActivityRepository for managing activities in Firestore. - Integrated ActivityPlacesService for searching activities via Google Places API. - Updated ShowTripDetailsContent to navigate to activities page. - Enhanced main.dart to include ActivityBloc and necessary repositories.
This commit is contained in:
153
lib/blocs/activity/activity_event.dart
Normal file
153
lib/blocs/activity/activity_event.dart
Normal file
@@ -0,0 +1,153 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import '../../models/activity.dart';
|
||||
|
||||
/// Base class for all activity-related events
|
||||
abstract class ActivityEvent extends Equatable {
|
||||
const ActivityEvent();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
/// Event to load activities for a specific trip
|
||||
class LoadActivities extends ActivityEvent {
|
||||
final String tripId;
|
||||
|
||||
const LoadActivities(this.tripId);
|
||||
|
||||
@override
|
||||
List<Object> get props => [tripId];
|
||||
}
|
||||
|
||||
/// Event to search activities using Google Places API
|
||||
class SearchActivities extends ActivityEvent {
|
||||
final String tripId;
|
||||
final String destination;
|
||||
final ActivityCategory? category;
|
||||
|
||||
const SearchActivities({
|
||||
required this.tripId,
|
||||
required this.destination,
|
||||
this.category,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [tripId, destination, category];
|
||||
}
|
||||
|
||||
/// Event to search activities by text query
|
||||
class SearchActivitiesByText extends ActivityEvent {
|
||||
final String tripId;
|
||||
final String destination;
|
||||
final String query;
|
||||
|
||||
const SearchActivitiesByText({
|
||||
required this.tripId,
|
||||
required this.destination,
|
||||
required this.query,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object> get props => [tripId, destination, query];
|
||||
}
|
||||
|
||||
/// Event to add a single activity to the trip
|
||||
class AddActivity extends ActivityEvent {
|
||||
final Activity activity;
|
||||
|
||||
const AddActivity(this.activity);
|
||||
|
||||
@override
|
||||
List<Object> get props => [activity];
|
||||
}
|
||||
|
||||
/// Event to add multiple activities at once
|
||||
class AddActivitiesBatch extends ActivityEvent {
|
||||
final List<Activity> activities;
|
||||
|
||||
const AddActivitiesBatch(this.activities);
|
||||
|
||||
@override
|
||||
List<Object> get props => [activities];
|
||||
}
|
||||
|
||||
/// Event to vote for an activity
|
||||
class VoteForActivity extends ActivityEvent {
|
||||
final String activityId;
|
||||
final String userId;
|
||||
final int vote; // 1 for positive, -1 for negative, 0 to remove vote
|
||||
|
||||
const VoteForActivity({
|
||||
required this.activityId,
|
||||
required this.userId,
|
||||
required this.vote,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object> get props => [activityId, userId, vote];
|
||||
}
|
||||
|
||||
/// Event to delete an activity
|
||||
class DeleteActivity extends ActivityEvent {
|
||||
final String activityId;
|
||||
|
||||
const DeleteActivity(this.activityId);
|
||||
|
||||
@override
|
||||
List<Object> get props => [activityId];
|
||||
}
|
||||
|
||||
/// Event to filter activities
|
||||
class FilterActivities extends ActivityEvent {
|
||||
final String? category;
|
||||
final double? minRating;
|
||||
final bool? showVotedOnly;
|
||||
|
||||
const FilterActivities({
|
||||
this.category,
|
||||
this.minRating,
|
||||
this.showVotedOnly,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [category, minRating, showVotedOnly];
|
||||
}
|
||||
|
||||
/// Event to refresh activities
|
||||
class RefreshActivities extends ActivityEvent {
|
||||
final String tripId;
|
||||
|
||||
const RefreshActivities(this.tripId);
|
||||
|
||||
@override
|
||||
List<Object> get props => [tripId];
|
||||
}
|
||||
|
||||
/// Event to clear search results
|
||||
class ClearSearchResults extends ActivityEvent {
|
||||
const ClearSearchResults();
|
||||
}
|
||||
|
||||
/// Event to update activity details
|
||||
class UpdateActivity extends ActivityEvent {
|
||||
final Activity activity;
|
||||
|
||||
const UpdateActivity(this.activity);
|
||||
|
||||
@override
|
||||
List<Object> get props => [activity];
|
||||
}
|
||||
|
||||
/// Event to toggle favorite status
|
||||
class ToggleActivityFavorite extends ActivityEvent {
|
||||
final String activityId;
|
||||
final String userId;
|
||||
|
||||
const ToggleActivityFavorite({
|
||||
required this.activityId,
|
||||
required this.userId,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object> get props => [activityId, userId];
|
||||
}
|
||||
Reference in New Issue
Block a user