feat: Add 'Send me Feedback' home screen quick action#87
feat: Add 'Send me Feedback' home screen quick action#87justanotheratom wants to merge 449 commits intomainfrom
Conversation
• Created ConfettiView component with colorful particle animation • Implemented 60 confetti particles with rotation and horizontal spread • Added celebration colors (green, gold, red, teal, mint, pink) • Integrated confetti overlay in MeetYourAvatar view • Animation triggers automatically when sheet appears • Particles fall from top with rotation and fade out after 2 seconds • Enhances user experience with celebratory feedback on avatar reveal
• Added setUpAvatarFor route to BottomSheetRoute enum • Integrated SetUpAvatarFor view in PersistentBottomSheet navigation • Added nextPressed callback to SetUpAvatarFor for navigation • Updated HomeView to check family member count before navigation • If family has more than one member, show SetUpAvatarFor first • When Next is pressed in SetUpAvatarFor, navigate to YourCurrentAvatar • Single member families go directly to YourCurrentAvatar • Configured dynamic height for setUpAvatarFor bottom sheet
- Replace GreenCapsule buttons with white buttons with light gray borders - Add Google and Apple logos on the left side of buttons - Update button styling to match design specifications - Maintain existing sign-in functionality
…eenOutlinedCapsule buttons - Update WhosThisFor sheet: Replace gray and filled green buttons with GreenOutlinedCapsule for consistent styling - Update WouldYouLikeToInvite sheet: Replace GreenCapsule buttons with GreenOutlinedCapsule matching design - Enhance GreenOutlinedCapsule component: Add white background fill and make image parameter optional - Apply green gradient to icons in GreenOutlinedCapsule to match text and border styling - Both sheets now have consistent white buttons with green gradient borders and text
- Replace hardcoded placeholder family members with live data from FamilyStore - Convert members from constant array to computed property that reads from familyStore.family - Combine selfMember and otherMembers into single list for display - Map FamilyMember to Member struct with proper id, name, image, and color conversion - Handle empty family case gracefully - Resolves issue where wrong family members were shown when household has more than one member
…avatar-flow Feature/eig 618 create your avatar flow
… all the dependent flags to that. update AuthController to derive the sign‑in provider from Supabase user.identities (with a safe fallback to appMetadata["provider"]), then wire signedInWithApple, signedInWithGoogle, signedInAsGuest, and currentSignInProviderDisplay to that single source of truth so the Settings screen always shows the correct provider.
…eCanvasView - Add updateSectionCompletionStatus() method to check if sections have data in preferences - Update completion status on view appear, preferences change, and section switch - Make Preferences and PreferenceValue conform to Equatable for onChange support - Fixes issue where only last section showed as completed when reopening view
- Add family/food-notes endpoint to SupabaseRequestBuilder - Implement fetchFoodNotes and updateFoodNotes methods in WebService - Add debounced auto-save when preferences change in EditableCanvasView - Load existing food notes on view appear - Handle version conflicts with automatic retry logic - Convert between backend content format and preferences format - Add loading state UI during initial data fetch
Replaced arrow-right asset images and updated references. Added new feedback and star rating image assets. Refactored UserFeedbackCard to include a selectable star rating UI and feedback image. Updated YourBarcodeScans to display dynamic scan count from UserPreferences and refresh on appear. Enhanced UserPreferences to track and refresh total scan count. Modified BarcodeDataCard to increment scan count only on successful product analysis. Improved ArrowSwipeShimmer opacity handling in BarcodeScanCameraControls.
Deleted an extraneous 'matching' line from the UserFeedbackCard view to clean up the code and prevent potential confusion.
…rcodescan-productdetails Feature/eig 616 review UI barcodescan productdetails
- Updated sectionedChips() to handle both type-2 (subSteps) and type-3 (regions) step types - Region chips were not displaying because the method only checked for subSteps - Now properly maps region selections from backend data to SectionedChipModel format
- Updated version mismatch handling to use 409 Conflict instead of 400 Bad Request - Removed complex error string parsing logic - now uses currentNote from error response - Updated VersionMismatchError to include full currentNote object instead of just version numbers - Improved null response handling for GET endpoint when no food notes exist - Simplified error handling by using structured data from backend response - Reduced code complexity by ~20 lines of parsing logic
- Update EditableCanvasView to detect family context and use .family flow type - Replace hardcoded family members in FamilyCarouselView with dynamic data from FamilyStore - Display first character of member names in colored circles matching HomeView design - Ensure family carousel shows actual family members with their colors and names
- Replace GreenCircle Next button with GreenCapsule Done button in EditSectionBottomSheet - Done button closes the sheet when pressed instead of navigating to next section - Increase bottom padding to 100pt to prevent content from being hidden behind Done button - Add allowTappingIncompleteSections parameter to CanvasTagBar for edit mode - Enable tapping any section in EditableCanvasView regardless of completion status - Remove unused handleNextSection function and onNext parameter
…asView - Add new endpoint family_food_notes_all to SupabaseRequestBuilder - Create FoodNotesAllResponse struct to handle member-specific food notes - Add fetchFoodNotesAll() function to fetch food notes with member associations - Update EditableCanvasView to use /family/food-notes/all endpoint instead of /family/food-notes - Track member associations for each preference item (family-level vs member-specific) - Merge family note and member notes into unified content structure - Update EditableCanvasCard to display member images on chips via familyList parameter - Show 'Everyone' image for family-level preferences, member names for member-specific preferences - Pass itemMemberAssociations to EditableCanvasCard to enable member image display
- Track selected family member in FamilyStore so preferences know if editing Everyone or an individual - Wire FamilyCarouselView taps to update FamilyStore.selectedMemberId and fetch member/family food notes with detailed logging - Add member-specific endpoints (GET/PUT /family/members/:id/food-notes) to WebService with version-mismatch handling - In EditableCanvasView, route PUTs to member endpoint when a member is selected, or family endpoint when Everyone is selected, with full terminal traces - Keep chips selection in sync with backend content for each member
- Use a separate canvasPreferences store so scroll cards show union of family + all members - Map chip member associations to FamilyMember by UUID instead of raw string ids - Log missing member mappings to help debug avatar configuration - Trigger a fresh /family/food-notes/all load after successful member/family updates so chip avatars stay in sync
- Track avatarTargetMemberId in FamilyStore when selecting a member in SetUpAvatarFor - On MeetYourAvatar Assign, upload the generated memoji via WebService.uploadImage and persist imageFileHash on the target FamilyMember - Add FamilyMemberAvatarView to HomeView to render member avatars from imageFileHash with name-initial fallback - Update 'Your IngrediFam' row in HomeView to use the new avatar view instead of text prefixes
- When assigning a memoji in MeetYourAvatar, also persist memojiStore.backgroundColorHex to FamilyMember.color - Add loadedHash tracking in HomeView.FamilyMemberAvatarView so avatar reloads whenever imageFileHash changes - Clear cached avatar when imageFileHash is removed so fallback initials render correctly - Add detailed logging around avatar loading and color updates for easier debugging
- Add FoodEmojiMapper utility to inject food emojis into summary text - Build emoji mapping from dynamicJsonData.json step options - Use regex to find food names and prepend matching emojis (e.g., "🥜 peanuts") - Add highlight markers for MultiColorText styling - Create AISummaryCard component for UnifiedCanvasView editing mode - Shows "Summarized with AI" badge with gradient text and background - Text gradient: pink (#FB4889) → purple (#9A64D4) → blue (#0B77FF) - Background gradient: #FEF2F2 → #F9EDF9 → #EBF3FE - Displays full summary with emojis and styled text - Update AllergySummaryCard to use MultiColorText for styled rendering - Pass dynamicSteps to AllergySummaryCard from HomeView 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create ExclusionMultiColorText using UIKit's UITextView with exclusion paths - Text now properly wraps around the bottom-right corner cutout - Supports multi-color text with * delimiter markers - Proper word wrapping (words stay together, don't break mid-word) - Calculate container size and exclusion rect based on card geometry - Add previews for empty state, with summary, and long text truncation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isJoiningViaInviteCode flag to AppNavigationCoordinator - Update invite code success flow to show MeetYourProfileView first - User sees "Welcome to IngrediFam!" canvas with their profile - Continue button then navigates to "All set to join your family!" screen Flow: EnterInviteCode → MeetYourProfile → WelcomeToYourFamily 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
HomeView Improvements: - Remove refresh button from Recent Scans header - Auto-refresh Recent Scans after each scan completion - Change background color to #FCFCFC - Add bento card styling to "Your IngrediFam" card with proper padding - Update greeting text styling and spacing - Fix Recent Scans to automatically update when scan history changes ScanCameraView Enhancements: - Add haptic feedback when scan analysis completes (both barcode and photo modes) - Wrap ProductDetailView in NavigationStack when presented from camera - Ensure proper navigation bar visibility ProductDetailView Updates: - Limit product name to 2 lines maximum - Add custom back button when presented from camera view - Improve navigation experience from ScanCameraView FullScreenImageViewer Improvements: - Remove zoom reset button from top toolbar - Add zoom in/out controls with percentage badge at bottom - Position zoom controls above thumbnail strip - Center percentage badge between zoom buttons Code Refactoring: - Create ViewExtensions.swift with reusable bottom tab bar helpers - Refactor bottom gradient + TabBar overlay pattern into reusable components - Update HomeView, UnifiedCanvasView, and EditableCanvasView to use new helpers - Remove duplicate code (~60 lines) across three files Preview Fixes: - Fix ProfileCard preview crash (add FamilyStore environment) - Fix YourBarcodeScans preview crash (add required environments) - Fix HomeView preview crash (add ScanHistoryStore and MemojiStore)
…ements Feature/food notes ux improvements
- TabBar: Add camera permission handling with alert - AverageScansCard: Improve layout and spacing - ListsTab: Add navigation tint and update header - Various component styling and layout improvements - Update Info.plist and app configuration
* feat: add Single Root NavigationStack foundation - Create AppRoute.swift enum with all navigation routes - Add navigationPath and navigation methods to AppState - Wrap LoggedInRootView in single NavigationStack - Add destinationView(for:) builder for AppRoute destinations - Add pushNavigation case to ProductDetailPresentationSource - Add pushNavigation case to CameraPresentationSource - Add onChange handler to reset navigation on tab switch This establishes the infrastructure for unified navigation via appState.navigate(to:) enabling AI Bot navigation to any screen and swipe-back gestures for push navigation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: complete Single Root NavigationStack refactor with UI improvements - Convert all fullScreenCover usages to push navigation via appState.navigate() - Fix navigation loop: ProductDetail "Add Image" now pops back instead of pushing new camera - Add scroll-to-card when returning from ProductDetail via scrollToScanId in AppState - Update navigation bar: #FCFCFC background globally, transparent for ScanCameraView - Simplify FlashToggleButton: remove capsule background in scanner mode - Use default back button with white color (.toolbarColorScheme(.dark)) for camera - Fix HomeView IngrediFam card navigation to use appState.navigate(to: .manageFamily) - Add navigation test commands to IngrediBotChatView (/scan, /family, /settings, etc.) Files: TabBar, YourBarcodeScans, ListsTab, HomeView, ProductDetailView, ScanCameraView, LoggedInRootView, IngrediBotChatView, FlashToggleButton, IngrediCheckApp 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: UI improvements, navigation fixes, and image viewer enhancements ## Navigation Fixes - Fix "Add Photo" navigation from HomeView/Recent Scans to properly open camera - Added hasCameraInStack tracking to AppState - ScanCameraView sets flag on appear/disappear - ProductDetailView checks flag to decide push vs pop navigation - Fix "What's your name?" sheet appearing again after self member already added - Added check for pendingSelfMember/family existence before showing ## Bottom Sheet Improvements - Standardize title top padding to 24pt across all sheets - UpdateAvatarSheet, MeetYourProfileView, LetsMeetYourIngrediFamView - Adjust fixed heights to compensate for padding changes - meetYourProfile: 389 → 397 - updateAvatar: 500 → 492 - Add UpdateAvatarSheet for avatar selection/generation flow ## FullScreenImageViewer Enhancements - Full screen image display with ignoresSafeArea for immersive zoom - Material blur backgrounds for header and controls (iOS Camera style) - Auto-hide header/thumbnails when zoomed (>1.2x scale) - Zoom controls remain visible at all times - Tap to toggle controls visibility - Improved thumbnail strip with auto-scroll to selected ## Other Improvements - Product feedback with optimistic updates and vote toggling - ManageFamilyView custom swipe-to-delete with rounded UI - Various UI polish and consistency updates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: UI improvements, AIBot enhancements, and card unification - Unify card UI across RecentScanCard, ScanDataCard with consistent layout - Add RecentScanCard with CardStyle (compact/full) for reuse in HomeView and Recent Scans - Remove deprecated HomeRecentScanRow (replaced by RecentScanCard) - Fix AIBot FAB visibility: hide in ScanCameraView, show in ProductDetailView - Add isInScanCameraView tracking for reliable FAB visibility - Enhance IngrediBotChatView with improved context handling - Update ScanDataCard layout (name first, chevron bottom-right) - Add FilterSegmentedControl for Recent Scans filtering - Various UI polish and navigation fixes across sheets and views 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Update ScanDataCard to display images in priority order: local (pending) → user → inventory (reversed) - Local images now show immediately with loader overlay until processed by API - User images from API appear when status="processed", replacing local images by hash match - Inventory images displayed in reversed order (last appears at front) - Update localImages parameter type to include hash for duplicate prevention - Add CombinedImageDisplayItem struct and combinedImagesStackView function - Update ScanCameraView to pass full image tuple with hash to ScanDataCard Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace commands with new iOS skills structure (ios-deploy, ios-debug) - Use devicectl --console for reliable iOS 18 NSLog capture (replaces idevicesyslog) - Use script -F -q for real-time PTY output streaming Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add 4 new fields to capture approximate location info without location permissions: - timezone: IANA timezone identifier (e.g., "Asia/Kolkata") - localeRegion: ISO 3166-1 alpha-2 country code from device locale (e.g., "US") - preferredLanguage: BCP 47 language tag (e.g., "en-US") - storeCountry: App store country code from StoreKit (e.g., "USA") Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add Claude Code skills for App Store Connect workflows using the `asc` CLI: - /asc-setup: Validate installation and authentication - /asc-builds: List builds grouped by marketing version with TestFlight status - /asc-reviews: Show App Store ratings and customer reviews - /asc-testflight: Manage beta testers, groups, feedback, and crashes - /asc-submit: Submit builds for App Store review - /asc-sales: Download sales reports and analytics - /asc-publish: Archive, build, and upload to App Store Connect Key features: - Builds auto-grouped by marketing version with external TestFlight status - Ratings fetched from iTunes Lookup API - Build numbers auto-determined from ASC (no project file changes needed) - Shared asc-common.sh helper for config loading and validation - Moved publish scripts to skills directory Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhance PersistentBottomSheet, RecentScanCard, and IngredientsAlertCard. Refactor sheet system with new AddPreferencesForMemberSheet and CaptureYourProductSheet, replacing WantToAddPreference. Update family carousel, onboarding views, login sheet, and navigation coordinator. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Track per-image processing latency from upload to server confirmation - Capture "Photo Scan Image Processed" event with latency_ms property - Track memoji generation latency with "AI Memoji Generation" event - Add PostHog MCP server config and SwiftUI expert skill plugin Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…condition (#82) - Fix AllergySummaryCard not loading AI summary on fresh app launch by initializing FoodNotesStore eagerly in RootContainerView.init instead of lazily in .task (eliminates race condition with HomeView.task) - Make FoodNotesStore non-optional across all consumer views - Update ChatBot, HomeView, Canvas, Onboarding, and UI components - Add ChatStore and ShimmerModifier utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…ght (#83) Instrument the entire onboarding flow with distinct PostHog events so each step appears as a separate node in the Paths Sankey diagram. Events cover early branching (existing/new user, invite codes), family setup, all 10 dynamic preference steps, IngrediBot chat engagement, and three completion sources. Gated by canvas route to prevent false events when chat/preferences are accessed from Home. Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…ovements Tutorial Video Feature: - Add TutorialVideoManager for downloading/caching tutorial video from Supabase - Replace video placeholder in SeeHowScanningWorksCanvasView with looping player - Add fullscreen video playback support - Pre-download tutorial video in background after guest login Capture Guide Slideshow: - Redesign CaptureYourProductSheet as auto-advancing 5-slide carousel - Add new v2 image assets (front/back/nutrition/ingredients product photos) - Show step-by-step capture instructions with animated transitions Product Details: - Add empty state UI when product not found in database - Show "Product Not Found" message with capture photos button Chat Improvements: - Fix ScrollView auto-scroll to latest message using bottom anchor - Add scroll triggers for typing indicator and message visibility Onboarding Fixes: - Fix state reset when navigating to/from avatar generation flow - Reset name/selection state on fresh member addition UI Polish: - Adjust ScanCameraView layout and padding - Update PersistentBottomSheet height for scanning help state - Simplify SeeHowScanningWorksSheet layout Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Display and preserve misc notes from IngrediBot - Fix: clear misc notes on load failure + use explicit food_notes context - Refactor: rename screenOverride to contextKeyOverride for clarity - Fix: display misc notes from member-level storage - Move misc notes card to top when non-empty
…/Manage Family When adding a new family member from Home or Manage Family views with avatar generation, the app now correctly navigates to the "Would you like to invite?" screen instead of going back to "Add More Members". - Modified handleAssignAvatar to return new member info (UUID, name) when created - Updated navigation in .meetYourAvatar case to check for new member and route to .wouldYouLikeToInvite when on home screen Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ission - Remove extra quotation marks from AllergySummaryCard and AISummaryCard summary text - Add NSPhotoLibraryUsageDescription to Info.plist for photo library access - Remove shimmer animation from AskIngrediBotButton - Update build configuration settings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…loader - Block background interaction for wouldYouLikeToInvite and addPreferencesForMember sheets - Fix sign-in loader in WelcomeBack to occupy full sheet height Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix "IngrediPoiints" → "IngrediPoints" typo (3 occurrences) - Fix double punctuation: ".." → "." and "!!" → "!" - Fix lowercase "would" → "Would" after period - Fix "foodnote" → "food notes" terminology (2 occurrences) - Fix "watch out for" → "needs to avoid" (family-friendly) - Remove extra space before "!" in welcome messages (4 occurrences) - Fix capitalization "Help me Improve" → "Help me improve" - Update invite code error message for friendlier tone Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
fix: Improve micro-copy for spelling, punctuation, and consistency
Adds iOS home screen quick action that opens IngrediBot with a feedback-friendly greeting. Handles both cold launch (via pendingShortcutItem) and warm launch (via notification) scenarios, deferring the action until sign-in completes when needed. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add static shortcut definition in Info.plist for reliable registration - Add SceneDelegate to handle warm launch shortcuts via notification - Fix SwiftUI timing issue by reading context directly from coordinator - Add feedback-specific greeting: "Would you like to give me some feedback?" Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8fad9080e4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // MARK: - Production Flow | ||
| private struct ProductionFlowView: View { | ||
| var body: some View { | ||
| Splash { | ||
| Image("SplashScreen") | ||
| .resizable() | ||
| .scaledToFill() | ||
| } content: { | ||
| MainView() | ||
| } |
There was a problem hiding this comment.
Route production flow through shortcut-aware container
In production (Config.usePreviewFlow == false), ProductionFlowView routes to MainView() instead of RootContainerView, but the quick-action handling (the ShowFeedbackFromShortcut notification and cold-launch pendingShortcutItem consumption) only exists in RootContainerView. This means the new “Send me Feedback” shortcut will be ignored for real users unless the preview flow is enabled. Consider moving the shortcut handling to a view used in production (e.g., MainView/LoggedInRootView) or routing production through RootContainerView.
Useful? React with 👍 / 👎.
- Make feedback_id optional in FeedbackContext DTO - Update ChatContextBuilder to support feedback context without feedbackId - Send FeedbackContext (with nil feedback_id) for general feedback quick action Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Summary
Implementation Details
Info.plistfor reliable registrationSceneDelegatehandles warm launch shortcuts viaNotificationCenterRootContainerViewlistens for shortcut notification and callshandleFeedbackShortcut()IngrediBotChatViewreads context directly from coordinator to fix SwiftUI timing issueTest plan
🤖 Generated with Claude Code