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 get props => []; } /// Event to load activities for a specific trip class LoadActivities extends ActivityEvent { final String tripId; const LoadActivities(this.tripId); @override List get props => [tripId]; } /// Event to search activities using Google Places API class SearchActivities extends ActivityEvent { final String tripId; final String destination; final ActivityCategory? category; final int? maxResults; final int? offset; final bool reset; final bool appendToExisting; const SearchActivities({ required this.tripId, required this.destination, this.category, this.maxResults, this.offset, this.reset = false, this.appendToExisting = false, }); @override List get props => [tripId, destination, category, maxResults, offset, reset, appendToExisting]; } /// Event to search activities using coordinates directly (bypasses geocoding) class SearchActivitiesWithCoordinates extends ActivityEvent { final String tripId; final double latitude; final double longitude; final ActivityCategory? category; final int? maxResults; final int? offset; final bool reset; final bool appendToExisting; const SearchActivitiesWithCoordinates({ required this.tripId, required this.latitude, required this.longitude, this.category, this.maxResults, this.offset, this.reset = false, this.appendToExisting = false, }); @override List get props => [tripId, latitude, longitude, category, maxResults, offset, reset, appendToExisting]; } /// 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 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 get props => [activity]; } /// Event to add multiple activities at once class AddActivitiesBatch extends ActivityEvent { final List activities; const AddActivitiesBatch(this.activities); @override List 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 get props => [activityId, userId, vote]; } /// Event to delete an activity class DeleteActivity extends ActivityEvent { final String activityId; const DeleteActivity(this.activityId); @override List 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 get props => [category, minRating, showVotedOnly]; } /// Event to refresh activities class RefreshActivities extends ActivityEvent { final String tripId; const RefreshActivities(this.tripId); @override List 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 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 get props => [activityId, userId]; }