feat: product search screen with catalog add and success feedback
- Add product search screen (/products/search) as primary add flow; "Add" button on products list opens search, manual entry remains as fallback - Add to shelf bottom sheet with AnimatedSwitcher success view (green checkmark) and SnackBar confirmation on the search screen via onAdded callback - Manual add (AddProductScreen) shows SnackBar on success before popping back - Extend AddProductScreen with optional nutrition fields (calories, protein, fat, carbs, fiber); auto-fills from catalog selection and auto-expands section - Auto-upsert catalog product on backend when nutrition data is provided without a primary_product_id, linking the user product to the catalog - Add fiber_per_100g field to CatalogProduct model and CreateRequest - Add 16 new L10n keys across all 12 locales (addProduct, addManually, searchProducts, quantity, storageDays, addToShelf, nutritionOptional, calories, protein, fat, carbs, fiber, productAddedToShelf, etc.) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,16 @@ func (r *Repository) Update(requestContext context.Context, id, userID string, r
|
||||
return userProduct, scanError
|
||||
}
|
||||
|
||||
// DeleteAll removes all user products for the given user.
|
||||
func (r *Repository) DeleteAll(requestContext context.Context, userID string) error {
|
||||
_, execError := r.pool.Exec(requestContext,
|
||||
`DELETE FROM user_products WHERE user_id = $1`, userID)
|
||||
if execError != nil {
|
||||
return fmt.Errorf("delete all user products: %w", execError)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete removes a user product. Returns ErrNotFound if it does not exist or belongs to a different user.
|
||||
func (r *Repository) Delete(requestContext context.Context, id, userID string) error {
|
||||
tag, execError := r.pool.Exec(requestContext,
|
||||
|
||||
Reference in New Issue
Block a user