Add Progress Photos feature for plant growth tracking (Phase 8)

Implement progress photo capture with HEIC compression and thumbnail
generation, gallery view with grid display and full-size viewing,
time-lapse playback with adjustable speed, and photo reminder
notifications at weekly/biweekly/monthly intervals.

New files:
- ProgressPhoto domain entity with imageData and thumbnailData
- ProgressPhotoRepositoryProtocol and CoreDataProgressPhotoRepository
- CaptureProgressPhotoUseCase with image compression/resizing
- SchedulePhotoReminderUseCase with notification scheduling
- ProgressPhotosViewModel, ProgressPhotoGalleryView
- ProgressPhotoCaptureView, TimeLapsePlayerView

Modified:
- PlantMO with progressPhotos relationship
- Core Data model with ProgressPhotoMO entity
- NotificationService with photo reminder support
- PlantDetailView with Progress Photos section
- DIContainer with photo service registrations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-23 15:40:50 -06:00
parent f41c77876a
commit 4fcec31c02
17 changed files with 3315 additions and 12 deletions

View File

@@ -65,15 +65,11 @@
};
1C4B79FC2F21C37C00ED69CF /* PlantGuideTests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
path = PlantGuideTests;
sourceTree = "<group>";
};
1C4B7A062F21C37C00ED69CF /* PlantGuideUITests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
path = PlantGuideUITests;
sourceTree = "<group>";
};
@@ -111,7 +107,6 @@
DADA0723BB8443C632252796 /* TaskSection.swift */,
678533C17B8C3244E2001F4F /* RoomTaskGroup.swift */,
);
name = Components;
path = Components;
sourceTree = "<group>";
};
@@ -141,7 +136,6 @@
children = (
775B6E967C5DFFD7F1871824 /* Repositories */,
);
name = Data;
path = Data;
sourceTree = "<group>";
};
@@ -150,7 +144,6 @@
children = (
52FD1E71E8C36B0075A932F2 /* InMemoryRoomRepository.swift */,
);
name = Repositories;
path = Repositories;
sourceTree = "<group>";
};
@@ -160,7 +153,6 @@
DEFE3CA84863FD85C7F7BB48 /* Presentation */,
43A10090BDB504EEA8160579 /* Data */,
);
name = PlantGuide;
path = PlantGuide;
sourceTree = "<group>";
};
@@ -169,7 +161,6 @@
children = (
EB55B50C41964C736A4FF8A3 /* TodayView */,
);
name = Scenes;
path = Scenes;
sourceTree = "<group>";
};
@@ -178,7 +169,6 @@
children = (
96D83367DDD373621B7CA753 /* Scenes */,
);
name = Presentation;
path = Presentation;
sourceTree = "<group>";
};
@@ -189,7 +179,6 @@
7A9D5ED974C43A2EC68CD03B /* TodayView.swift */,
1A0266DEC4BEC766E4813767 /* Components */,
);
name = TodayView;
path = TodayView;
sourceTree = "<group>";
};