fix: batch of collections/i18n/translate-button fixes (v0.53.1)
- Drag-reorder used verticalListSortingStrategy on a multi-column grid, which computes wrong transforms for grid reflow — swapped to rectSortingStrategy so cards actually animate live while dragging. - Grip handle was rendered as a sibling of (not a descendant of) the `group` element its `group-hover:opacity-100` depended on, so it was permanently invisible. Fixed the DOM nesting and made it always partially visible instead of hover-only. - common.edit was missing from both locales (not just French) — edit-collection-dialog.tsx was the first caller to hit it. - Root cause of "generated in my language but Translate still shows": generate-meal, meal-plan/generate, and adapt never set recipes.language on the row they inserted, so the button's `!recipe.language || ...` check always fell back to "show it". Fixed at all three insert sites. - Translate dialog was entirely hardcoded English (title, description, language names, buttons) despite i18n keys already existing for most of it — now uses them, plus new translated language-name keys. - Recipe tags now render on the recipe detail page (previously grid-card only). - Collection header actions converted to icon-only + tooltip, matching the recipe page's pattern instead of icon+label buttons. - Collections list search now also matches recipe titles inside each collection, not just the collection's own name/description. - Explore page links to /collections/explore next to its tabs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -52,6 +52,8 @@ export async function POST(req: NextRequest, { params }: Params) {
|
||||
if (!configResult.ok) return configResult.response;
|
||||
const aiConfig = configResult.data;
|
||||
|
||||
const locale = (session!.user as { locale?: string }).locale ?? "en";
|
||||
|
||||
const result = await withAiQuota(userId, session!.user.tier as "free" | "pro" | "family", () =>
|
||||
adaptRecipe(
|
||||
{
|
||||
@@ -66,7 +68,7 @@ export async function POST(req: NextRequest, { params }: Params) {
|
||||
extraConstraints: parsed.data.extraConstraints,
|
||||
},
|
||||
{ ...aiConfig, userContext: privateBio ?? undefined },
|
||||
(session!.user as { locale?: string }).locale ?? "en"
|
||||
locale
|
||||
), { skipQuota: aiConfig.isByok }
|
||||
);
|
||||
if (!result.ok) return result.response;
|
||||
@@ -100,6 +102,7 @@ export async function POST(req: NextRequest, { params }: Params) {
|
||||
description: adapted.description,
|
||||
baseServings: adapted.baseServings,
|
||||
visibility: "private",
|
||||
language: locale,
|
||||
difficulty: adapted.difficulty,
|
||||
prepMins: adapted.prepMins,
|
||||
cookMins: adapted.cookMins,
|
||||
|
||||
@@ -8,6 +8,7 @@ import { withAiQuota, resolveAiConfigOrError } from "@/lib/ai/ai-error";
|
||||
import { checkAndIncrementTierLimit, incrementUsage, TierLimitError } from "@/lib/tiers";
|
||||
import { generateMeal, MEAL_COURSES } from "@/lib/ai/features/generate-meal";
|
||||
import { getUserPrivateBio } from "@/lib/ai/user-bio";
|
||||
import { getMessages } from "@/lib/i18n/server";
|
||||
|
||||
const Schema = z.object({
|
||||
collectionId: z.string().min(1),
|
||||
@@ -89,12 +90,13 @@ export async function POST(req: NextRequest) {
|
||||
baseServings: recipe.baseServings,
|
||||
recipeType: recipe.recipeType,
|
||||
visibility: "private",
|
||||
language: locale,
|
||||
aiGenerated: true,
|
||||
difficulty: recipe.difficulty ?? null,
|
||||
prepMins: recipe.prepMins ?? null,
|
||||
cookMins: recipe.cookMins ?? null,
|
||||
dietaryTags: recipe.dietaryTags ?? {},
|
||||
tags: [recipe.course],
|
||||
tags: [getMessages(locale).collections.course[recipe.course]],
|
||||
});
|
||||
|
||||
if (recipe.ingredients.length > 0) {
|
||||
|
||||
@@ -134,6 +134,7 @@ export async function POST(req: NextRequest) {
|
||||
description: entry.recipe.description,
|
||||
baseServings: entry.servings,
|
||||
visibility: "private",
|
||||
language: locale,
|
||||
aiGenerated: true,
|
||||
difficulty: entry.recipe.difficulty ?? null,
|
||||
prepMins: entry.recipe.prepMins ?? null,
|
||||
|
||||
Reference in New Issue
Block a user