Commit Graph

42 Commits

Author SHA1 Message Date
c38d4075be Fix grocery sync deletions not persisting and Reminders race condition
Stop cascading syncs by adding an isReconciling flag so that
reconcileFromServer no longer triggers scheduleSync via addItem/deleteItem.
Make Reminders write-only by removing the diff/sync logic from the
onDataChanged callback. Fetch fresh server state in RecipeView reconcile
instead of using stale local cache. Track pending removal recipe IDs via
DataStore so performInitialSync can push deletions for recipes whose
grocery keys have already been removed from groceryDict.

Fix a race condition in RemindersGroceryStore where EKEventStoreChanged
notifications triggered load() before saveMappings() finished writing to
disk, causing the correct in-memory state to be overwritten with stale
data. Add ignoreNextExternalChange flag to skip self-triggered reloads.

Restyle the add/remove all grocery button to match the Plan recipe button
style using Label, subheadline font, and rounded rectangle background.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 06:04:41 +01:00
8b23652f10 Add meal plan feature with cross-device sync and automatic stale data cleanup
Introduces weekly meal planning with a calendar-based tab view, per-recipe
date assignments synced via Nextcloud Cookbook custom metadata, and 30-day
automatic pruning of old entries on load, save, and sync merge.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 05:23:29 +01:00
5890dbcad4 Add cross-device grocery list sync via Nextcloud Cookbook API
Store a _groceryState JSON field on each recipe to track which
ingredients have been added, completed, or removed. Uses per-item
last-writer-wins conflict resolution with ISO 8601 timestamps.
Debounced push (2s) avoids excessive API calls; pull reconciles
on recipe open and app launch. Includes a settings toggle to
enable/disable sync.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 04:14:02 +01:00
98c82dc537 Add Apple Reminders integration for grocery list with local mapping persistence
Introduce a GroceryListManager facade that delegates to either the existing
in-app GroceryList or a new RemindersGroceryStore backed by EventKit. Users
choose the mode in Settings; when Reminders mode is active the Grocery List
tab is hidden. Recipe-to-reminder grouping uses a local mapping file
(reminder_mappings.data) instead of polluting the reminder's notes field,
with automatic pruning when reminders are deleted externally.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 02:54:52 +01:00
7c824b492e Modernize networking layer and fix category navigation and recipe list bugs
Network layer:
- Replace static CookbookApi protocol with instance-based CookbookApiProtocol
  using async/throws instead of tuple returns
- Refactor ApiRequest to use URLComponents for proper URL encoding, replace
  print statements with OSLog, and return typed NetworkError cases
- Add structured NetworkError variants (httpError, connectionError, etc.)
- Remove global cookbookApi constant in favor of injected dependency on AppState
- Delete unused RecipeEditViewModel, RecipeScraper, and Scraper playground

Data & model fixes:
- Add custom Decodable for RecipeDetail with safe fallbacks for malformed JSON
- Make Category Hashable/Equatable use only `name` so NavigationSplitView
  selection survives category refreshes with updated recipe_count
- Return server-assigned ID from uploadRecipe so new recipes get their ID
  before the post-upload refresh block executes

View updates:
- Refresh both old and new category recipe lists after upload when category
  changes, mapping empty recipeCategory to "*" for uncategorized recipes
- Raise deployment target to iOS 18, adopt new SwiftUI API conventions
- Clean up alerts, onboarding views, and settings

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 00:47:28 +01:00
VincentMeilinger
b66ef63b6a Recipe decoding fixes 2024-05-05 10:33:33 +02:00
VincentMeilinger
6ae9926c41 Code cleanup, translations, show empty categories 2024-03-26 18:13:24 +01:00
VincentMeilinger
d201690332 UI bug fixes (regarding recipe servings adjustment) 2024-03-22 14:31:45 +01:00
VincentMeilinger
7b59c79222 Number formatting settings, recipe ingredient amount calculation 2024-03-20 08:53:58 +01:00
VincentMeilinger
054e222d8e Adjustable recipe ingredient amount 2024-03-18 09:09:49 +01:00
VincentMeilinger
eae72eb0ce Basic ingredient amount adjustment 2024-03-11 20:07:50 +01:00
VincentMeilinger
dbe626d595 Bug fixes and UI polish 2024-03-07 19:09:39 +01:00
VincentMeilinger
b5dbaad9aa Recipe edit UI polish 2024-03-05 08:39:06 +01:00
VincentMeilinger
650df2b67e Updated Duration Picker during Recipe Editing 2024-03-01 15:32:04 +01:00
VincentMeilinger
744ea76a34 Updated RecipeView 2024-03-01 14:17:24 +01:00
VincentMeilinger
d3e0366ce6 New Recipe Edit View 2024-02-18 12:25:18 +01:00
VincentMeilinger
4c2b459683 Bug fixes 2024-02-03 10:07:15 +01:00
VincentMeilinger
9b225f63b5 Improved timer widget 2024-01-11 14:15:12 +01:00
VincentMeilinger
772ee6b0e0 'Keep Screen Awake'-Setting, Acknowledge used libraries 2024-01-11 10:12:59 +01:00
Vincent Meilinger
2ed664857b users can now choose between http and https 2024-01-07 17:10:47 +01:00
Vicnet
bb68b29bdf Release Candidate Version 1.6 2023-12-15 13:43:56 +01:00
Vicnet
222685e05d fixed offline recipes duplicate encoding 2023-12-14 17:18:52 +01:00
Vicnet
a3fc891d0a Better file caching and update management 2023-12-14 14:11:56 +01:00
VincentM
642c31b2af Revert "Merge updated onboarding view" 2023-12-10 11:00:12 +01:00
VincentM
32ea911368 Merge branch 'download-rework' into api-update 2023-12-10 10:56:04 +01:00
Vicnet
22eeb8362d Updated Login Flow 2023-11-29 17:44:10 +01:00
Vicnet
23e1a665df Simpler api endpoints are now integrated into the MainViewModel 2023-11-16 17:53:30 +01:00
Vicnet
3563c23e29 Networking rework: simplified API calls. 2023-11-16 13:13:06 +01:00
Vicnet
46401edfb9 French localization update 2023-11-11 12:31:00 +01:00
Vicnet
13b025771c Improved date handling (DurationComponents) 2023-11-11 11:11:08 +01:00
Vicnet
04980b64c7 Added recipe description, nutrition information and keywords to recipe detail view 2023-10-24 19:09:21 +02:00
Vicnet
8f32946e27 Added category 'All' recipes 2023-10-22 20:28:51 +02:00
Vicnet
c0a63d7560 Keyword suggestions and language support. 2023-10-10 13:37:46 +02:00
Vicnet
c3a068a1c0 Updated recipe editing user interface 2023-10-05 22:59:53 +02:00
Vicnet
85a8e631d0 Recipe creation, editing and deletion are now supported 2023-10-04 11:23:05 +02:00
Vicnet
ee1c0d9aed Basic Edit View and components 2023-09-30 10:07:27 +02:00
Vicnet
26dd5c34ff Nextcloud login flow v2, Network code rewrite 2023-09-20 13:25:25 +02:00
Vicnet
0f16b164d6 Nextcloud login flow v2 support (not in working state yet) 2023-09-19 12:04:59 +02:00
Vicnet
4350cad1e0 Download function for all recipes or recipes in a certain category 2023-09-19 09:39:08 +02:00
Vicnet
5fdfed9413 Image caching fixes 2023-09-17 20:45:35 +02:00
Vicnet
3504ce2a25 MainViewModel documentation and image caching improvements 2023-09-16 20:11:02 +02:00
Vicnet
2ebc420451 initial commit 2023-09-16 14:09:49 +02:00