feat: version history as 10th feature flag, richer upgrade prompts, close unguarded photo-import tab (v0.80.0)

Recipe version history is now gated like the other 9 per-tier features (enabled by default, locked-vs-hidden treatment via isFeatureAvailableAnyTier). UpgradeDialog now shows a tagline + concrete bullet list per feature instead of one generic sentence.

Also closes a real gap: the AI-generate dialog's Photo tab hit /api/v1/ai/import-photo directly with no tier check in the UI (server route was already correctly gated) — a locked-out user could fill it in and hit a dead-end error instead of an upgrade prompt. Now threaded through the same lock/hide props as the dedicated PhotoImportButton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-24 14:04:27 +02:00
parent 1dd8abfd52
commit 1fe379bcdc
15 changed files with 240 additions and 32 deletions
+11 -1
View File
@@ -92,6 +92,8 @@ export function RecipesHeader({
sharedUrl,
importUrlAvailable = true,
importUrlLocked = false,
importPhotoAvailable = true,
importPhotoLocked = false,
}: {
count: number;
initialQuery?: string;
@@ -114,6 +116,9 @@ export function RecipesHeader({
* (with a "Pro" upsell) and opens an upgrade prompt instead of the
* import dialog. */
importUrlLocked?: boolean;
/** Same idea, for the AI-generate dialog's Photo tab (recipe_import_photo). */
importPhotoAvailable?: boolean;
importPhotoLocked?: boolean;
}) {
const router = useRouter();
const pathname = usePathname();
@@ -340,7 +345,12 @@ export function RecipesHeader({
</div>
</div>
<AiGenerateDialog open={aiOpen} onOpenChange={setAiOpen} />
<AiGenerateDialog
open={aiOpen}
onOpenChange={setAiOpen}
photoTabAvailable={importPhotoAvailable}
photoTabLocked={importPhotoLocked}
/>
<UrlImportDialog open={urlOpen} onOpenChange={setUrlOpen} initialUrl={sharedUrl} autoImport={!!sharedUrl && !importUrlLocked} />
<UpgradeDialog
open={upgradeOpen}