163 lines
3.9 KiB
Dart
163 lines
3.9 KiB
Dart
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
import 'package:hive/hive.dart';
|
|
|
|
part 'routine.freezed.dart';
|
|
part 'routine.g.dart';
|
|
|
|
@HiveType(typeId: 0)
|
|
enum RoutineCategory {
|
|
@HiveField(0)
|
|
medication,
|
|
@HiveField(1)
|
|
vitamin,
|
|
@HiveField(2)
|
|
appointment,
|
|
@HiveField(3)
|
|
sleep,
|
|
@HiveField(4)
|
|
food,
|
|
@HiveField(5)
|
|
hydration,
|
|
@HiveField(6)
|
|
exercise,
|
|
@HiveField(7)
|
|
hygiene,
|
|
@HiveField(8)
|
|
selfCare,
|
|
@HiveField(9)
|
|
custom,
|
|
}
|
|
|
|
@HiveType(typeId: 1)
|
|
@freezed
|
|
class Routine with _$Routine {
|
|
const factory Routine({
|
|
@HiveField(0) required String id,
|
|
@HiveField(1) required String name,
|
|
@HiveField(2) String? description,
|
|
@HiveField(3) required RoutineCategory category,
|
|
@HiveField(4) required Schedule schedule,
|
|
@HiveField(5) @Default([]) List<Reminder> reminders,
|
|
@HiveField(6) @Default(10) int points,
|
|
@HiveField(7) String? icon,
|
|
@HiveField(8) String? color,
|
|
@HiveField(9) @Default(true) bool isActive,
|
|
@HiveField(10) required DateTime createdAt,
|
|
@HiveField(11) DateTime? updatedAt,
|
|
}) = _Routine;
|
|
|
|
factory Routine.fromJson(Map<String, dynamic> json) =
|
|
_$$RoutineImplFromJson;
|
|
}
|
|
|
|
@HiveType(typeId: 2)
|
|
@freezed
|
|
class Schedule with _$Schedule {
|
|
const factory Schedule({
|
|
@HiveField(0) required ScheduleType type,
|
|
@HiveField(1) List<int>? daysOfWeek, // 0 = Monday, 6 = Sunday
|
|
@HiveField(2) DateTime? specificDate,
|
|
@HiveField(3) required String time, // "HH:mm" format
|
|
@HiveField(4) int? intervalDays, // For every X days
|
|
}) = _Schedule;
|
|
|
|
factory Schedule.fromJson(Map<String, dynamic> json) =
|
|
_$$ScheduleImplFromJson;
|
|
}
|
|
|
|
@HiveType(typeId: 3)
|
|
enum ScheduleType {
|
|
@HiveField(0)
|
|
daily,
|
|
@HiveField(1)
|
|
weekly,
|
|
@HiveField(2)
|
|
specificDate,
|
|
@HiveField(3)
|
|
interval,
|
|
}
|
|
|
|
@HiveType(typeId: 4)
|
|
@freezed
|
|
class Reminder with _$Reminder {
|
|
const factory Reminder({
|
|
@HiveField(0) required String id,
|
|
@HiveField(1) required int minutesBefore,
|
|
@HiveField(2) @Default(true) bool isEnabled,
|
|
}) = _Reminder;
|
|
|
|
factory Reminder.fromJson(Map<String, dynamic> json) =
|
|
_$$ReminderImplFromJson;
|
|
}
|
|
|
|
// Extension for category metadata
|
|
extension RoutineCategoryExtension on RoutineCategory {
|
|
String get displayName {
|
|
switch (this) {
|
|
case RoutineCategory.medication:
|
|
return 'Medication';
|
|
case RoutineCategory.vitamin:
|
|
return 'Vitamins';
|
|
case RoutineCategory.appointment:
|
|
return 'Appointments';
|
|
case RoutineCategory.sleep:
|
|
return 'Sleep';
|
|
case RoutineCategory.food:
|
|
return 'Food & Nutrition';
|
|
case RoutineCategory.hydration:
|
|
return 'Hydration';
|
|
case RoutineCategory.exercise:
|
|
return 'Exercise';
|
|
case RoutineCategory.hygiene:
|
|
return 'Hygiene';
|
|
case RoutineCategory.selfCare:
|
|
return 'Self Care';
|
|
case RoutineCategory.custom:
|
|
return 'Custom';
|
|
}
|
|
}
|
|
|
|
String get icon {
|
|
switch (this) {
|
|
case RoutineCategory.medication:
|
|
return '💊';
|
|
case RoutineCategory.vitamin:
|
|
return '🍊';
|
|
case RoutineCategory.appointment:
|
|
return '📅';
|
|
case RoutineCategory.sleep:
|
|
return '😴';
|
|
case RoutineCategory.food:
|
|
return '🍎';
|
|
case RoutineCategory.hydration:
|
|
return '💧';
|
|
case RoutineCategory.exercise:
|
|
return '🏃';
|
|
case RoutineCategory.hygiene:
|
|
return '🧼';
|
|
case RoutineCategory.selfCare:
|
|
return '🧘';
|
|
case RoutineCategory.custom:
|
|
return '✨';
|
|
}
|
|
}
|
|
|
|
int get defaultPoints {
|
|
switch (this) {
|
|
case RoutineCategory.medication:
|
|
case RoutineCategory.vitamin:
|
|
return 20;
|
|
case RoutineCategory.appointment:
|
|
return 15;
|
|
case RoutineCategory.exercise:
|
|
return 25;
|
|
case RoutineCategory.sleep:
|
|
return 30;
|
|
case RoutineCategory.hydration:
|
|
return 10;
|
|
default:
|
|
return 15;
|
|
}
|
|
}
|
|
}
|