Files
CityCards_Partner_Flutter/lib/recurring/viewmodels/recurring_block_viewmodel.dart
2025-10-29 18:55:48 +05:30

151 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import '../models/recurring_block_model.dart';
class RecurringBlockViewModel extends ChangeNotifier {
final RecurringBlockModel _model = RecurringBlockModel();
int _currentStep = 0;
String? _selectedCategory;
String? _selectedRecurrence;
Set<String> _selectedDays = {};
int _repeatWeek = 1;
DateTime _focusedMonth = DateTime.now();
Set<int> _selectedDates = {};
int _capacity = 50;
List<TimeSlot> _timeSlots = [];
// ---------- Getters ----------
int get currentStep => _currentStep;
String? get selectedCategory => _selectedCategory;
String? get selectedRecurrence => _selectedRecurrence;
Set<String> get selectedDays => _selectedDays;
int get repeatWeek => _repeatWeek;
DateTime get focusedMonth => _focusedMonth;
Set<int> get selectedDates => _selectedDates;
int get capacity => _capacity;
List<TimeSlot> get timeSlots => _timeSlots;
RecurringBlockModel get model => _model;
// ---------- Step Navigation ----------
void nextStep() {
if (_currentStep < 3) {
_currentStep++;
notifyListeners();
}
}
void previousStep(BuildContext context) {
if (_currentStep > 0) {
_currentStep--;
notifyListeners();
} else {
Navigator.pop(context);
}
}
// ---------- Category ----------
void selectCategory(String category) {
_selectedCategory = category;
notifyListeners();
}
// ---------- Recurrence Type ----------
void selectRecurrence(String type) {
// ✅ Single-choice only (cannot deselect, always one active)
if (_selectedRecurrence != type) {
_selectedRecurrence = type;
notifyListeners();
}
}
// ---------- Weekly Day Selection ----------
void toggleDay(String day) {
if (_selectedDays.contains(day)) {
_selectedDays.remove(day);
} else {
_selectedDays.add(day);
}
notifyListeners();
}
// ---------- Week Repeat Increment/Decrement ----------
void incrementWeek() {
_repeatWeek++;
notifyListeners();
}
void decrementWeek() {
if (_repeatWeek > 1) {
_repeatWeek--;
notifyListeners();
}
}
// ---------- Month Navigation ----------
void changeMonth(int offset) {
_focusedMonth = DateTime(
_focusedMonth.year,
_focusedMonth.month + offset,
);
notifyListeners();
}
// ---------- Monthly Date Selection ----------
void toggleDate(int day) {
if (_selectedDates.contains(day)) {
_selectedDates.remove(day);
} else {
_selectedDates.add(day);
}
notifyListeners();
}
// ---------- Time Slots ----------
void addTimeSlot(String start, String end, int capacity) {
_timeSlots.add(TimeSlot(start, end, capacity));
notifyListeners();
}
void clearSlots() {
_timeSlots.clear();
notifyListeners();
}
// ---------- Capacity ----------
void incrementCapacity() {
_capacity++;
notifyListeners();
}
void decrementCapacity() {
if (_capacity > 1) _capacity--;
notifyListeners();
}
// ---------- Model Field Updates ----------
void updateAttractionName(String value) {
_model.attractionName = value;
notifyListeners();
}
void updateLocation(String value) {
_model.location = value;
notifyListeners();
}
void updateDescription(String value) {
_model.description = value;
notifyListeners();
}
void updateStartDate(DateTime date) {
_model.startDate = date;
notifyListeners();
}
void updateEndDate(DateTime date) {
_model.endDate = date;
notifyListeners();
}
}